Anleitung zum Einbetten von Bildern für Python

Mit der MediaPipe-Bildeinbettungsaufgabe können Sie Bilddaten in eine numerische Darstellung umwandeln, um ML-bezogene Bildverarbeitungsaufgaben auszuführen, z. B. die Ähnlichkeit von zwei Bildern zu vergleichen. In dieser Anleitung erfahren Sie, wie Sie den Bildeinbetter mit Python verwenden.

Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.

Codebeispiel

Der Beispielcode für Image Embedder bietet zu Ihrer Information eine vollständige Implementierung dieser Aufgabe in Python. Dieser Code hilft Ihnen beim Testen dieser Aufgabe und beim Erstellen Ihres eigenen Bildeinbetters. Sie können den Beispielcode für das Einbetten von Bildern über Ihren Webbrowser mit Google Colab aufrufen, ausführen und bearbeiten. Sie können sich den Quellcode für dieses Beispiel auf GitHub ansehen.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte speziell für die Verwendung von Image Embedder 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.

Pakete

Die Aufgabe des Bildeinbetters ist das pip-Paket von mediapipe. So können Sie die Abhängigkeit installieren:

$ python -m pip install mediapipe

Importe

Importieren Sie die folgenden Klassen, um auf die Aufgabenfunktionen der Bildeinbettung zuzugreifen:

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

Modell

Die MediaPipe-Bildeinbettungsaufgabe erfordert ein trainiertes Modell, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu verfügbaren trainierten Modellen für Bildeinbetter finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.

Wählen Sie ein Modell aus, laden Sie es herunter und speichern Sie es dann in einem lokalen Verzeichnis. Sie können das empfohlene MobileNetV3-Modell verwenden.

model_path = '/absolute/path/to/mobilenet_v3_small_075_224_embedder.tflite'

Geben Sie den Pfad des Modells innerhalb des Parameters model_asset_path an, wie unten dargestellt:

base_options = BaseOptions(model_asset_path=model_path)

Aufgabe erstellen

Sie können die create_from_options-Funktion verwenden, um die Aufgabe zu erstellen. Die Funktion create_from_options akzeptiert Konfigurationsoptionen, um die Einbettungsoptionen festzulegen. Weitere Informationen zu Konfigurationsoptionen finden Sie unter Konfigurationsübersicht.

Die Aufgabe „Bild einbetten“ unterstützt drei Eingabedatentypen: Standbilder, Videodateien und Live-Videostreams. Wählen Sie den Tab für Ihren Eingabedatentyp aus, um zu sehen, wie die Aufgabe erstellt und die Inferenz ausgeführt wird.

Bild

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageEmbedder = mp.tasks.vision.ImageEmbedder
ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageEmbedderOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    quantize=True,
    running_mode=VisionRunningMode.IMAGE)

with ImageEmbedder.create_from_options(options) as embedder:
  # The embedder is initialized. Use it here.
  # ...
    

Video

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageEmbedder = mp.tasks.vision.ImageEmbedder
ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageEmbedderOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    quantize=True,
    running_mode=VisionRunningMode.VIDEO)

with ImageEmbedder.create_from_options(options) as embedder:
  # The embedder is initialized. Use it here.
  # ...
    

Livestream

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageEmbedderResult = mp.tasks.vision.ImageEmbedder.ImageEmbedderResult
ImageEmbedder = mp.tasks.vision.ImageEmbedder
ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions
VisionRunningMode = mp.tasks.vision.RunningMode

def print_result(result: ImageEmbedderResult, output_image: mp.Image, timestamp_ms: int):
    print('ImageEmbedderResult result: {}'.format(result))

options = ImageEmbedderOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    quantize=True,
    result_callback=print_result)

with ImageEmbedder.create_from_options(options) as embedder:
  # The embedder is initialized. Use it here.
  # ...
    

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
l2_normalize Gibt an, ob der zurückgegebene Featurevektor mit der L2-Norm normalisiert werden soll. Verwenden Sie diese Option nur, wenn das Modell noch keinen nativen L2_NORMALIZATION TFLite-Vorgang enthält. In den meisten Fällen ist dies bereits der Fall und die L2-Normalisierung wird daher durch TFLite-Inferenz erreicht, ohne dass diese Option erforderlich ist. Boolean False
quantize Gibt an, ob die zurückgegebene Einbettung über eine skalare Quantisierung in Byte quantisiert werden soll. Bei Einbettungen wird implizit davon ausgegangen, dass es sich um eine Einheitsnorm handelt. Daher hat jede Dimension garantiert einen Wert bei [-1,0, 1,0]. Sollte dies nicht der Fall sein, verwenden Sie die Option „l2_normalize“. Boolean False
result_callback Legt den Ergebnis-Listener so fest, dass er die Einbettungsergebnisse asynchron empfängt, wenn sich der Bildeinbetter im Livestreammodus befindet. Kann nur verwendet werden, wenn der Laufmodus auf LIVE_STREAM festgelegt ist Nicht festgelegt

Daten vorbereiten

Bereiten Sie die Eingabe als Bilddatei oder NumPy-Array vor und konvertieren Sie sie in ein mediapipe.Image-Objekt. Wenn es sich bei der Eingabe um eine Videodatei oder einen Livestream einer Webcam handelt, können Sie eine externe Bibliothek wie OpenCV verwenden, um Ihre Eingabeframes als NumPy-Arrays zu laden.

Bild

import mediapipe as mp

# 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

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it 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

import mediapipe as mp

# 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)
    

Task ausführen

Sie können die Einbettungsfunktion für den Ausführungsmodus aufrufen, um Inferenzen auszulösen. Die Image Embedder API gibt die Einbettungsvektoren für das Eingabebild oder den Eingabeframe zurück.

Bild

# Perform image embedding on the provided single image.
embedding_result = embedder.embed(mp_image)
    

Video

# Calculate the timestamp of the current frame
frame_timestamp_ms = 1000 * frame_index / video_file_fps

# Perform image embedding on the video frame.
embedding_result = embedder.embed_for_video(mp_image, frame_timestamp_ms)
    

Livestream


# Send the latest frame to perform image embedding.
# Results are sent to the `result_callback` provided in the `ImageEmbedderOptions`.
embedder.embed_async(mp_image, frame_timestamp_ms)
    

Wichtige Hinweise:

  • Im Video- oder Livestreammodus musst du außerdem in der Aufgabe „Bild einbetten“ den Zeitstempel des Eingabeframes angeben.
  • Bei Ausführung im Bild- oder Videomodell blockiert die Aufgabe „Bild einbetten“ den aktuellen Thread, bis die Verarbeitung des Eingabebilds oder ‐frames abgeschlossen ist.
  • Im Livestreammodus blockiert die Aufgabe zur Bildeinbettung den aktuellen Thread nicht, sondern wird sofort zurückgegeben. Jedes Mal, wenn ein Eingabeframe verarbeitet wurde, ruft er seinen Ergebnis-Listener mit dem Einbettungsergebnis auf. Wenn die Funktion embedAsync aufgerufen wird, während die Aufgabe des Bildeinbetters mit der Verarbeitung eines weiteren Frames beschäftigt ist, ignoriert die Aufgabe den neuen Eingabeframe.

Ergebnisse verarbeiten und anzeigen

Beim Ausführen der Inferenz gibt die Aufgabe zur Bildeinbettung ein ImageEmbedderResult-Objekt zurück, das die Liste der möglichen Kategorien für die Objekte im Eingabebild oder Frame enthält.

Im Folgenden sehen Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:

ImageEmbedderResult:
  Embedding #0 (sole embedding head):
    float_embedding: {0.0, 0.0, ..., 0.0, 1.0, 0.0, 0.0, 2.0}
    head_index: 0

Dieses Ergebnis wurde durch Einbetten des folgenden Bildes erzielt:

Mit der Funktion ImageEmbedder.cosine_similarity können Sie die Ähnlichkeit von zwei Einbettungen vergleichen. Im folgenden Code sehen Sie ein Beispiel.

# Compute cosine similarity.
similarity = ImageEmbedder.cosine_similarity(
  embedding_result.embeddings[0],
  other_embedding_result.embeddings[0])