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.