AutoML Vision Edge'i kullanarak kendi modelinizi eğittikten sonra, bu modeli görüntülerdeki nesneleri algılamak için uygulamanızda kullanabilirsiniz.
AutoML Vision Edge'de eğitilen modelleri entegre etmenin iki yolu vardır: Modeli uygulamanızın öğe klasörüne ekleyerek paketleyebilir veya Firebase'den dinamik olarak indirebilirsiniz.
Model paketleme seçenekleri | |
---|---|
Uygulamanızda paket halinde |
|
Firebase ile barındırılan |
|
Başlamadan önce
Bir model indirmek istiyorsanız, henüz yapmadıysanız Firebase'i Android projenize eklediğinizden emin olun. Modeli paketlediğinizde bu gerekli değildir.
TensorFlow Lite Task kitaplığına ait bağımlılıkları, modülünüzün uygulama düzeyindeki Gradle dosyasına ekleyin. Bu dosya genellikle
app/build.gradle
şeklindedir:Bir modeli uygulamanızla paketlemek için:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
Bir modeli Firebase'den dinamik olarak indirmek için Firebase ML bağımlılığını da ekleyin:
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. Modeli yükleme
Yerel model kaynağını yapılandırma
Modeli uygulamanızla paket haline getirmek için:
- Modeli, Google Cloud konsolundan indirdiğiniz ZIP arşivinden çıkarın.
- Modelinizi uygulama paketinize ekleyin:
- Projenizde öğe klasörü yoksa
app/
klasörünü sağ tıklayıp Yeni > Klasör > Öğe Klasörü'nü tıklayarak bir klasör oluşturun. - Yerleştirilmiş meta verileri içeren
tflite
model dosyanızı assets klasörüne kopyalayın.
- Projenizde öğe klasörü yoksa
Gradle'in uygulamayı oluştururken model dosyasını sıkıştırmamasını sağlamak için uygulamanızın
build.gradle
dosyasına aşağıdakileri ekleyin:android { // ... aaptOptions { noCompress "tflite" } }
Model dosyası uygulama paketine eklenir ve ham öğe olarak kullanılabilir.
Firebase tarafından barındırılan bir model kaynağını yapılandırma
Uzaktan barındırılan modeli kullanmak için modeli yayınlarken atadığınız adı belirterek bir RemoteModel
nesnesi oluşturun:
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()
Ardından, indirmeye izin vermek istediğiniz koşulları belirterek model indirme görevini başlatın. Model cihazda yoksa veya modelin daha yeni bir sürümü varsa görev, modeli Firebase'den eşzamansız olarak indirir:
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.
}
Birçok uygulama, indirme görevini başlatma kodunda başlatır ancak modeli kullanmadan önce istediğiniz zaman bu işlemi yapabilirsiniz.
Modelinizden nesne algılayıcı oluşturma
Model kaynaklarınızı yapılandırdıktan sonra bunlardan birinde ObjectDetector
nesnesi oluşturun.
Yalnızca yerel olarak paketlenmiş bir modeliniz varsa model dosyanızdan bir nesne algılayıcı oluşturup zorunlu tutmak istediğiniz güven puanı eşiğini yapılandırmanız yeterlidir (Modelinizi değerlendirme bölümüne bakın):
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)
Uzaktan barındırılan bir modeliniz varsa çalıştırmadan önce modelin indirildiğinden emin olmanız gerekir. Model yöneticisinin isModelDownloaded()
yöntemini kullanarak model indirme görevinin durumunu kontrol edebilirsiniz.
Bunu yalnızca nesne algılayıcıyı çalıştırmadan önce onaylamanız gerekir. Ancak hem uzakta barındırılan hem de yerel olarak paketlenmiş bir modeliniz varsa nesne algılayıcıyı örneklendirirken bu kontrolü gerçekleştirmeniz yararlı olabilir: İndirilmişse uzak modelden, indirilmediyse yerel modelden bir nesne algılayıcı oluşturun.
Java
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
Kotlin
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
Yalnızca uzaktan barındırılan bir modeliniz varsa modelin indirildiğini onaylayana kadar modelle ilgili işlevleri (ör. kullanıcı arayüzünüzün bir kısmını devre dışı bırakma veya gizleme) devre dışı bırakmanız gerekir. Bunu, model yöneticisinin download()
yöntemine bir dinleyici ekleyerek yapabilirsiniz.
Modelinizin indirildiğini öğrendikten sonra model dosyasından bir nesne algılayıcı oluşturun:
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. Giriş resmini hazırlama
Ardından, etiketlemek istediğiniz her resim için resminizden bir TensorImage
nesnesi oluşturun. fromBitmap
yöntemini kullanarak Bitmap
öğesinden TensorImage
nesnesi oluşturabilirsiniz:
Java
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
Resim verileriniz Bitmap
biçiminde değilse TensorFlow Lite dokümanlarındaki gibi bir piksel dizisi yükleyebilirsiniz.
3. Nesne algılayıcıyı çalıştırma
Bir resimdeki nesneleri algılamak için TensorImage
nesnesini ObjectDetector
'un detect()
yöntemine iletin.
Java
List<Detection> results = objectDetector.detect(image);
Kotlin
val results = objectDetector.detect(image)
4. Etiketlenmiş nesneler hakkında bilgi edinme
Nesne algılama işlemi başarılı olursa Detection
nesnelerin listesini döndürür. Her Detection
nesnesi, resimde algılanan bir nesneyi temsil eder. Her nesnenin sınırlayıcı kutusunu ve etiketlerini alabilirsiniz.
Örneğin:
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()
}
Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları
Gerçek zamanlı bir uygulamada resimleri etiketlemek istiyorsanız en iyi kare hızlarına ulaşmak için aşağıdaki yönergeleri uygulayın:
- Resim etiketleyiciye yapılan çağrıları azaltın. Resim etiketleyici çalışırken yeni bir video karesi kullanılabilir hale gelirse kareyi bırakın. Örnek için hızlı başlangıç kılavuzu örnek uygulamasındaki
VisionProcessorBase
sınıfına bakın. - Giriş resmine grafik yerleştirmek için resim etiketleyicinin çıkışını kullanıyorsanız önce sonucu alın, ardından resmi oluşturup tek bir adımda yer paylaşımı yapın. Böylece, her giriş çerçevesi için ekran yüzeyinde yalnızca bir kez oluşturma işlemi gerçekleştirirsiniz. Örnek için hızlı başlangıç kılavuzundaki
CameraSourcePreview
veGraphicOverlay
sınıflarına bakın. -
Camera2 API'yi kullanıyorsanız resimleri
ImageFormat.YUV_420_888
biçiminde kaydedin.Eski Camera API'yi kullanıyorsanız resimleri
ImageFormat.NV21
biçiminde çekin.