ML Kit Pose Detection: Base vs Accurate SDK, Landmarks and Limits
Last verified October 17, 2026 · 4 min read
Sources checked (6) · October 17, 2026
- developers.google.com/ml-kit/vision/pose-detection — Beta status, 33 landmarks, face required, one person, in-frame likelihood, base vs accurate SDK, the Z coordinate, and no meaning attached to landmarks.
- developers.google.com/ml-kit/vision/pose-detection/android — SDK names, sizes and Pixel 3XL speeds, API level 23, the 18.0.0-beta5 dependencies, detection modes, hardware configs, 480x360 and 256x256 guidance, and out-of-frame landmarks.
- developers.google.com/ml-kit/vision/pose-detection/ios — PoseDetection and PoseDetectionAccurate sizes and iPhone X speeds, pods at 8.0.0, Xcode 13.2.1, stream and singleImage modes.
- developers.google.com/android/reference/com/google/mlkit/vision/pose/PoseLandmark — The 33 constants and their values, the in-frame likelihood range, the getPosition3D Z notes, and the RIGHT_EYE descriptions that say left.
- developers.google.com/ml-kit/reference/swift/mlkitposedetectioncommon/api/reference/Classes/PoseLandmark — Z values are less accurate than x and y, and facial landmark z-values are not calculated.
- developers.google.com/ml-kit/terms — Last modified May 14, 2025: input processing fully on-device, and the performance and utilization metrics the APIs send to Google.
Covered here:MediaPipe
Choosing between ML Kit, MediaPipe and the rest happens in pose estimation models compared. ML Kit is governed by service terms rather than an open-source licence, read in pose estimation model licenses. This page covers what Google's ML Kit guides and API reference say about the pose API, as read on October 17, 2026.
Base vs accurate SDK#
| Platform | SDK | App size, per Google | Speed, per Google |
|---|---|---|---|
| Android | pose-detection | About 10.1 MB | Pixel 3XL: about 30 FPS |
| Android | pose-detection-accurate | About 13.3 MB | Pixel 3XL: about 23 FPS on CPU, about 30 FPS on GPU |
| iOS | PoseDetection | Up to 29.6 MB | iPhone X: about 45 FPS |
| iOS | PoseDetectionAccurate | Up to 33.2 MB | iPhone X: about 29 FPS |
Google's overview says the base SDK "runs in real time on modern phones like the Pixel 4 and iPhone X" while "the precision of the landmark coordinates may vary", and that the accurate SDK "returns results at a slower framerate, but produces more accurate coordinate values". On Android the code and assets are statically linked into the app at build time, and the guide requires API level 23 or above; on iOS the detector's assets are statically linked. The guides printed these dependency versions on the day we read them:
com.google.mlkit:pose-detection:18.0.0-beta5
com.google.mlkit:pose-detection-accurate:18.0.0-beta5
pod 'GoogleMLKit/PoseDetection', '8.0.0'
pod 'GoogleMLKit/PoseDetectionAccurate', '8.0.0'
The iOS guide asks for Xcode 13.2.1 or higher.
What it returns#
When a person is detected, the Android guide says the API returns a Pose with 33 PoseLandmark objects, and an empty list when nobody is. Each landmark has a type, a 2D position, a 3D position and an in-frame likelihood from 0.0 to 1.0. When part of the body is outside the image, Google says the missing landmarks get coordinates outside the frame and low in-frame values.
The 33 types are listed with their integer values in the ML Kit landmark map. They use the same 33 values as MediaPipe's PoseLandmark enum, and every name matches except the mouth corners: ML Kit's LEFT_MOUTH and RIGHT_MOUTH against MediaPipe's MOUTH_LEFT and MOUTH_RIGHT. One quirk of Google's Android reference: it describes RIGHT_EYE, RIGHT_EYE_INNER and RIGHT_EYE_OUTER with the word "left".
Google's overview adds that "Pose Detection does not attach any meaning to the landmarks in a pose or the pose itself". Classifying a pose or counting a rep is your code's job, which how rep counting works covers.
The Z value#
Google calls Z "an experimental value". The overview says it is measured in image pixels like X and Y but "is not a true 3D value", that its origin is approximately the center point between the hips, that negative values are toward the camera, and that it has no upper or lower bound. The Android reference adds that Z is less accurate than X and Y.
Two of Google's pages differ on one point. The overview says the Z coordinate "is calculated for every landmark"; the iOS Swift reference says "z-values for facial landmarks are not calculated, so please disregard them". Treat facial Z as unusable either way. For depth you can lean on, see 2D vs 3D pose estimation.
Detection modes and inputs#
STREAM_MODE, the default, detects the most prominent person, then tracks them and re-runs person detection only when they are obscured or lost; Google recommends it for video. SINGLE_IMAGE_MODE runs person detection on every image, with higher latency and no tracking, for static images. On Android, setPreferredHardwareConfigs chooses between CPU and CPU_GPU, and ML Kit falls back to CPU when no preferred configuration works.
Google asks for input images of at least 480x360 pixels and says the person should be represented by at least 256x256 pixels for best performance. For real-time use it recommends the base SDK with STREAM_MODE.
The limits Google states#
- One person. "Pose detection can only detect one person in an image." With two people, the landmarks go to the person detected with the highest confidence.
- The face must be visible. "The user's face must be present in order to detect a pose."
- Beta. The API "is offered in beta, and is not subject to any SLA or deprecation policy", and Google warns that changes may break backward compatibility.
The ML Kit Terms of Service, last modified May 14, 2025, say processing of the input data "fully happens on-device", and that the APIs "send metrics about the performance and utilization of the APIs in your app to Google". For more than one person in frame, start from multi-person pose tracking.
When it fits#
Our reading: ML Kit suits an Android and iOS app that wants one person's skeleton without shipping and versioning a model file, and that can accept beta terms. If you need the model file itself or an open-source licence, MediaPipe Pose Landmarker outputs 33 landmarks at the same indices; its variants are compared in MediaPipe Pose Landmarker models.
Frequently asked questions
- What is the difference between ML Kit's base and accurate pose detection SDKs?
- Speed against coordinate accuracy, and size. Google's Android guide lists pose-detection 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 on CPU or 30 FPS on GPU. On iOS, PoseDetection is up to 29.6 MB at about 45 FPS on an iPhone X and PoseDetectionAccurate up to 33.2 MB at about 29 FPS. Google says the accurate SDK produces more accurate coordinate values at a slower frame rate.
- Can ML Kit pose detection track more than one person?
- No. Google's overview says pose detection can only detect one person in an image, and that with two people in frame the model assigns landmarks to the person detected with the highest confidence. In STREAM_MODE it tracks the most prominent person across frames. For group scenes you need a multi-person model instead.
- Is the Z coordinate from ML Kit pose detection real depth?
- No. Google calls it an experimental value measured in image pixels like X and Y that is not a true 3D value, with its origin approximately at the center between the hips, negative toward the camera and no fixed bound. The Android reference says it is less accurate than X and Y, and the iOS Swift reference says Z values for facial landmarks are not calculated and should be disregarded.
- What image resolution does ML Kit pose detection need?
- Google's Android guide asks for images of at least 480x360 pixels and says the person should be represented by at least 256x256 pixels for best performance. For real-time use it suggests capturing at a lower resolution to cut latency while keeping to those minimums, and using the base SDK with STREAM_MODE.
- Why does ML Kit return pose landmarks outside the image?
- Because it always returns all 33. When the person is not completely inside the image, Google's Android guide says the model assigns the missing landmarks coordinates outside the frame and gives them low in-frame likelihood values. Check getInFrameLikelihood, which runs from 0.0 to 1.0, before using a landmark.
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 17, 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 ai motion · by AIFitnessAPI