Objekte in Bildern mit einem von AutoML trainierten Modell unter Android erkennen

Nachdem Sie Ihr eigenes Modell mit AutoML Vision Edge trainiert haben, führen Sie folgende Schritte aus: können Sie in Ihrer App Objekte in Bildern erkennen.

Es gibt zwei Möglichkeiten, mit AutoML Vision Edge trainierte Modelle einzubinden: bündeln Sie das Modell, indem Sie es im Asset-Ordner Ihrer App ablegen. Alternativ können Sie dynamisch von Firebase herunterladen.

Optionen für Modellbündelung
In deiner App enthalten
  • Das Modell ist Teil des APK Ihrer App.
  • Das Modell ist sofort verfügbar, auch wenn das Android-Gerät offline ist
  • Kein Firebase-Projekt erforderlich
Mit Firebase gehostet
  • Hosten Sie das Modell, indem Sie es auf Firebase Machine Learning
  • Verringert die APK-Größe
  • Das Modell wird on demand heruntergeladen
  • Modellaktualisierungen senden, ohne die App neu zu veröffentlichen
  • Einfache A/B-Tests mit Firebase Remote Config
  • Erfordert ein Firebase-Projekt

Hinweis

  1. Wenn Sie ein Modell herunterladen möchten, müssen Sie Firebase zu Ihrem Android-Projekt hinzufügen, falls noch nicht geschehen. Dies ist nicht erforderlich, wenn Sie das Modell als Paket anbieten.

  2. Fügen Sie die Abhängigkeiten für die TensorFlow Lite Task-Bibliothek zum Gradle-Datei auf App-Ebene, in der Regel app/build.gradle:

    So bündeln Sie ein Modell mit Ihrer App:

    dependencies {
      // ...
      // Object detection with a bundled Auto ML model
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT'
    }
    

    Fügen Sie zum dynamischen Herunterladen eines Modells aus Firebase auch das Firebase ML hinzu. Abhängigkeit:

    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. Modell laden

Lokale Modellquelle konfigurieren

So bündeln Sie das Modell mit Ihrer App:

  1. Extrahieren Sie das Modell aus dem ZIP-Archiv, das Sie aus der Google Cloud-Konsole heruntergeladen haben.
  2. Fügen Sie Ihr Modell in das App-Paket ein:
    1. Wenn Sie in Ihrem Projekt noch keinen Assets-Ordner haben, erstellen Sie einen. Klicken Sie dazu mit der rechten Maustaste auf den Ordner app/ und dann auf Neu > Ordner > Assets-Ordner.
    2. Kopieren Sie Ihre tflite-Modelldatei mit eingebetteten Metadaten in die Assets Ordner.
  3. Fügen Sie der Datei build.gradle Ihrer App Folgendes hinzu, um sicherzustellen, Gradle komprimiert die Modelldatei beim Erstellen der App nicht:

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

    Die Modelldatei ist im App-Paket enthalten und verfügbar als unbearbeitetes Asset.

Von Firebase gehostete Modellquelle konfigurieren

Wenn Sie das remote gehostete Modell verwenden möchten, erstellen Sie ein RemoteModel-Objekt und geben Sie den Namen an, den Sie dem Modell bei der Veröffentlichung zugewiesen haben:

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

Starten Sie dann die Aufgabe zum Herunterladen des Modells und geben Sie die Bedingungen an, unter denen der Download zulässig sein soll. Wenn das Modell nicht auf dem Gerät installiert ist oder ein neueres Modell Version des Modells verfügbar ist, lädt die Aufgabe asynchron das aus Firebase verwenden:

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

Viele Apps starten die Download-Aufgabe im Initialisierungscode, aber Sie können jederzeit tun, bevor Sie das Modell verwenden müssen.

Objektdetektor aus Ihrem Modell erstellen

Nachdem Sie die Modellquellen konfiguriert haben, erstellen Sie ein ObjectDetector-Objekt aus einer von ihnen.

Wenn Sie nur ein lokal gebündeltes Modell haben, erstellen Sie einfach einen Objektdetektor aus Ihrem Modelldatei erstellen und den Konfidenzwert konfigurieren Schwellenwert, den Sie verlangen möchten (siehe Modell bewerten):

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)

Wenn Sie ein extern gehostetes Modell haben, müssen Sie prüfen, ob es heruntergeladen wurde, bevor Sie es ausführen. Sie können den Status des Modelldownloads mit der Methode isModelDownloaded() des Modellmanagers.

Sie müssen dies nur vor der Ausführung des Objektdetektors bestätigen. Wenn Sie ein remote gehostetes und ein lokal gebündeltes Modell haben, sinnvoll, diese Prüfung beim Instanziieren des Objektdetektors auszuführen: Objektdetektor vom Remote-Modell, falls es heruntergeladen wurde, und vom lokalen modellieren.

Java

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean isDownloaded) {
            }
        });

Kotlin

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener { success ->

        }

Wenn Sie nur ein remote gehostetes Modell haben, sollten Sie die modellbezogenen wie z. B. das Ausgrauen oder Ausblenden eines Teils der Benutzeroberfläche, bis bestätigen Sie, dass das Modell heruntergeladen wurde. Hängen Sie hierzu einen Listener an. zur download()-Methode des Modellmanagers hinzu.

Sobald Sie wissen, dass Ihr Modell heruntergeladen wurde, erstellen Sie einen Objektdetektor aus der Modelldatei:

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. Eingabebild vorbereiten

Erstellen Sie dann für jedes Bild, das Sie mit einem Label versehen möchten, ein TensorImage-Objekt aus Ihrem Bild. Mit der Methode fromBitmap können Sie ein TensorImage-Objekt aus einem Bitmap-Objekt erstellen:

Java

TensorImage image = TensorImage.fromBitmap(bitmap);

Kotlin

val image = TensorImage.fromBitmap(bitmap)

Wenn sich Ihre Bilddaten nicht in einem Bitmap befinden, können Sie ein Pixelarray laden, wie in die TensorFlow Lite-Dokumentation.

3. Objektdetektor ausführen

Um Objekte in einem Bild zu erkennen, übergeben Sie das Objekt TensorImage an die Die Methode detect() von ObjectDetector.

Java

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

Kotlin

val results = objectDetector.detect(image)

4. Informationen zu Objekten mit Label abrufen

Wenn die Objekterkennung erfolgreich ist, wird eine Liste mit Detection zurückgegeben. Objekte. Jedes Detection-Objekt steht für etwas, das im Bild. Sie können den Begrenzungsrahmen und die Labels jedes Objekts abrufen.

Beispiel:

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()
}

Tipps zur Verbesserung der Echtzeitleistung

Wenn Sie Bilder in einer Echtzeitanwendung mit Labels versehen möchten, gehen Sie so vor: um optimale Framerates zu erzielen:

  • Aufrufe an den Bildbeschrifter drosseln Wenn während der Ausführung des Bildestikkers ein neuer Videoframe verfügbar wird, legen Sie ihn ab. Siehe VisionProcessorBase in der Beispielanwendung „Kurzanleitung“ finden Sie ein Beispiel.
  • Wenn Sie die Ausgabe des Bildlabelerstellers verwenden, um Grafiken das Eingabebild, rufen Sie zuerst das Ergebnis ab und rendern Sie das Bild in einem Schritt übereinanderlegen. Dadurch rendern Sie auf der Anzeigeoberfläche für jeden Eingabe-Frame nur einmal. Siehe CameraSourcePreview und GraphicOverlay-Klassen in der Schnellstart-Beispiel-App für ein Beispiel.
  • Wenn Sie die Camera2 API verwenden, nehmen Sie Bilder in ImageFormat.YUV_420_888-Format.

    Wenn Sie die ältere Camera API verwenden, nehmen Sie Bilder in ImageFormat.NV21-Format.