Interaktive Anleitung zur Bildsegmentierung für Android

Mit der Aufgabe „MediaPipe Interactive Image Segmenter“ wird ein Ort in einem Bild ermittelt, die Grenzen an diesem Ort und gibt die Segmentierung für das Objekt als Bilddaten. In dieser Anleitung erfahren Sie, wie Sie den interaktiven Bildsegmentierer mit Android-Apps. Das in dieser Anleitung beschriebene Codebeispiel ist GitHub Weitere Informationen zu Funktionen, Modellen und Konfigurationsoptionen Sehen Sie sich die Übersicht an.

Codebeispiel

Das Codebeispiel für MediaPipe Tasks ist eine einfache Implementierung eines interaktiven Bildsegmenters für Android. Das Beispiel funktioniert mit Bildern, die aus der Gerätegalerie ausgewählt wurden.

Du kannst die App als Ausgangspunkt für deine eigene Android-App verwenden oder darauf verweisen wenn Sie eine vorhandene App ändern. Der Beispielcode für die interaktive Bildsegmentierung wird auf GitHub

Code herunterladen

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

<ph type="x-smartling-placeholder">

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 den Sparse-Checkout. Sie haben daher nur die Dateien für die Beispiel-App "Interactive Image Segmenter":
    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 importieren in Android Studio ein und führen die App aus. Anweisungen finden Sie in der Einrichtungsleitfaden für Android

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für dieses Bild. Beispielanwendung für Segmentierung:

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und für die Verwendung des interaktiven Bildsegmentierers. Allgemeine Informationen zu Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Plattformversionsanforderungen finden Sie in der Einrichtungsleitfaden für Android

<ph type="x-smartling-placeholder">

Abhängigkeiten

Interaktive Bildsegmentierung verwendet die Bibliothek com.google.mediapipe:tasks-vision. Dieses Element hinzufügen Abhängigkeit zur build.gradle-Datei Ihres Android-App-Entwicklungsprojekt Importieren Sie die erforderlichen Abhängigkeiten mit den folgenden Code:

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

Modell

Für die Aufgabe „Interactive Image Segmenter“ von MediaPipe ist ein trainiertes Modell erforderlich, für die Aufgabe. Weitere Informationen zu verfügbaren trainierten Modellen für den Interactive Image Segmenter finden Sie unter 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 Pfad anzugeben. die vom Modell verwendet werden. Diese Methode wird im Codebeispiel in den .

In der interaktiven Bildsegmentierung Beispielcode Das Modell ist in InteractiveSegmenterHelper.kt definiert. in der Funktion setupInteractiveSegmenter().

Aufgabe erstellen

Zum Erstellen der Aufgabe können Sie die Funktion createFromOptions verwenden. Die Die Funktion createFromOptions akzeptiert Konfigurationsoptionen, darunter: Ausgabetypen der Maske. Weitere Informationen zur Konfiguration 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 InteractiveSegmenterHelper Klasse setupInteractiveSegmenter().

Konfigurationsoptionen

Diese Aufgabe bietet 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 eines das Objekt, das sich im gewünschten Bereich befindet. {True, False} False
outputConfidenceMasks Wenn True festgelegt ist, enthält die Ausgabe eine Segmentierungsmaske als Gleitkommawert, wobei jeder Gleitkommawert den Konfidenzwert darstellt Das Pixel ist Teil des Objekts, das sich im gewünschten Bereich befindet. {True, False} True
displayNamesLocale Legt die Sprache der Labels fest, die für Anzeigenamen in der Metadaten des Aufgabenmodells, falls verfügbar. Standardwert ist en für Englisch. Sie können den Metadaten eines benutzerdefinierten Modells lokalisierte Labels hinzufügen mit der TensorFlow Lite Metadata Writer API Gebietsschemacode de
errorListener Legt einen optionalen Fehler-Listener fest. Nicht festgelegt

Daten vorbereiten

Die interaktive Bildsegmentierung arbeitet mit Bildern und die Aufgabe verarbeitet die Dateneingabe. Vorverarbeitung, einschließlich Größenanpassung, Rotation und Wertnormalisierung. Sie müssen das Eingabebild in ein com.google.mediapipe.framework.image.MPImage-Objekt vor der Übergabe an den für die Aufgabe.

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();
RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

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

Im Beispielcode der interaktiven Bildsegmentierung sind die segment-Funktionen in der InteractiveSegmenterHelper.kt -Datei.

Ergebnisse verarbeiten und anzeigen

Beim Ausführen der Inferenz gibt die Aufgabe „Interactive Image Segmenter“ eine ImageSegmenterResult-Objekt, das die Ergebnisse der Segmentierungsaufgabe. Der Inhalt der Ausgabe kann eine Kategoriemaske, Konfidenzmaske oder beides, je nachdem, was Sie konfiguriert.

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 Kategorie Wertmaske mit einem angegebenen POI. Jedes Pixel ist ein uint8 -Wert, der angibt, ob das Pixel Teil des Objekts ist, das sich im Bereich von Interesse. Der schwarz-weiße Kreis im zweiten Bild steht für die ausgewählte Interessengebiet.

Ausgabe des Originalbilds und der Kategoriemaske. Quell-Image von Pascal VOC 2012 Dataset.

Konfidenzmaske

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