Mendeteksi objek pada gambar dengan model yang dilatih AutoML di Android

Setelah melatih model sendiri menggunakan AutoML Vision Edge, Anda dapat menggunakannya di aplikasi untuk mendeteksi objek dalam gambar.

Ada dua cara untuk mengintegrasikan model yang dilatih dari AutoML Vision Edge: Anda dapat memaketkan model dengan memasukkannya ke dalam folder aset aplikasi, atau mendownloadnya secara dinamis dari Firebase.

Opsi pemaketan model
Dipaketkan dalam aplikasi Anda
  • Model merupakan bagian dari APK aplikasi
  • Model akan langsung tersedia, bahkan saat perangkat Android sedang offline
  • Tidak memerlukan project Firebase
Dihosting dengan Firebase
  • Hosting model dengan menguploadnya ke Firebase Machine Learning
  • Mengurangi ukuran APK
  • Model didownload sesuai permintaan
  • Update model dapat dikirim tanpa memublikasikan ulang aplikasi
  • Pengujian A/B yang mudah dengan Firebase Remote Config
  • Memerlukan project Firebase

Sebelum memulai

  1. Jika ingin mendownload model, pastikan Anda menambahkan Firebase ke project Android, jika belum melakukannya. Langkah ini tidak diperlukan jika Anda memaketkan model.

  2. Tambahkan dependensi untuk library Tugas TensorFlow Lite ke file gradle modul (level aplikasi), biasanya app/build.gradle:

    Untuk memaketkan model dengan aplikasi Anda:

    dependencies {
      // ...
      // Object detection with a bundled Auto ML model
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT'
    }
    

    Untuk mendownload model dari Firebase secara dinamis, tambahkan juga dependensi Firebase ML:

    dependencies {
      // ...
      // Object detection with an Auto ML model deployed to Firebase
      implementation platform('com.google.firebase:firebase-bom:26.1.1')
      implementation 'com.google.firebase:firebase-ml-model-interpreter'
    
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly'
    }
    

1. Muat model

Mengonfigurasi sumber model lokal

Untuk memaketkan model dengan aplikasi Anda:

  1. Ekstrak model dari arsip zip yang didownload dari Google Cloud console.
  2. Sertakan model Anda dalam paket aplikasi:
    1. Jika belum memiliki folder aset dalam project, buatlah dengan mengklik kanan folder app/, lalu mengklik Baru > Folder > Folder Aset.
    2. Salin file model tflite Anda dengan metadata tersemat ke folder aset.
  3. Tambahkan hal berikut ke file build.gradle aplikasi Anda untuk memastikan Gradle tidak mengompresi file model saat mem-build aplikasi:

    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }
    

    File model akan disertakan dalam paket aplikasi dan tersedia sebagai aset mentah.

Mengonfigurasi sumber model yang dihosting Firebase

Untuk menggunakan model yang dihosting dari jarak jauh, buat objek RemoteModel, dengan menentukan nama yang diberikan kepada model saat dipublikasikan:

Java

// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
        new FirebaseCustomRemoteModel.Builder("your_model").build();

Kotlin

// Specify the name you assigned when you deployed the model.
val remoteModel =
    FirebaseCustomRemoteModel.Builder("your_model_name").build()

Kemudian, mulai tugas download model dengan menentukan kondisi yang Anda inginkan untuk mengizinkan download. Jika model tidak ada di perangkat, atau jika versi model yang lebih baru tersedia, tugas ini akan mendownload model dari Firebase secara asinkron:

Java

DownloadConditions downloadConditions = new DownloadConditions.Builder()
        .requireWifi()
        .build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(@NonNull Task<Void> task) {
                // Success.
            }
        });

Kotlin

val downloadConditions = DownloadConditions.Builder()
    .requireWifi()
    .build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
    .addOnSuccessListener {
        // Success.
    }

Banyak aplikasi memulai tugas download dalam kode inisialisasinya, tetapi Anda dapat melakukannya kapan saja sebelum menggunakan model.

Membuat detektor objek dari model Anda

Setelah mengonfigurasi sumber model, buat objek ObjectDetector dari salah satu sumber model tersebut.

Jika Anda hanya memiliki model yang dipaketkan secara lokal, cukup buat detektor objek dari file model dan konfigurasikan nilai minimum skor keyakinan yang ingin Anda wajibkan (baca artikel Mengevaluasi model):

Java

// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud console
                           // to determine an appropriate value.
    .build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);

Kotlin

// Initialization
val options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud console
                           // to determine an appropriate value.
    .build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)

Jika Anda memiliki model yang dihosting dari jarak jauh, Anda harus memeriksa apakah model tersebut sudah didownload sebelum menjalankannya. Anda dapat memeriksa status tugas download model menggunakan metode isModelDownloaded() pengelola model.

Meskipun Anda hanya perlu mengonfirmasi hal ini sebelum menjalankan detektor objek, jika Anda memiliki model yang dihosting dari jarak jauh dan model yang dipaketkan secara lokal, sebaiknya lakukan pemeriksaan ini saat membuat instance detektor objek: buat detektor objek dari model jarak jauh jika model tersebut sudah didownload, dan dari model lokal jika belum didownload.

Java

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean isDownloaded) {
            }
        });

Kotlin

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener { success ->

        }

Jika Anda hanya memiliki model yang dihosting dari jarak jauh, Anda harus menonaktifkan fungsi yang berkaitan dengan model—misalnya, menonaktifkan atau menyembunyikan sebagian UI—sampai Anda mengonfirmasi bahwa model telah didownload. Anda dapat melakukannya dengan menambahkan pemroses ke metode download() pengelola model:

Setelah Anda mengetahui bahwa model telah didownload, buat detektor objek dari file model:

Java

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnCompleteListener(new OnCompleteListener<File>() {
            @Override
            public void onComplete(@NonNull Task<File> task) {
                File modelFile = task.getResult();
                if (modelFile != null) {
                    ObjectDetectorOptions options = ObjectDetectorOptions.builder()
                            .setScoreThreshold(0)
                            .build();
                    objectDetector = ObjectDetector.createFromFileAndOptions(
                            getApplicationContext(), modelFile.getPath(), options);
                }
            }
        });

Kotlin

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnSuccessListener { modelFile ->
            val options = ObjectDetectorOptions.builder()
                    .setScoreThreshold(0f)
                    .build()
            objectDetector = ObjectDetector.createFromFileAndOptions(
                    applicationContext, modelFile.path, options)
        }

2. Menyiapkan gambar input

Selanjutnya, buat objek TensorImage dari setiap gambar Anda yang ingin diberi label. Anda dapat membuat objek TensorImage dari Bitmap menggunakan metode fromBitmap:

Java

TensorImage image = TensorImage.fromBitmap(bitmap);

Kotlin

val image = TensorImage.fromBitmap(bitmap)

Jika data gambar Anda tidak ada dalam Bitmap, Anda dapat memuat array piksel seperti yang ditampilkan dalam dokumentasi TensorFlow Lite.

3. Menjalankan detektor objek

Untuk mendeteksi objek pada gambar, teruskan objek TensorImage ke metode detect() ObjectDetector.

Java

List<Detection> results = objectDetector.detect(image);

Kotlin

val results = objectDetector.detect(image)

4. Mendapatkan informasi tentang objek berlabel

Jika berhasil, operasi deteksi objek ini akan menampilkan daftar objek Detection. Setiap objek Detection mewakili sesuatu yang terdeteksi dalam gambar. Anda dapat memperoleh kotak pembatas dari setiap objek dan labelnya.

Contoh:

Java

for (Detection result : results) {
    RectF bounds = result.getBoundingBox();
    List<Category> labels = result.getCategories();
}

Kotlin

for (result in results) {
    val bounds = result.getBoundingBox()
    val labels = result.getCategories()
}

Tips untuk meningkatkan performa real-time

Jika Anda ingin memberikan label pada gambar dalam aplikasi real-time, ikuti panduan ini untuk mencapai kecepatan frame terbaik:

  • Batasi panggilan ke pemberi label gambar. Jika frame video baru tersedia saat pemberi label gambar sedang berjalan, hapus frame tersebut. Lihat class VisionProcessorBase di aplikasi contoh panduan memulai untuk mengetahui contohnya.
  • Jika Anda menggunakan output pemberi label gambar untuk menempatkan grafis pada gambar input, pertama-tama dapatkan hasilnya, lalu render gambar dan tempatkan grafis dalam satu langkah. Dengan demikian, Anda hanya merender ke permukaan tampilan sekali untuk setiap frame input. Lihat class CameraSourcePreview dan GraphicOverlay dalam aplikasi contoh panduan memulai untuk mengetahui contohnya.
  • Jika Anda menggunakan Camera2 API, ambil gambar dalam format ImageFormat.YUV_420_888.

    Jika Anda menggunakan Camera API versi lama, ambil gambar dalam format ImageFormat.NV21.