Zadanie MediaPipe Image Embedder umożliwia konwertowanie danych obrazu na reprezentację liczbową np. do porównywania podobieństwo dwóch obrazów. Z tych instrukcji dowiesz się, jak korzystać z Umieszczanie obrazów w języku Python.
Więcej informacji o funkcjach, modelach i opcjach konfiguracji zapoznaj się z Przeglądem.
Przykładowy kod
Przykładowy kod komponentu Image Embedder zapewnia pełną implementację w Pythonie. Ten kod pomoże Ci przetestować to zadanie i uzyskać zaczął tworzenie własnego narzędzia do umieszczania obrazów. Możesz wyświetlać, uruchamiać i edytować Komponent do umieszczania obrazów przykład kod używając Google Colab tylko w przeglądarce. Możesz wyświetlić kod źródłowy dla ten przykład na GitHub
Konfiguracja
W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu, w których wykorzystano narzędzie do umieszczania obrazów. Ogólne informacje na temat: skonfigurować środowisko programistyczne do korzystania z zadań MediaPipe, w tym wymagań wersji platformy znajdziesz w przewodniku konfiguracji dla Pythona.
Pakiety
Komponent do dodawania obrazów wykonuje zadanie związane z pakietem pip mediapipe. Możesz zainstalować zależność z następującymi wartościami:
$ python -m pip install mediapipe
Importy
Aby uzyskać dostęp do funkcji zadań umieszczania obrazów, 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 zgodnego z tym zadanie. Więcej informacji o dostępnych wytrenowanych modelach narzędzia do dodawania obrazów znajdziesz w materiałach na temat zapoznaj się z omówieniem zadania sekcją Modele.
Wybierz i pobierz model, a następnie zapisz go w katalogu lokalnym. Za pomocą zalecane MobileNetV3 model atrybucji.
model_path = '/absolute/path/to/mobilenet_v3_small_075_224_embedder.tflite'
Określ ścieżkę modelu w parametrze model_asset_path
, 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, aby ustawić umieszczony element
. Więcej informacji o opcjach konfiguracji znajdziesz w sekcji Konfiguracja
Przegląd.
Zadanie dodawania obrazów obsługuje 3 typy danych wejściowych: obrazy i pliki wideo i transmisje wideo na żywo. Wybierz kartę odpowiadającą typowi danych wejściowych, aby jak utworzyć zadanie i przeprowadzić wnioskowanie.
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
To zadanie zawiera te opcje konfiguracji aplikacji w Pythonie:
Nazwa opcji | Opis | Zakres wartości | Wartość domyślna |
---|---|---|---|
running_mode |
Ustawia tryb działania zadania. Są trzy
tryby: IMAGE: tryb wprowadzania pojedynczego obrazu. WIDEO: tryb zdekodowanych klatek filmu. LIVE_STREAM: tryb transmisji danych wejściowych na przykład z kamery. W tym trybie detektor wyników musi mieć wartość wywołano, aby skonfigurować detektor i otrzymywać wyniki asynchronicznie. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
l2_normalize |
Określa, czy znormalizować zwrócony wektor cech z normą L2. Użyj tej opcji tylko wtedy, gdy model nie zawiera jeszcze reklamy natywnej L2_NORMALIZATION TFLite Op. W większości przypadków tak jest i tak, Normalizacja L2 jest więc osiągana przez wnioskowanie TFLite i nie ma potrzeby dla tej opcji. | Boolean |
False |
quantize |
Określa, czy zwrócony wektor dystrybucyjny powinien być skwantyzowany na bajty za pomocą kwantyzacji skalarnej. Odtwarzacze domyślnie przyjmuje się, że są zgodne z normą jednostkową, w związku z tym każdy wymiar będzie miał wartość w zakresie [-1,0; 1,0]. Używaj wybierz opcję l2_normalize. | Boolean |
False |
result_callback |
Konfiguruje detektor wyników, który otrzymuje wyniki wektora dystrybucyjnego
asynchronicznie, gdy komponent Image Embedder jest w transmisji na żywo.
i trybu uzyskiwania zgody. Tej opcji można używać tylko wtedy, gdy tryb działania jest ustawiony na LIVE_STREAM |
Nie dotyczy | Nie ustawiono |
Przygotuj dane
Przygotuj dane wejściowe jako plik graficzny lub tablicę numpy, a następnie przekonwertuj je na
mediapipe.Image
obiekt. Jeśli dane wejściowe to plik wideo lub transmisja na żywo z
kamery internetowej, możesz użyć zewnętrznej biblioteki, takiej jak
OpenCV, który wczytuje klatki wejściowe w formacie numpy
tablice.
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 aktywować funkcję, możesz wywołać funkcję umieszczania odpowiadającą Twojemu trybowi działającemu danych. Interfejs Image Embedder API zwróci wektory dystrybucyjne dla obiektu obrazu lub ramki.
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:
- Gdy pracujesz w trybie wideo lub w trybie transmisji na żywo, musisz też podaj w zadaniu Umieszczanie obrazów sygnaturę czasową ramki wejściowej.
- Po uruchomieniu w obrazie lub modelu wideo zadanie umieszczania obrazu zablokuj bieżący wątek do czasu zakończenia przetwarzania obrazu wejściowego lub ramki.
- W trybie transmisji na żywo zadanie umieszczania obrazów nie blokuje
w bieżącym wątku, ale wraca natychmiast. Wywoła swój wynik
detektor z wynikiem wektora dystrybucyjnego za każdym razem, gdy zakończy przetwarzanie
ramki wejściowej. Jeśli funkcja
embedAsync
jest wywoływana przy użyciu narzędzia do umieszczania obrazów zadanie jest zajęte przetwarzaniem innej ramki, zadanie zignoruje nową ramkę wejściową.
Obsługa i wyświetlanie wyników
Po uruchomieniu wnioskowania zadanie umieszczania obrazów zwraca wartość ImageEmbedderResult
.
który zawiera listę możliwych kategorii obiektów w
obrazu lub ramki.
Poniżej znajdziesz przykładowe dane wyjściowe 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 udało się uzyskać przez umieszczenie tego obrazu:
Możesz porównać podobieństwo dwóch wektorów dystrybucyjnych, korzystając z funkcji
ImageEmbedder.cosine_similarity
. Poniżej znajdziesz kod dla
przykład.
# Compute cosine similarity.
similarity = ImageEmbedder.cosine_similarity(
embedding_result.embeddings[0],
other_embedding_result.embeddings[0])