Interaktive Anleitung zur Bildsegmentierung für Android

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:

  1. Klonen Sie das Git-Repository mit dem folgenden Befehl:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 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 users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes 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.

Ein Hund, der inmitten eines Laubhaufens steht Die Umrisse des Hundes aus dem vorherigen Bild

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.