🚶 Aprende cómo detectar posiciones del cuerpo con YOLO (¡Pose Estimation fácil!)

Por Administrador

¡Hola, hola, Omesitos! Ahora nos introduciremos en una nueva tarea llamada, Pose Estimation, la cual consiste en identificar puntos distribuidos en el cuerpo. Para llevarlo a cabo usaremos Ultralytics, ya que nos provee distintos modelos YOLOv11. Así que, ¡vamos a por ello!

¿Qué es la Pose Estimation o Estimación de pose?

Es una técnica de visión por computador que permite detectar la posición y orientación del cuerpo de una persona a través de puntos clave o landmarks. Estos puntos pueden representar diversas partes del cuerpo.

🔧 Instalación de Ultralytics

Para llevar a cabo esta práctica debemos instalar Ultralytics, a través de:

pip install ultralytics

Puedes verificar su instalación y versión con: pip freeze

Nota: A continuación te dejo la programación usada en el video. Si quieres ver el paso a paso explicado con más detalle, ¡no te pierdas el video completo!

🖼️Estimación de pose en imágenes con YOLOv11 de Ultralytics

from ultralytics import YOLO

# Cargamos el modelo YOLO
model = YOLO("yolo11x-pose.pt")

# Cargamos la imagen
image = "./Inputs/*.jpg"

# Realizamos la inferencia de YOLO
results = model(image, conf=0.7)

# Visualizar los resultados
for res in results:
    res.show()

🖼️ Estimación de pose en imágenes leídas con OpenCV con YOLOv11 de Ultralytics

En este apartado veremos como acceder a los landmarks predichos.

from ultralytics import YOLO
import cv2

# Cargamos la imagen de entrada
image = cv2.imread("./image.jpg")

# Cargamos el modelo YOLO
model = YOLO("yolo11l-pose.pt")

# Realizamos la inferencia sobre la imagen
results = model(image, conf=0.7)

# Explorando los resultados
print(results[0])
print(results[0].keypoints)

# Acceder a un landmark
x, y, conf = results[0].keypoints.data[0][10]
#cv2.circle(image, (int(x), int(y)), 5, (0,255, 255), 2)

# Acceder a los landmarks de la persona detectada
for x, y, conf in results[0].keypoints.data[0]:
    if conf > 0.5:
        
        cv2.circle(image, (int(x), int(y)), 3, (0, 255, 0), -1)
        cv2.imshow(f"image", image)
        cv2.waitKey(0)
'''
# Acceder a los landmarks de cada persona detectada
for person in results[0].keypoints.data:
    for i, (x, y, conf) in enumerate(person):
        color = (255, 255, 255)
        if conf > 0.5:
            if i <= 4:
                color = (0, 255, 0)
            elif i == 5:
                color = (0, 0, 0)
            elif 6 <= i <= 11:
                color = (255, 255, 0)
            cv2.circle(image, (int(x), int(y)), 5, color, 2)
'''
cv2.imshow(f"image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

🎞️ Estimación de pose en videos con YOLOv11 de Ultralytics

from ultralytics import YOLO
import cv2

# Cargamos el modelo YOLO
model = YOLO("yolo11m-pose.pt")

# Cargamos el video de entrada
video_path = "./Inputs/video_001.mp4"
cap = cv2.VideoCapture(video_path)

while cap.isOpened():
    # Leemos el frame del video
    ret, frame = cap.read()
    if not ret:
        break

    # Realizamos la inferencia de YOLO sobre el frame
    results = model(frame)

    # Extraemos los resultados
    annotated_frame = results[0].plot()

    # Visualizamos los resultados
    cv2.imshow("YOLO Inference", annotated_frame)

    # El ciclo se rompe al presionar "Esc"
    if cv2.waitKey(1) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

Y eso ha sido todo por este post, Omesitos.
Espero que les haya resultado útil y que se animen a probar la estimación de pose con los modelos de Ultralytics usando YOLOv11.
📌 No olviden revisar el video si desean ver todo el paso a paso en acción.

¡Nos vemos en el siguiente post!