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
yy
: 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 quex
.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
yz
: 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.