Pose Detection — számítógépes látástechnológia, amely az emberi test helyzetét határozza meg kulcspontok (landmarks) segítségével: fej, vállak, könyök, csuklók, csípők, térdek, bokák. Minden pontnak vannak koordinátái (x, y) a 2D térben, a fejlett modellek (MediaPipe BlazePose 3D) pedig z-koordinátát adnak hozzá a mélységhez. Mobilalkalmazásokban a Pose Detection-t fitneszkövetőkben, jógaalkalmazásokban, AR-szűrőkben, rehabilitációs programokban és sportanalitikai rendszerekben használják. A Google ML Kit, 2025 szerint az on-device Pose Detection akár 30 képkockát is feldolgoz másodpercenként 94% PCK pontossággal.
Főbb
Pose Detection (más néven Pose Estimation) az emberi test szemantikus kulcspontjainak meghatározására utal képből vagy videóból. A Top-down megközelítés először érzékeli a személyt (Object Detection), majd meghatározza a testtartását. A Bottom-up megközelítés megtalálja az összes landmarkot a képen, majd csoportosítja őket személyenként (OpenPose). Mobileszközökhöz a bottom-up-ot használják — gyorsabb, ha több ember van a képkockában. Az ML Kit és a BlazePose single-stage megközelítést használ — érzékelés + testtartás egy menetben.
COCO Keypoints — 17 pontból álló szabványos készlet: orr, szemek (2), fülek (2), vállak (2), könyök (2), csuklók (2), csípők (2), térdek (2), bokák (2). A MediaPipe BlazePose 33 pontot használ, hozzáadva: lábujjak, sarkak, törzs középpontja, arcpontok. Minél több pont, annál pontosabb a testtartás-elemzés, de annál magasabb a számítási terhelés. Fitneszalkalmazásokhoz 17–20 pont elegendő. Teljes elemzéshez (jóga, tánc) — 33 pont. AR-szűrőkhöz — 33 pont + 468 arcpont (MediaPipe Face Mesh).
PCK (Percentage of Correct Keypoints) — a Pose Detection pontosságának metrikája. A ground truth-tól számított távolságon belül (ltalában a személy bounding box méretének 0.05–0.15-e) előrejelzett pontok arányaként számítják. ML Kit Pose Detection: 94% PCK@0.1. BlazePose Full: 96% PCK@0.1. MoveNet Lightning: 91% PCK@0.1. OKS (Object Keypoint Similarity) — a COCO-ban használt metrika, amely figyelembe veszi a személy méretarányát és a pont nehézségét. mAP@OKS — benchmarkok szabványos metrikája.
| Modell | Landmarks | PCK@0.1 | Latencia (GPU) | Méret |
|---|---|---|---|---|
| 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: minden landmark rendelkezik egy pontszámmal (0..1), amely jelzi, hogy a modell mennyire biztos a pontban és hogy az látható-e. A < 0.5 pontszámú pontok láthatatlannak minősülnek (takart, kockán kívüli). Testtartás elemzéséhez csak látható pontokat használjon. Az igazítás értékeléséhez — számítson confidence-weighted distances-t, ahol az alacsony pontszámú pontok kisebb súlyt kapnak a metrikában.
ML Kit Pose Detection — könyvtár a Google-tól a testtartás eszközön történő meghatározásához. 33 landmarkot támogat, beleértve az arcpontokat, lábujjakat és sarkakat. Módok: Accurate Mode (14 MB modell, 15–30 ms, nagy pontosság) és Streaming Mode (5 MB, 5–10 ms, valós idejű). A Streaming Mode könnyű modellt használ követéssel — az első kocka után követi a mozgást anélkül, hogy újra érzékelné a pontos pozíciókat, ami akár 60 FPS-t is biztosít.
ML Kit Pose Detection API: PoseDetector (opciók: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). Minden PoseLandmark rendelkezik: landmarkType (38 típus), position (PointF3D), inFrameLikelihood (0..1). A Pose emellett biztosítja: a személy boundingBox-ját, a landmarks listáját, a getLandmark(type) metódust. Testtartás osztályozásához használja a csontok közötti szögeket: shoulderAngle, elbowAngle, hipAngle — a Vector3D segítségével számítva a szomszédos landmarks között.
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-en: A Pose Detection az ML Kit CocoaPods segítségével érhető el. Az API megegyezik az Androidéval: PoseDetector → UIImage → Pose → PoseLandmark. iOS-en az ML Kit a Core ML-t és az ANE-t (A12+) használja, ami 10–20 ms latenciát biztosít Accurate Mode-ban iPhone 15 Pro-n. Streaming Mode — 3–8 ms, akár 120 FPS. iOS-en az ML Kit Pose Detection gyorsabban működik, mint a MediaPipe BlazePose (Core ML gyorsítás), de FPS tekintetében elmarad a BlazePose-tól régebbi eszközökön (iPhone X–11).
MediaPipe BlazePose — nagy teljesítményű modell a Pose Detection számára a Google Research-től. Hibrid detector-decoder pipeline architektúrát használ MobileNetV2 + Feature Pyramid Network alapokon. BlazePose Full: 33 landmarks + 3D koordináták (z mélység). BlazePose Lite: 33 landmarks (2D) mélység nélkül. Mindkét modell elérhető a MediaPipe Tasks Vision-ban Androidon, iOS-en, Pythonban és Weben. A BlazePose Full 30–60 FPS-t dolgoz fel GPU-n, a Lite 60+ FPS-t.
3D Pose Estimation BlazePose-zal: a modell z-koordinátát jósol minden landmarkhoz, lehetővé téve a mélység értékelését (végtagok közelítése/távolítása) sztereó kamera nélkül. A z-koordináta metrikus térben (méter) kerül kiszámításra a kamerához viszonyítva. BlazePose 3D pontosság: 37 mm MPJPE (Mean Per Joint Position Error) nyilvános benchmarkokon — elegendő fitneszhez és AR-hez, nem elegendő orvosi diagnosztikához. ARKit/ARFoundation számára a BlazePose 3D természetes mélységet biztosít.
// 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: A BlazePose gyorsabb (60+ FPS vs 30 FPS), támogatja a 3D koordinátákat, cross-platform működik a MediaPipe-on keresztül. Az ML Kit egyszerűbben integrálható (nem igényel MediaPipe SDK-t), előre betanított modelleket tartalmaz nagy pontossággal. Natív iOS-projektekhez — ML Kit Pose Detection (jobb optimalizálás ANE-hez). Cross-platform projektekhez (Flutter, React Native) — MediaPipe BlazePose (egyetlen modell minden platformhoz). Pontossághoz igényes szcénákban — mindkét modell összehasonlítható.
MoveNet — Pose Detection modellek családja a TensorFlow-tól, TFLite-ra optimalizálva. Lightning (8 MB, INT8 — 4 MB): 17 COCO keypoints, 91% PCK, 8–15 ms latencia, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoints, 95% PCK, 25–40 ms latencia, 20+ FPS. A MoveNet CenterNet architektúrát + bilineáris interpolációt használ nagy felbontású heatmap-hez. A MoveNet támogatja a multi-pose érzékelést (akár 6 fő). A modellek a TensorFlow Hub-ban érhetőek el.
MoveNet Lightning vs Thunder: Lightning — valós idejű alkalmazásokhoz magas FPS-sel (fitnesz, AR szűrők). Thunder — pontos testtartás-elemzéshez (rehabilitáció, sportanalitika) GPU-val rendelkező eszközökön. Mindkét modell konvertálható Core ML-re a tf-coreml segítségével iOS-hez. A MoveNet a TFLite Task Vision PoseLandmarker API-n keresztül is elérhető. Javaslat: kezdje a Lightning-gal, ha a pontosság nem elegendő — váltson Thunder-re (csak +15 ms többletlatencia).
// 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: akár 6 fő érzékelése a kockában. A szabványos heatmap megközelítés helyett a MoveNet person detection + pose refinement-t használ: először érzékeli a személyeket (centroid-based), majd értékeli mindegyik testtartását. A multi-pose mód 2–3x lassabb, mint a single-pose: Lightning — 25–50 ms (6 fő). Egyfelhasználós fitneszalkalmazásokhoz használjon single-pose-t. Csoportos tevékenységekhez (jóga, crossfit) — multi-pose kockakorlátozással az akkumulátor kíméléséhez.
Pose Classification — az érzékelés utáni szakasz: a landmarks átalakítása szemantikus cselekvésekké (áll, ül, felemelte a kezét, guggol). Megközelítések: Rule-based (kézi szabályok — csontok közötti szögek), ML-based (logisztikus regresszió vagy Random Forest a landmarks vektoron), DL-based (testtartás-sorozat LSTM osztályozója kockánként). Rule-based — 50–80% pontosság, egyszerű és gyors. ML-based — 85–95% pontosság 200+ címkézett példával. LSTM — 90–98% pontosság idősorokon (videó).
Szögek a csontok között: minden ponthoz kiszámításra kerülnek a szögek a szomszédos pontokkal. Példák: right elbow angle (shoulder → elbow → wrist), right knee angle (hip → knee → ankle), torso angle (vállak felezőpontja → csípők felezőpontja). A szögek invariánsak a skálára és a személy képernyőn elfoglalt helyzetére. A szögek [0, 1] tartományba normalizálása lehetővé teszi a testtartás osztályozását egy egyszerű küszöbérték-szabállyal: ha elbowAngle < 30° — a kar hajlított, ha > 150° — nyújtott.
// Szabályalapú guggolásosztályozó
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 — előre betanított osztályozók a MediaPipe Tasks részeként: guggolások, fekvőtámaszok, plank, lábemelések. Az osztályozó fogadja a landmarks listáját és visszaadja a cselekvést + megbízhatóságot. Időbeli simítást (temporal filter) tartalmaz: HED (Holt Exponential Double Smoothing) a testtartások közötti sima átmenethez. Egyedi cselekvésekhez — tanítson osztályozót 100–500 példán a MediaPipe Model Maker (TensorFlow Lite + metadata) segítségével.
Fitneszkövetők technikajavítással — az alkalmazás elemzi a felhasználó testtartását a gyakorlat során és hangutasításokat ad: „engedd lejjebb a medencét”, „ne dőntsd meg a törzset”. ML Kit Pose Detection + rule-based osztályozó számlálja az ismétléseket és értékeli a minőséget. Squat: knee angle < 90° — helyes guggolás, back angle < 45° — veszélyes törzsdőlés. Push-up: elbow angle < 90° az alsó pontban — teljes fekvőtámasz. Pull-up: áll a rúd szintje felett.
Rehabilitáció és fizioterápia — a Pose Detection-t a fizioterápiás gyakorlatok távvezérlésére használják. Az orvos beállít egy referenciatesttartást (pl. váll-abdukció 45°-ra), az alkalmazás méri az aktuális szöget és az eltéréseket. A BlazePose 3D ±3° szögpontosságot biztosít — elegendő a klinikai értékeléshez. Gyakoriság: 1 kocka 3–5 másodpercenként (akkumulátorkímélés). On-device — a beteg orvosi adatainak védelme. Rehabilitáció sztrájk után: hand-to-shoulder, elbow-extension, hip-flexion követése.
AR-szűrők és effektek — a Pose Detection képezi a közösségi média AR-szűrőinek (TikTok, Instagram, Snapchat) alapját. A fej, vállak és kezek landmarks-jait maszkok, animációk és dekoratív elemek ráhelyezésére használják. A MediaPipe BlazePose Full + Face Mesh (468 pont) 120+ FPS-t biztosít zászlóshajó eszközökön. ARKit/ARCore Face Tracking + Pose Detection — kombináció a full-body AR-hez. Követelmények: FPS > 30, motion-to-photon latency < 20 ms.
// AR szűrő testtartás-landmarkokkal
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)
}
}
Sportanalitika — professzionális technikaértékelés: futás biomechanikai elemzése (cadence, stride length, arm swing symmetry), úszás (body roll, elbow angle húzásnál), tenisz (shoulder rotation, wrist snap). A MoveNet Thunder utófeldolgozással elegendő pontosságot biztosít nem professzionális analitikához. A professzionális sporthoz 3D Motion Capture (Vicon, OptiTrack) szükséges, de a Pose Detection a telefonon egy elérhető alternatíva a tömegpiac számára. A szögek szinkronizálása a kockák között — kulcsfontosságú komponens.
Gyakran ismételt kérdések
Használjon temporal smoothing-ot (időbeli simítás): One Euro Filter (1€ filter) — minden landmarkhoz külön állítható cut-off frekvencia, elnyomja a magas frekvenciájú zajt (remegés), megtartja a valós mozgást (alacsony latencia). A MediaPipe BlazePose beépített HED-et (Holt Exponential Double Smoothing) tartalmaz — adaptív simítás mozgáselőrejelzéssel. ML Kit-hez implementálja a 1€ filtert saját maga: a szűrőnek két paramétere van — beta (sebesség) és minCutoff (frekvencia küszöb). Javasolt: beta = 0.04, minCutoff = 0.5 (Android).
ML Kit Pose Detection — egy személyt (single-pose). MoveNet Lightning — akár 6 főt (multi-pose). MediaPipe BlazePose — akár 2–3 főt a MediaPipe Tasks segítségével (multi-pose). Csoportos tevékenységekkel rendelkező alkalmazásokhoz használja a MoveNet Lightning-ot vagy a BlazePose-t. Egyfelhasználós fitneszalkalmazásokhoz — ML Kit (egyszerűbb integráció, magasabb single-pose pontosság). AR szűrős videóhívásokhoz — elegendő a BlazePose Lite multi-pose-zal (magas FPS).
Szög két csont között: vegyen három landmarkot — ízület A, ízület B (a szög csúcspontja), ízület C. Számítsa ki a BA = (A - B) és BC = (C - B) vektorokat. Szög = atan2(cross(BA, BC), dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). Szög 0–180° tartományban. Háromdimenziós koordinátákhoz (BlazePose 3D) használja a Vector3D-t. Normalizálja a szögeket [0,1] tartományba az ML osztályozó számára.
Igen, az összes fő modell (ML Kit, BlazePose, MoveNet) egyszerre érzékeli mindkét kéz landmarks-jait: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST. A kezek kiegészítő érzékeléséhez (hand tracking) kombinálja a Pose Detection-t és a Hand Landmarker-t (21 pont kézenként). MediaPipe Hands + BlazePose — standard kombináció a full-body + hands számára. iOS-en — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.
ML Kit Pose Detection: minimális bounding box személyenként — 100x100 pixel (arány ~1:1). MoveNet Lightning: 120x120 pixel. BlazePose: 80x160 pixel (függőleges bounding box). Teljes magasságú személyhez 3 méter távolságra a kamerától (1920x1080) — kb. 250x600 px, ami elegendő. 5 méternél nagyobb távolságnál a pontosság csökken — használjon Multi-Pose + high-resolution input-ot. Távoli objektumokhoz jobb az Object Detection + Pose Estimation (two-stage) használata.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is