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 | Закъснение (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 се считат за невидими (покрити, извън кадъра). За анализ на позата използвайте само видими точки. За оценяване на подравняването — изчислявайте confidence-weighted distances, където точките с нисък резултат имат по-малко тегло в метриката.
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.
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 — високопроизводителен модел за 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 осигурява естествена дълбочина.
// 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 — семейство от модели за 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 допълнително закъснение).
// 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° — изправена.
// Класификатор на клекове, базиран на правила
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).
Фитнес трекъри с корекция на техниката — приложението анализира позата на потребителя по време на упражнението и дава гласови напутствия: „спусни таза по-надолу”, „не наклоняй торса”. 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.
// 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) — адаптивно изглажване с предвиждане на движението. За ML Kit имплементирайте 1€ филтър самостоятелно: филтърът има два параметъра — 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също