Przewodnik umieszczania obrazów w Pythonie

Zadanie MediaPipe Image Embedder umożliwia konwertowanie danych obrazu na postać liczbową, aby wykonywać zadania związane z przetwarzaniem obrazu za pomocą uczenia maszynowego, takie jak porównywanie podobieństwa 2 obrazów. Z tych instrukcji dowiesz się, jak korzystać z narzędzia do wklejania obrazów w Pythonie.

Więcej informacji o możliwościach, modelach i opcjach konfiguracji związanych z tym zadaniem znajdziesz w sekcji Omówienie.

Przykładowy kod

Przykładowy kod modułu Image Embedder zawiera pełną implementację tego zadania w języku Python. Ten kod pomoże Ci przetestować to zadanie i rozpocząć tworzenie własnego wstawiacza obrazów. Możesz wyświetlać, uruchamiać i edytować przykładowy kod Image Embedder za pomocą przeglądarki internetowej i Google Colab. Kod źródłowy tego przykładu znajdziesz na GitHub.

Konfiguracja

W tej sekcji opisaliśmy kluczowe kroki konfigurowania środowiska programistycznego i projektów kodu w celu korzystania z wtyczki Image Embedder. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby korzystania z zadań MediaPipe, w tym wymagania dotyczące wersji platformy, znajdziesz w przewodniku po konfigurowaniu Pythona.

Pakiety

Zadanie Wstawianie obrazu używa pakietu mediapipe pip. Zależność możesz zainstalować za pomocą:

$ python -m pip install mediapipe

Importy

Aby uzyskać dostęp do funkcji zadania Image Embedder, zaimportuj te klasy:

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

Model

Zadanie MediaPipe Image Embedder wymaga wytrenowanego modelu, który jest zgodny z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach usługi Image Embedder znajdziesz w sekcji Modele w omówieniu zadania.

Wybierz i pobierz model, a następnie zapisz go w katalogu lokalnym. Możesz użyć zalecanego modelu MobileNetV3.

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

W parametrze model_asset_path podaj ścieżkę do modelu, jak pokazano poniżej:

base_options = BaseOptions(model_asset_path=model_path)

Tworzenie zadania

Do utworzenia zadania możesz użyć funkcji create_from_options. Funkcja create_from_options akceptuje opcje konfiguracji, które umożliwiają konfigurowanie opcji wtyczki. Więcej informacji o opcjach konfiguracji znajdziesz w artykule Omówienie konfiguracji.

Zadanie Wstawianie obrazów obsługuje 3 typy danych wejściowych: obrazy, pliki wideo i strumienie wideo na żywo. Aby dowiedzieć się, jak utworzyć zadanie i wykonywać wnioskowanie, wybierz kartę odpowiadającą typowi danych wejściowych.

Obraz

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

Wideo

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

Transmisja na żywo

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

Opcje konfiguracji

W tym zadaniu dostępne są te opcje konfiguracji aplikacji Pythona:

Nazwa opcji Opis Zakres wartości Wartość domyślna
running_mode Ustawia tryb działania zadania. Dostępne są 3 tryby:

OBRAZ: tryb dla pojedynczych obrazów wejściowych.

FILM: tryb dekodowanych klatek filmu.

LIVE_STREAM: tryb transmisji na żywo danych wejściowych, takich jak dane z kamery. W tym trybie należy wywołać metodę resultListener, aby skonfigurować odbiornik, który będzie asynchronicznie odbierał wyniki.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
l2_normalize Określa, czy zwrócony wektor cech ma być znormalizowany za pomocą normy L2. Używaj tej opcji tylko wtedy, gdy model nie zawiera już natywnej operacji TFLite L2_NORMALIZATION. W większości przypadków tak jest już w ogóle, więc normalizacja L2 jest osiągana przez wnioskowanie TFLite bez potrzeby stosowania tej opcji. Boolean False
quantize Określa, czy zwrócony wektor dystrybucyjny ma być zaokrąglony do bajtów za pomocą kwantyzacji skalarnej. Zakłada się, że wektory mają długość jednostkową, dlatego wartość dowolnego wymiaru musi mieścić się w zakresie [-1,0, 1,0]. Jeśli nie, użyj opcji l2_normalize. Boolean False
result_callback Ustawia odbiornik wyników tak, aby otrzymywał wyniki umieszczania asynchronicznie, gdy moduł umieszczania obrazu jest w trybie transmisji na żywo. Można go używać tylko wtedy, gdy tryb działania ma wartość LIVE_STREAM. Nie dotyczy Nie ustawiono

Przygotuj dane

Przygotuj dane wejściowe jako plik obrazu lub tablicę numpy, a potem przekonwertuj je na obiekt mediapipe.Image. Jeśli dane wejściowe to plik wideo lub transmisja na żywo z kamery internetowej, możesz użyć biblioteki zewnętrznej, takiej jak OpenCV, aby załadować ramki wejściowe jako tablice NumPy.

Obraz

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)
    

Wideo

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)
    

Transmisja na żywo

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)
    

Uruchamianie zadania

Aby wywołać wnioski, możesz wywołać funkcję osadzania odpowiadającą bieżącemu trybowi działania. Interfejs Image Embedder API zwraca wektory osadzania dla podawanego obrazu lub kadru.

Obraz

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

Wideo

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

Transmisja na żywo

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

Pamiętaj:

  • W trybie wideo lub transmisji na żywo musisz też przekazać zadaniu Image Embedder sygnaturę czasową ramki wejściowej.
  • Gdy zadanie jest wykonywane w przypadku modelu obrazu lub filmu, blokuje bieżący wątek, dopóki nie zakończy przetwarzania obrazu wejściowego lub klatki.
  • W trybie transmisji na żywo zadanie osadzania obrazów nie blokuje bieżącego wątku, ale zwraca się natychmiast. Za każdym razem, gdy zakończy przetwarzanie ramki wejściowej, wywoła swojego słuchacza z wynikiem. Jeśli funkcja embedAsync zostanie wywołana, gdy zadanie Image Embedder jest zajęte przetwarzaniem innej klatki, zadanie zignoruje nową klatkę wejściową.

Obsługa i wyświetlanie wyników

Po przeprowadzeniu wnioskowania zadanie Image Embedder zwraca obiekt ImageEmbedderResult, który zawiera listę możliwych kategorii obiektów na obrazie lub klatce wejściowej.

Poniżej znajdziesz przykład danych wyjściowych z tego zadania:

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

Ten wynik został uzyskany dzięki umieszczeniu tego obrazu:

Ujęcie średnie egzotycznego kota

Za pomocą funkcji ImageEmbedder.cosine_similarity możesz porównać podobieństwo 2 wkładników. Przykładowy kod znajdziesz poniżej.

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