Leitfaden zur Bildsegmentierung für Python

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.