Android Thing dan Machine Learning
Indonesian (Bahasa Indonesia) translation by Husain Ali Yahya (you can also view the original English article)
Android Things mengizinkanmu untuk membuat perangkat IoT keten dengan kode sederhana, tapi satu hal yang membuatnya luar biasa adalah mempelajari mesin. Sementara ada bebeapa layanan yang tersedia online yang akan mengizinkanmu untuk mengunggah datamu dan mengembalikan hasilnua, bisa menggunakan mesil secara lokal dan offline akan jadi sangat berguna.
Di artikel ini, saya akan membagikan pengalaman saya menggunakan TensorFlow image classifier, dimulai dengan Google's Android Things TensorFlow example.
Kenapa Menggunakan Machine Learning?
Machine learning bisa membantu menyelesaikan masalah yang aplikasi konvensional tidak bisa. Untuk memberikan konteks, mari pergi ke contoh sederhana di mana machine learning bisa digunakan dengan berkas IoT untuk meningkatkan kehidupan sehari-hari.
Di sini di Colorado, adalah sebuah hal yang tidak umum untuk melihat berita mengenai binatang liar muncul dari hutan dan berjalan di kota:



Atau beruang memanjat pohon di universitas lokal:



Saya pernah melihat teman mosting video sebuah beruang di luar rumahnya!



Sementara situasi ini tidak dianggap penting, ada data publik yang tersedia dari State of Colorado’s Division of Parks and Wildlife yang menjelaskan konflik manusia-beruang hitam, dan aneka aktivitas spesies-spesies liar. Dengan melihat kembali ke data konflik beruang hitam-manusia di Google Earth, kita bisa menemukan area di mana beruang bisa menjadi ancaman bagi keamanan publik.



Sebagai tambahan, sementara saya membaca data dari negara bagian, seorang teman memosting gambar darei mobilnya memiliki kecelakaan dengan sebuah elk selama perjalanannya ke Durango, CO. Berdasarkan Colorado Department of Transportation (CDOT) Crash Book, lebih dari 4.000 kecelekaan melibatkan hewan liar terjadi dalam satu tahun di Colorado, dengan 150 korban terluka ringan dan 1 korban jiwa. Di seluruh Amerika Serikat, angka ini naik hinga 1.500.000 kecelakaan dengan 200 korban jiwa, berdasarkan Defenders of Wildlife facts sheet.



Jadi bagaimana kita bisa menggunakan machine learning untuk menyelesaikan masalah ini? Dengan pengenalan gambar, kita bisa membuat perangkat motion-triggered yang bisa mengambil gambar dengan Raspberry Pi lalu menginisialisasinya untuk mendeteksi seekor binatang liar berbahaya.
Menggunakan contoh Google, kita bisa membuat perangkat Android Things yang mengambil gambar dengan Raspberry Pi dan mengklasifikasikan kontennya dengan ribuan label yang mungkin, Tapi label ini tidak persis dengan yang kita perlu gunakan.
Dengan melatih TensorFlow untuk menggunakan gambar dan labell sendiri, kita bisa membuat sebuah perangkat yang bisa mengidentifikasi rusa besar, rusa amerika maupun berunag hitam lalu melakukan aksi jika terdeteksi. Ini mengizinkan kita untuk membuat sebuah perangkat yang bisa menyelamatkan nyawa yang mudah untuk dibuat.
Membuat sebuah Custom TensorFlow Image Classifier
Setelah kamu memasang dan menjalankan contoh Google Tensor untuk Android Things, ini waktunya untuk mulai memodifikasinya. Hal pertama yang perlu kamu lakukan adalah memastikan bahwa TensorFlow ada dan bekerja di komputermu. Ini bisa menjadi rumit, cara termudah yang saya temukan untuk membuatnya berjalan dengan benar melalui seluruh proses menggenerasi trained files adalah dengan memasang dan menggunakan Docker. Program ini mengizinkan kamu untuk menjalankan mesin virtual di komputermu yang telah diatur untuk TensorFlow.
Setelah kamu telah memasang Docker dan menjalankannya di komputermu, kamu harus membuka pengaturannya dan mengatur penggunaan memori dari mesin virtual. Saya mengatur 7 GB dari memory yang bisa jadi lebih dari yang kamu butuhkan. Tapi, saya menghabiskan berhari-hari mencoba membuat TensorFlow bekerja dengan benar untuk membuat trained graph yang dibutuhkan tanpa crash sebelum saya menyadari bahwa mesin virtual saya kekurangan memori.
Apa yang akan kita lakukan di contoh ini melatih ulang contoh machine learning yang tersedia untuk menggunakan data kita sendiri karena ini lebih cepat daripada melatih sebuah data set baru dari awal. Untuk penjelasan lebih lanjut tentang apa yang kita lakukan kamu bisa melihat Dokumentasi Tensor Flow Resmi.



Setelah kamu memasang Docker dan memulainya di mesinmu. Kamu harus menjalankannya dari terminal dan mendorong gambar. Contohnya saya menjalankannya di macOS, jadi perintahnya bisa jadi sedikit berbeda di platform-mu.
docker run -it -v $HOME/tf_files:/tf_files gcr.io/tensorflow/tensorflow:latest-devel cd /tensorflow git pull git checkout v1.0.1
Ketika semua telah selesai diatur, kamu harus memeiliki perintah yang mirip dengan ini:
root@1643721c503b:/tensorflow#
Pada titik ini kamu perlu seperangkan gambar untuk melatih TensorFlow saya menggunakan Fatkun Batch Download Image Chrome plugin untuk mengunduh gambar dari Google Search. Ketika plugin telah terpasan, kamu bisa mencari apapun yang ingin kamu klasifikasikan dan mulai memilih gambar yang ingin kamu simpan.



Untuk membuat penamaan jadi lebih mudah kamu juga bisa pergi ke bagian More Options dan membiarkan plugin mengganti nama gambar saat mengunduhnya.



Sekarang kamu perlu memindahkan gambar yang kamu gunakan ke folder tf_files di bawah direktori awal yang merupakan folder yang kita buat saat menginisialisasi mesin docker kita. Untuk contoh ini, direktori gambar saya disebut TensorFlowTrainingImages.. Tiap benda yang bisa diklasifikasikan memiliki foldernya sendiri seperti yang di bawah ini.



Ketika direktori siap, kamu bisa mulai melatih kembali perintah berikut dari Docker terminal.
python tensorflow/examples/image_retraining/retrain.py \ --bottleneck_dir=/tf_files/bottlenecks \ --how_many_training_steps 3000 \ --model_dir=/tf_files/inception \ --output_graph=/tf_files/graph.pb \ --output_labels=/tf_files/labels.txt \ --image_dir /tf_files/TensorFlowTrainingImages
Perintah di atas akan menggenerasi bottlenecks yang secara esensial adalah data yang digunakan oleh klasifikasi akhir untuk membagikan data dan sebuah berkas grafik dan label yang digunakan untuk klasifikasi.
Dari poin ini keepannya, operasi yang kita jalankan dengan Tensorflow bisa berlangsung mulai dari beberapa menit hingga berjam-jam, tergantung dari kecepatan komputermu. Ini bisa jadi bagus untuk membuat kopi dan sedikit berjalan-jalan.
Sementara perintah latihan berjalan kamu harusnya melihat banyak output di terminal seperti ini:
2017-04-12 18:21:28.495685: Step 130: Train accuracy = 95.0% 2017-04-12 18:21:28.495779: Step 130: Cross entropy = 0.250339 2017-04-12 18:21:28.748928: Step 130: Validation accuracy = 92.0% (N=100)
Ketika bottleneck telah digenerasi kamu akan memili berkas graph.pb dan labels.txt yang mewakili datamu. Sementara format ini bekerja baik saat mengklasifikasikan di koomputermu, mereka cenderung tidak bekerja ketika diletakkan di aplikasi Android. Kamu harus mengoptimasinya.
Mulai dengen menjalankan perintah berikut. Terima semua nilai awal.
./configure Please specify the location of python. [Default is /usr/bin/python]: Please specify optimization flags to use during compilation [Default is -march=native]: Do you wish to use jemalloc as the malloc implementation? (Linux only) [Y/n] jemalloc enabled on Linux Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] No Google Cloud Platform support will be enabled for TensorFlow Do you wish to build TensorFlow with Hadoop File System support? [y/N] No Hadoop File System support will be enabled for TensorFlow Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N] No XLA support will be enabled for TensorFlow Found possible Python library paths: /usr/local/lib/python2.7/dist-packages /usr/lib/python2.7/dist-packages Please input the desired Python library path to use. Default is [/usr/local/lib/python2.7/dist-packages] Using python library path: /usr/local/lib/python2.7/dist-packages Do you wish to build TensorFlow with OpenCL support? [y/N] No OpenCL support will be enabled for TensorFlow Do you wish to build TensorFlow with CUDA support? [y/N] No CUDA support will be enabled for TensorFlow Configuration finished Extracting Bazel installation... .............. INFO: Starting clean (this may take a while). Consider using --expunge_async if the clean takes more than several minutes. ............ INFO: All external dependencies fetched successfully.
Ketika konfigurasi telah selesai, jalankan perintah berikut untuk mengatur alat optimasi. Tahap ini memakan sejam di mesinku, sabar adalah kuncinya!
bazel build tensorflow/python/tools:optimize_for_inference
Ketika optimasi telah dibuat, kamu bisa menggunakannya untuk mengoptimasi berkas graph-mu.
bazel-bin/tensorflow/python/tools/optimize_for_inference \ --input=/tf_files/graph.pb \ --output=/tf_files/optimized_graph.pb \ --input_names=Mul \ --output_names=final_result
Sekarang kamu telah mengoptimasi graph yang digenerasi, kamu bisa mencarinya dengan labelmu di folder tf_files di direktori awal.



Menambahkan Custom Classifier ke Contoh Android Things
Selamat! Menggenerasi graph dan label TensorFlow adalah bagian sulitnya dan butuh kecerdikkan untuk membuatnya secara benar. Sekarang kamu memilikinya, ini waktunya untuk mengubah contoh Android Things untuk menggunakan data kita. Pertama, pergi ke berkas build.grandle dan hapus bagian berikut beserta deklarasi plugin-nya.
apply plugin: 'de.undercouch.download' // Download model zip file into ../../assets directory // unzip it to demo project's own ./assets directory import de.undercouch.gradle.tasks.download.Download task downloadFile(type: Download) { src 'https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip' dest projectDir.toString() + '/../../assets/inception.zip' } task unzip(type: Copy) { from zipTree(projectDir.toString() + '/../../assets/inception.zip') into file(projectDir.toString() + '/assets') } unzip.dependsOn downloadFile project.afterEvaluate { if (!(new File(projectDir.toString() + '/assets')).exists()) { preBuild.dependsOn unzip } }
Kode di atas mengunduh contoh graph dan label dari Google dan menambahkannya ke folder assets. Semenjak kita menggenari milik kita sendiri, kita tidak perlu khawatir mengenainya dan bisa menghapusnya.
Selanjutnya buka berkas TensorFlowImageClassifier.java. Kamu harusnya melihat beberapa variabel terdeklarasi di bagian atas berkas dengan sebuah komentar panjang mengenai apa yang perlu diubah jika kamu menggunakan graph-mu sendiri yang digenerasi dari sebuah lab kode (yang dekat dengan apa yang telah kita lakukan)
// These are the settings for the original v1 Inception model. If you want to // use a model that's been produced from the TensorFlow for Poets codelab, // you'll need to set IMAGE_SIZE = 299, IMAGE_MEAN = 128, IMAGE_STD = 128, // INPUT_NAME = "Mul:0", and OUTPUT_NAME = "final_result:0". // You'll also need to update the MODEL_FILE and LABEL_FILE paths to point to // the ones you produced. public static final int INPUT_SIZE = 224; // Note: the actual number of classes for Inception is 1001, but the output layer size is 1008. private static final int NUM_CLASSES = 1008; private static final int IMAGE_MEAN = 117; private static final float IMAGE_STD = 1; private static final String INPUT_NAME = "input:0"; private static final String OUTPUT_NAME = "output:0"; private static final String MODEL_FILE = "file:///android_asset/tensorflow_inception_graph.pb"; private static final String LABEL_FILE = "file:///android_asset/imagenet_comp_graph_label_strings.txt";
Ubah bagian akhir dari MODEL_FILE
dan LABEL_FILE
agar memiliki nama yang sama dengan graph dan label teroptimasimu.
private static final String MODEL_FILE = "file:///android_asset/optimized_graph.pb"; private static final String LABEL_FILE = "file:///android_asset/labels.txt";
Kembali ke komentar panjang di berkas asli, mari melangkah dan mengubah berkasnya agar cocok dengan rekomendasi Google.
public static final int NUM_CLASSES = 4; public static final int INPUT_SIZE = 299; public static final int IMAGE_MEAN = 128; public static final float IMAGE_STD = 128; public static final String INPUT_NAME = "Mul"; public static final String OUTPUT_NAME = "final_result";
Kamu akan menyadari kita mengatur NUM_CLASSES
ke 4
. Ini adalah angka dari item tersedia untuk algoritma machine learning kita untuk diklasifikasikan. Kamu bisa menggantinya dengan kategori yang telah kamu latih.
Untuk mempersingkatnya, pindahkan graph dan label teroptimasimu ke direktori app/src/main/assets. Setelah selesai, kamu bisa memasang contoh aplikasi ke sebuah Raspberry Pi dengan modul kamera dan mengambil gambar. Di bawah ini adalah gambar yang saya ambil dengan perangkatnya.



Dan hasil yang dikirim ke Firebase (dengan sedikit modifikasi ke berkas contoh).



Kesimpulan
Di tutorial ini kamu mendapat pengantar singkat menggunakan TensorFlow untuk machine learning dan mengintegrasikannya dengan aplikasi Android Things. Seperti yang telah kamu lihat, machine learning adalah sebuah alat yang kuat yang bisa digunakan untuk menyelesaikan banyak masalah yang aplikasi konvensional sulit untuk melakukannya. Ketika mengabungkan machine learning dengan Internet of Things kamu bisa membuat beberapa perangkat keren dan ebrguna yang berinteraksi dengan dunia di sekitarnya.
Menggunakan apa yang telah kamu pelajari dari artikel ini, dan lainnya dari Seri Android Things, kamu bisa membuat aplikasi dan perangkat yang keren!