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 resimlerdeki nesneleri algılamak için uygulamanızda kullanabilirsiniz.

AutoML Vision Edge'den eğitilen modelleri entegre etmenin iki yolu vardır: modelinizi uygulamanızın öğe klasörüne yerleştirerek gruplandırabilir veya Firebase'den dinamik olarak indirebilirsiniz.

Model paketleme seçenekleri
Uygulamanızda paket olarak sunuluyor
  • Model, uygulamanızın APK'sının bir parçasıdır
  • Model, Android cihaz çevrimdışı olsa bile hemen kullanılabilir
  • Firebase projesine gerek yoktur
Firebase ile barındırılan
  • Modeli şu klasöre yükleyerek barındırın: Firebase Makine Öğrenimi
  • APK boyutunu küçültü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 şunu yaptığınızdan emin olun: Firebase'i Android projenize ekleyin, (onaylamadıysanız). Modeli paket haline getirirken bu işlem gerekli değildir.

  2. TensorFlow Lite Görev kitaplığı için bağımlılıkları modülünüzün uygulama düzeyinde gradle dosyası vardır. Bu genellikle app/build.gradle olan:

    Bir modeli uygulamanızla gruplandırmak 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'yi de ekleyin. bağımlılık:

    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 şuradan indirdiğiniz zip arşivinden çıkarın: Google Cloud konsolunu kullanın.
  2. Modelinizi uygulama paketinize ekleyin:
    1. Projenizde bir öğe klasörü yoksa şu tarihe kadar bir klasör oluşturun: app/ klasörünü sağ tıklayıp Yeni > Klasör > Öğeler klasörünü açın.
    2. Yerleşik meta veriler içeren tflite model dosyanızı öğelere kopyalayın tıklayın.
  3. Aşağıdakini uygulamanızın build.gradle dosyasına ekleyin: Gradle, uygulamayı oluştururken model dosyasını sıkıştırmaz:

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

    Model dosyası, uygulama paketine eklenir ve işlenmemiş bir öğe olarak görebiliriz.

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

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

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, model indirme görevini başlatmak için model indirme işleminde indirmeye izin vermek istiyorsunuz. Model cihazda yoksa veya sürümü kullanılabiliyorsa görev, yeni bir sürümün yüklü olduğu modeliniz:

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 kullanmaya başlamadan önce istediğiniz zaman yapabilirsiniz.

Modelinizden nesne algılayıcısı oluşturma

Model kaynaklarınızı yapılandırdıktan sonraObjectDetector sağlayabilir.

Yalnızca yerel olarak paketlenmiş bir modeliniz varsa model dosyasını seçin ve güven puanını (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 bu modelin indiremezsiniz. Model indirme işleminin durumunu kontrol edebilirsiniz. model yöneticisinin isModelDownloaded() yöntemini kullanarak görevi tamamlayın.

Nesne algılayıcıyı çalıştırmadan önce bunu onaylamanız yeterli olsa da, hem uzaktan barındırılan hem de yerel olarak paketlenen nesne algılayıcıyı örneklendirirken şu kontrolü gerçekleştirmek mantıklıdır: nesne dedektöründen, indirilmişse uzak modelden ve yerel modelden modelini kullanmanız gerekir.

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 modelle ilgili ayarını devre dışı bırakmanız gerekir. (örneğin, kullanıcı arayüzünüzün bir kısmını devre dışı bırakan veya gizleyen) modelin indirildiğini onaylayın. Bunu bir dinleyici ekleyerek model yöneticisinin download() yöntemine.

Modelinizin indirildiğinden emin olduktan sonra, Google Etiket Yöneticisi'nden bir nesne model dosyası:

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 bir görüntü içinTensorImage görüntüsüdür. Şu komutu kullanarak Bitmap öğesinden TensorImage nesnesi oluşturabilirsiniz: fromBitmap yöntemi:

Java

TensorImage image = TensorImage.fromBitmap(bitmap);

Kotlin

val image = TensorImage.fromBitmap(bitmap)

Resim verileriniz bir Bitmap içinde değilse şu şekilde bir piksel dizisi yükleyebilirsiniz: TensorFlow Lite belgelerine bakın.

3. Nesne algılayıcıyı çalıştırma

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

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 bir Detection listesi döndürür. nesneler'i tıklayın. Her Detection nesnesi görüntüsüdür. Her bir 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 isterseniz şu talimatları uygulayın:

  • Görüntü etiketleyiciye yapılan çağrıları kısıtlayın. Yeni bir video karesi resim etiketleyici çalışırken kullanılabilir, çerçeveyi bırakın. Bkz. Örnek için hızlı başlangıç örnek uygulamasındaki VisionProcessorBase sınıfı.
  • Grafikleri üzerine bindirmek için görüntü etiketleyicinin çıkışını kullanıyorsanız önce sonucu alın, sonra da resmi oluşturun tek bir adımda yapabilirsiniz. Bu şekilde, öğeleri ekran yüzeyinde her giriş karesi için yalnızca bir kez. Bkz. CameraSourcePreview ve Hızlı başlangıç örnek uygulamasındaki GraphicOverlay sınıfındaki örneğine bakalım.
  • Camera2 API'sini kullanıyorsanız görüntüleri şurada yakalayın: ImageFormat.YUV_420_888 biçimindedir.

    Eski Kamera API'sini kullanıyorsanız görüntüleri şurada yakalayın: ImageFormat.NV21 biçimindedir.