Leitfaden zur Bildsegmentierung für Python

Mit der Aufgabe MediaPipe Image Segmenter können Sie Bilder basierend auf vordefinierten Kategorien für visuelle Effekte wie das Weichzeichnen des Hintergrunds. Diese Anweisungen zur Verwendung des Bildsegmenters mit der Programmiersprache Python. Für über die Funktionen, Modelle und Konfigurationsoptionen finden Sie in der Übersicht.

Codebeispiel

Der Beispielcode für Image Segmenter bietet eine vollständige Implementierung dieses in Python. Dieser Code hilft Ihnen, diese Aufgabe zu testen und mit der Erstellung einer eigenen Bildsegmentierungs-Anwendung begonnen. Sie können Daten abrufen, ausführen und Bildsegmentierung bearbeiten Beispielcode ganz einfach in Ihrem Webbrowser.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Code-Projekte zur Verwendung des Image Segmenter erstellen. Allgemeine Informationen zu Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Plattformversionsanforderungen finden Sie in der Einrichtungsleitfaden für Python Den Quellcode für dieses Beispiel finden Sie GitHub

Pakete

Für die Aufgabe „MediaPipe Image Segmenter“ ist das Paket mediapipe erforderlich. Sie können die mit dem folgenden Befehl die erforderlichen Abhängigkeiten:

$ python -m pip install mediapipe

Importe

Importieren Sie die folgenden Klassen, um auf die Aufgabenfunktionen "Bildsegmentierung" zuzugreifen:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

Modell

Für die Aufgabe „MediaPipe Image Segmenter“ ist ein trainiertes Modell erforderlich, . Weitere Informationen zu verfügbaren trainierten Modellen für den Bildsegmentator finden Sie unter den Abschnitt Modelle in der Aufgabenübersicht.

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 innerhalb des Parameters Model Name wie unten gezeigt an:

base_options = BaseOptions(model_asset_path=model_path)

Aufgabe erstellen

In der Aufgabe „MediaPipe Image Segmenter“ wird mithilfe der Funktion create_from_options die Aufgabe eingerichtet haben. Die Funktion create_from_options akzeptiert Werte für die Konfigurationsoptionen. Weitere Informationen zur Aufgabenkonfiguration Siehe 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 mit Eingabe zum Beispiel von einer Kamera. In diesem Modus muss der resultListener wird aufgerufen, um einen Listener für den Empfang von Ergebnissen einzurichten asynchron programmiert.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask Wenn True festgelegt ist, enthält die Ausgabe eine Segmentierungsmaske als Uint8-Bild, wobei jeder Pixelwert die Gewinnerkategorie angibt Wert. {True, False} False
output_confidence_masks Wenn True festgelegt ist, enthält die Ausgabe eine Segmentierungsmaske als Gleitkommawert, wobei jeder Gleitkommawert den Konfidenzwert darstellt Kurzübersicht der Kategorie. {True, False} True
display_names_locale 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
result_callback Legt den Ergebnis-Listener fest, der die Segmentierungsergebnisse empfangen soll asynchron, wenn sich der Bildsegmentierer im LIVE_STREAM-Modus befindet. Kann nur verwendet werden, wenn der Ausführungsmodus auf LIVE_STREAM festgelegt ist

Daten vorbereiten

Bereiten Sie Ihre Eingabe als Bilddatei oder als NumPy-Array vor. Konvertieren Sie es dann in ein mediapipe.Image-Objekt. Wenn Sie eine Videodatei eingegeben haben oder über eine Webcam streamen, kannst du eine externe Mediathek wie OpenCV, um die Eingabeframes als NumPy zu laden Arrays.

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 den Bildsegmentierer zeigt, finden Sie in der Codebeispiel an.

Aufgabe ausführen

Die Bildsegmentierung verwendet segment, segment_for_video und segment_async zum Auslösen von Inferenzen. Bei der Bildsegmentierung umfasst Eingabedaten vorverarbeiten, Segmentierungsmodell ausführen und Nachbearbeitung die Ausgabedaten des Modells in 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 musst du außerdem geben der Bildsegmentierungs-Aufgabe den Zeitstempel des Eingabe-Frames an.
  • Bei der Ausführung im Bild- oder Videomodell wird die Aufgabe "Bildsegmentierung" den aktuellen Thread blockieren, bis die Verarbeitung des Eingabebildes abgeschlossen ist, Frame.

Ein ausführlicheres Beispiel für die Ausführung von Image Segmenter-Inferenzen finden Sie in der Codebeispiel an.

Ergebnisse verarbeiten und anzeigen

Die Bildsegmentierung gibt eine Liste mit Image-Daten aus. Wenn output_type ist CATEGORY_MASK, die Ausgabe ist eine Liste mit einer einzelnen segmentierten Maske als Uint8-Bild. Das Pixel gibt an, erkannten Kategorieindex des Eingabebilds. Wenn output_type gleich CONFIDENCE_MASK ist die Ausgabe ein Vektor mit der Größe der Kategorienummer. Jedes Die segmentierte Maske ist ein Floating-Bild im Bereich [0,1], das den Konfidenzwert des Pixels, das zur Kategorie gehört.

In den folgenden Abschnitten finden Sie 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 Konfidenzmaske des Originalbilds und der Kategorie. Quell-Image von Pascal VOC 2012 Dataset.

Kategoriewert

Die folgenden Bilder zeigen eine Visualisierung der Aufgabenausgabe für eine Kategorie Wertmaske. Der Bereich der Kategoriemaske ist [0, 255] und jeder Pixelwert stellt den erfolgreichen Kategorieindex der Modellausgabe dar. Die Gewinnerkategorie Index die höchste Punktzahl unter den Kategorien hat, die das Modell erkennen kann.

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