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.1Закъснение (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 се считат за невидими (покрити, извън кадъра). За анализ на позата използвайте само видими точки. За оценяване на подравняването — изчислявайте confidence-weighted distances, където точките с нисък резултат имат по-малко тегло в метриката.

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>). Всяка 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 закъснение в 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, което позволява оценяване на дълбочината (приближаване/отдалячване на каймаците) без стерео камера. 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 проекти — 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 закъснение, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoints, 95% PCK, 25–40 ms закъснение, 20+ FPS. MoveNet използва CenterNet архитектура + билинейна интерполация за heatmap с висока резолюция. MoveNet поддържа multi-pose откриване (до 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 допълнително закъснение).

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% точност, прост и бърз. ML-based — 85–95% точност с 200+ етикирани примера. LSTM — 90–98% точност на времени редици (видео).

Ъгъли между костите: за всяка точка се изчисляват ъгъли със съседните точки. Примери: right elbow angle (shoulder → elbow → wrist), right knee angle (hip → knee → ankle), torso angle (среда на раменете → среда на ханшето). Ъгълите са инвариантни спрямо мащаба и позицията на човека на екрана. Нормализацията на ъгълите в обхват [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 и възвраща действието + доверие. Включва временно изглажване (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: брадичката над нивото на лъствицата.

Рехабилитация и физиотерапия — Pose Detection се използва за дистанционен контрол на физиотерапевтични упражнения. Лекарят задава референтна поза (например абдукция на раменото на 45°), приложението измерва текущия ъгъл и отклоненията. BlazePose 3D осигурява точност на ъгълите ±3° — достатъчна за клинична оценка. Честота: 1 кадър на 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 закъснение < 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) — адаптивно изглажване с предвиждане на движението. За ML Kit имплементирайте 1€ филтър самостоятелно: филтърът има два параметъра — 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 — поверителност, real-time, 3 ms–30 ms закъснение
  • Приложение — фитнес, рехабилитация, AR филтри, спортен анализ

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

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също