ML Kit vs MediaPipe Pose: Same 33 Landmarks, Different Packaging
Last verified October 27, 2026 · 7 min read
Sources checked (15) · October 27, 2026
- developers.google.com/ml-kit/vision/pose-detection — beta status, 33 landmarks, one person, face required, in-frame likelihood, base vs accurate SDK, experimental Z, no meaning attached
- developers.google.com/ml-kit/vision/pose-detection/android — SDK sizes and Pixel 3XL speeds, API level 23, 18.0.0-beta5, detection modes, hardware configs
- developers.google.com/ml-kit/vision/pose-detection/ios — SDK sizes and iPhone X speeds, pods at 8.0.0, statically linked assets
- developers.google.com/android/reference/com/google/mlkit/vision/pose/PoseLandmark — constant values, LEFT_MOUTH 9, LEFT_HIP 23
- developers.google.com/ml-kit/terms — last modified May 14, 2025: on-device processing, metrics to Google, models as related software
- developers.google.com/ml-kit/vision/pose-detection/classifying-poses — k-NN classification and rep counting tips
- developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker — 33 landmarks, world coordinates, segmentation mask, num_poses, running modes, bundles
- developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker/android — tasks-vision library
- developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker/ios — MediaPipeTasksVision via Swift Package Manager
- developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker/web_js — @mediapipe/tasks-vision on npm
- github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/pose.md — BlazePose also powers ML Kit; world landmarks; Pixel 3 latencies
- github.com/google-ai-edge/mediapipe/blob/master/mediapipe/tasks/python/vision/pose_landmarker.py — PoseLandmark enum, MOUTH_LEFT and MOUTH_RIGHT
- 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/LICENSE — Apache-2.0
- storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_full/float16/latest/pose_landmarker_full.task — bundle sizes from the Content-Length of the lite, full and heavy files
Covered here:MediaPipe
Disclosure: this site is funded by KinesteX, which sells a motion-tracking SDK that sits a layer above pose models like these. Both products on this page are Google's, neither is ours, and we have no reason to prefer either. Every fact below comes from Google's ML Kit guides, reference and terms, Google's MediaPipe Pose Landmarker guides, and the google-ai-edge/mediapipe repository, all read on October 27, 2026.
These are close relatives rather than rivals. Google's MediaPipe Pose documentation says its BlazePose research "also powers the ML Kit Pose Detection API". Both return 33 body landmarks at the same indices. What differs is the packaging around the model: ML Kit is a closed, beta SDK for Android and iOS with no model file to handle, and MediaPipe Pose Landmarker is an open-source task library with a model bundle you ship, on more platforms and with more options. What ML Kit documents about itself is in ML Kit pose detection; this page sets the two side by side.
ML Kit vs MediaPipe at a glance#
| ML Kit Pose Detection | MediaPipe Pose Landmarker | |
|---|---|---|
| Landmarks | 33, values 0 to 32 | 33, indices 0 to 32 |
| Per landmark | x, y, an experimental z, in-frame likelihood | x, y, z, visibility, presence; plus world landmarks in meters |
| People | One per image | Up to num_poses, default 1 |
| Variants | Base SDK and accurate SDK | Lite, full and heavy model bundles |
| Platforms | Android and iOS | Android, iOS, Python and web |
| How the model ships | Statically linked into the app at build time | A .task file you bundle and load |
| Extras | None documented | Optional segmentation masks |
| Status | Beta, with no SLA or deprecation policy | Open source |
| Terms | ML Kit Terms of Service; usage metrics go to Google | Apache-2.0 |
Same landmarks, almost the same names#
ML Kit's Android PoseLandmark reference and MediaPipe's PoseLandmark enum assign the same numbers to the same body points, from 0 nose to 32 right foot index; LEFT_HIP is 23 in both. Only the mouth corners are spelled differently: ML Kit's LEFT_MOUTH (9) and RIGHT_MOUTH (10) are MediaPipe's MOUTH_LEFT and MOUTH_RIGHT. Index-based code moves between them unchanged, which makes a later switch cheaper than between most pose models. Both maps are on the ML Kit landmark page and the BlazePose 33 keypoint map.
Where they differ in output#
Depth. ML Kit calls its Z coordinate "an experimental value" that is measured in image pixels like X and Y "but it is not a true 3D value", with its origin near the centre between the hips and no upper or lower bound. MediaPipe returns two sets of landmarks from one call: normalized image landmarks, whose z uses the hip midpoint as origin and "roughly the same scale as x", and world landmarks that Google's documentation describes as "Real-world 3D coordinates in meters with the origin at the center between hips". If you need joint angles that survive the user turning side-on, MediaPipe's world landmarks are the documented route; 2D vs 3D pose estimation covers when that matters.
Per-point scores. ML Kit's InFrameLikelihood is, in Google's words, "a measure that indicates the probability that the landmark is within the image frame", from 0.0 to 1.0. When part of the body is outside the image, ML Kit still returns all 33 points and gives the missing ones coordinates outside the frame. MediaPipe gives two scores per landmark, visibility and presence.
People and masks. ML Kit's overview is direct: "Pose detection can only detect one person in an image." With two people, it assigns the landmarks to the person detected with the highest confidence, and Google adds that "The user's face must be present in order to detect a pose." MediaPipe's num_poses sets "The maximum number of poses that can be detected", defaulting to 1, and its output_segmentation_masks option returns a person mask. For groups, start from multi-person pose tracking.
Speed and size, as Google publishes them#
ML Kit publishes both. Its Android guide lists the base pose-detection SDK at about 10.1 MB and about 30 FPS on a Pixel 3XL, and pose-detection-accurate at about 13.3 MB and about 23 FPS with CPU or about 30 FPS with GPU. Its iOS guide lists up to 29.6 MB at about 45 FPS for PoseDetection and up to 33.2 MB at about 29 FPS for PoseDetectionAccurate, both on an iPhone X.
MediaPipe's current Pose Landmarker guides, the overview and the Android, iOS and web pages, publish neither figure. When we requested the three bundles from Google's model storage on October 27, 2026, they were 5,777,746 bytes (lite), 9,398,198 bytes (full) and 30,664,242 bytes (heavy); that is the model file alone, before the task library. For speed, Google's legacy Pose documentation gives BlazePose GHUM latencies on a Pixel 3 with TFLite GPU of 20 ms for lite, 25 ms for full and 53 ms for heavy. Those are different devices and different measures from ML Kit's, so they do not compare; measure on your target phones. MediaPipe Pose Landmarker models goes deeper on the three variants.
Platforms and integration#
ML Kit's pose guides cover Android and iOS only. The Android guide needs API level 23 or above and, on the day we read it, printed the dependencies com.google.mlkit:pose-detection:18.0.0-beta5 and com.google.mlkit:pose-detection-accurate:18.0.0-beta5; the iOS guide printed the pods GoogleMLKit/PoseDetection and GoogleMLKit/PoseDetectionAccurate at 8.0.0. Google says the Android SDKs' code and assets, and the iOS detectors' assets, are statically linked into the app at build time, so there is no model file to download or version separately. Detection runs in STREAM_MODE, which tracks the most prominent person between frames, or SINGLE_IMAGE_MODE, and on Android setPreferredHardwareConfigs chooses between CPU and CPU_GPU.
MediaPipe adds Python and the web. Android uses the com.google.mediapipe:tasks-vision library, iOS the MediaPipeTasksVision package through Swift Package Manager, and the web the @mediapipe/tasks-vision npm package; each loads a .task model you supply. Running modes are IMAGE, VIDEO and LIVE_STREAM. Shipping the file yourself is extra work, and it is also what lets you pin a model version for regression tests.
Terms, status and data#
ML Kit is beta. Google's overview says the API "is offered in beta, and is not subject to any SLA or deprecation policy", and that changes "may be made to this API that break backward compatibility".
ML Kit has terms, not a licence file. The ML Kit Terms of Service, last modified May 14, 2025, say processing of input data "fully happens on-device", and also that the APIs "send metrics about the performance and utilization of the APIs in your app to Google", which the developer is responsible for telling users about where the law requires it. The terms treat machine learning models as related software and forbid attempts to reverse engineer or extract them.
MediaPipe is Apache-2.0. The repository's LICENSE is the Apache License, Version 2.0, and the code is there to read, fork or build from source. Pose estimation model licenses reads both sets of terms in full; this is not legal advice.
Which should you pick?#
- An Android and iOS app that wants one person's skeleton with the least setup → ML Kit. No model file to ship or update, and Google publishes size and frame-rate figures for both SDKs.
- A web app, a Python pipeline or a server-side batch job → MediaPipe; ML Kit's pose guides cover only Android and iOS.
- Joint angles in 3D, or a user who turns side-on → MediaPipe, for world landmarks in meters rather than an experimental pixel-scale Z.
- Two or more people, or a segmentation mask → MediaPipe, by raising
num_posesor enabling masks; ML Kit detects one person. - A product that cannot sit on a beta API or send usage metrics → MediaPipe, under Apache-2.0 with a model file you control.
- Already on ML Kit and outgrowing it → the shared landmark indices make MediaPipe the cheapest move; rename the two mouth constants and keep your rules.
What neither gives you#
Google's ML Kit overview says pose detection "does not attach any meaning to the landmarks in a pose or the pose itself", and the same is true of MediaPipe. Google's pose classification tips show a k-NN approach for exercise classification and rep counting; how rep counting works covers the logic, and AI workout tracking APIs compares products that sell that layer.
Frequently asked questions
- Is ML Kit pose detection built on MediaPipe?
- On the same research, by Google's account. MediaPipe's Pose documentation says its BlazePose research also powers the ML Kit Pose Detection API, and both return 33 landmarks with the same numbering, from 0 nose to 32 right foot index. The products differ: ML Kit is a beta SDK for Android and iOS with its model linked into the app, and MediaPipe is an open-source task library with a model bundle you load.
- Can I switch from ML Kit to MediaPipe without rewriting my pose code?
- Mostly. ML Kit's PoseLandmark constants and MediaPipe's PoseLandmark enum give the same index to the same point, so rules written against landmark numbers carry over. Only the mouth corners are named differently, LEFT_MOUTH and RIGHT_MOUTH in ML Kit against MOUTH_LEFT and MOUTH_RIGHT in MediaPipe. The output objects, scores and setup code still change: in-frame likelihood becomes visibility and presence.
- Does ML Kit or MediaPipe run in a web browser?
- MediaPipe does: Google documents a web guide that loads Pose Landmarker from the @mediapipe/tasks-vision npm package or a CDN, alongside Android, iOS and Python guides. ML Kit's pose detection guides cover Android and iOS only, so a web or desktop build needs MediaPipe or another model.
- Which is safer for a production app, ML Kit or MediaPipe?
- It depends on which risk you weigh. ML Kit pose detection is offered in beta and, per Google, is not subject to any SLA or deprecation policy, and its terms say the APIs send performance and usage metrics to Google. MediaPipe is Apache-2.0 open source with a model file you control, but you ship, size and update that file yourself. Neither gives you rep counting or form feedback.
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 27, 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