Die Aufgabe „MediaPipe Interactive Image Segmenter“ nimmt einen Ort 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 interaktiven Bildsegmenter 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 MediaPipe Tasks-Codebeispiel ist eine einfache Implementierung einer App für den interaktiven Bildsegmentierungsalgorithmus 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 sich an ihr orientieren, wenn Sie eine vorhandene App ändern. Der Beispielcode für den interaktiven Bildsegmenter wird auf GitHub gehostet.
Code herunterladen
In der folgenden Anleitung wird beschrieben, wie Sie mit dem Befehlszeilentool git eine lokale Kopie des Beispielcodes erstellen.
So laden Sie den Beispielcode herunter:
- Klonen Sie das Git-Repository mit dem folgenden Befehl:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Optional können Sie Ihre Git-Instanz so konfigurieren, dass eine spärliche Überprüfung verwendet wird, sodass nur die Dateien für die Beispielanwendung „Interactive Image Segmenter“ vorhanden sind:
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 wichtigsten Code für diese Beispielanwendung zur Bildsegmentierung:
- InteractiveSegmentationHelper.kt: Hier wird die Aufgabe „Interaktiver Bildsegmenter“ initialisiert und die Modell- und Delegate-Auswahl verarbeitet.
- OverlayView.kt: Hier werden die Segmentierungsergebnisse verarbeitet und formatiert.
Einrichtung
In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte für die Verwendung des interaktiven Bildsegmentierungstools beschrieben. Allgemeine Informationen zum Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Anforderungen an die Plattformversion, finden Sie im Einrichtungsleitfaden für Android.
Abhängigkeiten
Der interaktive Bildsegmenter 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 Aufgabe „MediaPipe Interactive Image Segmenter“ ist ein trainiertes Modell erforderlich, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu verfügbaren trainierten Modellen für den interaktiven Bildsegmenter finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.
Wählen Sie das Modell aus, laden Sie es herunter und speichern Sie es 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 veranschaulicht.
Im Beispielcode für den interaktiven Bildsegmenter wird das Modell in der Klasse InteractiveSegmenterHelper.kt
in der Funktion setupInteractiveSegmenter()
definiert.
Aufgabe erstellen
Sie können die Aufgabe mit der Funktion createFromOptions
erstellen. Die Funktion createFromOptions
akzeptiert Konfigurationsoptionen, einschließlich Maskierungsausgabetypen. Weitere Informationen zu den 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(exception -> { // Process the segmentation errors here. }) .build(); interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);
Ein ausführlicheres Beispiel für die Einrichtung dieser Aufgabe finden Sie in der setupInteractiveSegmenter()
-Funktion der Klasse InteractiveSegmenterHelper
.
Konfigurationsoptionen
Für diese Aufgabe sind die folgenden Konfigurationsoptionen für Android-Apps verfügbar:
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
outputCategoryMask |
Wenn dieser Wert auf True gesetzt ist, enthält die Ausgabe eine Segmentierungsmaske als uint8-Bild, bei der jeder Pixelwert angibt, ob das Pixel zum Objekt im Bereich von Interesse gehört. |
{True, False } |
False |
outputConfidenceMasks |
Wenn dieser Wert auf True gesetzt ist, enthält die Ausgabe eine Segmentierungsmaske als Bild mit Gleitkommawerten. Jeder Gleitkommawert gibt die Wahrscheinlichkeit an, dass das Pixel Teil des Objekts im interessierenden Bereich ist. |
{True, False } |
True |
displayNamesLocale |
Legt die Sprache der Labels fest, die für die Anzeigenamen verwendet werden, die in den Metadaten des Modells der Aufgabe angegeben sind, sofern verfügbar. Der Standardwert ist en für Englisch. Mit der TensorFlow Lite Metadata Writer API können Sie den Metadaten eines benutzerdefinierten Modells lokalisierte Labels hinzufügen.
| Gebietscode | de |
errorListener |
Legt einen optionalen Fehler-Listener fest. | – | Nicht festgelegt |
Daten vorbereiten
Der interaktive Bildsegmenter funktioniert mit Bildern und die Aufgabe übernimmt die Vorverarbeitung der Dateneingabe, einschließlich Größenänderung, Drehung und Wertnormalisierung.
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. MPImage mpImage = new BitmapImageBuilder(bitmap).build();
Im Beispielcode für den interaktiven Bildsegmenter wird die Datenvorbereitung in der Klasse InteractiveSegmenterHelper
durch die Funktion segment()
ausgeführt.
Aufgabe ausführen
Rufen Sie die Funktion segment
auf, um die Vorhersage auszuführen und Segmente zu generieren.
Die Aufgabe „Interaktiver Bildsegmentierer“ gibt die erkannten 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 für den interaktiven Bildsegmenter sind die segment
-Funktionen in der Datei InteractiveSegmenterHelper.kt
definiert.
Ergebnisse verarbeiten und anzeigen
Nach der Ausführung der Inferenz gibt die Aufgabe „Interaktiver Bildsegmenter“ 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 näher erläutert:
Kategoriemaske
Die folgenden Bilder zeigen eine Visualisierung der Aufgabenausgabe für eine Kategoriewertmaske mit einem Punktbereich von Interesse. Jeder Pixel hat einen uint8
-Wert, der angibt, ob er zum Objekt im gewünschten Bereich gehört. Der schwarz-weiße Kreis auf dem zweiten Bild zeigt den ausgewählten Bereich an.
Originalbild und Kategoriemaskenausgabe. Quellbild aus dem Pascal VOC 2012-Dataset.
Konfidenzmaske
Die Ausgabe einer Konfidenzmaske enthält für jeden Bildeingabekanal Gleitkommawerte zwischen [0, 1]
. Je höher der Wert, desto höher ist die Wahrscheinlichkeit, dass das Bildpixel Teil des Objekts ist, das sich im Bereich von Interesse befindet.