Interaktive Anleitung zur Bildsegmentierung für Android

Die MediaPipe Interactive Image Segmenter-Aufgabe nimmt eine Position in einem Bild, schätzt die Grenzen eines Objekts an diesem Ort und gibt die Segmentierung für das Objekt als Bilddaten zurück. In dieser Anleitung erfahren Sie, wie Sie den Interactive Image Segmenter mit Android-Apps verwenden. Das in dieser Anleitung beschriebene Codebeispiel ist auf GitHub verfügbar. Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.

Codebeispiel

Das Codebeispiel „MediaPipe Tasks“ ist eine einfache Implementierung einer interaktiven Bildsegmentierungs-App für Android. Das Beispiel funktioniert mit Bildern, die aus der Gerätegalerie ausgewählt wurden.

Sie können die App als Ausgangspunkt für Ihre eigene Android-App verwenden oder beim Ändern einer vorhandenen App darauf zurückgreifen. Der Beispielcode für den Interactive Image Segmenter wird auf GitHub gehostet.

Code herunterladen

In der folgenden Anleitung erfahren Sie, wie Sie mit dem git-Befehlszeilentool eine lokale Kopie des Beispielcodes erstellen.

So laden Sie den Beispielcode herunter:

  1. Klonen Sie das Git-Repository mit dem folgenden Befehl:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Konfigurieren Sie optional Ihre Git-Instanz für die Verwendung von Sparse Checkout, sodass Sie nur die Dateien für die Beispielanwendung „Interactive Image Segmenter“ haben:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_segmentation/android
    

Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie das Projekt in Android Studio importieren und die App ausführen. Eine Anleitung dazu finden Sie im Einrichtungsleitfaden für Android.

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für diese Beispielanwendung für die Bildsegmentierung:

  • InteractiveSegmentationHelper.kt – Initialisiert die Aufgabe "Interactive Image Segmenter" und verarbeitet das Modell und die Delegierungsauswahl.
  • OverlayView.kt: Damit werden die Segmentierungsergebnisse verarbeitet und formatiert.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte für die Verwendung von Interactive Image Segmenter beschrieben. Allgemeine Informationen zum Einrichten der Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich der Anforderungen an die Plattformversion, finden Sie im Einrichtungsleitfaden für Android.

Abhängigkeiten

Das interaktive Bildsegmentierungs-Tool verwendet die com.google.mediapipe:tasks-vision-Bibliothek. Fügen Sie diese Abhängigkeit der Datei build.gradle Ihres Android-App-Entwicklungsprojekts hinzu. Importieren Sie die erforderlichen Abhängigkeiten mit dem folgenden Code:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

Modell

Für die MediaPipe Interactive Image Segmenter-Aufgabe ist ein trainiertes Modell erforderlich, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu verfügbaren trainierten Modellen für den Interactive Image Segmenter finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.

Wählen Sie das Modell aus, laden Sie es herunter und speichern Sie es dann in Ihrem Projektverzeichnis:

<dev-project-root>/src/main/assets

Verwenden Sie die Methode BaseOptions.Builder.setModelAssetPath(), um den vom Modell verwendeten Pfad anzugeben. Diese Methode wird im Codebeispiel im nächsten Abschnitt gezeigt.

Im Beispielcode von Interactive Image Segmenter wird das Modell in der Klasse InteractiveSegmenterHelper.kt in der Funktion setupInteractiveSegmenter() definiert.

Aufgabe erstellen

Sie können die createFromOptions-Funktion verwenden, um die Aufgabe zu erstellen. Die Funktion createFromOptions akzeptiert Konfigurationsoptionen, einschließlich Maskenausgabetypen. Weitere Informationen zu Konfigurationsoptionen finden Sie unter Konfigurationsübersicht.

InteractiveSegmenterOptions options =
  InteractiveSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);

Ein ausführlicheres Beispiel zum Einrichten dieser Aufgabe finden Sie in der setupInteractiveSegmenter()-Funktion der Klasse InteractiveSegmenterHelper.

Konfigurationsoptionen

Diese Aufgabe umfasst die folgenden Konfigurationsoptionen für Android-Apps:

Option Beschreibung Wertebereich Standardwert
outputCategoryMask Wenn True festgelegt ist, enthält die Ausgabe eine Segmentierungsmaske als uint8-Bild, wobei jeder Pixelwert angibt, ob das Pixel Teil des Objekts ist, das sich im betreffenden Bereich befindet. {True, False} False
outputConfidenceMasks Wenn True festgelegt ist, enthält die Ausgabe eine Segmentierungsmaske als Gleitkommazahlbild, wobei jeder Gleitkommawert die Konfidenz darstellt, dass das Pixel Teil des Objekts ist, das sich im relevanten Bereich befindet. {True, False} True
displayNamesLocale Legt die Sprache von Labels fest, die für Anzeigenamen bereitgestellt werden, die in den Metadaten des Aufgabenmodells angegeben sind, sofern verfügbar. Der Standardwert für Englisch ist en. Mit der TensorFlow Lite Metadata Writer API können Sie den Metadaten eines benutzerdefinierten Modells lokalisierte Labels hinzufügen. Sprachcode en
errorListener Legt einen optionalen Fehler-Listener fest. Nicht festgelegt

Daten vorbereiten

Der interaktive Image Segmenter arbeitet mit Bildern und die Aufgabe übernimmt die Vorverarbeitung der Dateneingabe, einschließlich Größenanpassung, Rotation und Wertenormalisierung. Sie müssen das Eingabebild in ein com.google.mediapipe.framework.image.MPImage-Objekt konvertieren, bevor Sie es an die Aufgabe übergeben.

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the user’s device as a Bitmap object using BitmapFactory.

// Convert an Android’s Bitmap object to a MediaPipe’s Image object.
Image mpImage = new BitmapImageBuilder(bitmap).build();

Im Beispielcode des Interactive Image Segmenter wird die Datenvorbereitung in der Klasse InteractiveSegmenterHelper von der segment()-Funktion durchgeführt.

Task ausführen

Rufen Sie die Funktion segment auf, um die Vorhersage auszuführen und Segmente zu generieren. Die Aufgabe „Interactive Image Segmenter“ gibt die identifizierten Segmentregionen im Eingabebild zurück.

RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

ImageSegmenterResult segmenterResult = interactivesegmenter.segment(image, roi);

Im Beispielcode des Interactive Image Segmenter sind die segment-Funktionen in der Datei InteractiveSegmenterHelper.kt definiert.

Ergebnisse verarbeiten und anzeigen

Nach dem Ausführen der Inferenz gibt die Aufgabe zur interaktiven Bildsegmentierung ein ImageSegmenterResult-Objekt zurück, das die Ergebnisse der Segmentierungsaufgabe enthält. Der Inhalt der Ausgabe kann eine Kategoriemaske, eine Konfidenzmaske oder beides enthalten, je nachdem, was Sie bei der Konfiguration der Aufgabe festgelegt haben.

In den folgenden Abschnitten werden die Ausgabedaten dieser Aufgabe weiter erläutert:

Kategoriemaske

Die folgenden Bilder zeigen eine Visualisierung der Aufgabenausgabe für eine Kategoriewertmaske, wobei ein POI-Bereich angegeben ist. Jedes Pixel ist ein uint8-Wert, der angibt, ob das Pixel Teil des Objekts ist, das sich am relevanten Bereich befindet. Der schwarz-weiße Kreis auf dem zweiten Bild zeigt den ausgewählten Bereich an, der von Interesse ist.

Ausgabe des Originalbilds und der Kategoriemaske. Quellbild aus dem Dataset Pascal VOC 2012.

Konfidenzmaske

Die Ausgabe für eine Konfidenzmaske enthält Gleitkommawerte zwischen [0, 1] für jeden Bildeingabekanal. Höhere Werte weisen auf eine höhere Wahrscheinlichkeit hin, dass das Bildpixel Teil des Objekts ist, das sich im betreffenden Bereich befindet.