Pose Detection — computervisietechnologie die de positie van het menselijk lichaam bepaalt via belangrijke punten (landmarks): hoofd, schouders, ellebogen, polsen, heupen, knieën, enkels. Elk punt heeft coördinaten (x, y) in de 2D-ruimte, en geavanceerde modellen (MediaPipe BlazePose 3D) voegen een z-coördinaat toe voor diepte. In mobiele apps wordt Pose Detection gebruikt in fitnesstrackers, yoga-apps, AR-filters, revalidatieprogramma's en sportanalysesystemen. Volgens Google ML Kit, 2025 verwerkt on-device Pose Detection tot 30 frames per seconde met een nauwkeurigheid van 94% PCK.
Belangrijkste
Pose Detection (ook bekend als Pose Estimation) verwijst naar de taak van het bepalen van semantische belangrijke punten van het menselijk lichaam uit een afbeelding of video. De Top-down benadering detecteert eerst de persoon (Object Detection), bepaalt vervolgens de houding. De Bottom-up benadering vindt alle landmarks in de afbeelding, groepeert ze vervolgens per persoon (OpenPose). Voor mobiele apparaten wordt bottom-up gebruikt — sneller bij meerdere personen in beeld. ML Kit en BlazePose gebruiken een single-stage benadering — detectie + houding in een enkele doorgang.
COCO Keypoints — standaardset van 17 punten: neus, ogen (2), oren (2), schouders (2), ellebogen (2), polsen (2), heupen (2), knieën (2), enkels (2). MediaPipe BlazePose gebruikt 33 punten en voegt toe: tenen, hielen, middelpunt van de romp, gezichtspunten. Hoe meer punten, hoe nauwkeuriger de houdingsanalyse, maar hoe hoger de rekenbelasting. Voor fitness-apps zijn 17–20 punten voldoende. Voor volledige analyse (yoga, dans) — 33 punten. Voor AR-filters — 33 punten + 468 gezichtspunten (MediaPipe Face Mesh).
PCK (Percentage of Correct Keypoints) — nauwkeurigheidsmetriek voor Pose Detection. Berekend als het aandeel punten dat binnen een bepaalde afstand van de ground truth valt (meestal 0.05–0.15 van de bounding box-grootte van de persoon). ML Kit Pose Detection: 94% PCK@0.1. BlazePose Full: 96% PCK@0.1. MoveNet Lightning: 91% PCK@0.1. OKS (Object Keypoint Similarity) — metriek gebruikt in COCO, die rekening houdt met de schaal van de persoon en de moeilijkheidsgraad van het punt. mAP@OKS — standaardmetriek voor benchmarks.
| Model | Landmarks | PCK@0.1 | Latency (GPU) | Grootte |
|---|---|---|---|---|
| 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: elke landmark heeft een score (0..1) die aangeeft hoe zeker het model is van het punt en of het zichtbaar is. Punten met score < 0.5 worden als onzichtbaar beschouwd (bedekt, buiten beeld). Gebruik voor houdingsanalyse alleen zichtbare punten. Voor het beoordelen van uitlijning — bereken confidence-weighted distances, waarbij punten met een lage score minder gewicht hebben in de metriek.
ML Kit Pose Detection — bibliotheek van Google voor het bepalen van houding op het apparaat. Ondersteunt 33 landmarks, inclusief gezichtspunten, tenen en hielen. Modi: Accurate Mode (14 MB model, 15–30 ms, hoge nauwkeurigheid) en Streaming Mode (5 MB, 5–10 ms, voor real-time). Streaming Mode gebruikt een licht model met tracking — na het eerste frame volgt het beweging zonder exacte posities opnieuw te detecteren, wat tot 60 FPS oplevert.
ML Kit Pose Detection API: PoseDetector (opties: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). Elke PoseLandmark heeft: landmarkType (38 types), position (PointF3D), inFrameLikelihood (0..1). Pose biedt ook: boundingBox van de persoon, lijst met landmarks, methode getLandmark(type). Voor pose-classificatie gebruikt u hoeken tussen botten: shoulderAngle, elbowAngle, hipAngle — berekend via Vector3D tussen aangrenzende 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 op iOS: Pose Detection is beschikbaar via ML Kit CocoaPods. De API is identiek aan Android: PoseDetector → UIImage → Pose → PoseLandmark. Op iOS gebruikt ML Kit Core ML en ANE (A12+), wat 10–20 ms latentie oplevert in Accurate Mode op iPhone 15 Pro. Streaming Mode — 3–8 ms, tot 120 FPS. Op iOS werkt ML Kit Pose Detection sneller dan MediaPipe BlazePose (Core ML-versnelling), maar is het minder dan BlazePose qua FPS op oudere apparaten (iPhone X–11).
MediaPipe BlazePose — krachtig model voor Pose Detection van Google Research. Gebruikt een hybride detector-decoder pipeline-architectuur gebaseerd op MobileNetV2 + Feature Pyramid Network. BlazePose Full: 33 landmarks + 3D-coördinaten (diepte z). BlazePose Lite: 33 landmarks (2D) zonder diepte. Beide modellen zijn beschikbaar in MediaPipe Tasks Vision op Android, iOS, Python en Web. BlazePose Full verwerkt 30–60 FPS op GPU, Lite — 60+ FPS.
3D Pose Estimation met BlazePose: het model voorspelt een z-coördinaat voor elke landmark, waardoor diepte (benadering/verwijdering van ledematen) kan worden beoordeeld zonder stereocamera. De z-coördinaat wordt berekend in metrische ruimte (meters) ten opzichte van de camera. BlazePose 3D-nauwkeurigheid: 37 mm MPJPE (Mean Per Joint Position Error) op openbare benchmarks — voldoende voor fitness en AR, onvoldoende voor medische diagnose. Voor ARKit/ARFoundation biedt BlazePose 3D natuurlijke diepte.
// 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 is sneller (60+ FPS vs 30 FPS), ondersteunt 3D-coördinaten, werkt cross-platform via MediaPipe. ML Kit is eenvoudiger te integreren (geen MediaPipe SDK nodig), bevat voorgetrainde modellen met hoge nauwkeurigheid. Voor native iOS-projecten — ML Kit Pose Detection (betere optimalisatie voor ANE). Voor cross-platform projecten (Flutter, React Native) — MediaPipe BlazePose (enkel model voor alle platforms). Voor nauwkeurigheid in veeleisende scènes — beide modellen zijn vergelijkbaar.
MoveNet — familie van Pose Detection-modellen van TensorFlow, geoptimaliseerd voor TFLite. Lightning (8 MB, INT8 — 4 MB): 17 COCO keypoints, 91% PCK, 8–15 ms latentie, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoints, 95% PCK, 25–40 ms latentie, 20+ FPS. MoveNet gebruikt CenterNet-architectuur + bilineaire interpolatie voor heatmaps met hoge resolutie. MoveNet ondersteunt multi-pose detectie (tot 6 personen). Modellen zijn beschikbaar in TensorFlow Hub.
MoveNet Lightning vs Thunder: Lightning — voor real-time apps met hoge FPS (fitness, AR-filters). Thunder — voor nauwkeurige houdingsanalyse (revalidatie, sportanalyse) op apparaten met GPU. Beide modellen worden geconverteerd naar Core ML via tf-coreml voor iOS. MoveNet is ook beschikbaar via de TFLite Task Vision PoseLandmarker API. Aanbeveling: begin met Lightning, als de nauwkeurigheid onvoldoende is — ga over op Thunder (slechts +15 ms latentie overhead).
// 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: detectie van tot 6 personen in beeld. In plaats van de standaard heatmap-benadering gebruikt MoveNet person detection + pose refinement: eerst detecteert het personen (centroid-based), vervolgens beoordeelt het de houding van elk. Multi-pose modus is 2–3x langzamer dan single-pose: Lightning — 25–50 ms (6 personen). Gebruik voor fitness-apps met een enkele gebruiker single-pose. Voor groepsactiviteiten (yoga, crossfit) — multi-pose met framebeperking om batterij te sparen.
Pose Classification — fase na detectie: omzetting van landmarks naar semantische acties (staat, zit, heeft hand opgeheven, doet squat). Benaderingen: Rule-based (handmatige regels — hoeken tussen botten), ML-based (logistische regressie of Random Forest op landmark-vector), DL-based (LSTM-classificator van houdingssequentie over frames). Rule-based — 50–80% nauwkeurigheid, eenvoudig en snel. ML-based — 85–95% nauwkeurigheid met 200+ gelabelde voorbeelden. LSTM — 90–98% nauwkeurigheid op tijdreeksen (video).
Hoeken tussen botten: voor elk punt worden hoeken met aangrenzende punten berekend. Voorbeelden: right elbow angle (shoulder → elbow → wrist), right knee angle (hip → knee → ankle), torso angle (midden schouders → midden heupen). Hoeken zijn invariant voor schaal en positie van de persoon op het scherm. Normalisatie van hoeken naar bereik [0, 1] maakt classificatie van de houding mogelijk met een eenvoudige drempelregel: als elbowAngle < 30° — arm gebogen, als > 150° — gestrekt.
// Op regels gebaseerde squat-classificator
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 — voorgetrainde classificatoren in MediaPipe Tasks: squats, push-ups, plank, beenheffingen. De classificator ontvangt een lijst met landmarks en retourneert de actie + betrouwbaarheid. Bevat temporele filtering (temporal filter): HED (Holt Exponential Double Smoothing) voor vloeiende overgangen tussen houdingen. Voor aangepaste acties — train een classificator op 100–500 voorbeelden via MediaPipe Model Maker (TensorFlow Lite + metadata).
Fitnesstrackers met techniekcorrectie — de app analyseert de houding van de gebruiker tijdens de oefening en geeft gesproken aanwijzingen: „laat het bekken zakken”, ’kantel de romp niet”. ML Kit Pose Detection + rule-based classificator telt herhalingen en beoordeelt de kwaliteit. Squat: knee angle < 90° — correcte squat, back angle < 45° — gevaarlijke romphelling. Push-up: elbow angle < 90° in het laagste punt — volledige push-up. Pull-up: kin boven de stang.
Revalidatie en fysiotherapie — Pose Detection wordt gebruikt voor afstandsbediening van fysiotherapie-oefeningen. De arts stelt een referentiehouding in (bijv. schouderabductie van 45°), de app meet de huidige hoek en afwijkingen. BlazePose 3D biedt hoeknauwkeurigheid van ±3° — voldoende voor klinische beoordeling. Frequentie: 1 frame per 3–5 seconden (batterijbesparing). On-device — privacy van medische gegevens van de patiënt. Revalidatie na beroerte: tracking van hand-to-shoulder, elbow-extension, hip-flexion.
AR-filters en effecten — Pose Detection vormt de basis van AR-filters van sociale media (TikTok, Instagram, Snapchat). Landmarks van hoofd, schouders en handen worden gebruikt voor het over elkaar heen leggen van maskers, animaties en decoratieve elementen. MediaPipe BlazePose Full + Face Mesh (468 punten) levert 120+ FPS op vlaggenschipapparaten. ARKit/ARCore Face Tracking + Pose Detection — combinatie voor full-body AR. Vereisten: FPS > 30, motion-to-photon latentie < 20 ms.
// AR-filter met pose-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)
}
}
Sportanalyse — professionele techniekbeoordeling: biomechanische analyse van hardlopen (cadence, stride length, arm swing symmetry), zwemmen (body roll, elbow angle bij slag), tennis (shoulder rotation, wrist snap). MoveNet Thunder met nabewerking biedt voldoende nauwkeurigheid voor niet-professionele analyse. Voor professionele sport is 3D Motion Capture (Vicon, OptiTrack) vereist, maar Pose Detection op de telefoon is een toegankelijk alternatief voor de massamarkt. Synchronisatie van hoeken tussen frames — belangrijkste component.
Veelgestelde vragen
Gebruik temporal smoothing (temporele afvlakking): One Euro Filter (1€ filter) — instelbare cut-off frequency voor elke landmark afzonderlijk, onderdrukt hoogfrequente ruis (trilling), behoudt realistische beweging (lage latentie). MediaPipe BlazePose bevat ingebouwde HED (Holt Exponential Double Smoothing) — adaptieve afvlakking met bewegingsvoorspelling. Voor ML Kit implementeert u zelf het 1€-filter: het filter heeft twee parameters — beta (snelheid) en minCutoff (frequentiedrempel). Aanbevolen: beta = 0.04, minCutoff = 0.5 (Android).
ML Kit Pose Detection — één persoon (single-pose). MoveNet Lightning — tot 6 personen (multi-pose). MediaPipe BlazePose — tot 2–3 personen via MediaPipe Tasks (multi-pose). Gebruik voor apps met groepsactiviteiten MoveNet Lightning of BlazePose. Voor fitness-apps met een enkele gebruiker — ML Kit (eenvoudigere integratie, hogere single-pose nauwkeurigheid). Voor videogesprekken met AR-filters — is BlazePose Lite met multi-pose voldoende (hoge FPS).
Hoek tussen twee botten: neem drie landmarks — gewricht A, gewricht B (hoekpunt), gewricht C. Bereken vectoren BA = (A - B) en BC = (C - B). Hoek = atan2(cross(BA, BC), dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). Hoek in bereik 0–180°. Gebruik voor driedimensionale coördinaten (BlazePose 3D) Vector3D. Normaliseer hoeken naar bereik [0,1] voor de ML-classificator.
Ja, alle belangrijke modellen (ML Kit, BlazePose, MoveNet) detecteren landmarks van beide handen tegelijk: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST. Voor extra handdetectie (hand tracking) combineert u Pose Detection + Hand Landmarker (21 punten per hand). MediaPipe Hands + BlazePose — standaardcombinatie voor full-body + hands. Op iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.
ML Kit Pose Detection: minimale bounding box van de persoon — 100x100 pixels (verhouding ~1:1). MoveNet Lightning: 120x120 pixels. BlazePose: 80x160 pixels (verticale bounding box). Voor een persoon op ware grootte op 3 meter afstand van de camera (1920x1080) — ongeveer 250x600 px, wat voldoende is. Bij afstand > 5 meter neemt de nauwkeurigheid af — gebruik Multi-Pose + high-resolution input. Voor verre objecten kunt u beter Object Detection + Pose Estimation (two-stage) gebruiken.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook