Mendeteksi objek pada gambar dengan ML Kit: Android

1. Sebelum memulai

ML Kit adalah SDK seluler yang menghadirkan keahlian machine learning di perangkat Google ke aplikasi Android dan iOS. Anda dapat menggunakan Vision dan Natural Language API yang canggih namun mudah digunakan untuk mengatasi tantangan umum di aplikasi Anda atau membuat pengalaman pengguna yang baru. Semuanya didukung oleh model ML Google terbaik di kelasnya dan ditawarkan kepada Anda tanpa biaya.

Semua API ML Kit berjalan di perangkat, misalnya, sehingga memungkinkan kasus penggunaan real-time saat Anda ingin memproses streaming kamera live. Ini juga berarti bahwa fungsi tersebut tersedia secara offline.

Codelab ini akan memandu Anda melakukan langkah-langkah sederhana untuk menambahkan Deteksi dan Pelacakan Objek (ODT) untuk gambar tertentu ke dalam aplikasi Android yang sudah ada. Perlu diperhatikan bahwa codelab ini menggunakan beberapa pintasan untuk menyoroti penggunaan ODT ML Kit.

Yang akan Anda bangun

Dalam codelab ini, Anda akan membangun aplikasi Android dengan ML Kit. Aplikasi Anda akan menggunakan ML Kit Object Detection and Tracking API untuk mendeteksi objek dalam gambar tertentu.Pada akhirnya, Anda akan melihat sesuatu yang mirip dengan gambar di sebelah kanan.

Yang akan Anda pelajari

  • Cara mengintegrasikan ML Kit SDK ke dalam aplikasi Android Anda
  • API Deteksi dan Pelacakan Objek ML Kit

Yang Anda butuhkan

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

Codelab ini berfokus pada ML Kit. Konsep dan blok kode yang tidak relevan akan dibahas sekilas dan disediakan, jadi Anda cukup menyalin dan menempelkannya.

2. Memulai persiapan

Download Kode

Klik link berikut untuk mendownload semua kode untuk codelab ini:

Ekstrak file ZIP yang didownload. Tindakan ini akan mengekstrak folder root (mlkit-android-main) dengan semua resource yang Anda perlukan. Untuk codelab ini, Anda hanya memerlukan sumber di subdirektori object-detection.

Subdirektori deteksi objek di repositori mlkit-android berisi dua direktori:

  • android_studio_folder.pngstarter—Memulai kode yang Anda bangun untuk codelab ini.
  • android_studio_folder.pngfinal—Kode lengkap untuk aplikasi contoh yang telah selesai.

3. Menambahkan Deteksi Objek dan Tracking API ML Kit ke project

Mengimpor aplikasi ke Android Studio

Mari kita mulai dengan mengimpor aplikasi awal ke Android Studio.

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

7c0f27882a2698ac.pngS

Menambahkan dependensi untuk Deteksi dan Pelacakan Objek ML Kit

Dependensi ML Kit memungkinkan Anda mengintegrasikan ML Kit ODT SDK di aplikasi Anda. Tambahkan baris berikut ke akhir file app/build.gradle project Anda:

build.gradle

dependencies {
  // ...
  implementation 'com.google.mlkit:object-detection:16.2.4'
}

Menyinkronkan project dengan file gradle

Guna memastikan bahwa semua dependensi tersedia untuk aplikasi, 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.)

4. Menjalankan aplikasi awal

Setelah mengimpor project ke Android Studio dan menambahkan dependensi untuk Deteksi dan Pelacakan Objek ML Kit, Anda siap menjalankan aplikasi untuk pertama kalinya.

Hubungkan perangkat Android Anda melalui USB ke host, atau Mulai emulator Android Studio, lalu klik Run ( execute.png) di toolbar Android Studio.

Menjalankan dan menjelajahi aplikasi

Aplikasi akan diluncurkan di perangkat Android Anda. Library ini memiliki beberapa kode boilerplate yang memungkinkan Anda mengambil foto, atau memilih gambar preset, dan memasukkannya ke pipeline deteksi dan pelacakan objek yang akan Anda bangun di codelab ini. Mari kita pelajari aplikasi ini sebentar sebelum menulis kode.

Pertama, ada Tombol ( c6d965d639c3646.png) di bagian bawah untuk:

  • memunculkan aplikasi kamera yang terintegrasi di perangkat/emulator Anda
  • mengambil foto di dalam aplikasi kamera
  • menerima gambar yang diambil di aplikasi awal
  • tampilkan gambar

Coba tombol Ambil foto, ikuti petunjuk untuk mengambil foto, terima foto, dan amati foto yang ditampilkan di dalam aplikasi awal.

Ulangi beberapa kali untuk melihat cara kerjanya:

9ec541980dbe2d31.pngS 8312dde41425ba4b.pngS fa8492bfc1914ff0.png

Kedua, ada 3 gambar preset yang dapat Anda pilih. Anda dapat menggunakan image ini nanti untuk menguji kode deteksi objek jika Anda menjalankannya di Android emulator.

Pilih gambar dari 3 gambar preset. Lihat apakah gambar ditampilkan dalam tampilan yang lebih besar:

1dd41b3ec978f1d9.pngS

5. Menambahkan deteksi objek di perangkat

Pada langkah ini, Anda akan menambahkan fungsi ke aplikasi awal untuk mendeteksi objek dalam gambar. Seperti yang Anda lihat di langkah sebelumnya, aplikasi awal berisi kode boilerplate untuk mengambil foto dengan aplikasi kamera di perangkat. Ada juga 3 gambar preset di aplikasi yang dapat Anda coba deteksi objek jika menjalankan codelab di emulator Android.

Setelah Anda memilih gambar, baik dari gambar preset atau mengambil foto dengan aplikasi kamera, kode boilerplate akan mendekode gambar tersebut ke dalam instance Bitmap, menampilkannya di layar, dan memanggil metode runObjectDetection bersama gambar.

Pada langkah ini, Anda akan menambahkan kode ke metode runObjectDetection untuk melakukan deteksi objek.

Menyiapkan dan menjalankan deteksi objek di perangkat pada gambar

Hanya ada 3 langkah sederhana dengan 3 API untuk menyiapkan ML Kit ODT:

  • siapkan gambar: InputImage
  • buat objek detektor: ObjectDetection.getClient(options)
  • hubungkan 2 objek di atas: process(image)

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

/**
 * ML Kit Object Detection Function
 */
private fun runObjectDetection(bitmap: Bitmap) {
}

Saat ini fungsi tersebut kosong. Lanjutkan ke langkah berikut untuk menerapkan ML Kit ODT. Selama proses, Android Studio akan meminta Anda untuk menambahkan impor yang diperlukan:

  • com.google.mlkit.vision.common.InputImage
  • com.google.mlkit.vision.objects.ObjectDetection
  • com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

Langkah 1: Membuat InputImage

ML Kit menyediakan API sederhana untuk membuat InputImage dari Bitmap. Lalu, Anda dapat memasukkan InputImage ke dalam API ML Kit.

// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)

Tambahkan kode di atas ke bagian atas runObjectDetection(bitmap:Bitmap).

Langkah 2: Membuat instance detektor

ML Kit mengikuti Pola Desain Builder. Anda akan meneruskan konfigurasi ke builder, lalu mendapatkan deteksi dari builder tersebut. Ada 3 opsi untuk mengonfigurasi (opsi dalam cetak tebal digunakan dalam codelab ini):

  • mode detektor (gambar tunggal atau streaming)
  • mode deteksi (satu atau beberapa deteksi objek)
  • mode klasifikasi (aktif atau nonaktif)

Codelab ini ditujukan untuk gambar tunggal - deteksi beberapa objek & Klasifikasi kalimat tunggal, Tambahkan sekarang:

// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
   .setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
   .enableMultipleObjects()
   .enableClassification()
   .build()
val objectDetector = ObjectDetection.getClient(options)

Langkah 3: Feed gambar ke detektor

Deteksi dan klasifikasi objek adalah pemrosesan asinkron:

  • Anda mengirim gambar ke pendeteksi (melalui process()).
  • Pendeteksi bekerja cukup keras.
  • Pendeteksi melaporkan hasilnya kembali kepada Anda melalui callback.

Kode berikut melakukan hal tersebut (menyalin dan menambahkannya ke kode yang ada di dalam fun runObjectDetection(bitmap:Bitmap)):

// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
   .addOnSuccessListener {
       // Task completed successfully
        debugPrint(it)
   }
   .addOnFailureListener {
       // Task failed with an exception
       Log.e(TAG, it.message.toString())
   }

Setelah selesai, detektor akan memberi tahu Anda melalui:

  • Jumlah total objek yang terdeteksi. Setiap objek yang terdeteksi akan dijelaskan dengan:
  • trackingId: bilangan bulat yang Anda gunakan untuk melacaknya lintas frame (TIDAK digunakan dalam codelab ini).
  • boundingBox: kotak pembatas objek.
  • labels: daftar label untuk objek yang terdeteksi (hanya jika klasifikasi diaktifkan):
  • index (Dapatkan indeks label ini)
  • text (Dapatkan teks label ini termasuk "Perlengkapan Mode", "Makanan", "Perlengkapan Rumah", "Tempat", "Tumbuhan")
  • confidence ( float antara 0,0 hingga 1,0 dengan 1,0 berarti 100%)

Anda mungkin telah melihat bahwa kode tersebut melakukan jenis pemrosesan printf untuk hasil yang terdeteksi dengan debugPrint().

Tambahkan ke class MainActivity:

private fun debugPrint(detectedObjects: List<DetectedObject>) {
   detectedObjects.forEachIndexed { index, detectedObject ->
       val box = detectedObject.boundingBox

       Log.d(TAG, "Detected object: $index")
       Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
       Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
       detectedObject.labels.forEach {
           Log.d(TAG, " categories: ${it.text}")
           Log.d(TAG, " confidence: ${it.confidence}")
       }
   }
}

Sekarang Anda siap menerima gambar untuk dideteksi.

Mari kita jalankan codelab dengan mengklik Run ( execute.png) di toolbar Android Studio. Coba pilih gambar preset, atau ambil foto, lalu lihat jendela logcat( 16bd6ea224cf8cf1.png) di dalam IDE.

Anda akan melihat sesuatu yang mirip dengan ini:

D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection:  categories: Food
D/MLKit Object Detection:  confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection:  categories: Home good
D/MLKit Object Detection:  confidence: 0.75390625

...yang berarti detektor melihat 3 objek:

  • Kategorinya adalah Makanan dan Produk rumah tangga.
  • Tidak ada kategori yang ditampilkan untuk yang ke-2 karena ini adalah class yang tidak diketahui.
  • Tidak ada trackingId (karena ini adalah mode deteksi gambar tunggal).
  • Posisi di dalam persegi panjang boundingBox (misalnya (481, 2021) – (2426, 3376))
  • Pendeteksi cukup yakin bahwa yang pertama adalah Makanan (kepercayaan 90%—adalah salad).

Secara teknis, itulah yang Anda perlukan agar Deteksi Objek ML Kit berfungsi: Anda mendapatkan semuanya saat ini. Selamat!

Di sisi UI, Anda masih berada pada tahap saat memulai, tetapi Anda dapat memanfaatkan hasil yang terdeteksi di UI seperti menggambar kotak pembatas untuk menciptakan pengalaman yang lebih baik: mari lanjutkan ke langkah berikutnya – pascaproses hasil yang terdeteksi.

6. Pascapemrosesan hasil deteksi

Pada langkah sebelumnya, Anda akan mencetak hasil yang terdeteksi ke logcat: sederhana dan cepat.

Di bagian ini, Anda akan menggunakan hasilnya dalam gambar:

  • gambar kotak pembatas pada gambar
  • gambar nama kategori dan keyakinan di dalam kotak pembatas

Memahami utilitas visualisasi

Ada beberapa kode boilerplate di dalam codelab untuk membantu Anda memvisualisasikan hasil deteksi. Manfaatkan utilitas ini untuk membuat kode visualisasi kita menjadi sederhana:

  • data class BoxWithText(val box: Rect, val text: String) Ini adalah class data untuk menyimpan hasil deteksi objek untuk visualisasi. box adalah kotak pembatas tempat objek ditemukan, dan text adalah string hasil deteksi untuk ditampilkan bersama dengan kotak pembatas objek.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap Metode ini menggambar hasil deteksi objek dalam detectionResults pada bitmap input dan menampilkan salinannya yang dimodifikasi.

Berikut adalah contoh output metode utilitas drawDetectionResult:

58c6f1d4ddb00dfa.pngS

Memvisualisasikan hasil deteksi ML Kit

Gunakan utilitas visualisasi untuk menggambar hasil deteksi objek ML Kit di atas gambar input.

Buka tempat Anda memanggil debugPrint(), lalu tambahkan cuplikan kode berikut di bawahnya:

// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
    var text = "Unknown"

    // We will show the top confident detection result if it exist
    if (obj.labels.isNotEmpty()) {
        val firstLabel = obj.labels.first()
        text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
    }
    BoxWithText(obj.boundingBox, text)
}

// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)

// Show the detection result on the app screen
runOnUiThread {
    inputImageView.setImageBitmap(visualizedResult)
}
  • Anda mulai dengan menguraikan DetectedObject ML Kit dan membuat daftar objek BoxWithText untuk menampilkan hasil visualisasi.
  • Kemudian, Anda menggambar hasil deteksi di atas gambar input, menggunakan metode utilitas drawDetectionResult, dan menampilkannya di layar.

Menjalankan aplikasi

Sekarang, klik Run ( execute.png) di toolbar Android Studio.

Setelah aplikasi dimuat, tekan Tombol dengan ikon kamera, arahkan kamera ke suatu objek, ambil foto, terima foto (di Aplikasi Kamera), atau ketuk gambar preset mana pun dengan mudah. Anda akan melihat hasil deteksi; tekan lagi Tombol atau pilih gambar lain untuk diulangi beberapa kali untuk mencoba ODT ML Kit terbaru!

a03109cb30d5014d.png

7. Selamat!

Anda telah menggunakan ML Kit untuk menambahkan kemampuan Deteksi Objek ke aplikasi Anda:

  • 3 langkah dengan 3 API
  • Buat Gambar Input
  • Buat Pendeteksi
  • Kirim Gambar ke Pendeteksi

Hanya ini yang Anda perlukan untuk mengaktifkannya.

Saat melanjutkan, Anda mungkin ingin meningkatkan kualitas model: seperti yang Anda lihat bahwa model default hanya dapat mengenali 5 kategori— model bahkan tidak mengenal pisau, garpu, dan botol. Lihat codelab lainnya di jalur pembelajaran Machine Learning - Deteksi Objek di Perangkat kami untuk mempelajari cara melatih model kustom.

Yang telah kita bahas

  • Cara menambahkan Deteksi dan Pelacakan Objek ML Kit ke aplikasi Android Anda
  • Cara menggunakan deteksi dan pelacakan objek di perangkat di ML Kit untuk mendeteksi objek dalam gambar

Langkah Berikutnya

  • Jelajahi lebih banyak hal dengan ML Kit ODT dengan lebih banyak gambar dan video live untuk mendeteksi & akurasi dan performa klasifikasi
  • Lihat Machine Learning di Perangkat - jalur pembelajaran Deteksi Objek untuk mempelajari cara melatih model kustom
  • Menerapkan ML Kit ODT di aplikasi Android Anda sendiri

Pelajari Lebih Lanjut