Pose Detection — technologie počítačového vidění, která určuje polohu lidského těla podle klíčových bodů (landmarks): hlava, ramena, lokty, zápěstí, boky, kolena, kotníky. Každý bod má souřadnice (x, y) v 2D prostoru, zatímco rozšířené modely (MediaPipe BlazePose 3D) přidávají souřadnici z pro hloubku. V mobilních aplikacích se Pose Detection používá ve fitness trackerech, aplikacích pro jógu, AR filtrech, rehabilitačních programech a systémech sportovní analýzy. Podle Google ML Kit, 2025, on-device Pose Detection zpracovává až 30 snímků za sekundu s přesností 94% PCK.
Hlavní body
Pose Detection (též Pose Estimation) se týká úkolu určování sémantických klíčových bodů lidského těla z obrázku nebo videa. Top-down přístup nejprve detekuje člověka (Object Detection), poté určuje jeho pózu. Bottom-up přístup najde všechny landmarks v obrázku, poté je seskupí podle osob (OpenPose). Pro mobilní zařízení se používá bottom-up — je rychlejší při více lidech v záběru. ML Kit a BlazePose používají single-stage přístup — detekce + póza v jednom průchodu.
COCO Keypoints — standardní sada 17 bodů: nos, oči (2), uši (2), ramena (2), lokty (2), zápěstí (2), boky (2), kolena (2), kotníky (2). MediaPipe BlazePose používá 33 bodů, přidává: prsty na nohou, paty, střed trupu, body na obličeji. Čím více bodů, tím přesnější analýza pózy, ale vyšší výpočetní zátěž. Pro fitness aplikace stačí 17–20 bodů. Pro úplnou analýzu (jóga, tanec) — 33 bodů. Pro AR filtry — 33 bodů + 468 bodů obličeje (MediaPipe Face Mesh).
PCK (Percentage of Correct Keypoints) — metrika přesnosti Pose Detection. Počítá se jako podíl bodů předpovězených v rámci vzdálenosti od ground truth (obvykle 0.05–0.15 velikosti bounding boxu člověka). ML Kit Pose Detection: 94% PCK@0.1. BlazePose Full: 96% PCK@0.1. MoveNet Lightning: 91% PCK@0.1. OKS (Object Keypoint Similarity) — metrika používaná v COCO, zohledňující měřítko člověka a obtížnost bodu. mAP@OKS — standardní metrika pro benchmarky.
| Model | Landmarks | PCK@0.1 | Latence (GPU) | Velikost |
|---|---|---|---|---|
| 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: každý landmark má skóre (score) (0..1), které udává, jak je model v bodě sebejistý a zda je viditelný. Body se score < 0.5 jsou považovány za neviditelné (zakryté, mimo záběr). Pro analýzu pózy používejte pouze viditelné body. Pro hodnocení vyrovnání (alignment) — počítejte confidence-weighted distances, kde body s nízkým score mají menší váhu v metrice.
ML Kit Pose Detection — knihovna od Google pro určování pózy na zařízení. Podporuje 33 landmarks, včetně bodů obličeje, prstů na nohou a pat. Režimy: Accurate Mode (14 MB model, 15–30 ms, vysoká přesnost) a Streaming Mode (5 MB, 5–10 ms, pro real-time). Streaming Mode používá odlehčený model se sledováním (tracking) — po prvním snímku sleduje pohyb bez opětovné detekce přesných pozic, což poskytuje až 60 FPS.
API ML Kit Pose Detection: PoseDetector (volby: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). Každý PoseLandmark má: landmarkType (38 typů), position (PointF3D), inFrameLikelihood (0..1). Pose také poskytuje: boundingBox člověka, seznam landmarks, metodu getLandmark(type). Pro klasifikaci pózy používejte úhly mezi kostmi: shoulderAngle, elbowAngle, hipAngle — počítají se pomocí Vector3D mezi sousedními 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 na iOS: Pose Detection je k dispozici přes ML Kit CocoaPods. API je totožné s Android: PoseDetector → UIImage → Pose → PoseLandmark. Na iOS ML Kit používá Core ML a ANE (A12+), což poskytuje 10–20 ms latenci v Accurate Mode na iPhone 15 Pro. Streaming Mode — 3–8 ms, až 120 FPS. Na iOS ML Kit Pose Detection funguje rychleji než MediaPipe BlazePose (zrychlení Core ML), ale zaostává za BlazePose na starších zařízeních (iPhone X–11).
MediaPipe BlazePose — vysoce výkonný model pro Pose Detection od Google Research. Používá hybridní architekturu: detector-decoder pipeline založený na MobileNetV2 + Feature Pyramid Network. BlazePose Full: 33 landmarks + 3D souřadnice (hloubka z). BlazePose Lite: 33 landmarks (2D) bez hloubky. Oba modely jsou k dispozici v MediaPipe Tasks Vision na Android, iOS, Python a Web. BlazePose Full zpracovává 30–60 FPS na GPU, Lite — 60+ FPS.
3D Pose Estimation s BlazePose: model předpovídá souřadnici z pro každý landmark, což umožňuje odhad hloubky (přiblížení/vzdálení končetin) bez stereokamery. Souřadnice z se počítá v metrickém prostoru (metry) vůči kameře. Přesnost BlazePose 3D: 37 mm MPJPE (Mean Per Joint Position Error) na veřejně dostupných benchmarcích — dostatečné pro fitness a AR, nedostatečné pro lékařskou diagnostiku. Pro ARKit/ARFoundation poskytuje BlazePose 3D přirozenou hloubku.
// Úlohy vidění pro detekci póz MediaPipe
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 je rychlejší (60+ FPS vs 30 FPS), podporuje 3D souřadnice, funguje cross-platform přes MediaPipe. ML Kit je jednodušší na integraci (nevyžaduje MediaPipe SDK), obsahuje předtrénované modely s vysokou přesností. Pro iOS-native projekty — ML Kit Pose Detection (lepší optimalizace pro ANE). Pro cross-platform projekty (Flutter, React Native) — MediaPipe BlazePose (jednotný model pro všechny platformy). Pro přesnost v náročných scénách — oba modely jsou srovnatelné.
MoveNet — rodina modelů pro Pose Detection od TensorFlow, optimalizovaná pro TFLite. Lightning (8 MB, INT8 — 4 MB): 17 COCO keypoints, 91% PCK, 8–15 ms latence, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoints, 95% PCK, 25–40 ms latence, 20+ FPS. MoveNet používá CenterNet architekturu + bilinear interpolation pro high-resolution heatmap. MoveNet podporuje multi-pose detekci (až 6 osob). Modely jsou k dispozici v TensorFlow Hub.
MoveNet Lightning vs Thunder: Lightning — pro real-time aplikace s vysokým FPS (fitness, AR filtry). Thunder — pro přesnou analýzu pózy (rehabilitace, sportovní analýza) na zařízeních s GPU. Oba modely se konvertují do Core ML přes tf-coreml pro iOS. MoveNet je také k dispozici přes TFLite Task Vision PoseLandmarker API. Doporučení: začněte s Lightning, pokud přesnost nestačí — přejděte na Thunder (pouze +15 ms latence navíc).
// Inference MoveNet s 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: detekce až 6 osob v záběru. Místo standardního heatmap přístupu MoveNet používá person detection + pose refinement: nejprve detekuje osoby (centroid-based), poté odhaduje pózu každé. Režim multi-pose je 2–3x pomalejší než single-pose: Lightning — 25–50 ms (6 osob). Pro fitness aplikace s jedním uživatelem používejte single-pose. Pro skupinové aktivity (jóga, crossfit) — multi-pose s omezením snímků pro úsporu baterie.
Pose Classification — fáze po detekci: převod landmarks na sémantické akce (stojí, sedí, zvedl ruku, dělá dřep). Přístupy: Rule-based (ruční pravidla — úhly mezi kostmi), ML-based (logistická regrese nebo Random Forest na vektoru landmarks), DL-based (LSTM klasifikátor sekvence póz podle snímků). Rule-based — 50–80% přesnost, jednoduchý a rychlý. ML-based — 85–95% přesnost s 200+ označenými příklady. LSTM — 90–98% přesnost na časových řadách (video).
Úhly mezi kostmi: pro každý bod se počítají úhly se sousedními. Příklady: right elbow angle (shoulder → elbow → wrist), right knee angle (hip → knee → ankle), torso angle (shoulders midpoint → hips midpoint). Úhly jsou invariantní vůči měřítku a pozici osoby na obrazovce. Normalizace úhlů do rozsahu [0, 1] umožňuje klasifikovat pózu pomocí jednoduchého prahového pravidla: pokud elbowAngle < 30° — ruka je ohnutá, pokud > 150° — je natažená.
// Pravidlový klasifikátor dřepů
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 — předtrénované klasifikátory v MediaPipe Tasks: dřepy, kliky, plank, zvedání nohou. Klasifikátor přijímá seznam landmarks a vrací akci + confidence. Zahrnuje časové vyhlazení (temporal filter): HED (Holt Exponential Double Smoothing) pro plynulý přechod mezi pózami. Pro vlastní akce — natrénujte klasifikátor na 100–500 příkladech pomocí MediaPipe Model Maker (TensorFlow Lite + metadata).
Fitness trackery s korekcí techniky — aplikace analyzuje pózu uživatele během cvičení a dává hlasové pokyny: „pusť pánev níže“, „nepřekláněj trup“. ML Kit Pose Detection + rule-based klasifikátor počítá opakování a hodnotí kvalitu. Squat: knee angle < 90° — správný dřep, back angle < 45° — nebezpečný náklon trupu. Push-up: elbow angle < 90° v dolním bodě — plný klik. Pull-up: brada nad úrovní tyče.
Rehabilitace a fyzioterapie — Pose Detection se používá pro vzdálené sledování cvičení. Lékař nastaví referenční pózu (např. abdukce ramene 45°), aplikace měří aktuální úhel a odchylky. BlazePose 3D poskytuje přesnost úhlů ±3° — dostatečné pro klinické hodnocení. Frekvence: 1 snímek za 3–5 sekund (úspora baterie). On-device — soukromí zdravotních dat pacienta. Rehabilitace po mrtvici: sledování hand-to-shoulder, elbow-extension, hip-flexion.
AR filtry a efekty — Pose Detection je základem AR filtrů sociálních sítí (TikTok, Instagram, Snapchat). Landmarks hlavy, ramen a rukou se používají pro překrývání masek, animací, dekorativních prvků. MediaPipe BlazePose Full + Face Mesh (468 bodů) poskytuje 120+ FPS na špičkových zařízeních. ARKit/ARCore Face Tracking + Pose Detection — kombinace pro full-body AR. Požadavky: FPS > 30, motion-to-photon latency < 20 ms.
// AR filtr s landmarky pózy
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)
}
}
Sportovní analýza — profesionální hodnocení techniky: biomechanická analýza běhu (cadence, stride length, arm swing symmetry), plavání (body roll, elbow angle při záběru), tenisu (shoulder rotation, wrist snap). MoveNet Thunder s postprocesingem poskytuje dostatečnou přesnost pro neprofesionální analýzu. Pro profesionální sport je vyžadován 3D Motion Capture (Vicon, OptiTrack), ale Pose Detection v telefonu je dostupnou alternativou pro masový trh. Synchronizace úhlů mezi snímky je klíčovou součástí.
Často kladené otázky
Použijte časové vyhlazení (temporal smoothing): One Euro Filter (1€ filter) — nastavuje se cut-off frequency pro každý landmark zvlášť, potlačuje vysokofrekvenční šum (chvění), zachovává skutečný pohyb (nízká latence). MediaPipe BlazePose obsahuje vestavěný HED (Holt Exponential Double Smoothing) — adaptivní vyhlazení s predikcí pohybu. Pro ML Kit implementujte 1€ filter samostatně: filtr má dva parametry — beta (rychlost) a minCutoff (prah frekvence). Doporučené: beta = 0.04, minCutoff = 0.5 (Android).
ML Kit Pose Detection — jednu osobu (single-pose). MoveNet Lightning — až 6 osob (multi-pose). MediaPipe BlazePose — až 2–3 osoby přes MediaPipe Tasks (multi-pose). Pro aplikace se skupinovými aktivitami používejte MoveNet Lightning nebo BlazePose. Pro fitness aplikace s jedním uživatelem — ML Kit (jednodušší integrace, vyšší přesnost single-pose). Pro videohovory s AR filtry — stačí BlazePose Lite s multi-pose (vysoký FPS).
Úhel mezi dvěma kostmi: vezměte tři landmarks — kloub A, kloub B (vrchol úhlu), kloub C. Vypočítejte vektory BA = (A - B) a BC = (C - B). Úhel = atan2(cross(BA, BC), dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). Úhel je v rozsahu 0–180°. Pro trojrozměrné souřadnice (BlazePose 3D) použijte Vector3D. Normalizujte úhly do rozsahu [0,1] pro ML klasifikátor.
Ano, všechny hlavní modely (ML Kit, BlazePose, MoveNet) detekují landmarks obou rukou současně: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST. Pro dodatečnou detekci rukou (hand tracking) kombinujte Pose Detection + Hand Landmarker (21 bodů na ruku). MediaPipe Hands + BlazePose — standardní kombinace pro full-body + hands. Na iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.
ML Kit Pose Detection: minimální bounding box člověka — 100x100 pixelů (poměr stran ~1:1). MoveNet Lightning: 120x120 pixelů. BlazePose: 80x160 pixelů (svislý bounding box). Pro člověka v plné výšce na vzdálenost 3 metrů od kamery (1920x1080) — přibližně 250x600 px, což je dostatečné. Při vzdálenosti > 5 metrů přesnost klesá — použijte Multi-Pose + high-resolution input. Pro vzdálené objekty je lepší Object Detection + Pose Estimation (two-stage).
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také