Guida alla segmentazione delle immagini per Python

L'attività Segmenter di immagini MediaPipe consente di suddividere le immagini in regioni in base alle categorie predefinite per applicare effetti visivi come la sfocatura dello sfondo. Queste istruzioni mostrano come utilizzare il segmenter di immagini con il linguaggio 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 il segmentazione delle immagini fornisce un'implementazione completa di questa attività in Python come riferimento. Questo codice consente di testare l'attività e iniziare a creare la tua applicazione di segmentazione delle immagini. Puoi visualizzare, eseguire e modificare il codice di esempio del segmentatore di immagini utilizzando semplicemente il browser web.

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 del Segmenter immagini. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività di MediaPipe, inclusi i requisiti di versione della piattaforma, consulta la Guida alla configurazione per Python. Puoi esaminare il codice sorgente per questo esempio su GitHub

Pacchetti

L'attività Segmenter di immagini MediaPipe richiede il pacchetto mediapipe. Puoi installare le dipendenze richieste con il seguente comando:

$ python -m pip install mediapipe

Importazioni

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

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

Modello

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

Seleziona e scarica il modello, quindi archivialo all'interno della directory del progetto:

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

Specifica il percorso del modello all'interno del parametro Model Name, come illustrato di seguito:

base_options = BaseOptions(model_asset_path=model_path)

Creare l'attività

L'attività Segmenter di immagini MediaPipe utilizza la funzione create_from_options per configurarla. La funzione create_from_options accetta valori per le opzioni di configurazione da gestire. Per saperne di più sulla configurazione delle attività, consulta Opzioni di configurazione.

Questi esempi mostrano anche le varianti della creazione delle attività per immagini, file video e stream video in diretta.

Immagine

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

Video

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the video mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

Live streaming

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the live stream mode:
def print_result(result: List[Image], output_image: Image, timestamp_ms: int):
    print('segmented masks size: {}'.format(len(result)))

options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
    

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
output_category_mask Se impostato su True, l'output include una maschera di segmentazione come immagine uint8, in cui ogni valore di pixel indica il valore della categoria vincente. {True, False} False
output_confidence_masks Se impostato su True, l'output include una maschera di segmentazione come immagine con valore in virgola mobile, in cui ogni valore in virgola mobile rappresenta la mappa del punteggio di confidenza della categoria. {True, False} True
display_names_locale Imposta la lingua delle etichette da utilizzare per i nomi visualizzati forniti nei metadati del modello dell'attività, se disponibili. Il valore predefinito è en per l'inglese. Puoi aggiungere etichette localizzate ai metadati di un modello personalizzato utilizzando l'API Metadata Writer di TensorFlow Lite Codice impostazioni internazionali it
result_callback Imposta il listener dei risultati per ricevere i risultati di segmentazione in modo asincrono quando il segmenter di immagini è in modalità live streaming. Può essere utilizzato solo quando la modalità di esecuzione è impostata su LIVE_STREAM N/A N/A

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

# 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

# Use OpenCV’s VideoCapture to load the input video.
# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You need the frame rate 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

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

Per un esempio di codice che mostra la preparazione dei dati per il Segmenter immagini, consulta l'esempio di codice.

Esegui l'attività

Il segmento di immagini utilizza le funzioni segment, segment_for_video e segment_async per attivare le inferenze. Per la segmentazione delle immagini, ciò comporta la pre-elaborazione dei dati di input, l'esecuzione del modello di segmentazione e la post-elaborazione degli output del modello non elaborato alle maschere segmentate.

I seguenti esempi di codice mostrano come eseguire l'elaborazione con il modello di attività.

Immagine

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
segmented_masks = segmenter.segment(mp_image)
    

Video

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the video mode.
segmented_masks = segmenter.segment_for_video(mp_image, frame_timestamp_ms)
    

Live streaming

# Send live image data to perform image segmentation.
# The results are accessible via the `result_callback` provided in
# the `ImageSegmenterOptions` object.
# The image segmenter must be created with the live stream mode.
segmenter.segment_async(mp_image, frame_timestamp_ms)
    

Tieni presente quanto riportato di seguito:

  • Quando esegui l'esecuzione in modalità video o live streaming, devi anche fornire all'attività Segmenter immagini il timestamp del frame di input.
  • Quando viene eseguita nell'immagine o nel modello video, l'attività Segmenter di immagini bloccherà il thread corrente fino a quando non completa l'elaborazione dell'immagine o del frame di input.

Per un esempio più completo dell'esecuzione di inferenze del segmenter immagine, consulta l'esempio di codice.

Gestire e visualizzare i risultati

Il Segmenter immagini restituisce un elenco di dati Image. Se output_type è CATEGORY_MASK, l'output è un elenco contenente una maschera a segmento singolo come immagine uint8. Il pixel indica l'indice di categoria riconosciuto dell'immagine di input. Se output_type è CONFIDENCE_MASK, l'output è un vettore con dimensione del numero di categoria. Ogni maschera segmentata è un'immagine mobile all'interno dell'intervallo [0,1], che rappresenta il punteggio di affidabilità del pixel appartenente alla categoria.

Le seguenti sezioni mostrano esempi di dati di output di questa attività:

Confidenza della categoria

Le immagini seguenti mostrano una visualizzazione dell'output dell'attività per una maschera di confidenza della categoria. L'output della maschera di confidenza contiene valori in virgola mobile compresi tra [0, 1].

Output della maschera di confidenza della categoria e dell'immagine originale. Immagine di origine dal set di dati di Pascal VOC 2012.

Valore categoria

Le immagini seguenti mostrano una visualizzazione dell'output dell'attività per una maschera dei valori di categoria. L'intervallo di maschere di categoria è [0, 255] e ogni valore di pixel rappresenta l'indice di categoria vincente dell'output del modello. L'indice delle categorie vincenti ha il punteggio più alto tra le categorie che il modello può riconoscere.

Output della maschera di categoria e immagine originale. Immagine di origine dal set di dati di Pascal VOC 2012.