Android'de AutoML tarafından eğitilmiş bir modelle görüntülerdeki nesneleri algılama

AutoML Vision Edge'i kullanarak kendi modelinizi eğittikten sonra, 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 yerleştirerek paketleyebilir veya Firebase'den dinamik olarak indirebilirsiniz.

Model paketleme seçenekleri
Uygulamanızda paketlenmiş
  • Model, uygulamanızın APK'sının bir parçasıdır.
  • Model, Android cihaz çevrimdışıyken bile anında kullanılabilir.
  • Firebase projesine gerek yoktur.
Firebase ile barındırılır
  • Modeli Firebase Machine Learning'e yükleyerek barındırın.
  • APK boyutunu küçültür.
  • Model, talep üzerine indirilir.
  • Uygulamanızı yeniden yayınlamadan model güncellemelerini gönderme
  • Firebase Remote Config ile kolay A/B testi
  • Firebase projesi gerektirir

Başlamadan önce

  1. Bir modeli indirmek istiyorsanız henüz yapmadıysanız Firebase'i Android projenize eklediğinizden emin olun. Bu işlem, modeli paketlediğinizde gerekli değildir.

  2. TensorFlow Lite Görev kitaplığına ait bağımlılıkları, modülünüzün uygulama düzeyindeki Gradle dosyasına (genellikle app/build.gradle) ekleyin:

    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'
    }
    

    Firebase'den dinamik olarak model 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ğı yapılandırma

Modeli uygulamanızla paketlemek için:

  1. Modeli, Google Cloud konsolundan indirdiğiniz ZIP arşivinden çıkarın.
  2. Modelinizi uygulama paketinize ekleyin:
    1. Projenizde bir öğeler klasörü yoksa app/ klasörünü sağ tıklayıp Yeni > Klasör > Öğeler Klasörü'nü tıklayarak bir klasör oluşturun.
    2. Yerleştirilmiş meta verileri içeren tflite model dosyanızı assets klasörüne kopyalayın.
  3. Gradle'ın uygulamayı oluştururken model dosyasını sıkıştırmadığından emin olmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

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

    Model dosyası, uygulama paketine dahil edilir ve ham öğe olarak kullanılabilir.

Firebase'de barındırılan bir model kaynağını yapılandırma

Uzaktan barındırılan modeli kullanmak için RemoteModel nesnesi oluşturun. Modeli yayınlarken atadığınız adı belirtin:

JavaKotlin
// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
        new FirebaseCustomRemoteModel.Builder("your_model").build();
// 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:

JavaKotlin
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.
            }
        });
val downloadConditions = DownloadConditions.Builder()
    .requireWifi()
    .build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
    .addOnSuccessListener {
        // Success.
    }

Birçok uygulama, başlatma kodunda indirme görevini başlatır ancak modeli kullanmanız gerekmeden ö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 birinden ObjectDetector nesnesi oluşturun.

Yalnızca yerel olarak paketlenmiş bir modeliniz varsa model dosyanızdan bir nesne dedektörü oluşturun ve gerekli güven puanı eşiğini yapılandırın (bkz. Modelinizi değerlendirme):

JavaKotlin
// 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);
// 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 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 gerekse de hem uzaktan barındırılan bir modeliniz hem de yerel olarak paketlenmiş bir modeliniz varsa nesne algılayıcıyı oluştururken bu kontrolü yapmanız mantıklı olabilir: Uzak model indirilmişse bu modelden, aksi takdirde yerel modelden bir nesne algılayıcı oluşturun.

JavaKotlin
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean isDownloaded) {
            }
        });
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 bölümü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 dedektörü oluşturun:

JavaKotlin
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);
                }
            }
        });
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 TensorImage nesnesi oluşturun. fromBitmap yöntemini kullanarak Bitmap öğesinden TensorImage nesnesi oluşturabilirsiniz:

JavaKotlin
TensorImage image = TensorImage.fromBitmap(bitmap);
val image = TensorImage.fromBitmap(bitmap)

Görüntü verileriniz Bitmap biçiminde değilse TensorFlow Lite belgelerinde gösterildiği 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'nin detect() yöntemine iletin.

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

4. Etiketlenmiş nesneler hakkında bilgi alma

Nesne algılama işlemi başarılı olursa Detectionnesnelerin listesini döndürür. Her Detection nesnesi, resimde algılanan bir şeyi temsil eder. Her nesnenin sınırlayıcı kutusunu ve etiketlerini alabilirsiniz.

Örneğin:

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

Anlık performansı artırmaya yönelik ipuçları

Görüntüleri gerçek zamanlı bir uygulamada etiketlemek istiyorsanız en iyi kare hızlarına ulaşmak için aşağıdaki yönergeleri uygulayın:

  • Görüntü etiketleyiciye yapılan çağrıları sınırlayın. Görüntü etiketleyici çalışırken yeni bir video karesi kullanılabilir hale gelirse kareyi bırakın. Örnek için hızlı başlangıç ö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şturun ve tek bir adımda yerleştirin. Bunu yaptığınızda, her giriş çerçevesi için yalnızca bir kez görüntüleme yüzeyine işleme yaparsınız. Örnek için hızlı başlangıç örnek uygulamasındaki CameraSourcePreview ve GraphicOverlay sınıflarına bakın.
  • Camera2 API'yi kullanıyorsanız görüntüleri ImageFormat.YUV_420_888 biçiminde çekin.

    Eski Camera API'yi kullanıyorsanız görüntüleri ImageFormat.NV21 biçiminde çekin.