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 має оцінку (0..1), що вказує наскільки модель впевнена в точці та чи видна вона. Точки з оцінкою < 0.5 вважаються невидимими (закриті, за кадром). Для аналізу пози використовуйте лише видимі точки. Для оцінки вирівнювання (alignment) — розраховуйте confidence-weighted відстані, де точки з низькою оцінкою мають меншу вагу в метриці.
ML Kit Pose Detection — бібліотека від Google для визначення пози на пристрої. Підтримує 33 landmarks, включаючи точки обличчя, пальців ніг та п'ят. Режими: Accurate Mode (14 MB модель, 15–30 ms, висока точність) та Streaming Mode (5 MB, 5–10 ms, для реального часу). Streaming Mode використовує полегшену модель із трекінгом — після першого кадру відстежує рух без повторної детекції точних позицій, що дає до 60 FPS.
API ML Kit Pose Detection: PoseDetector (опції: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). Кожен PoseLandmark має: landmarkType (38 типів), position (PointF3D), inFrameLikelihood (0..1). Pose також надає: boundingBox людини, список landmarks, метод getLandmark(type). Для класифікації пози використовуйте кути між кістками: shoulderAngle, elbowAngle, hipAngle — розраховуються через Vector3D між сусідніми landmarks.
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 з 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% точність, простий і швидкий. ML-based — 85–95% точність із 200+ розмічених прикладів. LSTM — 90–98% точність на часових рядах (відео).
Кути між кістками: для кожної точки розраховуються кути з сусідніми. Приклади: right elbow angle (shoulder → elbow → wrist), right knee angle (hip → knee → ankle), torso angle (shoulders midpoint → hips midpoint). Кути — інваріантні до масштабу та позиції людини на екрані. Нормалізація кутів до діапазону [0, 1] дозволяє класифікувати позу за допомогою простого порогового правила: якщо elbowAngle < 30° — рука зігнута, якщо > 150° — випрямлена.
// Класифікатор присідань на основі правил
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-фільтр з 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) — адаптивне згладжування з прогнозуванням руху. Для MLKit реалізуйте 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. Нормалізуйте кути в діапазон [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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також