Tutorial Menggunakan Machine Learning di Android dengan TFLite

Tutorial Menggunakan Machine Learning di Android dengan TFLite

Halo, kembali lagi dengan Series Machine Learning di Android. Pada artikel sebelumnya, kita sudah membahas Macam Cara Implementasi Machine Learning/AI di Aplikasi Android. Pada blog kali ini, kita akan mempraktikkan secara langsung salah satu framework yang disebutkan, yakni TensorFlow Lite (TFLite).

logo tensorflow lite, framework machine learning

TensorFlow Lite adalah versi ringan dan efisien dari framework Tensorflow yang sering digunakan Machine Learning Developer untuk mengembangkan dan men-deploy model. Ia didesain sedemikian rupa sehingga memungkinkan kita untuk menjalankan model pada perangkat dengan resource yang terbatas, seperti handphone dan embedded system.

💻 Mulai Belajar Pemrograman

Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.

Daftar Sekarang

Beberapa contoh aplikasi yang menggunakan TensorFlow Lite adalah Gmail, Google Assistant, Google Nest, dan Shazam. Tentu nama-nama yang tidak asing, bukan?

Untuk yang sudah terbiasa berkecimpung di dunia Android dan tak mau ketinggalan hype teknologi AI, kamu tentu tidak hanya ingin menjadi pemakai saja, kan? Kamu tentu mau tahu dong cara mengimplementasikan machine learning di Android. 

Nah, pada tutorial ini, kita akan membuat aplikasi klasifikasi objek dengan menggunakan TFLite. Menariknya, kamu tidak perlu tahu pemahaman machine learning yang mendalam untuk mengikuti tutorial ini. Penasaran? Yuk, simak langkah-langkahnya dan buat aplikasi AI pertamamu!

Persiapan Project

Supaya kamu bisa fokus praktik tentang penerapan TFLite, kami sudah menyediakan starter project yang berisi fungsi dasar kamera dengan menggunakan CameraX, sebuah library dari Android Jetpack untuk menampilkan kamera di dalam aplikasi secara langsung dengan lebih mudah. 

Sebenarnya ada banyak cara untuk mendapatkan gambar di dalam aplikasi, seperti memilih gambar dari galeri atau memanfaatkan kamera bawaan menggunakan Camera Intent. Namun, di sini kita menggunakan CameraX supaya bisa menganalisis gambar secara real-time. Selain itu, di dalam CameraX juga terdapat ImageAnalysis yang bisa kita integrasikan dengan TFLite.

Okay, sekarang silakan langsung unduh atau clone proyek awal berikut:

Silakan buka proyek tersebut dengan menggunakan Android Studio. Jika kita perhatikan, di dalamnya sudah ada beberapa penambahan kode seperti berikut.

  • Dependensi library CameraX di dalam build.gradle.kts.
  • PreviewView dari CameraX dan TextView pada activity_main.xml.
  • Pendefinisian Camera permission di dalam AndroidManifest.xml.
  • Proses request Camera permission, inisialisasi ProcessCameraProvider untuk menampilkan kamera, dan implementasi ViewBinding di dalam MainActivity.

Berikut adalah tampilan aplikasi dari starter project jika dijalankan.

starter project camera tensorflow lite, frame work machine learning

Setelah memberikan akses kamera, aplikasi dapat menampilkan kamera secara langsung.

Persiapan Model TFLite

Jika kamu sudah memiliki TensorFlow Model, konversi terlebih dahulu menjadi TensorFlow Lite Model dengan ekstensi .tflite. Alhasil, ukurannya menjadi lebih kecil, lebih efisien, dan mendukung framework TensorFlow Lite.

Apabila tidak memiliki model sendiri, kamu bisa memanfaatkan TensorFlow Lite Model Maker untuk melakukan transfer learning. Transfer learning adalah pendekatan untuk menggunakan model yang telah dilatih sebelumnya dalam mengerjakan tugas tertentu. Ini digunakan sebagai titik awal untuk membuat model baru dengan tugas serupa. 

Jika kamu tidak memiliki latar belakang machine learning sebelumnya, kamu juga bisa memanfaatkan TensorFlow Hub untuk mencari referensi model yang sudah paten. Nah, pada latihan ini kita akan menggunakan model berikut untuk melakukan deteksi objek.

Silakan unduh model tersebut dan import ke dalam Android Studio dengan cara klik kanan pada folder app dan pilih New → Other → TensorFlow Lite Model. Dari sini, Anda jadi tahu kan bahwa sebenarnya Android Studio sudah bersahabat baik, lo dengan TFLite. Buktinya sudah ada fiturnya langsung untuk import dalam Android Studio.

import TensorFlow Lite Model in Android Studio

Kemudian, pilih file tadi yangsudah diunduh pada Model location dan beri centang pada semua opsi.

Import TensorFlow Lite model

Klik Finish dan lihatlah sekarang file tersebut terdapat di folder app/ml. Kamu pun dapat membaca metadata dari file tersebut berkat library yang ditambahkan sebelumnya.

Model Metadata in Android Studio

File ini nanti dapat diakses layaknya asset dengan adanya penambahan konfigurasi pada build.gradle.kts.


Oke, sekarang model sudah siap, saatnya menambahkan library utama dari TensorFlow Lite untuk pemrosesan machine learning. Karena klasifikasi objek termasuk dalam kategori task-vision, tambahkan dependensi berikut pada build.gradle.kts.


Jangan lupa untuk melakukan Sync Now setiap kali menambahkan library baru pada konfigurasi Gradle untuk mengunduhnya.

Membuat Helper TFLite

Setelah semua persiapan usai, kita akan membuat kelas helper untuk memudahkan kita mengelompokkan fungsi yang digunakan untuk melakukan proses ML. Selain itu, kode menjadi lebih rapi dan bersih dengan pemisahan ini.

Pertama, buat dulu class baru dengan cara klik kanan pada nama package dan pilih new → Kotlin Class/File. Kemudian tambahkan parameter dan listener seperti berikut.


Listener di sini berfungsi untuk memberi tahu class utama ketika proses yang dilakukan berhasil atau gagal. Apabila proses berhasil, fungsi onResults yang dipanggil. Namun jika proses gagal, fungsi onError yang dipanggil. Inilah yang disebut dengan callback.

Selanjutnya, buat fungsi baru bernama setupImageClassifier dan panggil di dalam init supaya fungsi ini terpanggil setiap kali kelas ini dibuat.


Di sini kita menyiapkan beberapa konfigurasi pada TensorFlow Lite sebelum melakukan pemrosesan. Berikut adalah fungsi yang digunakan.

  • setScoreThreshold: Menentukan batas minimal keakuratan dari hasil yang ditampilkan. 0.1 artinya 10%.
  • setMaxResults: Menentukan batas maksimal jumlah hasil yang ditampilkan. 
  • setNumThreads: Menentukan jumlah thread yang digunakan untuk melakukan pemrosesan ML.
  • createFromFileAndOptions: Membuat ImageClassifier berdasarkan asset file model dan option yang didefinisikan sebelumnya.

Catatan:
Sebenarnya juga ada fungsi baseOptionsBuilder.useGpu() jika kamu ingin menentukan jalannya pemrosesan dilakukan di GPU, alih-alih di CPU. Namun, kamu perlu menambahkan library tensorflow-lite-gpu.

Mari kita lanjutkan penulisan kodenya. Masih pada berkas ImageClassifierHelper, buat sebuah fungsi baru untuk melakukan pemrosesan klasifikasi seperti berikut.


Di awal, kita periksa dulu instance ImageClassifier masih null atau tidak. Jika tidak, kita lanjut mengubah image buffer menjadi Bitmap dengan fungsi createBitmap. Setelah itu, buat TensorImage dari Bitmap tadi menggunakan fungsi process

Setelah itu, kita siapkan juga ImageProcessingOptions untuk mengatur orientasi gambar input sesuai dengan gambar yang ada pada model. Hal ini diperlukan supaya hasil yang diberikan akurat. 

Sebagai catatan, karena fungsi yang disediakan adalah setOrientation, kita perlu membuat fungsi baru untuk mengonversi rotationDegress menjadi orientation seperti contoh di atas.

Setelah kedua objek tersebut siap, kamu dapat memanggil fungsi classify untuk memulai proses pengklasifikasian. Selain itu, kamu juga membuat variabel inferenceTime guna menghitung waktu yang dibutuhkan untuk melakukan pemrosesan. 

Terakhir, kita menyimpan data yang dihasilkan melalui fungsi imageClassifierListener?.onResults.

Alhasil, keseluruhan kode pada ImageClassifierHelper menjadi seperti berikut.

Integrasi CameraX dengan TFLite

Setelah kelas helper sudah siap, kita akan mengintegrasikan ImageClassifier dengan CameraX dengan memanfaatkan ImageAnalysis sebagai UseCase pada argument terakhir fungsi bindToLifecycle.


Pertama, kita inisialisasi dulu kelas ImageClassifierHelper dengan argument Context dan ClassifierListener. Untuk argument lain, kamu dapat mengubahnya atau membuat setting untuk pengaturan tersebut jika mau. Namun, pada latihan ini kita memanfaatkan default argument supaya tetap simpel.

Pada callback ClassifierListener, kita menampilkan Toast ketika terjadi error. Sedangkan apabila berhasil, kita menampilkan hasilnya dalam sebuah TextView. Tak lupa data yang ditampilkan diurutkan dulu dari skor (baca: keakuratan) tertinggi dan diubah dalam bentuk persentase. 

Jangan lupa untuk menggunakan block runOnUiThread karena pada dasarnya kita tidak dapat meng-update UI dari background thread. Untuk itu, perlu diubah dulu menjadi UI thread dengan menggunakan block tersebut.

Kemudian ketika inisialisasi ImageAnalysis, kamu mengatur beberapa hal berikut.

  • setTargetAspectRatio: Mengatur rasio aspek target gambar. Dalam hal ini, rasio aspek ditetapkan sebagai 4:3 supaya sesuai dengan model TFLite.
  • setTargetRotation: Mengatur rotasi target gambar berdasarkan rotasi tampilan yang terkait dengan viewFinder. Ini memastikan bahwa gambar yang dianalisis sesuai dengan orientasi layar.
  • setBackpressureStrategy: Mengatur strategi untuk mengatasi masalah penundaan dalam pemrosesan gambar. STRATEGY_KEEP_ONLY_LATEST memungkinkan analisis hanya menggunakan gambar terbaru jika gambar-gambar sebelumnya belum selesai diproses.
  • setOutputImageFormat: Mengatur format gambar keluaran yang dihasilkan oleh ImageAnalysis menjadi RGBA 8888. Ini adalah format gambar yang mengandung komponen warna merah, hijau, biru, dan alfa dengan 8 bit per komponen.
  • setAnalyzer: Di sini, kita mengatur analisis gambar dengan menjalankan sebuah executor tunggal yang akan menjalankan fungsi lambda yang akan menerima gambar sebagai input dan kemudian memanggil metode classify dari objek imageClassifierHelper untuk mengklasifikasikan gambar tersebut.

Setelah ImageAnalysis siap, sematkan objek tersebut pada argument keempat fungsi bindToLifecycle yang merupakan fitur untuk menambahkan use case tertentu pada CameraX, seperti analisis gambar di atas.

Oke, aplikasi untuk analisis sudah jadi. Mari, kita jalankan aplikasi pada perangkat dan lihat hasilnya.

Wih, mantap! Keren, bukan? Dengan kode yang tidak terlalu kompleks, kamu sudah dapat membuat aplikasi sendiri yang menerapkan machine learning untuk klasifikasi objek. Dapat dilihat bahwa data yang dihasilkan berjumlah tiga dan threshold di atas 10% sesuai dengan yang didefinisikan di konfigurasi.

Untuk melihat hasil jadi proyek, Anda dapat melihatnya pada tautan berikut.

 

Apabila mengikuti tutorial ini dengan sungguh-sungguh, kamu menjadi memiliki kemampuan dasar untuk menerapkan TensorFlow Lite untuk semua jenis pemrosesan. Karena pada dasarnya semua jenis pemrosesan vision, memiliki dasar yang sama. Jadi, jika kamu ingin mengubahnya menjadi deteksi teks atau deteksi objek, tidak akan membutuhkan waktu yang lama.

Jika ingin belajar lebih dalam lagi terkait CameraX ataupun dasar pembuatan aplikasi lain, kamu juga dapat belajar di kelas Belajar Pengembangan Aplikasi Android Intermediate

Harapannya, dengan memiliki dasar ini, kamu dapat membuat berbagai macam aplikasi sebagai solusi untuk permasalahan di sekitar kamu dengan memanfaatkan AI. Jika kamu memiliki ide aplikasi apa pun itu, silakan dituliskan di kolom komentar, ya! Semangat dan wujudkan aplikasi AI-mu!


Belajar Pemrograman Gratis
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.