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 |
|
Dihosting dengan Firebase |
|
Sebelum kamu memulai
Jika Anda ingin mengunduh model , pastikan Anda menambahkan Firebase ke proyek Android Anda , jika Anda belum melakukannya. Ini tidak diperlukan saat Anda memaketkan model.
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:
- Ekstrak model dari arsip zip yang Anda unduh dari Google Cloud Console.
- Sertakan model Anda dalam paket aplikasi Anda:
- Jika Anda tidak memiliki folder aset di proyek Anda, buatlah dengan mengklik kanan folder
app/
, lalu klik New > Folder > Assets Folder . - Salin file model
tflite
Anda dengan metadata tersemat ke folder aset.
- Jika Anda tidak memiliki folder aset di proyek Anda, buatlah dengan mengklik kanan folder
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
danGraphicOverlay
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
.