Mit der Aufgabe „MediaPipe-Bildsegmentierung“ können Sie Bilder anhand vordefinierter Kategorien in Regionen unterteilen, um visuelle Effekte wie das Weichzeichnen des Hintergrunds anzuwenden. In dieser Anleitung erfahren Sie, wie Sie den Image Segmenter mit der Programmiersprache Python verwenden. Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.
Codebeispiel
Der Beispielcode für Image Segmenter bietet eine vollständige Implementierung dieser Aufgabe in Python zu Referenzzwecken. Dieser Code hilft Ihnen beim Testen dieser Aufgabe und beim Erstellen Ihrer eigenen Anwendung zur Bildsegmentierung. Sie können den Beispielcode von Image Segmenter einfach über Ihren Webbrowser aufrufen, ausführen und bearbeiten.
Einrichtung
In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte speziell für die Verwendung von 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 Python. Sie können den Quellcode für dieses Beispiel auf GitHub überprüfen.
Pakete
Für die Aufgabe „MediaPipe Image Segmenter“ ist das Paket mediapipe
erforderlich. Sie können die erforderlichen Abhängigkeiten mit dem folgenden Befehl installieren:
$ python -m pip install mediapipe
Importe
Importieren Sie die folgenden Klassen, um auf die Aufgabenfunktionen des Image Segmenter zuzugreifen:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Modell
Für die MediaPipe-Bildsegmentierungsaufgabe ist ein trainiertes Modell erforderlich, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu verfügbaren trainierten Modellen für 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:
model_path = '/absolute/path/to/model.tflite'
Geben Sie den Pfad des Modells im Modellnamen-Parameter an, wie unten dargestellt:
base_options = BaseOptions(model_asset_path=model_path)
Aufgabe erstellen
Die Aufgabe „MediaPipe Image Segmenter“ verwendet die Funktion create_from_options
, um sie einzurichten. Die Funktion create_from_options
akzeptiert Werte, die von Konfigurationsoptionen verarbeitet werden sollen. Weitere Informationen zur Aufgabenkonfiguration finden Sie unter Konfigurationsoptionen.
Diese Beispiele zeigen auch die Variationen der Aufgabenkonstruktion für Bilder, Videodateien und Live-Videostreams.
Bild
BaseOptions = mp.tasks.BaseOptions ImageSegmenter = mp.tasks.vision.ImageSegmenter ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions VisionRunningMode = mp.tasks.vision.RunningMode # Create a image segmenter instance with the image mode: options = ImageSegmenterOptions( base_options=BaseOptions(model_asset_path='/path/to/model.task'), running_mode=VisionRunningMode.IMAGE, output_category_mask=True) with ImageSegmenter.create_from_options(options) as segmenter:
Video
BaseOptions = mp.tasks.BaseOptions ImageSegmenter = mp.tasks.vision.ImageSegmenter ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions VisionRunningMode = mp.tasks.vision.RunningMode # Create a image segmenter instance with the video mode: options = ImageSegmenterOptions( base_options=BaseOptions(model_asset_path='/path/to/model.task'), running_mode=VisionRunningMode.VIDEO, output_category_mask=True) with ImageSegmenter.create_from_options(options) as segmenter:
Livestream
BaseOptions = mp.tasks.BaseOptions ImageSegmenter = mp.tasks.vision.ImageSegmenter ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions VisionRunningMode = mp.tasks.vision.RunningMode # Create a image segmenter instance with the live stream mode: def print_result(result: List[Image], output_image: Image, timestamp_ms: int): print('segmented masks size: {}'.format(len(result))) options = ImageSegmenterOptions( base_options=BaseOptions(model_asset_path='/path/to/model.task'), running_mode=VisionRunningMode.VIDEO, output_category_mask=True) with ImageSegmenter.create_from_options(options) as segmenter:
Konfigurationsoptionen
Diese Aufgabe bietet die folgenden Konfigurationsoptionen für Python-Anwendungen:
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
running_mode |
Legt den Ausführungsmodus für die Task fest. Es gibt drei Modi: IMAGE: Der Modus für Einzelbildeingaben. VIDEO: Der Modus für decodierte Frames eines Videos. LIVE_STREAM: Der Modus für einen Livestream der Eingabedaten, z. B. von einer Kamera. In diesem Modus muss resultListener aufgerufen werden, um einen Listener einzurichten, der die Ergebnisse asynchron empfängt. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
output_category_mask |
Wenn True festgelegt ist, enthält die Ausgabe eine Segmentierungsmaske als uint8-Bild, wobei jeder Pixelwert den Wert der erfolgreichen Kategorie angibt. |
{True, False } |
False |
output_confidence_masks |
Wenn True festgelegt ist, enthält die Ausgabe eine Segmentierungsmaske als Gleitkommazahlbild, wobei jeder Gleitkommawert die Konfidenzwertzuordnung der Kategorie darstellt. |
{True, False } |
True |
display_names_locale |
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 |
result_callback |
Legt den Ergebnis-Listener so fest, dass die Segmentierungsergebnisse asynchron empfangen werden, wenn sich der Bildsegmentierer im Livestream-Modus befindet.
Kann nur verwendet werden, wenn der Laufmodus auf LIVE_STREAM festgelegt ist |
– | – |
Daten vorbereiten
Bereiten Sie Ihre Eingabe als Bilddatei oder NumPy-Array vor und konvertieren Sie sie in ein mediapipe.Image
-Objekt. Wenn Ihre Eingabe eine Videodatei oder ein Livestream über eine Webcam ist, können Sie eine externe Bibliothek wie OpenCV verwenden, um Ihre Eingabeframes als NumPy-Arrays zu laden.
Bild
# Load the input image from an image file. mp_image = mp.Image.create_from_file('/path/to/image') # Load the input image from a numpy array. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
Video
# Use OpenCV’s VideoCapture to load the input video. # Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS # You need the frame rate to calculate the timestamp for each frame. # Loop through each frame in the video using VideoCapture#read() # Convert the frame received from OpenCV to a MediaPipe’s Image object. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
Livestream
# Use OpenCV’s VideoCapture to start capturing from the webcam. # Create a loop to read the latest frame from the camera using VideoCapture#read() # Convert the frame received from OpenCV to a MediaPipe’s Image object. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
Ein Codebeispiel, das die Vorbereitung von Daten für Image Segmenter veranschaulicht, finden Sie im Codebeispiel.
Task ausführen
Der Image Segmenter verwendet die Funktionen segment
, segment_for_video
und segment_async
, um Inferenzen auszulösen. Bei der Bildsegmentierung umfasst dies die Vorverarbeitung von Eingabedaten, das Ausführen des Segmentierungsmodells und die Nachbearbeitung der Rohmodellausgaben an die segmentierten Masken.
Die folgenden Codebeispiele zeigen, wie die Verarbeitung mit dem Aufgabenmodell ausgeführt wird.
Bild
# Perform image segmentation on the provided single image. # The image segmenter must be created with the image mode. segmented_masks = segmenter.segment(mp_image)
Video
# Perform image segmentation on the provided single image. # The image segmenter must be created with the video mode. segmented_masks = segmenter.segment_for_video(mp_image, frame_timestamp_ms)
Livestream
# Send live image data to perform image segmentation. # The results are accessible via the `result_callback` provided in # the `ImageSegmenterOptions` object. # The image segmenter must be created with the live stream mode. segmenter.segment_async(mp_image, frame_timestamp_ms)
Wichtige Hinweise:
- Im Video- oder Livestreammodus müssen Sie auch den Zeitstempel des Eingabeframes in der Aufgabe zur Bildsegmentierung angeben.
- Bei Ausführung im Bild- oder Videomodell blockiert die Aufgabe zur Bildsegmentierung den aktuellen Thread, bis die Verarbeitung des Eingabebilds oder ‐frames abgeschlossen ist.
Ein ausführlicheres Beispiel für das Ausführen von Image Segmenter-Inferenzen finden Sie im Codebeispiel.
Ergebnisse verarbeiten und anzeigen
Der Image Segmenter gibt eine Liste mit Image
-Daten aus. Wenn output_type
den Wert CATEGORY_MASK
hat, wird eine Liste ausgegeben, die eine einzelne segmentierte Maske als uint8-Bild enthält. Das Pixel gibt den erkannten Kategorieindex des Eingabebilds an. Wenn output_type
den Wert CONFIDENCE_MASK
hat, ist die Ausgabe ein Vektor mit der Größe der Kategorienummer. Jede segmentierte Maske ist ein Float-Bild im Bereich [0,1]
, das den Konfidenzwert des Pixels der Kategorie darstellt.
Die folgenden Abschnitte enthalten Beispiele für die Ausgabedaten dieser Aufgabe:
Kategorie Konfidenz
Die folgenden Bilder zeigen eine Visualisierung der Aufgabenausgabe für eine Kategorie-Konfidenzmaske. Die Ausgabe der Konfidenzmaske enthält Gleitkommawerte zwischen [0, 1]
.
Ausgabe der Originalbild- und Kategorie-Konfidenzmaske. Quellbild aus dem Dataset Pascal VOC 2012.
Kategoriewert
Die folgenden Bilder zeigen eine Visualisierung der Aufgabenausgabe für eine Kategoriewertmaske. Der Kategoriemaskenbereich ist [0, 255]
und jeder Pixelwert stellt den erfolgreichen Kategorieindex der Modellausgabe dar. Der Index der erfolgreichen Kategorie hat den höchsten Wert unter den Kategorien, die das Modell erkennen kann.
Ausgabe des Originalbilds und der Kategoriemaske. Quellbild aus dem Dataset Pascal VOC 2012.