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

L'attività Punti di riferimento di MediaPipe consente di rilevare punti di riferimento di corpi umani in un'immagine o 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 funzionano con singole immagini o video. L'attività restituisce le posizioni del corpo nell'immagine e in coordinate mondiali tridimensionali.

L'esempio di codice descritto in queste istruzioni è disponibile su GitHub. Per ulteriori informazioni su funzionalità, modelli e opzioni di configurazione di questa attività, consulta la Panoramica.

Esempio di codice

Il codice d'esempio di Pose Taper fornisce un'implementazione completa un'attività in Python come riferimento. Questo codice ti consente di testare l'attività e ottenere a creare il tuo segnaposto di posa. Puoi visualizzare, eseguire modifica il Codice di esempio di Pose Highlighter usando solo il browser web.

Se implementi Pose Punto di riferimento per Raspberry Pi, consulta le Esempio di Raspberry Pi Google Cloud.

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e che utilizzano specificatamente i progetti di codice per usare Pose Highlighter. 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.

Pacchetti

L'attività Punto di riferimento della posizione di MediaPipe richiede il pacchetto PyPI mediapipe. Puoi installare e importare queste dipendenze con quanto segue:

$ python -m pip install mediapipe

Importazioni

Importa le classi seguenti per accedere alle funzioni attività di porre punti di riferimento:

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

Modello

L'attività Punti di riferimento di MediaPipe richiede un modello addestrato che sia compatibile con dell'attività. Per ulteriori informazioni sui modelli addestrati disponibili per Pose Taper, vedi la panoramica delle attività nella sezione Modelli.

Seleziona e scarica il modello, quindi archivialo 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.

Crea l'attività

L'attività Livello di riferimento 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, vedi Opzioni di configurazione.

Il codice seguente illustra come creare e configurare questa attività.

Questi esempi mostrano anche le varianti della costruzione dell'attività per le 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 della creazione di un pose famoso da utilizzare con un'immagine, vedi la sezione esempio di codice.

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
num_poses Il numero massimo di pose che possono essere rilevate dal Punto di riferimento per la posa. Integer > 0 1
min_pose_detection_confidence Il punteggio di confidenza minimo per il rilevamento della posizione viene considerata riuscita. Float [0.0,1.0] 0.5
min_pose_presence_confidence Il punteggio di confidenza minimo della presenza della posa il punteggio nel rilevamento dei punti di riferimento della posizione. Float [0.0,1.0] 0.5
min_tracking_confidence Il punteggio di confidenza minimo per il monitoraggio della posizione per essere considerate efficaci. Float [0.0,1.0] 0.5
output_segmentation_masks Consente di stabilire se mostrare o meno una maschera di segmentazione per l'oggetto rilevato posa. Boolean False
result_callback Imposta il listener dei risultati per ricevere i risultati dei punti di riferimento in modo asincrono quando l'app Luogo di riferimento è in modalità live streaming. Può essere utilizzato solo quando la modalità di corsa è impostata su LIVE_STREAM ResultListener N/A

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

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à

Posa di riferimento utilizza detect, detect_for_video e detect_async per attivare le inferenze. Per il riferimento della posa, ciò prevede durante la pre-elaborazione dei dati di input e il rilevamento delle 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:

  • In modalità video o live streaming, indica il timestamp del frame di input nell'attività Pose Highlighter.
  • Durante l'esecuzione nell'immagine o nel modello video, l'attività Punti di riferimento in posizioni blocca il thread corrente finché non termina di elaborare l'immagine di input o frame.
  • Quando viene eseguita in modalità live streaming, l'attività Punti di riferimento restituisce l'attività immediatamente e non blocca il thread corrente. Richiamerà il risultato con il risultato del rilevamento ogni volta che termina l'elaborazione di un frame di input. Se la funzione di rilevamento viene chiamata quando viene eseguita l'attività è impegnato a elaborare un altro frame, l'attività ignorerà il nuovo frame di input.

Per un esempio completo di esecuzione di una funzione su un'immagine, guarda la esempio di codice per maggiori dettagli.

Gestire e visualizzare i risultati

La funzione di riferimento per le posizioni restituisce un oggetto poseLandmarkerResult per ogni rilevamento vengono eseguiti tutti i test delle unità. L'oggetto risultato contiene le coordinate di ogni punto di riferimento di 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 il mondo coordinate (WorldLandmarks) per ogni punto di riferimento.

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

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

  • z: la profondità del punto di riferimento, con la profondità nel punto centrale dei fianchi come origine dati. Più basso è il valore, più il punto di riferimento è vicino alla fotocamera. La magnitude z utilizza più o meno 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 del mondo (WorldLandmarks):

  • x, y e z: coordinate 3dimensionali del mondo reale in metri, con parte centrale 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 ciascun pixel appartenga a una persona rilevata. Nell'immagine di seguito è riportata una maschera di segmentazione output dell'attività:

Il codice d'esempio di Pose Taper illustra come visualizzare i risultati restituiti dall'attività, controlla esempio di codice per maggiori dettagli.