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, 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
  • Model, uygulamanızın APK'sının bir parçasıdır
  • Android cihaz çevrimdışı olsa bile model hemen kullanılabilir.
  • Firebase projesine gerek yoktur
Firebase ile barındırılan
  • Modeli Firebase Makine Öğrenimi'ne yükleyerek barındırın.
  • APK boyutunu azaltır
  • Model, istek üzerine indirilir
  • Uygulamanızı yeniden yayınlamadan model güncellemelerini aktarma
  • Firebase Remote Config ile kolay A/B testi
  • Firebase projesi gerekir

Başlamadan önce

  1. 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.

  2. 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:

  1. Modeli, Google Cloud konsolundan indirdiğiniz ZIP arşivinden çıkarın.
  2. Modelinizi uygulama paketinize ekleyin:
    1. Projenizde öğe 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ı öğeler klasörüne kopyalayın.
  3. 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şlangıç kodlarında başlatır ancak modeli kullanmadan önce istediğiniz zaman bunu 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ısı oluşturup talep etmek 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.

Nesne algılayıcıyı çalıştırmadan önce bunu onaylamanız yeterlidir. Hem uzaktan barındırılan hem de yerel olarak paketlenmiş bir modeliniz varsa nesne algılayıcısını örneklendirirken şu kontrolü gerçekleştirmek mantıklı olabilir: Nesne algılayıcı indirildiyse uzak modelden, aksi takdirde yerel modelden bir nesne algılayıcısı oluşturmak.

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

Daha sonra, etiketlemek istediğiniz her görüntü 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. Etiketli 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 şeyi 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ıç ö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 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 Kamera API'sini kullanıyorsanız görüntüleri ImageFormat.NV21 biçiminde yakalayın.