MediaPipe vs MoveNet: 33 Landmarks in 3D or 17 Keypoints Fast?
Last verified October 22, 2026 · 7 min read
Sources checked (14) · October 22, 2026
- storage.googleapis.com/mediapipe-assets/Model%20Card%20BlazePose%20GHUM%203D.pdf — 33 keypoints, fitness and repetition counting, one person, 14 feet / 4 m out of scope, z up to scale, Pixel 3 TFLite figures, Apache-2.0
- github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/pose.md — world landmarks in meters from the hip centre; quality table compared with AlphaPose and Apple Vision
- github.com/google-ai-edge/mediapipe/blob/master/mediapipe/tasks/python/vision/pose_landmarker.py — PoseLandmark enum indices; num_poses default 1
- github.com/google-ai-edge/mediapipe/blob/master/mediapipe/tasks/python/components/containers/landmark.py — visibility and presence fields
- github.com/google-ai-edge/mediapipe/blob/master/README.md — Android, iOS, Python and web
- github.com/google-ai-edge/mediapipe/blob/master/LICENSE — Apache-2.0
- storage.googleapis.com/movenet/MoveNet.SinglePose%20Model%20Card.pdf — inputs, [1, 1, 17, 3] output, fitness tuning, 3 to 6 feet, closest person, 0.3 threshold, Chrome benchmark, Apache-2.0 line
- storage.googleapis.com/movenet/MoveNet.MultiPose%20Model%20Card.pdf — up to 6 people; no licence line in the text
- github.com/tensorflow/tfjs-models/blob/master/pose-detection/src/movenet/README.md — model types, modelUrl and bundleResourceIO, MultiPose tracking, FPS table
- github.com/tensorflow/tfjs-models/blob/master/pose-detection/README.md — three models behind createDetector, keypoint fields, keypoints3D space
- github.com/tensorflow/tfjs-models/blob/master/pose-detection/src/blazepose_tfjs/README.md — BlazePose FPS on the same four machines, bundle sizes
- github.com/tensorflow/tfjs-models/blob/master/pose-detection/src/blazepose_mediapipe/README.md — cannot be used with tfjs-react-native
- github.com/tensorflow/tfjs-models/blob/master/pose-detection/src/constants.ts — COCO_KEYPOINTS and BLAZEPOSE_KEYPOINTS orders
- github.com/tensorflow/tfjs-models/blob/master/LICENSE — Apache-2.0
Disclosure: this site is funded by KinesteX, which sells a motion-tracking SDK that sits a layer above pose models like these. Neither model on this page is ours, both are free Google projects, and we have no reason to prefer either. Every fact below comes from Google's model cards, the google-ai-edge/mediapipe repository and the tensorflow/tfjs-models repository, read on October 22, 2026.
A short version of this decision sits in the pose models overview. This page goes further on the four things that settle it in practice: what each output lets you compute, how fast each runs on the same hardware, how their keypoint numbering differs, and what a switch costs.
MediaPipe vs MoveNet at a glance#
| MediaPipe Pose Landmarker (BlazePose GHUM) | MoveNet | |
|---|---|---|
| Keypoints | 33 landmarks | 17 COCO keypoints |
| Per point | x, y, z, visibility, presence | y, x, confidence |
| 3D | World landmarks in meters, origin between the hips; the card says z is "not metric but up to scale" | None |
| Variants | Lite, Full, Heavy | SinglePose Lightning (192x192), SinglePose Thunder (256x256), MultiPose Lightning |
| People | One, per the model card; the Tasks num_poses option defaults to 1 | One for SinglePose; up to 6 for MultiPose |
| Camera distance | People beyond about 14 feet or 4 meters are out of scope | Most suitable 3 to 6 feet from a webcam |
| Runtimes | MediaPipe Tasks on Android, iOS, web and Python; also the TF.js pose-detection package | TF.js pose-detection in the browser; TF Lite on device |
| Licence | Apache-2.0 (framework and model card) | Apache-2.0 (tfjs-models code and SinglePose card); no licence line in the MultiPose card text |
Both are built for this domain. Google's BlazePose GHUM card lists "Fitness and repetition counting" among its application domains, and the MoveNet SinglePose card says the model is "Tuned to be robust on detecting fitness/fast movement with difficult poses and/or motion blur."
What each output lets you compute#
MediaPipe has points MoveNet does not. Sixteen of its 33 landmarks are outside COCO's 17: the inner and outer eye corners, the mouth corners, the pinky, index and thumb knuckles, the heels and the foot index points. Heel and toe points are the inputs a heel-lift check or an ankle angle needs, and the hand points let you read wrist position.
It also adds a third axis. MediaPipe's Pose documentation describes world landmarks as "Real-world 3D coordinates in meters with the origin at the center between hips", and the TF.js pose-detection README places BlazePose's keypoints3D in a 2 x 2 x 2 meter space with the hip centre at (0, 0, 0). The model card is plain about the limit: the z value comes from synthetic data fitted with the GHUM body model, and is up to scale rather than metric. In our reading that is still enough to keep a knee or hip angle meaningful when the user turns side-on, which a 2D angle from MoveNet cannot do. 2D vs 3D pose estimation covers when the depth axis is worth having.
MoveNet gives you less, faster. The SinglePose card describes a float32 output of shape [1, 1, 17, 3]: y and x normalized to the frame, then a confidence score, with a recommended default confidence threshold of 0.3. For counting reps from elbow or knee angles in a well-framed side view, 17 points are enough; how rep counting works shows the logic.
Speed: the one like-for-like table#
The model cards do not cross-compare. BlazePose's card reports frames per second on a Pixel 3 through TFLite, and MoveNet's reports milliseconds in desktop Chrome. The TF.js pose-detection package is the exception: its MoveNet and BlazePose READMEs publish frames per second for both models on the same four machines, a 2019 15-inch MacBook Pro, an iPhone 12, a Pixel 5 and a desktop with an Intel i9-10900K and a GTX 1070.
| Model and runtime | MacBook Pro | iPhone 12 | Pixel 5 | Desktop |
|---|---|---|---|---|
| MoveNet SinglePose Lightning, WebGL | 104 | 51 | 34 | 87 |
| MoveNet SinglePose Thunder, WebGL | 77 | 43 | 12 | 82 |
| BlazePose, MediaPipe runtime (WASM and GPU) | 92, 81, 38 | N/A | 32, 22, N/A | 160, 140, 98 |
| BlazePose, TF.js runtime (WebGL) | 48, 53, 28 | 34, 30, N/A | 12, 11, 5 | 44, 40, 30 |
The BlazePose README gives three figures per cell, one per model variant, but does not label which is lite, full or heavy; the MoveNet README labels its own order. Read with that caveat, the table says something the cards cannot. MoveNet Lightning is the fastest option on both phones. It is not the fastest everywhere: on the desktop, BlazePose under the MediaPipe runtime reached 160 FPS against Lightning's 87, and on the MacBook and the Pixel 5 BlazePose's best figure beats MoveNet Thunder. These are the TF.js team's browser numbers on its own hardware, so measure on your target devices; real-time pose estimation covers the frame-rate budget. Accuracy does not line up either: the cards use different metrics and test sets, and Google's own quality table for BlazePose compares it with AlphaPose and Apple Vision, not MoveNet. Pose estimation accuracy explains the metrics.
Same names, different numbers#
Both models return COCO's 17 body points, but not at the same indices. MoveNet follows the COCO order, so left_hip is index 11. In MediaPipe's PoseLandmark enum, LEFT_HIP is 23 and index 11 is LEFT_SHOULDER. Code that reads keypoints by position will silently read the wrong joint after a switch.
Map by name instead. The TF.js package returns a name with every keypoint, and the keypoint crosswalk joins all 17 COCO points to their BlazePose counterparts. The full orders are in the BlazePose 33 keypoint map and the COCO 17 keypoint map.
What a switch costs#
In a browser, little. The pose-detection README serves MoveNet, BlazePose and PoseNet through one createDetector call, and every model returns the same pose shape: a score and keypoints with x, y, score and name, with BlazePose adding keypoints3D and a segmentation mask. Testing both behind a flag is cheap. Two details can still decide it:
- React Native. The BlazePose-MediaPipe README says it "uses WebAssembly behind the scene and cannot be used with" tfjs-react-native. MoveNet's
modelUrloption accepts anio.IOHandler, which its README pairs with tfjs-react-native'sbundleResourceIOto load the model from the app bundle. - Download size. The BlazePose README lists 10.6 MB, 14 MB and 34.9 MB for the lite, full and heavy models under the MediaPipe runtime. The MoveNet README publishes no equivalent table, so weigh your own build.
Natively, the routes differ more: MediaPipe ships through its Tasks libraries for Android, iOS and Python, while MoveNet's cards name TensorFlow Lite for on-device use. Variant choice within each family is in MediaPipe Pose Landmarker models and MoveNet models.
Which should you pick?#
- Squat depth, hip hinge, heel lift, or any movement where the user may turn side-on → MediaPipe. Its world landmarks and foot points are the inputs that math needs.
- Live rep counting on low-end phones or in a mobile browser → MoveNet Lightning, the fastest of the pair on both phones in the TF.js table.
- A desktop or laptop browser, such as a kiosk → test BlazePose under the MediaPipe runtime first; on the TF.js team's desktop it out-ran both MoveNet models.
- Two to six people in frame → MoveNet MultiPose Lightning, the only model in this pair whose card covers several people. Confirm its terms, since the text of its card has no licence line.
- A user standing well back from the camera → MediaPipe. MoveNet's cards call it most suitable 3 to 6 feet away, while BlazePose's card only rules out people further than about 14 feet.
- React Native through TF.js → MoveNet, whose README documents loading from the app bundle.
What neither gives you#
Both return keypoints and nothing more. Rep counting, form rules, mistake feedback and exercise content are yours to build, or to buy as an SDK; AI workout tracking APIs compares the products that sell that layer, and build vs buy AI motion tracking sets out the trade.
Frequently asked questions
- Is MoveNet faster than MediaPipe BlazePose?
- On phones, in the TF.js team's own browser benchmark, yes: MoveNet SinglePose Lightning ran at 51 FPS on an iPhone 12 and 34 FPS on a Pixel 5, above every BlazePose figure published for those devices. Not everywhere, though: on the same team's Intel i9-10900K desktop with a GTX 1070, BlazePose under the MediaPipe runtime reached 160 FPS against Lightning's 87. Measure on your own hardware before choosing.
- Does MoveNet output 3D keypoints like MediaPipe's world landmarks?
- No. MoveNet's SinglePose card describes a [1, 1, 17, 3] output holding y, x and a confidence score per keypoint, all in normalized 2D image coordinates. MediaPipe Pose adds world landmarks in meters with the origin between the hips, and through TF.js BlazePose returns keypoints3D alongside its 2D keypoints. BlazePose's depth is estimated from one camera and, per its model card, up to scale rather than metric.
- Why do my joint indices break when I switch from MoveNet to BlazePose?
- Because the shared joints sit at different positions. MoveNet uses the COCO order, where left_hip is index 11; MediaPipe's PoseLandmark enum puts LEFT_HIP at 23 and LEFT_SHOULDER at 11. Look keypoints up by name rather than index: the TF.js pose-detection package returns a name with every keypoint, and both models use the same names for the 17 COCO body points.
- Can MoveNet or MediaPipe track several people at once?
- MoveNet can, through MultiPose Lightning, which its README describes as a multi-pose detector that detects up to 6 poses, with optional tracking IDs across frames. MediaPipe's BlazePose GHUM card says the model tracks only one person on scene if multiple are present, and the Tasks num_poses option defaults to 1. MoveNet's SinglePose models also track one person, the one closest to the image center.
- Which works in React Native, MoveNet or BlazePose?
- MoveNet has the documented path. Its TF.js README says the modelUrl option accepts an io.IOHandler, used with tfjs-react-native's bundleResourceIO to load the model from the app bundle. The BlazePose-MediaPipe README says that runtime uses WebAssembly and cannot be used with tfjs-react-native. The files we read do not document BlazePose's TF.js runtime under React Native either way, so test it before relying on it.
Keep reading
Elsewhere on the site
Pages that share this one’s concepts and sources, from other sections.
Next steps
Was this page useful?
Independent comparison, last reviewed October 22, 2026. Pricing, rate limits, and feature availability change often — confirm current details in each provider’s official documentation before you commit. Product and company names are trademarks of their respective owners; AIFitnessAPI is not affiliated with, endorsed by, or sponsored by any product listed here.
← All comparisons · by AIFitnessAPI