Guida al rilevamento dei punti di riferimento per le posizioni per Python

L'attività MediaPipe Pose Landmarker consente di rilevare i punti di riferimento dei corpi umani in un'immagine o un video. Puoi utilizzare questa attività per identificare le posizioni chiave del corpo, analizzare la postura e classificare i movimenti. Questa attività utilizza modelli di machine learning (ML) che lavorano con singole immagini o video. L'attività genera i punti di riferimento della posa del corpo nelle coordinate dell'immagine e nelle coordinate del mondo tridimensionale.

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 rilevamento di punti di riferimento della posa fornisce un'implementazione completa di questa attività in Python per riferimento futuro. Questo codice ti aiuta a testare questa attività e a iniziare a creare il tuo indicatore di pose. Puoi visualizzare, eseguire e modificare il codice di esempio di landmarking di pose solo utilizzando il browser web.

Se stai implementando il rilevamento di punti di riferimento per Raspberry Pi, consulta l'app di esempio per Raspberry Pi.

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice specificamente per utilizzare Pose Landmarker. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti della versione della piattaforma, consulta la guida alla configurazione per Python.

Pacchetti

L'attività MediaPipe Pose Landmarker richiede il pacchetto PyPI mediapipe. Puoi installare e importare queste dipendenze con quanto segue:

$ python -m pip install mediapipe

Importazioni

Importa le seguenti classi per accedere alle funzioni della funzionalità di rilevamento di punti di riferimento della posa:

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

Modello

L'attività MediaPipe Pose Landmarker richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per Pose Landmarker, 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 BaseOptions dell'oggetto model_asset_path per specificare il percorso del modello da utilizzare. Per un esempio di codice, consulta la sezione successiva.

Crea l'attività

L'attività MediaPipe Pose Landmarker utilizza la funzione create_from_options per impostarla. 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 costruzione dell'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 rilevamento di punti di riferimento per le pose da utilizzare con un'immagine, consulta l'esempio di codice.

Opzioni di configurazione

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

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

IMMAGINE: la modalità per l'inserimento 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 ascoltatore per ricevere i risultati in modo asincrono.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_poses Il numero massimo di pose che possono essere rilevate da Pose Landmarker. Integer > 0 1
min_pose_detection_confidence Il punteggio di attendibilità minimo per il rilevamento della posa da considerare positivo. Float [0.0,1.0] 0.5
min_pose_presence_confidence Il punteggio di attendibilità 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 attendibilità minimo per il monitoraggio della posa da considerare riuscito. Float [0.0,1.0] 0.5
output_segmentation_masks Indica se l'indicatore di posizione della posa restituisce una maschera di segmentazione per la posa rilevata. Boolean False
result_callback Imposta l'ascoltatore dei risultati in modo da ricevere i risultati del rilevamento di punti di riferimento in modo asincrono quando la funzionalità è 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 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 rilevamento di punti di riferimento della posa utilizza le funzioni detect, detect_for_video e detect_async per attivare le deduzioni. Per il rilevamento dei punti di riferimento delle pose, è necessario 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 segue:

  • Quando esegui l'operazione in modalità video o live streaming, fornisci anche all'attività di rilevamento di punti di riferimento della posa il timestamp del frame di input.
  • Quando viene eseguita nel modello di immagine o video, l'attività di rilevamento di punti di riferimento della posa blocca il thread corrente fino al termine dell'elaborazione dell'immagine o del frame di input.
  • Quando viene eseguita in modalità live streaming, l'attività di rilevamento di punti di riferimento della posa ritorna immediatamente e non blocca il thread corrente. Evocherà l'ascoltatore dei risultati con il risultato del rilevamento ogni volta che termina l'elaborazione di un frame di input. Se la funzione di rilevamento viene chiamata quando la task di rilevamento di punti di riferimento della posa è impegnata a elaborare un altro frame, la task ignorerà il nuovo frame di input.

Per un esempio completo di esecuzione di un rilevamento di punti di riferimento di pose su un'immagine, consulta l'esempio di codice per maggiori dettagli.

Gestire e visualizzare i risultati

Il rilevamento di punti di riferimento della posa restituisce un oggetto poseLandmarkerResult per ogni esecuzione del rilevamento. L'oggetto risultato contiene le coordinate di ogni punto di riferimento della 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 le coordinate normalizzate (Landmarks) sia le coordinate mondiali (WorldLandmarks) per ogni punto di riferimento.

L'output contiene le seguenti coordinate normalizzate (Landmarks):

  • x e y: coordinate di punti di riferimento normalizzate tra 0,0 e 1,0 in base alla larghezza (x) e all'altezza (y) dell'immagine.

  • z: la profondità del punto di riferimento, con la profondità al centro dei fianchi come origine. Più basso è il valore, più il punto di riferimento è vicino alla fotocamera. La magnitudine di z utilizza approssimativamente la stessa scala di x.

  • visibility: la probabilità che il punto di riferimento sia visibile all'interno dell'immagine.

L'output contiene le seguenti coordinate mondiali (WorldLandmarks):

  • x, y e z: coordinate tridimensionali reali in metri, con il punto mediano 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à:

Una donna in una posa meditativa. La posa è evidenziata da un wireframe che indica il posizionamento di arti e tronco

La maschera di segmentazione facoltativa rappresenta la probabilità che ogni pixel appartenga a una persona rilevata. L'immagine seguente è una maschera di segmentazione dell'output della task:

Maschera di segmentazione dell'immagine precedente che delinea la forma della donna

Il codice di esempio di Pose Landmarker mostra come visualizzare i risultati restituiti dall'attività. Per maggiori dettagli, consulta l'esempio di codice.