Pose estimation

MediaPipe vs MoveNet, ML Kit and Apple Vision

Every mainstream pose engine finds the same twelve body points from shoulders to ankles. Beyond those they differ — in how many points they give you, where the origin of their coordinates is, which way y points, and whether a value is a fraction or a pixel. This is a map of those differences, not a ranking: which model is best depends on your device, your footage and your movement.

At a glance

EngineKeypointsPlatformsCoordinatesPeople
MediaPipe Pose Landmarker33Android, iOS, web, PythonNormalized 0–1, origin top-left, plus 3D world landmarks in metresOne or more (num_poses)
ML Kit Pose Detection33Android, iOSImage pixels, origin top-left, plus a depth valueOne
MoveNet17 (COCO)TensorFlow Lite, TensorFlow.jsNormalized 0–1, returned as [y, x, score]One (Lightning, Thunder) or up to six (MultiPose)
YOLO-pose17 (COCO)Python, ONNX and other exportsImage pixels, origin top-leftMany
Apple Vision body pose19iOS, iPadOS, macOSNormalized 0–1, origin bottom-leftOne or more
From each engine's documentation. Model variants trade speed for accuracy within an engine: MediaPipe's lite, full and heavy; ML Kit's base and accurate; MoveNet's Lightning and Thunder.

Which points you get

MediaPipe and ML Kit share a 33-point topology: the face, three points on each hand, and a heel and toe on each foot as well as the main joints. The 33 landmarks lists them all.

MoveNet and YOLO-pose use the 17 keypoints of the COCO dataset: nose, eyes, ears, shoulders, elbows, wrists, hips, knees and ankles. There is nothing past the wrist or the ankle.

Apple Vision returns 19 joints: COCO's 17 plus a neck point between the shoulders and a root point between the hips. Like COCO, it stops at the wrists and ankles.

What that means for angles

Shoulder, elbow, hip and knee angles work on all of them. A wrist angle needs a point on the hand, and an ankle angle a point on the foot — so those need MediaPipe or ML Kit.

Body pointMediaPipe, ML KitCOCO-17Apple Vision
nose00.nose
left / right eye2 / 51 / 2.leftEye / .rightEye
left / right ear7 / 83 / 4.leftEar / .rightEar
left / right shoulder11 / 125 / 6.leftShoulder / .rightShoulder
left / right elbow13 / 147 / 8.leftElbow / .rightElbow
left / right wrist15 / 169 / 10.leftWrist / .rightWrist
left / right hip23 / 2411 / 12.leftHip / .rightHip
left / right knee25 / 2613 / 14.leftKnee / .rightKnee
left / right ankle27 / 2815 / 16.leftAnkle / .rightAnkle
hands, heels, toes17–22, 29–32——
neck, root (pelvis)——.neck / .root

Coordinate gotchas

  • Apple Vision's y points up. Its origin is the bottom-left corner, unlike every other engine here. Use 1 − y before mixing its points with anything else, or every directed angle runs backwards.
  • MoveNet returns y before x. Each keypoint is [y, x, score]. Swapping them silently transposes the skeleton.
  • Pixels or fractions. ML Kit and YOLO-pose return pixels; MediaPipe, MoveNet and Vision return fractions of the frame. Convert fractions to pixels before taking an angle — here is why.
  • Left is the subject's left in all of them. A mirrored front-camera preview is the usual reason left and right appear swapped.
  • Confidence means different things. MediaPipe has visibility and presence, ML Kit an in-frame likelihood, MoveNet, YOLO-pose and Vision a per-point score. Thresholds do not carry over from one to another.

Choosing one

Platform usually decides before anything else does. A native iOS app has Apple Vision built in and needs no model download. A cross-platform or web app points to MediaPipe or TensorFlow.js. A server processing uploaded video can run whichever is most accurate on that footage, because it is not limited by a phone's battery.

After platform, the movement. If you need the wrist or ankle, you need hand and foot points. If several people share the frame, you need a multi-person model. Then test on your own footage: published benchmarks are run on other people's images, and a model that wins on them can still struggle with your camera angle, your lighting or your sport.

One exercise definition, any engine

A rep counter or form check written against one engine's indices is tied to it. Markerless exports exercises as JSON that names each angle by its three body points instead, so the same file runs on MediaPipe, ML Kit, Apple Vision, MoveNet or YOLO-pose — with ready-made adapters for each in the developer guide. See rep counters for fitness apps.

Questions

Is MediaPipe better than MoveNet?

They answer different needs. MediaPipe gives 33 points, including hands and feet, and 3D world landmarks. MoveNet gives COCO's 17 points and is built for TensorFlow Lite and TensorFlow.js. Which tracks your movement better is worth testing on your own footage rather than settling from a benchmark.

Does ML Kit use MediaPipe?

ML Kit's pose detection returns the same 33-point topology as MediaPipe's pose model, with landmarks in image pixels rather than normalized coordinates.

How many keypoints does Apple Vision detect?

Vision's 2D human body pose request returns 19 joints: the COCO set of 17 plus a neck point and a root point at the pelvis.

Can I move a rep counter from one pose engine to another?

Yes, if it is defined by body points rather than engine indices, and the coordinates are converted to pixels with y pointing down before any angle is taken. That is how Markerless's exercise JSON works.

References

  1. Bazarevsky, V., Grishchenko, I., Raveendran, K., Zhu, T., Zhang, F., & Grundmann, M. (2020). BlazePose: On-device Real-time Body Pose tracking. arXiv:2006.10204.

    The model behind MediaPipe's pose landmarks, and where the 33-point topology comes from.

    doi:10.48550/arXiv.2006.10204

  2. Lin, T.-Y., Maire, M., Belongie, S., Hays, J., Perona, P., Ramanan, D., et al. (2014). Microsoft COCO: Common Objects in Context. Computer Vision – ECCV 2014, Lecture Notes in Computer Science, 740–755.

    The dataset whose 17 keypoints MoveNet, YOLO-pose and most other body models output.

    doi:10.1007/978-3-319-10602-1_48

Next

Build a rep counter once, run it on any engine.