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 |
|
Dihosting dengan Firebase |
|
Sebelum memulai
Jika ingin mendownload model, pastikan Anda menambahkan Firebase ke project Android, jika belum melakukannya. Langkah ini tidak diperlukan jika Anda memaketkan model.
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:
- Ekstrak model dari arsip zip yang didownload dari Google Cloud Console.
- Sertakan model Anda dalam paket aplikasi:
- Jika belum memiliki folder aset dalam project, buatlah dengan mengklik kanan folder
app/
, lalu mengklik Baru > Folder > Folder Aset. - Salin file model
tflite
Anda dengan metadata tersemat ke folder aset.
- Jika belum memiliki folder aset dalam project, buatlah dengan mengklik kanan folder
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
danGraphicOverlay
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
.