Guida all'incorporamento di immagini per Python

L'attività Incorporamento di immagini MediaPipe consente di convertire i dati delle immagini in una rappresentazione numerica per svolgere attività di elaborazione delle immagini relative al machine learning, come il confronto della somiglianza tra due immagini. Queste istruzioni mostrano come usare Image Embedder con Python.

Per ulteriori informazioni sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.

Esempio di codice

Il codice di esempio per l'incorporamento di immagini fornisce un'implementazione completa di questa attività in Python come riferimento. Questo codice ti consente di testare l'attività e iniziare a creare un incorporamento di immagini. Puoi visualizzare, eseguire e modificare il codice di esempio di Image Embedder utilizzando solo il tuo browser web con Google Colab. Puoi visualizzare il codice sorgente per questo esempio su GitHub.

Configurazione

In questa sezione vengono descritti i passaggi chiave per configurare l'ambiente di sviluppo e codificare i progetti in modo specifico per l'utilizzo di Image Embedder. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti di versione della piattaforma, consulta la Guida alla configurazione per Python.

Pacchetti

L'attività di incorporamento di immagini per il pacchetto pip mediapipe. Puoi installare la dipendenza con quanto segue:

$ python -m pip install mediapipe

Importazioni

Importa le seguenti classi per accedere alle funzioni dell'attività Incorporamento di immagini:

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

Modello

L'attività Incorporamento di immagini MediaPipe richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per l'incorporamento di immagini, consulta la sezione Modelli della panoramica dell'attività.

Seleziona e scarica un modello, quindi archivialo in una directory locale. Puoi utilizzare il modello consigliato MobileNetV3.

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

Specifica il percorso del modello all'interno del parametro model_asset_path, come mostrato di seguito:

base_options = BaseOptions(model_asset_path=model_path)

Creare l'attività

Puoi utilizzare la funzione create_from_options per creare l'attività. La funzione create_from_options accetta le opzioni di configurazione per impostare le opzioni di incorporamento. Per ulteriori informazioni sulle opzioni di configurazione, consulta Panoramica della configurazione.

L'attività Incorporamento di immagini supporta 3 tipi di dati di input: immagini fisse, file video e stream video in diretta. Scegli la scheda corrispondente al tipo di dati di input per vedere come creare l'attività ed eseguire l'inferenza.

Immagine

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

Live streaming

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

Opzioni di configurazione

Questa attività prevede le seguenti opzioni di configurazione per le applicazioni Python:

Nome opzione Descrizione Intervallo di valori Valore predefinito
running_mode Imposta la modalità di esecuzione per l'attività. Esistono tre modalità:

IMAGE: la modalità per gli input di singole immagini.

VIDEO: la modalità per i fotogrammi decodificati di un video.

LIVE_STREAM: la modalità per un live streaming di dati di input, ad esempio da una videocamera. In questa modalità, resultListener deve essere chiamato per configurare un listener per ricevere i risultati in modo asincrono.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
l2_normalize Indica se normalizzare il vettore di caratteristiche restituito con la norma L2. Utilizza questa opzione solo se il modello non contiene già un'operatività TFLite L2_NORMALIZATION nativa. Nella maggior parte dei casi, è già così e la normalizzazione L2 viene quindi ottenuta tramite l'inferenza TFLite senza necessità di questa opzione. Boolean False
quantize Indica se l'incorporamento restituito deve essere quantizzato in byte tramite la quantizzazione scalare. Gli incorporamenti si presume implicitamente come unità-norm, pertanto è garantito che ogni dimensione abbia un valore in [-1.0, 1.0]. In caso contrario, utilizza l'opzione l2_normalize. Boolean False
result_callback Imposta il listener dei risultati per ricevere i risultati di incorporamento in modo asincrono quando l'incorporamento di immagini è in modalità di live streaming. Può essere utilizzato solo quando la modalità di esecuzione è impostata su LIVE_STREAM N/A Non impostata

Preparazione dei dati

Prepara l'input come file immagine o array numpy, quindi convertilo in un oggetto mediapipe.Image. Se l'input è un file video o un live streaming proveniente da una webcam, puoi utilizzare una libreria esterna come OpenCV per caricare i frame di input come array numpy.

Immagine

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)
    

Live streaming

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)
    

Esegui l'attività

Puoi chiamare la funzione di incorporamento corrispondente alla tua modalità di esecuzione per attivare le inferenze. L'API Image Embedder restituirà i vettori di incorporamento per l'immagine o il frame di input.

Immagine

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

Live streaming


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

Tieni presente quanto riportato di seguito:

  • Quando l'attività è in esecuzione in modalità video o live streaming, devi anche fornire all'attività di incorporamento di immagini il timestamp del frame di input.
  • Quando viene eseguita nell'immagine o nel modello video, l'attività di incorporamento di immagini bloccherà il thread corrente fino a quando non completa l'elaborazione dell'immagine o del frame di input.
  • Quando è in esecuzione in modalità live streaming, l'attività di incorporamento di immagini non blocca il thread corrente, ma restituisce immediatamente. Richiama il proprio listener dei risultati con il risultato di incorporamento ogni volta che ha terminato l'elaborazione di un frame di input. Se la funzione embedAsync viene richiamata quando l'attività di incorporamento di immagini è impegnata a elaborare un altro frame, l'attività ignora il nuovo frame di input.

Gestire e visualizzare i risultati

Dopo l'esecuzione dell'inferenza, l'attività Incorporamento immagini restituisce un oggetto ImageEmbedderResult che contiene l'elenco di possibili categorie per gli oggetti all'interno dell'immagine o del frame di input.

Di seguito è riportato un esempio dei dati di output di questa attività:

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

Questo risultato è stato ottenuto incorporando la seguente immagine:

Puoi confrontare la somiglianza di due incorporamenti utilizzando la funzione ImageEmbedder.cosine_similarity. Per un esempio, vedi il codice che segue.

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