
Pengarang: John Doll
Awalnya diterbitkan di Towards AI the World’s Leading AI and Technology News and Media Company. Jika Anda sedang membangun produk atau layanan terkait AI, kami mengundang Anda untuk mempertimbangkan untuk menjadi sponsor AI. Di Towards AI, kami membantu menskalakan AI dan startup teknologi. Biarkan kami membantu Anda melepaskan teknologi Anda kepada massa.
Deep Java Library (DJL) memiliki beberapa aplikasi demo Android PyTorch yang dapat menjalankan inferensi pembelajaran mendalam secara lokal di ponsel Anda. Contoh-contoh ini mudah digunakan sebagai dasar untuk membangun aplikasi Anda sendiri. Hari ini, saya ingin fokus pada satu Blog ini berfokus pada satu contoh yang saya sumbangkan ke proyek open source, Semantik Segmentasi: area pembelajaran mendalam yang biasa digunakan oleh mobil self-driving dan mesin pencitraan medis, antara lain.
Segmentasi semantik adalah proses pembelajaran mendalam yang memilah-milah gambar untuk menemukan objek. Sebuah model segmentasi semantik berjalan piksel demi piksel melalui gambar, mengklasifikasikan setiap piksel sebagai objek atau latar belakang. Itu tidak membedakan dua objek dengan tipe yang sama satu sama lain — melainkan, itu hanya mengidentifikasi mereka. Misalnya, dua anjing dalam sebuah gambar keduanya diwarnai dengan warna yang sama dengan segmentasi semantik, tetapi model tidak selalu peduli bahwa ini adalah dua anjing yang berbeda. Bagian segmentasi muncul ketika algoritme yang menjalankan inferensi mengidentifikasi dan mewarnai setiap piksel berdasarkan klasifikasinya, memungkinkan kita untuk melihat objek yang diwarnai setelah selesai. Sederhananya, model akan mewarnai objek apa pun yang ditemukannya dalam gambar yang Anda berikan. Artikel ini membahas lebih mendalam tentang model segmentasi semantik dan konstruksi lapisan yang dimilikinya.
Mempersiapkan
Di lingkungan komputer/pengembang lokal Anda, klon repositori djl-demo dari GitHub. Anda perlu melakukan ini untuk menjalankan aplikasi Semantik Segmentasi (atau salah satu aplikasi DJL lainnya).
git clone https://github.com/deepjavalibrary/djl-demo.git
Siapkan lingkungan pengembangan Anda dengan mengikuti petunjuk ini.
Untuk menjalankan aplikasi di ponsel Android Anda sendiri, ikuti langkah-langkah ini di terminal di komputer Anda:
cd djl-demo/android/pytorch_android Kemudian cd sekali lagi ke dalam aplikasi yang ingin Anda jalankan. Jika Anda ingin menjalankan Semantic Segmentation, maka jalankan perintah ini: cd semantic_segmentation Dari sini, jalankan proyek sesuai dengan OS komputer Anda:
Mac: ./gradlew iD
Windows: ..gradlew iD
Jika Anda tidak memiliki ponsel Android, Anda dapat menginstal Android Studio untuk menjalankan aplikasi.
Untuk menjalankan aplikasi di Android Studio Emulator, ikuti langkah-langkah berikut:
Buka folder pytorch_android dari direktori djl-demo di Android Studio. Ini akan menunjukkan 4 aplikasi DJL PyTorch yang ada saat ini yang dapat Anda jalankan. Anda mungkin harus menunggu sebentar agar Gradle mengindeks proyek. Klik tombol putar hijau di kanan atas di sebelah nama aplikasi yang akan dijalankan, dan emulator yang dipilih, dan Anda sudah siap.
Sejauh input dan output model berjalan, mereka relatif mudah. Masukannya adalah gambar PNG atau JPG, yang dibatasi oleh model menjadi ukuran 600×800 atau lebih kecil. Outputnya adalah gambar dengan objek berwarna dengan ukuran 600×800. Penerjemah mengubah ukuran gambar ke dimensi aslinya.
Kesimpulan
Potongan kode di bawah ini diambil langsung dari SemanticSegmentationTranslator.java dari repositori DJL di GitHub. Penerjemah adalah yang menyiapkan input untuk model, mengambil informasi dari output model, dan mengubahnya menjadi output yang masuk akal secara intuitif bagi manusia. Saat membuat aplikasi Semantik Segmentasi, saya menemukan bahwa pembuatan penerjemah berkontribusi paling besar pada pemahaman saya tentang DJL. Saya mempelajari tipe dan struktur data yang ditawarkan DJL dan cara efisien untuk menggunakannya. Itu menyenangkan dan mengasyikkan untuk dijelajahi, seperti menyusun teka-teki dengan potongan-potongan yang tersembunyi. DJL memudahkan untuk menemukan bagian yang tepat dan menyesuaikannya dengan kreasi Anda yang sudah ada.
Kode di bawah ini adalah inti pasca-pemrosesan dari penerjemah Semantik Segmentasi yang pada akhirnya menghasilkan output gambar. Tanpa itu, Anda hanya memiliki beberapa larik keluaran yang tidak akan berarti apa-apa bagi pengguna akhir. Pasca-pemrosesan sangat penting untuk penggunaan model pembelajaran yang mendalam.
Mari selami dan periksa beberapa kode penerjemah untuk memahami apa yang terjadi.
int imageSize = lebar * tinggi;
ByteBuffer bb = manager.allocateDirect(CHANNEL * imageSize);
int r = 0; // penyesuaian untuk piksel merah
int g = 1; // penyesuaian untuk piksel hijau
int b = 2; // penyesuaian untuk piksel biru
byte[][] warna = byte baru[CLASSNUM][3]; // menetapkan warna secara acak untuk setiap kali model dijalankan
for (int i = 0; i < KELAS; i++) {
byte merah = (byte) RandomUtils.nextInt(256);
byte hijau = (byte) RandomUtils.nextInt(256);
byte biru = (byte) RandomUtils.nextInt(256);
warna[i][r] = merah;
warna[i][g] = hijau;
warna[i][b] = biru;
}
Kode di atas berada dalam metode pasca-pemrosesan setelah gambar diproses sebelumnya dan dijalankan melalui model. Ini menciptakan array byte 2D dari warna yang dihasilkan secara acak yang sesuai dengan objek yang diketahui berbeda dalam gambar setiap kali inferensi dibuat.
Kode di bawah ini segera mengikuti pembuatan warna; kode ini memetakan piksel yang diklasifikasikan ke warnanya, yang kemudian diubah menjadi gambar. Ini adalah daging pasca-pemrosesan.
// ganda untuk loop untuk mengulang setiap piksel
for (int h = 0; h < tinggi; h++) {
for (int w = 0; w < lebar; w++) {
int indeks = h * lebar + w;
int maksi = 0;
double maxnum = -Double.MAX_VALUE;
// mengulang setiap probabilitas objek pada piksel tertentu
for (int i = 0; i < KELAS; i++) {
// dapatkan skor untuk setiap i pada piksel h,w gambar
skor mengambang = skor[i * (imageSize) + index];
if (skor > jumlah maksimum) {
jumlah maksimum = skor;
maksimal = saya;
}
}
// jika sebuah objek ditemukan secara probabilistik, warnai dengan
jika (maks > 0) {
bb.put(warna[maxi][r]);
bb.put(warna[maxi][g]);
bb.put(warna[maxi][b]);
} kalau tidak {
bb.posisi(bb.posisi() + 3);
}
}
}
// pembuatan gambar dari buffer
bb.rewind();
int asalW = (int) ctx.getAttachment(“Lebar asli”);
int asalH = (int) ctx.getAttachment(“originalHeight”);
NDArray fullImage =
manager.create(bb, Bentuk baru(tinggi, lebar, CHANNEL), DataType.UINT8);
NDArray diubah ukurannya = NDImageUtils.resize(fullImage, originW, originH); kembalikan ImageFactory.getInstance().fromNDArray(diubah ukurannya);
Loop for ganda di loop atas melalui setiap piksel dalam larik skor kami, yang dikembalikan dalam output kami dari model. Untuk setiap piksel dalam gambar, ada larik yang berisi probabilitas bahwa piksel tersebut adalah objek yang sesuai dengan indeks larik tersebut. Jika tidak ada probabilitas yang lebih besar dari probabilitas pada indeks 0, maka piksel dibiarkan tidak berwarna (hitam) dan menjadi bagian dari latar belakang. Jika probabilitas terbesar pada indeks selain 0, maka piksel diberi nilai merah, hijau dan biru yang sesuai yang mewakili objek itu.
Setelah pewarnaan ini selesai, gambar dibuat menjadi NDArray dengan ukuran penuh 600 x 800. Ini kemudian dirampingkan ke lebar dan tinggi asli gambar dan dikembalikan seperti itu.
Ini penampakan dari aplikasinya.
Ini benar-benar sederhana. Tentu, ada kurva pembelajaran untuk memahami alat DJL yang Anda inginkan seperti proyek lainnya, tetapi begitu Anda melakukannya, Anda benar-benar mulai memahami kekuatan yang diberikan DJL kepada Anda.
Ringkasan
Pada awalnya, saya skeptis bahwa saya akan dapat mengambil dan memahami DJL. Saya seorang mahasiswa yang akan memasuki tahun terakhir saya di Universitas Miami, dan saya belum pernah mengerjakan proyek sumber terbuka sebelumnya. Saya pikir itu akan sangat sulit, tetapi saya benar-benar merasa itu menarik, dan itu menarik saya. Saya sangat penasaran untuk melihat fitur DJL baru apa yang dapat saya temukan setiap hari untuk membantu saya membangun aplikasi saya dengan lebih baik atau untuk aplikasi DJL di masa depan ke bawah garis.
Segmentasi Semantik dapat diperluas jauh melampaui penggunaan sederhana yang ditunjukkan di sini. Seperti yang saya sebutkan sebelumnya, ini bukan satu-satunya aplikasi di DJL. Sebenarnya ada tiga orang lain pada saat menulis blog ini. Salah satu aplikasi ini adalah Quickdraw Recognition, yang mengenali dan mengklasifikasikan objek yang Anda gambar di aplikasi secara real-time. Aplikasi lainnya adalah Style Transfer, yang menggunakan gambar yang telah Anda ambil dan mengubahnya agar sesuai dengan gaya artis seperti Vincent Van Gogh atau Claude Monet. Yang ketiga adalah Neural Machine Translation, yang mengambil input teks Prancis dan mengembalikan output bahasa Inggris yang diterjemahkan. Jadi, meskipun Segmentasi Semantik tidak cukup cocok dengan gaya aplikasi yang ingin Anda buat, ada beberapa opsi dan contoh lain di DJL untuk membantu Anda memulai!
Build Semantic Segmentation App dengan Deep Java Library awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.
Diterbitkan melalui Menuju AI