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 — приватність, реальний час, без надсилання відео на сервер

Що таке 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 має оцінку (0..1), що вказує наскільки модель впевнена в точці та чи видна вона. Точки з оцінкою < 0.5 вважаються невидимими (закриті, за кадром). Для аналізу пози використовуйте лише видимі точки. Для оцінки вирівнювання (alignment) — розраховуйте confidence-weighted відстані, де точки з низькою оцінкою мають меншу вагу в метриці.

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, для реального часу). 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.

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 з 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° — випрямлена.

kotlin
// Класифікатор присідань на основі правил
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-фільтр з 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) — адаптивне згладжування з прогнозуванням руху. Для MLKit реалізуйте 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. Нормалізуйте кути в діапазон [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 — приватність, реальний час, 3 ms–30 ms latency
  • Застосування — фітнес, реабілітація, AR-фільтри, спортивна аналітика

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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