System Development распознавания поз человека (Pose Estimation)
Pose estimation — детекция ключевых точек тела человека (keypoints): суставы, голова, конечности. Задача: по изображению или видео получить 2D или 3D координаты 17–133 точек скелета. Applications: фитнес-приложения с анализом техники упражнений, кинозахват без маркеров, реабилитационные системы, спортивная аналитика, AR/VR аватары.
Top-down vs Bottom-up подходы
Top-down: сначала детектировать людей (bounding boxes), потом для каждого отдельно предсказать keypoints. Более точный, медленнее при большом количестве людей. Models: ViTPose, RTMPose, HRNet.
Bottom-up: сначала находим все keypoints на изображении, потом группируем по людям. Быстрее при multiple people. Models: OpenPose, HigherHRNet.
from ultralytics import YOLO
import cv2
# YOLOv8-pose — top-down, производительный вариант
model = YOLO('yolov8l-pose.pt')
def estimate_poses(image_path: str) -> list[dict]:
results = model(image_path, conf=0.5)
poses = []
for result in results:
for i, (bbox, kps) in enumerate(zip(
result.boxes.xyxy,
result.keypoints.data
)):
keypoints = []
for j, kp in enumerate(kps):
x, y, conf = kp
keypoints.append({
'name': COCO_KEYPOINTS[j],
'x': float(x),
'y': float(y),
'confidence': float(conf)
})
poses.append({
'person_id': i,
'bbox': bbox.tolist(),
'keypoints': keypoints
})
return poses
COCO_KEYPOINTS = [
'nose', 'left_eye', 'right_eye', 'left_ear', 'right_ear',
'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow',
'left_wrist', 'right_wrist', 'left_hip', 'right_hip',
'left_knee', 'right_knee', 'left_ankle', 'right_ankle'
]
ViTPose и RTMPose
ViTPose — лучшее качество на COCO benchmark. ViTPose-H: AP 79.1 на COCO val2017. Transformer-based backbone.
RTMPose — оптимизирован для production (RTMDet детектор + RTMPose backbone). RTMPose-l: AP 76.3, latency 3ms на T4. Рекомендуется для систем реального времени.
from mmpose.apis import MMPoseInferencer
inferencer = MMPoseInferencer('rtmpose-l_8xb32-270e_coco-wholebody-384x288')
results = inferencer('image.jpg', out_dir='output/')
3D Pose Estimation
Для реабилитации, спортивного анализа нужны 3D-координаты:
- MotionBERT — transformer для 2D→3D лифтинга: принимает 2D keypoints из видео, выдаёт 3D скелет
- MediaPipe Pose — встроенный 3D (относительные 3D координаты без depth camera)
- Stereo camera setup — точный 3D через две синхронизированные камеры
- Depth camera (Intel RealSense, Azure Kinect) — RGBD для точного 3D
Анализ техники выполнения упражнений
import numpy as np
def analyze_squat_form(keypoints: dict) -> dict:
"""Анализ техники приседания по keypoints"""
# Угол в колене
hip = np.array([keypoints['left_hip']['x'], keypoints['left_hip']['y']])
knee = np.array([keypoints['left_knee']['x'], keypoints['left_knee']['y']])
ankle = np.array([keypoints['left_ankle']['x'], keypoints['left_ankle']['y']])
knee_angle = calculate_angle(hip, knee, ankle)
# Выравнивание спины (наклон туловища)
shoulder = np.array([keypoints['left_shoulder']['x'],
keypoints['left_shoulder']['y']])
torso_angle = calculate_angle(shoulder, hip,
np.array([hip[0], hip[1] + 100]))
return {
'knee_angle': knee_angle,
'torso_angle': torso_angle,
'depth': 'sufficient' if knee_angle < 90 else 'insufficient',
'back_alignment': 'good' if 70 < torso_angle < 90 else 'needs_correction'
}
Metrics качества
- OKS (Object Keypoint Similarity) — основная метрика COCO
- AP (Average Precision) на COCO val
- PCKh (Percentage of Correct Keypoints) — для head-normalized threshold
| Модель | AP COCO val | FPS (T4) |
|---|---|---|
| RTMPose-t | 68.5 | 300 |
| RTMPose-l | 76.3 | 100 |
| ViTPose-B | 75.8 | 50 |
| ViTPose-H | 79.1 | 20 |
| Применение | Срок |
|---|---|
| Фитнес-приложение с анализом упражнений | 4–6 недель |
| Реабилитационная система с 3D | 7–10 недель |
| Mocap без маркеров для анимации | 8–14 недель |







