Membuat dan men-deploy model deteksi objek kustom dengan TensorFlow Lite (Android)

1. Sebelum memulai

Dalam codelab ini, Anda akan mempelajari cara melatih model deteksi objek kustom menggunakan serangkaian gambar pelatihan denganPembuat Model TFLite, lalu deploy model Anda ke aplikasi Android menggunakanLibrary Tugas TFLite data. Anda akan:

  • Buat aplikasi Android yang mendeteksi bahan dalam gambar makanan.
  • Integrasikan model deteksi objek terlatih TFLite dan lihat batas dari apa yang dapat dideteksi model.
  • Latih model deteksi objek kustom untuk mendeteksi bahan/komponen makanan menggunakan set data kustom yang disebut salad dan TFLite Model Maker.
  • Deploy model kustom ke aplikasi Android menggunakan TFLite Task Library.

Pada akhirnya, Anda akan membuat sesuatu yang mirip dengan gambar di bawah:

b9705235366ae162.png

Prasyarat

Codelab ini dirancang untuk developer seluler berpengalaman yang ingin mendapatkan pengalaman dengan Machine Learning. Anda harus memahami:

  • Pengembangan Android menggunakan Kotlin dan Android Studio
  • Sintaksis Python dasar

Yang akan Anda pelajari

  • Cara melatih model deteksi objek kustom menggunakan TFLite Model Maker.
  • Cara men-deploy model deteksi objek TFLite menggunakan TFLite Task Library.

Yang Anda butuhkan

  • Versi terbaru Android Studio (v4.2+)
  • Android Studio Emulator atau perangkat Android fisik
  • Kode contoh
  • Pengetahuan dasar tentang pengembangan Android di Kotlin

2. Deteksi Objek

Deteksi objek adalah serangkaian tugas computer vision yang dapat mendeteksi dan menemukan objek dalam gambar digital. Dalam gambar atau streaming video, model deteksi objek dapat mengidentifikasi mana dari objek yang diketahui tersebut yang mungkin ada, dan memberikan informasi tentang posisinya dalam gambar.

TensorFlow menyediakan model terlatih yang dioptimalkan untuk seluler yang dapat mendeteksi objek umum, seperti mobil, jeruk, dll. Anda dapat mengintegrasikan model terlatih ini di aplikasi seluler Anda hanya dengan beberapa baris kode. Namun, Anda mungkin ingin atau perlu mendeteksi objek dalam kategori yang lebih unik atau unik. Anda harus mengumpulkan gambar pelatihan Anda sendiri, lalu melatih dan men-deploy model deteksi objek Anda sendiri.

TensorFlow Lite

TensorFlow Lite adalah library machine learning lintas platform yang dioptimalkan untuk menjalankan model machine learning di perangkat edge, termasuk perangkat seluler Android dan iOS.

TensorFlow Lite sebenarnya adalah mesin inti yang digunakan di dalam ML Kit untuk menjalankan model machine learning. Ada dua komponen dalam ekosistem TensorFlow Lite yang memudahkan pelatihan dan deployment model machine learning pada perangkat seluler:

  • Model Maker adalah library Python yang memudahkan pelatihan model TensorFlow Lite menggunakan data Anda sendiri hanya dengan beberapa baris kode, tanpa memerlukan keahlian machine learning.
  • Task Library adalah library lintas platform yang memudahkan deployment model TensorFlow Lite hanya dengan beberapa baris kode di aplikasi seluler Anda.

Codelab ini berfokus pada TFLite. Konsep dan blok kode yang tidak relevan dengan TFLite dan deteksi objek tidak dijelaskan dan disediakan cukup dengan menyalin dan menempelkan.

3 Memulai persiapan

Download Kode

Klik link berikut untuk mendownload semua kode untuk codelab ini:

Mengekstrak file zip yang didownload. Ini akan mengekstrak folder root (odml-pathways-main) dengan semua resource yang Anda butuhkan. Untuk codelab ini, Anda hanya memerlukan sumber di subdirektori object-detection/codelab2/android.

Subdirektori android dalam repositori object-detection/codelab2/android berisi dua direktori:

  • android_studio_folder.pngstarter—Kode awal yang Anda build untuk codelab ini.
  • android_studio_folder.pngfinal—Kode lengkap untuk aplikasi contoh yang sudah selesai.

Mengimpor aplikasi awal

Mari mulai dengan mengimpor aplikasi awal ke Android Studio.

  1. Buka Android Studio dan pilih Import Project (Gradle, Eclipse ADT, etc.)
  2. Buka folder starter dari kode sumber yang Anda download sebelumnya.

7c0f27882a2698ac.png

Untuk memastikan bahwa semua dependensi tersedia untuk aplikasi Anda, Anda harus menyinkronkan project dengan file gradle saat proses impor selesai.

  1. Pilih Sync Project with Gradle Files ( b451ab2d04d835f9.png) dari toolbar Android Studio. Impor starter/app/build.gradle

Menjalankan aplikasi awal

Setelah mengimpor project ke Android Studio, Anda siap menjalankan aplikasi untuk pertama kalinya.

Hubungkan perangkat Android melalui USB ke komputer atau mulai emulator Android Studio, dan klik Run ( execute.png) di toolbar Android Studio.

4. Memahami aplikasi awal

Agar codelab ini tetap sederhana dan berfokus pada bit machine learning, aplikasi awal berisi beberapa kode boilerplate yang melakukan beberapa hal untuk Anda:

  • Aplikasi ini dapat mengambil foto menggunakan kamera perangkat.
  • Ini berisi beberapa gambar stok bagi Anda untuk mencoba deteksi objek pada emulator Android.
  • Ini memiliki metode yang mudah untuk menggambar hasil deteksi objek pada bitmap input.

Anda akan sering berinteraksi dengan metode ini dalam kerangka aplikasi:

  • fun runObjectDetection(bitmap: Bitmap) Metode ini dipanggil saat Anda memilih gambar preset atau mengambil foto. bitmap adalah gambar input untuk deteksi objek. Nanti dalam codelab ini, Anda akan menambahkan kode deteksi objek ke metode ini.
  • data class DetectionResult(val boundingBoxes: Rect, val text: String) Ini adalah class data yang mewakili hasil deteksi objek untuk visualisasi. boundingBoxes adalah persegi panjang tempat objek ditemukan, dan text adalah string hasil deteksi yang akan ditampilkan bersama dengan kotak pembatas objek.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<DetectionResult>): Bitmap Metode ini menggambar hasil deteksi objek dalam detectionResults pada bitmap input dan menampilkan salinannya yang dimodifikasi.

Berikut adalah contoh output metode utilitas drawDetectionResult.

f6b1e6dad726e129.png

5. Menambahkan deteksi objek di perangkat

Sekarang Anda akan mem-build prototipe dengan mengintegrasikan model TFLite terlatih yang dapat mendeteksi objek umum ke dalam aplikasi awal.

Mendownload model deteksi objek TFLite yang telah dilatih

Ada beberapa model pendeteksi objek di TensorFlow Hub yang dapat Anda gunakan. Untuk codelab ini, Anda akan mendownload model pendeteksi Objek EfisienDet-Lite, yang dilatih di set data COCO 2017, yang dioptimalkan untuk TFLite, dan dirancang untuk performa di CPU seluler, GPU, dan EdgeTPU.

Selanjutnya, gunakan Library Tugas TFLite untuk mengintegrasikan model TFLite yang telah dilatih ke dalam aplikasi awal. Library Tugas TFLite memudahkan integrasi model machine learning yang dioptimalkan untuk seluler ke dalam aplikasi seluler. Framework ini mendukung banyak kasus penggunaan machine learning yang populer, termasuk deteksi objek, klasifikasi gambar, dan klasifikasi teks. Anda dapat memuat model TFLite dan menjalankannya hanya dengan beberapa baris kode.

Menambahkan model ke aplikasi awal

  1. Salin model yang baru saja Anda download ke folder assets aplikasi awal. Anda dapat menemukan folder di panel navigasi Project di Android Studio.

c2609599b7d22641.png

  1. Beri nama file model.tflite.

c83e9397177c4561.png

Memperbarui dependensi Library Tugas file Gradle

Buka file app/build.gradle dan tambahkan baris ini ke dalam konfigurasi dependencies:

implementation 'org.tensorflow:tensorflow-lite-task-vision:0.3.1'

Menyinkronkan project dengan file gradle

Untuk memastikan bahwa semua dependensi tersedia untuk aplikasi Anda, Anda harus menyinkronkan project dengan file gradle pada tahap ini. Pilih Sync Project with Gradle Files ( b451ab2d04d835f9.png) dari toolbar Android Studio.

(Jika tombol ini dinonaktifkan, pastikan Anda hanya mengimpor starter/app/build.gradle, bukan seluruh repositori.)

Menyiapkan dan menjalankan deteksi objek di perangkat pada gambar

Hanya ada 3 langkah mudah dengan 3 API untuk memuat dan menjalankan model deteksi objek:

  • siapkan gambar / streaming: TensorImage
  • buat objek detektor: ObjectDetector
  • hubungkan 2 objek di atas: detect(image)

Anda mencapainya di dalam fungsi runObjectDetection(bitmap: Bitmap) dalam file MainActivity.kt.

/**
* TFLite Object Detection Function
*/
private fun runObjectDetection(bitmap: Bitmap) {
    //TODO: Add object detection code here
}

Saat ini fungsi tersebut kosong. Lanjutkan ke langkah berikut untuk menerapkan detektor objek TFLite. Seiring berjalannya waktu, Android Studio akan meminta Anda untuk menambahkan impor yang diperlukan:

  • org.tensorflow.lite.support.image.TensorImage
  • org.tensorflow.lite.task.vision.detector.ObjectDetector

Membuat Objek Gambar

Gambar yang akan Anda gunakan untuk codelab ini akan berasal dari kamera di perangkat atau gambar preset yang Anda pilih di UI aplikasi. Gambar input didekode ke dalam format Bitmap dan diteruskan ke metode runObjectDetection.

TFLite menyediakan API sederhana untuk membuat TensorImage dari Bitmap. Tambahkan kode di bawah ini ke bagian atas runObjectDetection(bitmap:Bitmap):

// Step 1: create TFLite's TensorImage object
val image = TensorImage.fromBitmap(bitmap)

Membuat instance Pendeteksi

Library Tugas TFLite mengikuti Pola Desain Builder. Anda meneruskan konfigurasi ke builder, lalu mendapatkan pendeteksi darinya. Ada beberapa opsi untuk mengonfigurasi, termasuk untuk menyesuaikan sensitivitas detektor objek:

  • hasil maks (jumlah maksimum objek yang harus dideteksi model)
  • nilai minimum skor (seberapa yakin detektor objek seharusnya menampilkan objek yang terdeteksi)
  • memberi label/tolak daftar (izinkan/tolak objek dalam daftar standar)

Inisialisasi instance detektor objek dengan menentukan nama file model TFLite dan opsi konfigurasi:

// Step 2: Initialize the detector object
val options = ObjectDetector.ObjectDetectorOptions.builder()
    .setMaxResults(5)
    .setScoreThreshold(0.5f)
    .build()
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "model.tflite", // must be same as the filename in assets folder
    options
)

Feed Gambar ke detektor

Tambahkan kode berikut ke fun runObjectDetection(bitmap:Bitmap). Tindakan ini akan mengirimkan gambar Anda ke pendeteksi.

// Step 3: feed given image to the model and print the detection result
val results = detector.detect(image)

Setelah selesai, detektor menampilkan daftar Detection, masing-masing berisi informasi tentang objek yang ditemukan model dalam gambar. Setiap objek dijelaskan dengan:

  • boundingBox: persegi panjang yang mendeklarasikan keberadaan objek dan lokasinya dalam gambar
  • categories: jenis objek apa dan seberapa yakin model dengan hasil deteksi. Model ini menampilkan beberapa kategori, dan yang paling yakin adalah yang pertama.
  • label: nama kategori objek.
  • classificationConfidence:float antara 0,0 hingga 1,0, dengan 1,0 mewakili 100%

Tambahkan kode berikut ke fun runObjectDetection(bitmap:Bitmap). Tindakan ini akan memanggil metode untuk mencetak hasil deteksi objek ke Logcat.

// Step 4: Parse the detection result and show it
debugPrint(results)

Kemudian tambahkan metode debugPrint() ini ke class MainActivity:

private fun debugPrint(results : List<Detection>) {
    for ((i, obj) in results.withIndex()) {
        val box = obj.boundingBox

        Log.d(TAG, "Detected object: ${i} ")
        Log.d(TAG, "  boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")

        for ((j, category) in obj.categories.withIndex()) {
            Log.d(TAG, "    Label $j: ${category.label}")
            val confidence: Int = category.score.times(100).toInt()
            Log.d(TAG, "    Confidence: ${confidence}%")
        }
    }
}

Kini, detektor objek Anda sudah siap. Kompilasi dan jalankan aplikasi dengan mengklik Run ( execute.png) di toolbar Android Studio. Setelah aplikasi muncul di perangkat, ketuk gambar preset untuk memulai detektor objek. Kemudian lihat jendela Logcat*(* 16bd6ea224cf8cf1.png*)* di dalam IDE, dan Anda akan melihat sesuatu yang mirip dengan ini:

D/TFLite-ODT: Detected object: 0
D/TFLite-ODT:   boundingBox: (0.0, 15.0) - (2223.0,1645.0)
D/TFLite-ODT:     Label 0: dining table
D/TFLite-ODT:     Confidence: 77%
D/TFLite-ODT: Detected object: 1
D/TFLite-ODT:   boundingBox: (702.0, 3.0) - (1234.0,797.0)
D/TFLite-ODT:     Label 0: cup
D/TFLite-ODT:     Confidence: 69%

Hal ini memberi tahu Anda bahwa pendeteksi melihat 2 objek. Yang pertama adalah:

  • Sebuah objek berada di dalam persegi panjang (0, 15) – (2223, 1645)
  • Label adalah tabel makan
  • Model ini yakin bahwa yang pertama adalah meja makan (77%)

Secara teknis, itulah yang Anda butuhkan agar Library Tugas TFLite dapat berfungsi: Anda sudah mendapatkan semuanya saat ini. Selamat.

Namun, di sisi UI, Anda masih berada di titik awal. Sekarang Anda harus memanfaatkan hasil yang terdeteksi pada UI, dengan memproses hasil yang terdeteksi.

6. Menggambar hasil deteksi pada gambar input

Pada langkah sebelumnya, Anda telah mencetak hasil deteksi ke logcat: sederhana dan cepat. Pada langkah ini, Anda akan menggunakan metode utilitas yang telah diimplementasikan untuk Anda di aplikasi awal, untuk:

  • menggambar kotak pembatas pada gambar
  • gambar nama kategori dan persentase keyakinan dalam kotak pembatas
  1. Ganti panggilan debugPrint(results) dengan cuplikan kode berikut:
val resultToDisplay = results.map {
    // Get the top-1 category and craft the display text
    val category = it.categories.first()
    val text = "${category.label}, ${category.score.times(100).toInt()}%"

    // Create a data object to display the detection result
    DetectionResult(it.boundingBox, text)
}
// Draw the detection result on the bitmap and show it.
val imgWithResult = drawDetectionResult(bitmap, resultToDisplay)
runOnUiThread {
    inputImageView.setImageBitmap(imgWithResult)
}
  1. Sekarang klik Run ( execute.png) di toolbar Android Studio.
  2. Setelah aplikasi dimuat, ketuk salah satu gambar preset untuk melihat hasil deteksi.

Ingin mencoba dengan foto Anda sendiri? Ketuk tombol Ambil foto dan ambil beberapa foto objek di sekitar Anda.

8b024362b15096a6.png

7. Melatih model deteksi objek kustom

Pada langkah sebelumnya, Anda mengintegrasikan model deteksi objek TFLite terlatih ke aplikasi Android dan melihat sendiri bahwa model tersebut dapat mendeteksi objek umum, seperti mangkuk atau meja makan, dalam gambar sampel. Namun, sasaran Anda adalah mendeteksi bahan masakan pada gambar, sehingga deteksi objek umum tidak sesuai dengan kasus penggunaan Anda. Anda ingin melatih model deteksi objek kustom menggunakan set data pelatihan dengan bahan yang ingin dideteksi.

Berikut adalah set data yang berisi gambar dan label yang dapat digunakan untuk melatih model kustom Anda sendiri. Kode ini dibuat menggunakan gambar dari Open Image Dataset V4.

Colaboratory

Selanjutnya, buka Google Colab untuk melatih model kustom.

Diperlukan waktu sekitar 30 menit untuk melatih model kustom.

Jika Anda sedang sibuk, Anda dapat mendownload model yang telah kami latih untuk Anda pada set data yang disediakan dan melanjutkan ke langkah berikutnya.

8 Mengintegrasikan model TFLite kustom ke aplikasi Android

Setelah Anda melatih model deteksi salad, mengintegrasikannya, dan mengubah aplikasi dari pendeteksi objek umum menjadi pendeteksi salad, khususnya.

  1. Salin model TFLite salad ke folder assets. Beri nama model baru salad.tflite.

91e8d37c4f78eddb.png

  1. Buka file MainActivity.kt dan temukan kode inisialisasi ObjectDetector.
  2. Ganti model efficiencyDet-Lite (model.tflite) dengan model salad (salad.tflite)
val detector = ObjectDetector.createFromFileAndOptions(
    this, // the application context
    "salad.tflite", // must be same as the filename in assets folder
    options
)
  1. Klik Run ( execute.png) pada toolbar Android Studio untuk menjalankan kembali aplikasi dengan model baru. Voilà! Aplikasi ini sekarang dapat mengenali keju, salad, dan makanan yang dipanggang.

b9705235366ae162.png

9. Selamat!

Anda telah menggunakan TFLite untuk melatih model kustom dan menambahkan kemampuan Deteksi Objek ke aplikasi. Hanya itu yang Anda perlukan untuk mengaktifkan dan menjalankan!

Yang telah kita bahas

  • Cara menemukan model deteksi objek TFLite yang terlatih di TensorFlow Hub
  • Cara mengintegrasikan model deteksi penolakan ke aplikasi Android Anda menggunakan Task TFLite Library
  • Cara melatih model deteksi objek kustom dengan TFLite Model Maker

Langkah Berikutnya

  • Menggunakan Firebase untuk meningkatkan deployment model TFLite Anda
  • Kumpulkan data pelatihan untuk melatih model Anda sendiri
  • Menerapkan deteksi objek di aplikasi Android Anda sendiri

Pelajari Lebih Lanjut