L'attività Punto di riferimento per la posa di MediaPipe consente di rilevare i punti di riferimento di corpi umani in un'immagine o in un video. Puoi utilizzare questa attività per identificare le posizioni chiave del corpo, analizzare la postura e classificare i movimenti. Questa attività usa modelli di machine learning (ML) che funzionano con singole immagini o video. L'attività restituisce i punti di riferimento nelle coordinate dell'immagine e nelle coordinate tridimensionali.
L'esempio di codice descritto in queste istruzioni è disponibile su GitHub. 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 punto di riferimento Pose fornisce un'implementazione completa di questa attività in Python come riferimento. Questo codice ti aiuta a testare l'attività e iniziare a creare un tuo punto di riferimento per le pose. Puoi visualizzare, eseguire e modificare il codice di esempio Pose Referenceer usando solo il tuo browser web.
Se stai implementando Pose Referenceer per Raspber Pi, consulta l'app di esempio Raspber Pi.
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 Punto di riferimento per le posizioni. 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.
Pacchetti
L'attività Punto di riferimento per la posizione di MediaPipe richiede il pacchetto PyPI di mediapipe. Puoi installare e importare queste dipendenze con quanto segue:
$ python -m pip install mediapipe
Importazioni
Importa le seguenti classi per accedere alle funzioni dell'attività Punto di riferimento per le posizioni:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Modello
L'attività Punto di riferimento per la posizione di MediaPipe richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per il punto di riferimento Pose, consulta la sezione Modelli della panoramica dell'attività.
Seleziona e scarica il modello, quindi memorizzalo in una directory locale:
model_path = '/absolute/path/to/pose_landmarker.task'
Utilizza il parametro model_asset_path
dell'oggetto BaseOptions
per specificare il percorso del modello da utilizzare. Per un esempio di codice, consulta la sezione successiva.
Creare l'attività
L'attività Punto di riferimento per la posa di MediaPipe utilizza la funzione create_from_options
per
configurarla. La funzione create_from_options
accetta valori
per le opzioni di configurazione da gestire. Per ulteriori informazioni, consulta Opzioni di configurazione.
Il codice seguente mostra come creare e configurare questa attività.
Questi esempi mostrano anche le varianti della creazione delle attività per immagini, file video e live streaming.
Immagine
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions PoseLandmarker = mp.tasks.vision.PoseLandmarker PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions VisionRunningMode = mp.tasks.vision.RunningMode options = PoseLandmarkerOptions( base_options=BaseOptions(model_asset_path=model_path), running_mode=VisionRunningMode.IMAGE) with PoseLandmarker.create_from_options(options) as landmarker: # The landmarker is initialized. Use it here. # ...
Video
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions PoseLandmarker = mp.tasks.vision.PoseLandmarker PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions VisionRunningMode = mp.tasks.vision.RunningMode # Create a pose landmarker instance with the video mode: options = PoseLandmarkerOptions( base_options=BaseOptions(model_asset_path=model_path), running_mode=VisionRunningMode.VIDEO) with PoseLandmarker.create_from_options(options) as landmarker: # The landmarker is initialized. Use it here. # ...
Live streaming
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions PoseLandmarker = mp.tasks.vision.PoseLandmarker PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions PoseLandmarkerResult = mp.tasks.vision.PoseLandmarkerResult VisionRunningMode = mp.tasks.vision.RunningMode # Create a pose landmarker instance with the live stream mode: def print_result(result: PoseLandmarkerResult, output_image: mp.Image, timestamp_ms: int): print('pose landmarker result: {}'.format(result)) options = PoseLandmarkerOptions( base_options=BaseOptions(model_asset_path=model_path), running_mode=VisionRunningMode.LIVE_STREAM, result_callback=print_result) with PoseLandmarker.create_from_options(options) as landmarker: # The landmarker is initialized. Use it here. # ...
Per un esempio completo di creazione di un punto di riferimento per la posa da utilizzare con un'immagine, consulta l'esempio di codice.
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 |
num_poses |
Il numero massimo di pose che possono essere rilevate dall'elemento di riferimento per le pose. | Integer > 0 |
1 |
min_pose_detection_confidence |
Il punteggio di affidabilità minimo affinché il rilevamento della posa venga considerato riuscito. | Float [0.0,1.0] |
0.5 |
min_pose_presence_confidence |
Il punteggio di affidabilità minimo del punteggio di presenza della posa nel rilevamento dei punti di riferimento della posa. | Float [0.0,1.0] |
0.5 |
min_tracking_confidence |
Il punteggio di affidabilità minimo affinché il monitoraggio della posa venga considerato riuscito. | Float [0.0,1.0] |
0.5 |
output_segmentation_masks |
Indica se il punto di riferimento per la posa restituisce una maschera di segmentazione per la posa rilevata. | Boolean |
False |
result_callback |
Imposta il listener dei risultati per ricevere i risultati del punto di riferimento in modo asincrono quando il punto di riferimento per la posa è in modalità live streaming.
Può essere utilizzato solo quando la modalità di esecuzione è impostata su LIVE_STREAM |
ResultListener |
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
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à
Il punto di riferimento per la posa utilizza le funzioni detect
, detect_for_video
e detect_async
per attivare le inferenze. Per l'identificazione delle pose, occorre pre-elaborare i dati di input e rilevare le pose nell'immagine.
Il seguente codice mostra come eseguire l'elaborazione con il modello di attività.
Immagine
# Perform pose landmarking on the provided single image. # The pose landmarker must be created with the image mode. pose_landmarker_result = landmarker.detect(mp_image)
Video
# Perform pose landmarking on the provided single image. # The pose landmarker must be created with the video mode. pose_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
Live streaming
# Send live image data to perform pose landmarking. # The results are accessible via the `result_callback` provided in # the `PoseLandmarkerOptions` object. # The pose landmarker must be created with the live stream mode. landmarker.detect_async(mp_image, frame_timestamp_ms)
Tieni presente quanto riportato di seguito:
- Quando l'esecuzione è in modalità video o live streaming, fornisci all'attività Pose Referenceer anche il timestamp del frame di input.
- Quando viene eseguita nell'immagine o nel modello video, l'attività Punto di riferimento per la posizione blocca il thread corrente finché non completa l'elaborazione dell'immagine o del frame di input.
- Quando è in esecuzione in modalità live streaming, l'attività Posa di riferimento restituisce immediatamente e non blocca il thread corrente. Richiama l'elenco dei risultati con il risultato del rilevamento ogni volta che termina l'elaborazione di un frame di input. Se la funzione di rilevamento viene richiamata quando l'attività Punto di riferimento per la posizione è impegnata a elaborare un altro frame, l'attività ignorerà il nuovo frame di input.
Per un esempio completo dell'esecuzione di un punto di riferimento per la posa su un'immagine, consulta l'esempio di codice per i dettagli.
Gestire e visualizzare i risultati
Il punto di riferimento per la posizione restituisce un oggetto poseLandmarkerResult
per ogni esecuzione
di rilevamento. L'oggetto risultato contiene le coordinate di ogni punto di riferimento per la posa.
Di seguito è riportato un esempio dei dati di output di questa attività:
PoseLandmarkerResult:
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : 0.129959
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
visibility : 0.999909
presence : 0.999958
... (33 landmarks per pose)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
visibility : 0.999976
presence : 0.999998
... (33 world landmarks per pose)
SegmentationMasks:
... (pictured below)
L'output contiene sia coordinate normalizzate (Landmarks
) sia coordinate
mondiali (WorldLandmarks
) per ogni punto di riferimento.
L'output contiene le seguenti coordinate normalizzate (Landmarks
):
x
ey
: coordinate dei punti di riferimento normalizzate tra 0,0 e 1,0 per la larghezza e l'altezza dell'immagine (x
) (y
).z
: la profondità importante, con la profondità al punto centrale dei fianchi come origine. Più basso è il valore, più il punto di riferimento è vicino alla fotocamera. L'entità di z utilizza all'incirca la stessa scala dix
.visibility
: la probabilità che il punto di riferimento sia visibile all'interno dell'immagine.
L'output contiene le seguenti coordinate mondiali (WorldLandmarks
):
x
,y
ez
: coordinate tridimensionali nel mondo reale in metri, con il punto medio dei fianchi come origine.visibility
: la probabilità che il punto di riferimento sia visibile all'interno dell'immagine.
L'immagine seguente mostra una visualizzazione dell'output dell'attività:
La maschera di segmentazione facoltativa rappresenta la probabilità che ogni pixel appartenga a una persona rilevata. La seguente immagine è una maschera di segmentazione dell'output dell'attività:
Il codice di esempio del punto di riferimento per la posa mostra come visualizzare i risultati restituiti dall'attività. Per i dettagli, consulta l'esempio di codice.