Guida alla segmentazione delle immagini per Python

L'attività Segmentazione delle immagini di MediaPipe consente di dividere le immagini in regioni in base a categorie per l'applicazione di effetti visivi, ad esempio la sfocatura dello sfondo. Questi le istruzioni riportate di seguito mostrano come usare lo strumento di segmentazione delle immagini con il linguaggio Python. Per ulteriori informazioni su funzionalità, modelli e opzioni di configurazione questa attività, consulta la Panoramica.

Esempio di codice

Il codice di esempio dello strumento di segmentazione delle immagini fornisce un'implementazione completa un'attività in Python come riferimento. Questo codice ti consente di testare l'attività e ottenere hai iniziato a creare la tua applicazione di segmentazione delle immagini. Puoi visualizzare, eseguire modifica la segmentazione delle immagini esempio di codice usando solo il browser web.

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e per i progetti di codice che utilizzano specificatamente la segmentazione delle immagini. Per informazioni generali su configurare l'ambiente di sviluppo per l'utilizzo delle attività di MediaPipe, tra cui: i requisiti di versione della piattaforma, consulta Guida alla configurazione per Python. Puoi rivedere il codice sorgente per questo esempio su GitHub

Pacchetti

L'attività di segmentazione delle immagini di MediaPipe richiede il pacchetto mediapipe. Puoi installare delle dipendenze obbligatorie con il comando seguente:

$ python -m pip install mediapipe

Importazioni

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

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

Modello

L'attività Segmenter immagini MediaPipe richiede un modello addestrato che sia compatibile con dell'attività. Per ulteriori informazioni sui modelli addestrati disponibili per la segmentazione delle immagini, consulta nella sezione Modelli della panoramica dell'attività.

Seleziona e scarica il modello, quindi archivialo nella directory del progetto:

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

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

base_options = BaseOptions(model_asset_path=model_path)

Crea l'attività

L'attività di segmentazione delle immagini di MediaPipe utilizza la funzione create_from_options per configurare l'attività. La funzione create_from_options accetta valori per gestire le opzioni di configurazione. Per ulteriori informazioni sulla configurazione delle attività, consulta Opzioni di configurazione.

Questi esempi mostrano anche le varianti della costruzione dell'attività per le 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à include 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 tipi di modalità:

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

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

LIVE_STREAM: la modalità per un live streaming di input dati, ad esempio quelli di una videocamera. In questa modalità, resultListener deve essere per impostare un listener in modo che riceva risultati in modo asincrono.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask Se impostato su True, l'output include una maschera di segmentazione come un'immagine uint8, in cui ogni valore di pixel indica la categoria vincente valore. {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 confidenza la mappa dei punteggi della categoria. {True, False} True
display_names_locale Imposta la lingua delle etichette da utilizzare per i nomi visualizzati forniti nel metadati del modello dell'attività, se disponibili. Il valore predefinito è en per Inglese. Puoi aggiungere etichette localizzate ai metadati di un modello personalizzato Utilizzando l'API TensorFlow Metadata Writer Codice impostazioni internazionali it
result_callback Imposta il listener di risultati per ricevere i risultati della segmentazione in modo asincrono quando il segmento di immagini è in modalità LIVE_STREAM. Può essere utilizzato solo quando la modalità di corsa è impostata su LIVE_STREAM N/D N/D

Preparazione dei dati

Prepara l'input come file immagine o array numpy, e poi convertilo in un oggetto mediapipe.Image. Se l'input è un file video o trasmettere in live streaming da webcam, puoi utilizzare una raccolta esterna come OpenCV per caricare i frame di input come numpy di grandi dimensioni.

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 la segmentazione delle immagini, consulta il esempio di codice.

Esegui l'attività

Il segmento di immagini utilizza segment, segment_for_video e segment_async per attivare le inferenze. Per la segmentazione delle immagini, pre-elaborazione dei dati di input, esecuzione del modello di segmentazione e post-elaborazione il modello non elaborato invia gli output 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 segue:

  • Quando è attiva la modalità video o live streaming, devi anche all'attività Segmentazione delle immagini il timestamp del frame di input.
  • Quando viene eseguita nel modello di immagine o video, l'attività Segmentazione delle immagini bloccare il thread corrente finché non termina di elaborare l'immagine di input o frame.

Per un esempio più completo di esecuzione delle inferenze del Segmenter immagini, consulta il esempio di codice.

Gestire e visualizzare i risultati

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

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

Confidenza nella categoria

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

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

Valore categoria

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

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