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 (также 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 — стандартная метрика для бенчмарков.
| Модель | Landmarks | PCK@0.1 | Latency (GPU) | Размер |
|---|---|---|---|---|
| ML Kit Pose Acc | 33 | 94% | 15–30 ms | 14 MB |
| BlazePose Full | 33 + 3D | 96% | 10–20 ms | 12 MB |
| BlazePose Lite | 33 | 91% | 5–10 ms | 5 MB |
| MoveNet Lightning | 17 | 91% | 8–15 ms | 8 MB |
| MoveNet Thunder | 17 | 95% | 25–40 ms | 13 MB |
Keypoint Visibility: каждая landmark имеет score (0..1), указывающий, насколько модель уверена в точке и видна ли она. Точки со score < 0.5 считаются невидимыми (закрыты, за кадром). Для анализа позы используйте только видимые точки. Для оценки выравнивания (alignment) — рассчитывайте confidence-weighted distances, где точки с низким score имеют меньший вес в метрике.
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
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 — высокопроизводительная модель для 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 даёт естественную глубину.
// 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 — семейство моделей для 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).
// 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° — выпрямлена.
// 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).
Фитнес-трекеры с коррекцией техники — приложение анализирует позу пользователя во время упражнения и даёт голосовые подсказки: «опусти таз ниже», «не заваливай корпус». 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.
// 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 на телефоне — доступная альтернатива для массового рынка. Синхронизация углов между кадрами — ключевой компонент.
Часто задаваемые вопросы
Используйте 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).
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.
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).
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также