Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Deteksi objek dalam gambar dengan model yang dilatih AutoML di Android

Setelah melatih model Anda 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 Anda, atau Anda dapat mendownloadnya secara dinamis dari Firebase.

Opsi bundling model
Dibundel dalam aplikasi Anda
  • Model adalah bagian dari APK aplikasi Anda
  • Model langsung tersedia, bahkan saat perangkat Android sedang offline
  • Tidak perlu proyek Firebase
Dihosting dengan Firebase
  • Host model dengan mengunggahnya ke Firebase Machine Learning
  • Mengurangi ukuran APK
  • Model diunduh sesuai permintaan
  • Dorong pembaruan model tanpa memublikasikan ulang aplikasi Anda
  • Pengujian A/B mudah dengan Firebase Remote Config
  • Memerlukan proyek Firebase

Sebelum kamu memulai

  1. Jika Anda ingin mengunduh model , pastikan Anda menambahkan Firebase ke proyek Android Anda , jika Anda belum melakukannya. Ini tidak diperlukan saat Anda memaketkan model.

  2. Tambahkan dependensi untuk library TensorFlow Lite Task ke file gradle level aplikasi modul Anda, yang biasanya adalah 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 secara dinamis dari Firebase, 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

Konfigurasikan sumber model lokal

Untuk memaketkan model dengan aplikasi Anda:

  1. Ekstrak model dari arsip zip yang Anda unduh dari Google Cloud Console.
  2. Sertakan model Anda dalam paket aplikasi Anda:
    1. Jika Anda tidak memiliki folder aset di proyek Anda, buatlah dengan mengklik kanan folder app/ , lalu klik New > Folder > Assets Folder .
    2. Salin file model tflite Anda dengan metadata tersemat ke folder aset.
  3. Tambahkan yang berikut ini ke file build.gradle aplikasi Anda untuk memastikan Gradle tidak mengompresi file model saat membuat aplikasi:

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

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

Konfigurasikan sumber model yang dihosting oleh Firebase

Untuk menggunakan model yang dihosting dari jarak jauh, buat objek RemoteModel , tentukan nama yang Anda tetapkan untuk model tersebut saat Anda menerbitkannya:

Jawa

// 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 pengunduhan model, tentukan kondisi di mana Anda ingin mengizinkan pengunduhan. Jika model tidak ada di perangkat, atau jika versi model yang lebih baru tersedia, tugas akan mengunduh model dari Firebase secara asinkron:

Jawa

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 pengunduhan dalam kode inisialisasinya, tetapi Anda dapat melakukannya kapan saja sebelum Anda perlu menggunakan model tersebut.

Buat detektor objek dari model Anda

Setelah Anda mengonfigurasi sumber model, buat objek ObjectDetector dari salah satunya.

Jika Anda hanya memiliki model yang dibundel secara lokal, buat saja detektor objek dari file model Anda dan konfigurasikan ambang skor kepercayaan yang ingin Anda perlukan (lihat Evaluasi model Anda ):

Jawa

// 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 telah diunduh sebelum Anda menjalankannya. Anda dapat memeriksa status tugas pengunduhan model menggunakan metode isModelDownloaded() manajer model.

Meskipun Anda hanya perlu mengonfirmasi ini sebelum menjalankan pendeteksi objek, jika Anda memiliki model yang dihosting dari jarak jauh dan model yang dibundel secara lokal, mungkin masuk akal untuk melakukan pemeriksaan ini saat membuat instance pendeteksi objek: buat pendeteksi objek dari jarak jauh model jika sudah diunduh, dan dari model lokal sebaliknya.

Jawa

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 fungsionalitas terkait model—misalnya, menghilangkan atau menyembunyikan bagian UI Anda—hingga Anda mengonfirmasi bahwa model telah diunduh. Anda dapat melakukannya dengan melampirkan pendengar ke metode download() pengelola model.

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

Jawa

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. Siapkan gambar masukan

Kemudian, untuk setiap gambar yang ingin Anda beri label, buat objek TensorImage dari gambar Anda. Anda dapat membuat objek TensorImage dari Bitmap menggunakan metode fromBitmap :

Jawa

TensorImage image = TensorImage.fromBitmap(bitmap);

Kotlin

val image = TensorImage.fromBitmap(bitmap)

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

3. Jalankan detektor objek

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

Jawa

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

Kotlin

val results = objectDetector.detect(image)

4. Dapatkan informasi tentang objek berlabel

Jika operasi deteksi objek berhasil, ia mengembalikan daftar objek Detection . Setiap objek Detection mewakili sesuatu yang terdeteksi pada gambar. Anda bisa mendapatkan kotak pembatas setiap objek dan labelnya.

Sebagai contoh:

Jawa

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()
}

Kiat untuk meningkatkan kinerja waktu nyata

Jika Anda ingin memberi label pada gambar dalam aplikasi real-time, ikuti panduan ini untuk mendapatkan frekuensi gambar terbaik:

  • Batasi panggilan ke pemberi label gambar. Jika bingkai video baru tersedia saat pelabel gambar sedang berjalan, jatuhkan bingkai. Lihat kelas VisionProcessorBase di contoh aplikasi quickstart untuk contoh.
  • Jika Anda menggunakan output dari pemberi label gambar untuk menghamparkan grafik pada gambar masukan, dapatkan hasilnya terlebih dahulu, lalu render gambar dan lakukan overlay dalam satu langkah. Dengan melakukannya, Anda merender ke permukaan tampilan hanya sekali untuk setiap bingkai masukan. Lihat kelas CameraSourcePreview dan GraphicOverlay di aplikasi contoh quickstart untuk contoh.
  • 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 .