Guía de detección de puntos de referencia de poses para Python

La tarea MediaPipe Pose Landmarker te permite detectar puntos de referencia de cuerpos humanos en una imagen o video. Puedes usar esta tarea para identificar las ubicaciones clave del cuerpo, analizar la postura, y categorizar los movimientos. En esta tarea, se usan modelos de aprendizaje automático (AA) que trabajar con imágenes o videos individuales. La tarea muestra los puntos de referencia de la postura corporal en una imagen y en coordenadas mundiales tridimensionales.

La muestra de código descrita en estas instrucciones está disponible en GitHub: Para obtener más información sobre las capacidades, los modelos y las opciones de configuración para completar esta tarea, consulta la Descripción general.

Ejemplo de código

El código de ejemplo para Pose Landmarker brinda una implementación completa de este en Python para tu referencia. Este código te ayuda a probar esta tarea y obtener y empecé a crear tu propio punto de referencia de la postura. Puedes ver, ejecutar y editar el Código de ejemplo de Landmarker de la pose usando solo el navegador web.

Si estás implementando el marcador de posición de la posición para Raspberry Pi, consulta la Ejemplo de Raspberry Pi de la app.

Configuración

En esta sección, se describen los pasos clave para configurar tu entorno de desarrollo y para crear proyectos de código específicamente para Pose Landmarker. Para obtener información general configurar tu entorno de desarrollo para usar tareas de MediaPipe, como de la versión de la plataforma, consulta la Guía de configuración para Python.

Paquetes

La tarea MediaPipe Pose Landmarker requiere el paquete mediapipe de PyPI. Puedes instalar y, luego, importar estas dependencias con lo siguiente:

$ python -m pip install mediapipe

Importaciones

Importa las siguientes clases para acceder a las funciones de tarea de Pose Landmarker:

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

Modelo

La tarea MediaPipe Pose Landmarker requiere un modelo entrenado que sea compatible con esta tarea. Para obtener más información sobre los modelos entrenados disponibles para Pose Landmarker, consulta la sección Modelos de la descripción general de la tarea.

Selecciona y descarga el modelo y, luego, guárdalo en un directorio local:

model_path = '/absolute/path/to/pose_landmarker.task'

Usa el parámetro model_asset_path del objeto BaseOptions para especificar la ruta de acceso. del modelo que se usará. Para ver un ejemplo de código, consulta la siguiente sección.

Crea la tarea

La tarea MediaPipe Pose Landmarker usa la función create_from_options para configurar la tarea. La función create_from_options acepta valores para conocer las opciones de configuración que manejar. Para obtener más información, consulta Opciones de configuración.

En el siguiente código, se muestra cómo compilar y configurar esta tarea.

Estos ejemplos también muestran las variaciones de la construcción de tareas para imágenes archivos de video y transmisiones en vivo.

Imagen

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

Transmisión en vivo

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

Para ver un ejemplo completo de cómo crear un marcador de posición de posición para usar con una imagen, consulta el ejemplo de código de barras.

Opciones de configuración

Esta tarea tiene las siguientes opciones de configuración para las aplicaciones de Python:

Nombre de la opción Descripción Rango de valores Valor predeterminado
running_mode Establece el modo de ejecución de la tarea. Existen tres modos:

IMAGE: Es el modo para entradas de una sola imagen.

VIDEO: es el modo de los fotogramas decodificados de un video.

LIVE_STREAM: Es el modo para una transmisión en vivo de entradas. datos, como los de una cámara. En este modo, resultListener debe se llama para configurar un objeto de escucha que reciba resultados de forma asíncrona.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_poses La cantidad máxima de poses que puede detectar el Pose aterrizaje. Integer > 0 1
min_pose_detection_confidence La puntuación de confianza mínima para la detección de poses correctamente. Float [0.0,1.0] 0.5
min_pose_presence_confidence La puntuación de confianza mínima de la presencia en poses en la detección de puntos de referencia de poses. Float [0.0,1.0] 0.5
min_tracking_confidence La puntuación de confianza mínima para el seguimiento de poses para ser considerada exitosa. Float [0.0,1.0] 0.5
output_segmentation_masks Establece si el marcador de posición de la postura genera una máscara de segmentación para el elemento detectado la pose. Boolean False
result_callback Configura el objeto de escucha de resultados para recibir los resultados del punto de referencia. de forma asíncrona cuando Pose Landmarker esté en el modo de transmisión en vivo. Solo se puede usar cuando el modo de ejecución está establecido en LIVE_STREAM ResultListener N/A

Preparar los datos

Prepara tu entrada como un archivo de imagen o un array de NumPy. y, luego, convertirlo en un objeto mediapipe.Image. Si la entrada es un archivo de video o transmitir en vivo desde una cámara web, puedes usar una biblioteca externa, como OpenCV para cargar tus marcos de entrada como NumPy para los diferentes tipos de arrays.

Imagen

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)
    

Transmisión en vivo

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)
    

Ejecuta la tarea

El marcador de posición de la posición utiliza los elementos detect, detect_for_video y detect_async. funciones para activar inferencias. Para la gestual de poses, esto implica el procesamiento previo de datos de entrada y la detección de poses en la imagen.

En el siguiente código, se muestra cómo ejecutar el procesamiento con el modelo de tarea.

Imagen

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

Transmisión en vivo

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

Ten en cuenta lo siguiente:

  • Cuando se ejecuta en el modo de video o de transmisión en vivo, también y proporciona la marca de tiempo del fotograma de entrada a la tarea Pose Landmarker.
  • Cuando se ejecuta en la imagen o el modelo de video, la tarea Pose Landmarker bloquea el subproceso actual hasta que termine de procesar la imagen de entrada o marco.
  • Cuando se ejecuta en el modo de transmisión en vivo, la tarea Pose Landmarker vuelve inmediatamente y no bloquea el subproceso actual. Invocará el resultado con el resultado de la detección cada vez que termina de procesar un marco de entrada. Si se llama a la función de detección cuando se crea la tarea Pose Landmarker esté ocupado procesando otro fotograma, la tarea ignorará el nuevo marco de entrada.

Para ver un ejemplo completo de cómo ejecutar un marcador de posición en una imagen, consulta la ejemplo de código para conocer los detalles.

Cómo controlar y mostrar resultados

El marcador de posición de poses muestra un objeto poseLandmarkerResult para cada detección cuando se ejecute. El objeto de resultado contiene coordenadas para cada punto de referencia de la pose.

A continuación, se muestra un ejemplo de los datos de salida de esta tarea:

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)

El resultado contiene coordenadas normalizadas (Landmarks) y de imágenes coordenadas (WorldLandmarks) de cada punto de referencia.

El resultado contiene las siguientes coordenadas normalizadas (Landmarks):

  • x y y: coordenadas de puntos de referencia normalizadas entre 0.0 y 1.0 por el ancho (x) y alto (y) de la imagen.

  • z: La profundidad del punto de referencia, con la profundidad en el punto medio de las caderas origen. Cuanto menor sea el valor, más cerca estará el punto de referencia de la cámara. El usa más o menos la misma escala que x.

  • visibility: Indica la probabilidad de que el punto de referencia sea visible dentro de la imagen.

El resultado contiene las siguientes coordenadas mundiales (WorldLandmarks):

  • x, y y z: Coordenadas tridimensionales del mundo real en metros, con el punto medio de las caderas como origen.

  • visibility: Indica la probabilidad de que el punto de referencia sea visible dentro de la imagen.

En la siguiente imagen, se muestra una visualización del resultado de la tarea:

La máscara de segmentación opcional representa la probabilidad de que cada píxel pertenezca a una persona detectada. La siguiente imagen es una máscara de segmentación del resultado de la tarea:

El código de ejemplo de Pose Landmarker muestra cómo mostrar el resultados que devolvió la tarea, consulta la ejemplo de código para conocer los detalles.