Android'de AutoML ile eğitilmiş bir modelle görüntülerdeki nesneleri tespit edin

AutoML Vision Edge kullanarak kendi modelinizi eğittikten sonra, görüntülerdeki nesneleri algılamak için uygulamanızda kullanabilirsiniz.

AutoML Vision Edge'den eğitilen modelleri entegre etmenin iki yolu vardır: Modeli uygulamanızın varlık klasörüne koyarak 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 hemen kullanılabilir
  • Firebase projesine gerek yok
Firebase ile barındırılıyor
  • 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önderin
  • Firebase Remote Config ile kolay A/B testi
  • Bir Firebase projesi gerektirir

Sen 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 Görev kitaplığının bağımlılıklarını, modülünüzün genellikle app/build.gradle olan uygulama düzeyindeki gradle dosyasına ekleyin:

    Uygulamanızla bir modeli gruplamak 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 bir 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ükleyin

Yerel bir model kaynağı yapılandırın

Modeli uygulamanızla birleştirmek için:

  1. Modeli, Google Cloud Console'dan indirdiğiniz zip arşivinden çıkarın.
  2. Modelinizi uygulama paketinize ekleyin:
    1. Projenizde bir varlıklar klasörünüz yoksa app/ klasöre sağ tıklayıp ardından Yeni > Klasör > Varlıklar Klasörü öğesine tıklayarak bir tane oluşturun.
    2. Gömülü meta veriler içeren tflite model dosyanızı varlıklar klasörüne kopyalayın.
  3. Gradle'ın uygulamayı oluştururken model dosyasını sıkıştırmamasını sağlamak için uygulamanızın build.gradle dosyasına aşağıdakini ekleyin:

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

    Model dosyası, uygulama paketine dahil edilecek ve ham varlık olarak sunulacak.

Firebase tarafından barındırılan bir model kaynağı yapılandırın

Uzaktan barındırılan modeli kullanmak için, modeli yayınladığınızda 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 değilse veya modelin daha yeni bir sürümü mevcutsa 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 bunu modeli kullanmanız gerekmeden önce herhangi bir noktada yapabilirsiniz.

Modelinizden bir nesne dedektörü oluşturun

Model kaynaklarınızı yapılandırdıktan sonra, bunlardan birinden bir ObjectDetector nesnesi oluşturun.

Yalnızca yerel olarak paketlenmiş bir modeliniz varsa, model dosyanızdan bir nesne detektörü oluşturmanız ve ihtiyaç duyduğunuz güven puanı eşiğini yapılandırmanız yeterlidir (bkz . Modelinizi değerlendirin ):

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 indirildiğini kontrol etmeniz 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 hem de yerel olarak paketlenmiş bir modeliniz varsa, nesne algılayıcıyı başlatırken bu kontrolü yapmak mantıklı olabilir: uzaktan kumandadan bir nesne algılayıcı oluşturun indirilmişse model, aksi takdirde yerel modelden.

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 devre dışı bırakmalısınız (örneğin, kullanıcı arayüzünüzün bir kısmını grileştirme veya gizleme). Model yöneticisinin download() yöntemine bir dinleyici ekleyerek bunu 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ş görüntüsünü hazırlayın

Ardından, etiketlemek istediğiniz her görüntü için görüntünüzden bir TensorImage nesnesi oluşturun. fromBitmap yöntemini kullanarak bir Bitmap bir TensorImage nesnesi oluşturabilirsiniz:

Java

TensorImage image = TensorImage.fromBitmap(bitmap);

Kotlin

val image = TensorImage.fromBitmap(bitmap)

Görüntü verileriniz bir Bitmap değilse, TensorFlow Lite belgelerinde gösterildiği gibi bir piksel dizisi yükleyebilirsiniz.

3. Nesne dedektörünü çalıştırın

Bir görüntüdeki nesneleri algılamak için TensorImage nesnesini ObjectDetector 'ın detect() yöntemine iletin.

Java

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

Kotlin

val results = objectDetector.detect(image)

4. Etiketli nesneler hakkında bilgi alın

Nesne algılama işlemi başarılı olursa, Detection nesnelerinin bir listesini döndürür. Her Detection nesnesi, görüntüde 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ı

Görüntüleri gerçek zamanlı bir uygulamada etiketlemek istiyorsanız, en iyi kare hızlarını elde etmek için şu yönergeleri izleyin:

  • Throttle, görüntü etiketleyiciye çağrı yapar. Görüntü etiketleyici çalışırken yeni bir video karesi kullanıma sunulursa, kareyi bırakın. Örnek için hızlı başlangıç ​​örnek uygulamasındaki VisionProcessorBase sınıfına bakın.
  • Giriş görüntüsünün üzerine grafik bindirmek için görüntü etiketleyicinin çıkışını kullanıyorsanız, önce sonucu alın, ardından görüntüyü oluşturun ve tek adımda bindirin. Bunu yaparak, her bir giriş karesi için yalnızca bir kez görüntüleme yüzeyini oluşturursunuz. Örnek için hızlı başlangıç ​​örnek uygulamasındaki CameraSourcePreview ve GraphicOverlay sınıflarına bakın.
  • Camera2 API kullanıyorsanız, görüntüleri ImageFormat.YUV_420_888 biçiminde yakalayın.

    Daha eski Kamera API'sini kullanıyorsanız, görüntüleri ImageFormat.NV21 biçiminde yakalayın.