Pose Detection: что это, модели и принцип работы

Автор: IT Sectr Опубликовано: 2026-07-19 Время чтения: 9 мин

Pose Detection — технология компьютерного зрения, определяющая положение тела человека по ключевым точкам (landmarks): голова, плечи, локти, запястья, бёдра, колени, лодыжки. Каждая точка имеет координаты (x, y) в 2D-пространстве, а расширенные модели (MediaPipe BlazePose 3D) добавляют z-координату для глубины. В мобильных приложениях Pose Detection применяется в фитнес-трекерах, приложениях для йоги, AR-фильтрах, реабилитационных программах и системах спортивной аналитики. По данным Google ML Kit, 2025, on-device Pose Detection обрабатывает до 30 кадров в секунду с точностью 94% PCK.

Главное

  • Pose Detection — определение ключевых точек тела (landmarks) из изображения
  • ML Kit Pose Detection — 33 landmarks, 30 FPS, точность 94% PCK
  • MediaPipe BlazePose — 33 landmarks + 3D, до 60 FPS на GPU
  • MoveNet Lightning — 17 keypoints (COCO), 30+ FPS, 8 MB, INT8
  • On-device — приватность, real-time, без отправки видео на сервер

Что такое Pose Detection: основы и метрики

Pose Detection (также Pose Estimation) относится к задаче определения семантических ключевых точек тела человека по изображению или видео. Top-down подход сначала детектирует человека (Object Detection), затем определяет его позу. Bottom-up подход находит все landmarks на изображении, затем группирует их по персонам (OpenPose). Для мобильных устройств используется bottom-up — он быстрее при нескольких людях в кадре. ML Kit и BlazePose используют single-stage подход — детекция + поза за один проход.

COCO Keypoints — стандартный набор из 17 точек: нос, глаза (2), уши (2), плечи (2), локти (2), запястья (2), бёдра (2), колени (2), лодыжки (2). MediaPipe BlazePose использует 33 точки, добавляя: пальцы ног, пятки, центр торса, точки на лице. Чем больше точек, тем точнее анализ позы, но выше вычислительная нагрузка. Для фитнес-приложений достаточно 17–20 точек. Для полного анализа (йога, танцы) — 33 точки. Для AR-фильтров — 33 точки + 468 точек лица (MediaPipe Face Mesh).

PCK (Percentage of Correct Keypoints) — метрика точности Pose Detection. Считается доля точек, предсказанных в пределах расстояния от ground truth (обычно 0.05–0.15 от размера bounding box человека). ML Kit Pose Detection: 94% PCK@0.1. BlazePose Full: 96% PCK@0.1. MoveNet Lightning: 91% PCK@0.1. OKS (Object Keypoint Similarity) — метрика, используемая в COCO, учитывающая масштаб человека и сложность точки. mAP@OKS — стандартная метрика для бенчмарков.

МодельLandmarksPCK@0.1Latency (GPU)Размер
ML Kit Pose Acc3394%15–30 ms14 MB
BlazePose Full33 + 3D96%10–20 ms12 MB
BlazePose Lite3391%5–10 ms5 MB
MoveNet Lightning1791%8–15 ms8 MB
MoveNet Thunder1795%25–40 ms13 MB

Keypoint Visibility: каждая landmark имеет score (0..1), указывающий, насколько модель уверена в точке и видна ли она. Точки со score < 0.5 считаются невидимыми (закрыты, за кадром). Для анализа позы используйте только видимые точки. Для оценки выравнивания (alignment) — рассчитывайте confidence-weighted distances, где точки с низким score имеют меньший вес в метрике.

ML Kit Pose Detection на Android и iOS

ML Kit Pose Detection — библиотека от Google для определения позы на устройстве. Поддерживает 33 landmarks, включая точки лица, пальцев ног и пяток. Режимы: Accurate Mode (14 MB модель, 15–30 ms, высокая точность) и Streaming Mode (5 MB, 5–10 ms, для real-time). Streaming Mode использует облегчённую модель с трекингом — после первого кадра отслеживает движение без повторной детекции точных позиций, что даёт до 60 FPS.

API ML Kit Pose Detection: PoseDetector (опции: setDetectorMode, setPerformanceMode) → InputImage → Pose (List). Каждый PoseLandmark имеет: landmarkType (38 типов), position (PointF3D), inFrameLikelihood (0..1). Pose также предоставляет: boundingBox человека, список landmarks, метод getLandmark(type). Для классификации позы используйте углы между костями: shoulderAngle, elbowAngle, hipAngle — рассчитываются через Vector3D между соседними landmarks.

kotlin
val options = PoseDetectorOptions.Builder()
    .setDetectorMode(PoseDetectorOptions.STREAM_MODE)
    .setPerformanceMode(PoseDetectorOptions.PERFORMANCE_MODE_FAST)
    .build()

val detector = PoseDetection.getClient(options)

detector.process(inputImage)
    .addOnSuccessListener { pose ->
        val leftElbow = pose.getLandmark(PoseLandmark.LEFT_ELBOW)
        val leftShoulder = pose.getLandmark(PoseLandmark.LEFT_SHOULDER)
        val leftWrist = pose.getLandmark(PoseLandmark.LEFT_WRIST)
        val elbowAngle = calculateAngle(
            leftShoulder.position, leftElbow.position, leftWrist.position
        )
    }

ML Kit на iOS: Pose Detection доступен через ML Kit CocoaPods. API идентичен Android: PoseDetector → UIImage → Pose → PoseLandmark. На iOS ML Kit использует Core ML и ANE (A12+), что даёт 10–20 ms latency в Accurate Mode на iPhone 15 Pro. Streaming Mode — 3–8 ms, до 120 FPS. Для iOS ML Kit Pose Detection работает быстрее, чем MediaPipe BlazePose (Core ML ускорение), но уступает BlazePose по количеству FPS на старых устройствах (iPhone X–11).

MediaPipe BlazePose: архитектура и 3D

MediaPipe BlazePose — высокопроизводительная модель для Pose Detection от Google Research. Использует гибридную архитектуру: detector-decoder pipeline на базе MobileNetV2 + Feature Pyramid Network. BlazePose Full: 33 landmarks + 3D координаты (глубина z). BlazePose Lite: 33 landmarks (2D) без глубины. Обе модели доступны в MediaPipe Tasks Vision на Android, iOS, Python и Web. BlazePose Full обрабатывает 30–60 FPS на GPU, Lite — 60+ FPS.

3D Pose Estimation с BlazePose: модель предсказывает z-координату для каждой landmark, что позволяет оценивать глубину (приближение/удаление limbs) без стереокамеры. Z-координата рассчитывается в метрическом пространстве (метры) относительно камеры. BlazePose 3D точность: 37 mm MPJPE (Mean Per Joint Position Error) на общедоступных бенчмарках — достаточно для фитнеса и AR, недостаточно для медицинской диагностики. Для ARKit/ARFoundation BlazePose 3D даёт естественную глубину.

kotlin
// MediaPipe Pose Detection Tasks Vision
val options = PoseLandmarkerOptions.Builder()
    .setBaseOptions(BaseOptions.builder()
        .setModelAssetPath("pose_landmarker_full.task")
        .build())
    .setDelegate(Delegate.GPU)
    .build()

val landmaker = PoseLandmarker.createFromOptions(context, options)

val result = landmaker.detect(MPImage.fromBitmap(bitmap))
result.landmarks.forEach { pose ->
    pose.forEach { landmark ->
        drawLandmark(landmark.x, landmark.y, landmark.z)
    }
}

BlazePose vs ML Kit Pose Detection: BlazePose быстрее (60+ FPS vs 30 FPS), поддерживает 3D-координаты, работает кроссплатформенно через MediaPipe. ML Kit проще в интеграции (не требует MediaPipe SDK), включает предобученные модели, показывающие высокую точность. Для iOS-native проектов — ML Kit Pose Detection (лучшая оптимизация под ANE). Для кроссплатформенных проектов (Flutter, React Native) — MediaPipe BlazePose (единая модель для всех платформ). Для точности в требовательных сценах — обе модели сравнимы.

MoveNet: Lightning и Thunder от TensorFlow

MoveNet — семейство моделей для Pose Detection от TensorFlow, оптимизированное под TFLite. Lightning (8 MB, INT8 — 4 MB): 17 COCO keypoints, 91% PCK, 8–15 ms latency, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoints, 95% PCK, 25–40 ms latency, 20+ FPS. MoveNet использует CenterNet-архитектуру + bilinear interpolation для high-resolution heatmap. MoveNet поддерживает multi-pose detection (до 6 человек). Модели доступны в TensorFlow Hub.

MoveNet Lightning vs Thunder: Lightning — для real-time приложений с высоким FPS (фитнес, AR-фильтры). Thunder — для точного анализа позы (реабилитация, спортивная аналитика) на устройствах с GPU. Обе модели конвертируются в Core ML через tf-coreml для iOS. MoveNet также доступна через TFLite Task Vision PoseLandmarker API. Рекомендация: начните с Lightning, если точность недостаточна — переходите на Thunder (всего +15 ms latency overhead).

java
// MoveNet Inference with TFLite
Interpreter interpreter = new Interpreter(loadModel(context));
TensorImage image = TensorImage.fromBitmap(bitmap);
image.load(Bitmap.createScaledBitmap(bitmap, 192, 192, true));

float[][] output = new float[1][51];
interpreter.run(image.getTensorBuffer(), output);

float[] keypoints = output[0];
for (int i = 0; i < 17; i++) {
    float y = keypoints[i * 3];
    float x = keypoints[i * 3 + 1];
    float score = keypoints[i * 3 + 2];
    drawKeypoint(x, y, score);
}

MoveNet Multi-Pose: детекция до 6 человек в кадре. Вместо стандартного heatmap подхода MoveNet использует person detection + pose refinement: сначала детектирует людей (centroid-based), затем оценивает позу каждого. Multi-pose режим в 2–3x медленнее single-pose: Lightning — 25–50 ms (6 человек). Для фитнес-приложений с одним пользователем используйте single-pose. Для групповых занятий (йога, кроссфит) — multi-pose с ограничением кадров для экономии батареи.

Классификация поз: от точек к действиям

Pose Classification — этап после детекции: преобразование landmarks в семантические действия (стоит, сидит, поднял руку, делает присед). Подходы: Rule-based (ручные правила — углы между костями), ML-based (логистическая регрессия или Random Forest на векторе landmarks), DL-based (LSTM-классификатор последовательности поз по кадрам). Rule-based — 50–80% accuracy, простой и быстрый. ML-based — 85–95% accuracy с 200+ размеченных примеров. LSTM — 90–98% accuracy на временных рядах (видео).

Углы между костями: для каждой точки рассчитываются углы с соседними. Примеры: right elbow angle (shoulder → elbow → wrist), right knee angle (hip → knee → ankle), torso angle (shoulders midpoint → hips midpoint). Углы — инвариантны к масштабу и позиции человека на экране. Нормализация углов к диапазону [0, 1] позволяет классифицировать позу с помощью простого порогового правила: если elbowAngle < 30° — рука согнута, если > 150° — выпрямлена.

kotlin
// Rule-based squat classifier
fun classifySquat(pose: Pose): SquatPhase {
    val kneeAngle = angle(
        pose.getLandmark(PoseLandmark.LEFT_HIP),
        pose.getLandmark(PoseLandmark.LEFT_KNEE),
        pose.getLandmark(PoseLandmark.LEFT_ANKLE)
    )
    return when {
        kneeAngle > 140f -> SquatPhase.STANDING
        kneeAngle < 90f  -> SquatPhase.SQUAT
        else           -> SquatPhase.TRANSITION
    }
}

MediaPipe Pose Classification — предобуждённые классификаторы в составе MediaPipe Tasks: приседания, отжимания, планка, подъём ног. Классификатор принимает список landmarks и возвращает действие + confidence. Включает сглаживание по времени (temporal filter): HED (Holt Exponential Double Smoothing) для плавного перехода между позами. Для кастомных действий — обучите классификатор на 100–500 примерах через MediaPipe Model Maker (TensorFlow Lite + metadata).

Применение Pose Detection в фитнесе и реабилитации

Фитнес-трекеры с коррекцией техники — приложение анализирует позу пользователя во время упражнения и даёт голосовые подсказки: «опусти таз ниже», «не заваливай корпус». ML Kit Pose Detection + rule-based классификатор считает повторения и оценивает качество. Squat: knee angle < 90° — правильный присед, back angle < 45° — опасный наклон корпуса. Push-up: elbow angle < 90° в нижней точке — полное отжимание. Pull-up: chin выше уровня перекладины.

Реабилитация и физиотерапия — Pose Detection используется для удалённого контроля упражнений ЛФК. Врач задаёт эталонную позу (например, отведение плеча на 45°), приложение измеряет текущий угол и отклонения. BlazePose 3D даёт точность углов ±3° — достаточно для клинической оценки. Периодичность: 1 Frame per 3–5 секунд (экономия батареи). On-device — приватность медицинских данных пациента. Реабилитация после инсульта: трекинг hand-to-shoulder, elbow-extension, hip-flexion.

AR-фильтры и эффекты — Pose Detection лежит в основе AR-фильтров социальных сетей (TikTok, Instagram, Snapchat). Landmarks головы, плеч и кистей используются для наложения масок, анимаций, декоративных элементов. MediaPipe BlazePose Full + Face Mesh (468 точек) даёт 120+ FPS на флагманских устройствах. ARKit/ARCore Face Tracking + Pose Detection — комбинация для full-body AR. Требования: FPS > 30, motion-to-photon latency < 20 ms.

swift
// AR filter with pose landmarks
let request = VNDetectHumanBodyPoseRequest { req, _ in
    guard let observation = req.results?.first as? VNHumanBodyPoseObservation else { return }
    let keypoints = try observation.recognizedPoints(.all)
    let rightShoulder = keypoints[VNHumanBodyPoseObservation.JointName.rightShoulder]
    DispatchQueue.main.async {
        arView.placeFilter(at: rightShoulder?.location ?? .zero)
    }
}

Спортивная аналитика — профессиональная оценка техники: биомеханический анализ бега (cadence, stride length, arm swing symmetry), плавания (body roll, elbow angle при гребке), тенниса (shoulder rotation, wrist snap). MoveNet Thunder с постпроцессингом даёт достаточную точность для непрофессиональной аналитики. Для профессионального спорта требуется 3D Motion Capture (Vicon, OptiTrack), но Pose Detection на телефоне — доступная альтернатива для массового рынка. Синхронизация углов между кадрами — ключевой компонент.

Часто задаваемые вопросы

Как стабилизировать Pose Detection при дрожании камеры?

Используйте temporal smoothing (временное сглаживание): One Euro Filter (1€ filter) — настраивается cut-off frequency для каждой landmark отдельно, подавляет высокочастотный шум (дрожание), сохраняя реальное движение (low latency). MediaPipe BlazePose включает встроенный HED (Holt Exponential Double Smoothing) — адаптивное сглаживание с предсказанием движения. Для ML Kit реализуйте 1€ filter самостоятельно: у фильтра два параметра — beta (скорость) и minCutoff (порог частоты). Рекомендуемые: beta = 0.04, minCutoff = 0.5 (Android).

Сколько людей в кадре может определять Pose Detection?

ML Kit Pose Detection — одного человека (single-pose). MoveNet Lightning — до 6 человек (multi-pose). MediaPipe BlazePose — до 2–3 человек через MediaPipe Tasks (multi-pose). Для приложений с групповыми занятиями используйте MoveNet Lightning или BlazePose. Для фитнес-приложений с одним пользователем — ML Kit (проще интеграция, выше точность single-pose). Для видеозвонков с AR-фильтрами — достаточно BlazePose Lite с multi-pose (высокий FPS).

Как рассчитать угол между костями для классификации позы?

Угол между двумя костями: возьмите три landmarks — сустав A, сустав B (вершина угла), сустав C. Рассчитайте векторы BA = (A - B) и BC = (C - B). Угол = atan2(cross(BA, BC), dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). Угол в диапазоне 0–180°. Для трёхмерных координат (BlazePose 3D) используйте Vector3D. Normalize углы в диапазон [0,1] для ML-классификатора.

Можно ли определять позу обеих рук одновременно?

Да, все основные модели (ML Kit, BlazePose, MoveNet) определяют landmarks обеих рук одновременно: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST. Для дополнительной детекции кистей (hand tracking) комбинируйте Pose Detection + Hand Landmarker (21 точка на кисть). MediaPipe Hands + BlazePose — стандартная комбинация для full-body + hands. На iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.

Какой минимальный размер человека в кадре для Pose Detection?

ML Kit Pose Detection: минимальная bounding box человека — 100x100 пикселей (соотношение сторон ~1:1). MoveNet Lightning: 120x120 пикселей. BlazePose: 80x160 пикселей (вертикальный bounding box). Для человека в полный рост на расстоянии 3 метра от камеры (1920x1080) — примерно 250x600 px, что достаточно. При расстоянии > 5 метров точность падает — используйте Multi-Pose + high-resolution input. Для удалённых объектов лучше Object Detection + Pose Estimation (two-stage).

Итоги

  • Pose Detection — определение 17–33 ключевых точек тела с точностью 91–96% PCK
  • ML Kit Pose Detection — 33 landmarks, до 30 FPS, простой API, на GPU/ANE
  • BlazePose (MediaPipe) — 33 landmarks + 3D, до 60 FPS, кроссплатформенный
  • MoveNet Lightning/Thunder — 17 COCO keypoints, 30+ FPS, TFLite, multi-pose
  • Pose Classification — от landmarks к действиям через rule-based или ML
  • On-device — приватность, real-time, 3 ms–30 ms latency
  • Применение — фитнес, реабилитация, AR-фильтры, спортивная аналитика

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также