Anleitung zum Einbetten von Bildern für Python

Mit der Aufgabe „MediaPipe Image Embedder“ können Sie Bilddaten in eine numerische Darstellung konvertieren um ML-bezogene Bildverarbeitungsaufgaben zu erledigen, z. B. den Vergleich der Ähnlichkeit von zwei Bildern. In dieser Anleitung erfahren Sie, wie Sie die Image Embedder mit Python verwenden.

Weitere Informationen zu Funktionen, Modellen und Konfigurationsoptionen Sehen Sie sich die Übersicht an.

Codebeispiel

Der Beispielcode für den Bildeinbetter bietet eine vollständige Implementierung dieses in Python. Dieser Code hilft Ihnen, diese Aufgabe zu testen und mit dem Erstellen eines eigenen Bildeinbetters begonnen. Sie können den Bereich Beispiel für den Bildeinbetter Code mit Google Colab in Ihrem Webbrowser. Sie können den Quellcode für dieses Beispiel auf GitHub

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte für die Verwendung von Bildeinbetter erstellen. Allgemeine Informationen zu Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Anforderungen an die Plattformversion finden Sie im Einrichtungsleitfaden für Python.

<ph type="x-smartling-placeholder">

Pakete

Aufgabe des Bildeinbetters für das mediapipe-PIP-Paket Sie können die Abhängigkeit Dabei gilt:

$ python -m pip install mediapipe

Importe

Importieren Sie die folgenden Klassen, um auf die Aufgabenfunktionen zum Einbinden von Bildern zuzugreifen:

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

Modell

Für die Aufgabe „MediaPipe Image Embedder“ ist ein trainiertes Modell erforderlich, für die Aufgabe. Weitere Informationen zu verfügbaren trainierten Modellen für den Bildeinbetter findest du unter 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 die empfohlenen MobileNetV3 modellieren.

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

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

base_options = BaseOptions(model_asset_path=model_path)

Aufgabe erstellen

Zum Erstellen der Aufgabe können Sie die Funktion create_from_options verwenden. Die Die Funktion create_from_options akzeptiert Konfigurationsoptionen, um den Einbettungscode festzulegen Optionen. Weitere Informationen zu Konfigurationsoptionen finden Sie unter Konfiguration Übersicht.

Bei der Aufgabe „Bild einbetten“ werden drei Arten von Eingabedaten unterstützt: Standbilder und Videodateien. und Live-Videostreams. Wählen Sie die Registerkarte, die Ihrem Eingabedatentyp entspricht, und wie Sie die Aufgabe erstellen und eine Inferenz ausführen.

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 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
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 keine native L2_NORMALIZATION TFLite Op. In den meisten Fällen ist dies bereits der Fall und Die L2-Normalisierung wird somit über TFLite-Inferenz ohne Notwendigkeit erreicht. für diese Option. Boolean False
quantize Ob die zurückgegebene Einbettung in Byte quantisiert werden soll mithilfe von eine skalare Quantisierung. Bei Einbettungen wird implizit angenommen, Daher hat jede Dimension garantiert einen Wert in [-1,0; 1,0]. Verwenden Sie die Option „l2_normalize“ verwenden, wenn dies nicht der Fall ist. Boolean False
result_callback Legt den Ergebnis-Listener fest, der die Einbettungsergebnisse empfangen soll asynchron, wenn sich der Bildeinbetter im Livestream befindet . Kann nur verwendet werden, wenn der Ausführungsmodus auf LIVE_STREAM festgelegt ist Nicht festgelegt

Daten vorbereiten

Bereiten Sie Ihre Eingabe als Bilddatei oder NumPy-Array vor und konvertieren Sie sie in ein mediapipe.Image-Objekt. Wenn Sie eine Videodatei oder einen Livestream von einem können Sie eine externe Bibliothek wie OpenCV, um die Eingabeframes als NumPy zu laden Arrays.

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)
    

Aufgabe ausführen

Sie können die Einbettungsfunktion aufrufen, die Ihrem Ausführungsmodus entspricht, um Rückschlüsse. Die Image Embedder API gibt die Einbettungsvektoren für den ein Bild oder einen Frame ein.

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 der Aufgabe zum Einbinden von Bildern den Zeitstempel des Eingabe-Frames.
  • Bei der Ausführung im Bild- oder Videomodell wird die Aufgabe „Bildeinbetter“ den aktuellen Thread blockieren, bis die Verarbeitung des Eingabebildes abgeschlossen ist. Frame.
  • Im Livestreammodus blockiert die Aufgabe „Bild einbetten“ nicht aktuellen Thread angelehnt, aber sofort wieder zurück. Das Ergebnis wird aufgerufen. Listener mit dem Einbettungsergebnis jedes Mal, wenn er die Verarbeitung eines Eingabe-Frame. Ob die Funktion embedAsync aufgerufen wird, wenn der Bildeinbetter die Aufgabe mit der Verarbeitung eines anderen Frames beschäftigt ist, ignoriert die Aufgabe den neuen Eingabeframe.

Ergebnisse verarbeiten und anzeigen

Beim Ausführen einer Inferenz gibt die Aufgabe zum Einbinden von Bildern ein ImageEmbedderResult zurück. -Objekt, das die Liste der möglichen Kategorien für die Objekte im ein Bild oder einen Frame ein.

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 erhalten:

Sie können die Ähnlichkeit von zwei Einbettungen mithilfe der Funktion ImageEmbedder.cosine_similarity. Im folgenden Code finden Sie eine Beispiel.

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