---
title: "Apple Vision vs MediaPipe: Native iOS Body Pose or a Cross-Platform Model?"
canonical: "https://aifitnessapi.com/compare/apple-vision-vs-mediapipe"
cluster: "Comparisons"
primary_query: "apple vision vs mediapipe"
last_reviewed: "2026-10-27"
description: "Apple Vision body pose vs MediaPipe Pose Landmarker, from Apple's and Google's docs: 19 vs 33 points, 3D in meters, people per frame, platforms."
publisher: "AIFitnessAPI — funded by KinesteX, the subject of this page; disclosure in body"
cite_as: "\"Apple Vision vs MediaPipe: Native iOS Body Pose or a Cross-Platform Model?\", AIFitnessAPI, https://aifitnessapi.com/compare/apple-vision-vs-mediapipe"
---

# Apple Vision vs MediaPipe: Native iOS Body Pose or a Cross-Platform Model?

> Pick Apple Vision when the app only runs on Apple devices: VNDetectHumanBodyPoseRequest ships inside the OS from iOS 14, returns 19 named 2D joints for each person it detects, and adds no model file to your app. Pick MediaPipe Pose Landmarker when you also need Android or the web, hand and foot points, or a model version you can pin: it returns 33 landmarks plus world coordinates in meters from a .task bundle you ship, under Apache-2.0. For 3D on Apple hardware, Vision's separate iOS 17 request returns 17 joints in meters, for the most prominent person only.

- Canonical: https://aifitnessapi.com/compare/apple-vision-vs-mediapipe
- Last reviewed: 2026-10-27
- Publisher: AIFitnessAPI (https://aifitnessapi.com) — funded by KinesteX, the subject of this page; disclosure in body
- Cite as: "Apple Vision vs MediaPipe: Native iOS Body Pose or a Cross-Platform Model?", AIFitnessAPI, https://aifitnessapi.com/compare/apple-vision-vs-mediapipe

---

**Disclosure: this site is funded by KinesteX, which sells a motion-tracking SDK that sits a layer above pose models like these.** Neither product on this page is ours, and we have no reason to prefer either. Apple facts come from Apple's Vision documentation; MediaPipe facts come from Google's Pose Landmarker guides and the google-ai-edge/mediapipe repository. All were read on October 27, 2026.

The two names do not sit at quite the same layer. Apple Vision is an operating-system framework: `VNDetectHumanBodyPoseRequest` and its 3D sibling run a pose model Apple ships inside iOS, iPadOS, macOS, tvOS and visionOS. MediaPipe Pose Landmarker is a model bundle plus a cross-platform task library that you add to your app. What Apple documents about its own request, on its own, is in [Apple Vision body pose on iOS](/motion/apple-vision-body-pose); this page puts the two side by side.

## Apple Vision vs MediaPipe at a glance

| | Apple Vision body pose | MediaPipe Pose Landmarker |
| --- | --- | --- |
| 2D points | 19 named joints (`VNHumanBodyPoseObservation.JointName`) | 33 landmarks, indexed 0 to 32 |
| Hands and feet | None in the 19; the iOS 18 `DetectHumanBodyPoseRequest` can add hand observations | Pinky, index and thumb points per hand; heel and foot index per foot |
| 3D | Separate request from iOS 17 and macOS 14: 17 joints in meters, origin at the root joint between the hips | World landmarks in meters, origin at the centre between the hips, from the same call |
| People per frame | 2D: one observation per detected pose; 3D: the most prominent person only | Up to `num_poses`, which defaults to 1 |
| Platforms | Apple only: iOS and iPadOS 14, macOS 11, Mac Catalyst 14, tvOS 14, visionOS 1 for the 2D request | Android, iOS, Python and web |
| What you ship | Nothing: the model is part of the OS | A `.task` model bundle: lite, full or heavy |
| Versioning | Request revisions inside the OS | The bundle file you choose and keep |
| Licence | Part of Apple's SDK | Apache-2.0 |

## What each returns in 2D

**Vision names 19 joints.** Apple's documentation says that starting in iOS 14 and macOS 11, Vision identifies human body poses "by detecting up to 19 unique body points". The joint names are grouped as head (nose, eyes, ears, neck), arms (shoulders, elbows, wrists), waist (`root`) and legs (hips, knees, ankles). Each `VNRecognizedPoint` carries x and y in normalized coordinates and a confidence score, and Apple's article says to ignore points with a confidence of 0, "because they’re invalid". The same article puts the origin at the bottom-left of the image.

**MediaPipe has 33 landmarks.** Google's Pose Landmarker guide lists them from 0 nose to 32 right foot index, and each landmark carries x, y, z, visibility and presence. Sixteen of the 33 have no Vision counterpart: four eye corners, two mouth corners, three hand points per side and two foot points per side. The heel and foot index points are what an ankle angle or a heel-lift check needs, which the 19 Vision joints cannot supply. Vision has two points MediaPipe does not: `neck` and `root`. In MediaPipe you would derive them, for example as midpoints of the shoulders and of the hips.

**Hands are a recent addition on Apple's side.** `DetectHumanBodyPoseRequest`, the Swift-only request available from iOS 18 and macOS 15, has a `detectsHands` property that Apple describes as "A Boolean value that detects hands of the body in the results, if they’re visible", defaulting to true and requiring the request's revision 2. Its observation exposes `leftHand` and `rightHand` as separate hand-pose observations rather than adding points to the body skeleton.

## Several people in frame

Apple's 2D article says the request "returns a unique observation for each detected human body pose", so one call can return several skeletons. Its accuracy advice also warns that "Attempting to detect body poses in dense crowd scenes is likely to produce inaccurate results". MediaPipe's `num_poses` option is "The maximum number of poses that can be detected by the Pose Landmarker", default 1, so you raise it explicitly. Neither guide documents keeping each person's identity from frame to frame; [multi-person pose tracking](/motion/multi-person-pose-tracking) covers that layer.

## 3D: two different promises

Vision's 3D request is a separate API with a higher floor: iOS 17 and macOS 14. Apple's article says it measures "17 individual joint locations in 3D space", in meters, relative to a root joint between the left and right hip. Three details matter for fitness code:

- **One person.** "The request only supports the detection and results for the most prominent person in the frame, so it generates a single observation."
- **All or nothing.** "The framework doesn’t return a partial list of joints, so you get all 17 joints or none."
- **Depth helps but is optional.** The request runs without depth data, and Apple says providing it "improves detection accuracy". `bodyHeight` is a measured value only when the capture session uses the LiDAR camera; otherwise Apple says it returns "a reference height of `1.8` meters".

MediaPipe returns its 3D output from the same call as the 2D landmarks. Google's legacy Pose documentation describes world landmarks as "Real-world 3D coordinates in meters with the origin at the center between hips", and the Pose Landmarker guide says the model "outputs an estimate of 33 3-dimensional pose landmarks". Its inputs are still images, decoded video frames or a live feed; the guide lists no depth input. Whether you need a third axis at all is the subject of [2D vs 3D pose estimation](/motion/2d-vs-3d-pose-estimation).

## Shipping and keeping it working

**Vision adds no model bytes.** The model ships in the OS, and the request is the API. The flip side is that the implementation updates when Apple updates it. The 2D request documents `VNDetectHumanBodyPoseRequestRevision1`, and the iOS 18 request has a `Revision` type whose listed case is `revision2`; what changes between them, and when, is Apple's to decide.

**MediaPipe adds a file you control.** The iOS guide installs the `MediaPipeTasksVision` library through Swift Package Manager and points `BaseOptions.modelAssetPath` at a `pose_landmarker.task` file in the app bundle; Android uses the `com.google.mediapipe:tasks-vision` library, and the web uses the `@mediapipe/tasks-vision` npm package. 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). Because the file is yours, an old version stays reproducible in a regression suite. [MediaPipe Pose Landmarker models](/motion/mediapipe-pose-landmarker-models) compares the three.

**Platform reach decides many projects outright.** Every platform Apple lists for Vision is an Apple platform. A team with an Android app either writes a second pose pipeline, with different joints and different failure modes, or uses one model on both, which MediaPipe supports.

## What is published about accuracy

Apple's documentation gives guidance rather than figures. For the 2D request it says the subject's height "should ideally be at least a third of the overall image height", that a large portion of the body should be in frame, and that "A subject wearing flowing or robe-like clothing reduces the detection accuracy."

The only side-by-side numbers come from Google. MediaPipe's legacy Pose documentation scores BlazePose GHUM against "Apple Vision" on Google's own Yoga, Dance and HIIT validation sets, each image holding one person 2 to 4 meters from the camera, on the 17 COCO keypoints. Apple Vision scored 32.8, 36.4 and 44.5 mAP and 82.7, 91.4 and 88.6 PCK@0.2; BlazePose GHUM Heavy scored 68.1, 73.0 and 74.0 mAP. Read it as a vendor benchmarking a competitor on its own test set, with no Vision version stated. [Pose estimation accuracy](/motion/pose-estimation-accuracy) explains the metrics, and your own footage is the only test that settles it.

## Mapping joints between them

Vision identifies joints by name, not by integer index, so code that reads MediaPipe's `landmarks[23]` has no direct equivalent. The 12 limb joints (shoulders, elbows, wrists, hips, knees, ankles) and the five face points (nose, eyes, ears) exist on both sides under matching names, which makes a name-keyed lookup the safe way to share form rules. The full lists are in [the Apple Vision 2D joint map](/pose-keypoints/apple-vision-2d), [the Apple Vision 3D joint map](/pose-keypoints/apple-vision-3d) and [the BlazePose 33 keypoint map](/pose-keypoints/blazepose-33).

## Which should you pick?

- **An iOS-only app that counts reps from elbow, hip or knee angles in 2D** → Apple Vision. No model file, no extra dependency, and a 2D request available back to iOS 14.
- **An app on iOS and Android, or in a browser** → MediaPipe, so one model and one set of joint rules serve every platform.
- **Squat depth, heel lift, ankle angles or grip** → MediaPipe, whose heel, foot index and hand points Vision's 19 joints do not include.
- **3D on Apple hardware with a depth camera** → test Vision's 3D request, which uses depth when it is present and can measure body height with LiDAR; remember it reports one person only.
- **Golden-clip regression tests that must not move between releases** → MediaPipe, because the model file is pinned in your repository; with Vision, plan to re-run the clips on each OS release.

## What neither gives you

Both return points, not workouts. Rep counting, form rules and feedback are yours to build or buy: [how rep counting works](/motion/how-rep-counting-works) shows the logic, [AI workout tracking in Swift](/guides/ai-workout-tracking-ios-swift) wires Vision into an iOS app, and [AI workout tracking APIs](/fitness-apis/ai-workout-tracking-apis) compares products that sell the layer above.

## Sources

- [developer.apple.com/documentation/vision/vndetecthumanbodyposerequest](https://developer.apple.com/documentation/vision/vndetecthumanbodyposerequest) — platforms from iOS 14 and macOS 11; revision 1 (checked 2026-10-27)
- [developer.apple.com/documentation/vision/detecting-human-body-poses-in-images](https://developer.apple.com/documentation/vision/detecting-human-body-poses-in-images) — 19 body points, one observation per detected pose, normalized points with a lower-left origin, confidence 0 invalid, accuracy guidance (checked 2026-10-27)
- [developer.apple.com/documentation/vision/vnhumanbodyposeobservation/jointname](https://developer.apple.com/documentation/vision/vnhumanbodyposeobservation/jointname) — the 19 joint names by group (checked 2026-10-27)
- [developer.apple.com/documentation/vision/vndetecthumanbodypose3drequest](https://developer.apple.com/documentation/vision/vndetecthumanbodypose3drequest) — 3D request from iOS 17 and macOS 14; depth data improves accuracy (checked 2026-10-27)
- [developer.apple.com/documentation/vision/identifying-3d-human-body-poses-in-images](https://developer.apple.com/documentation/vision/identifying-3d-human-body-poses-in-images) — 17 joints in meters, most prominent person only, all 17 or none, root origin, 1.8 m reference height, LiDAR (checked 2026-10-27)
- [developer.apple.com/documentation/vision/detecthumanbodyposerequest](https://developer.apple.com/documentation/vision/detecthumanbodyposerequest) — Swift request from iOS 18 and macOS 15 (checked 2026-10-27)
- [developer.apple.com/documentation/vision/detecthumanbodyposerequest/detectshands](https://developer.apple.com/documentation/vision/detecthumanbodyposerequest/detectshands) — detectsHands, default true, needs revision 2 (checked 2026-10-27)
- [developer.apple.com/documentation/vision/humanbodyposeobservation](https://developer.apple.com/documentation/vision/humanbodyposeobservation) — leftHand and rightHand observations (checked 2026-10-27)
- [developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker](https://developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker) — 33 landmarks, image and world coordinates, segmentation mask, num_poses default 1, running modes, lite/full/heavy bundles (checked 2026-10-27)
- [developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker/ios](https://developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker/ios) — MediaPipeTasksVision via Swift Package Manager; modelAssetPath (checked 2026-10-27)
- [developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker/android](https://developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker/android) — com.google.mediapipe:tasks-vision (checked 2026-10-27)
- [developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker/web_js](https://developers.google.com/edge/mediapipe/solutions/vision/pose_landmarker/web_js) — @mediapipe/tasks-vision on npm (checked 2026-10-27)
- [github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/pose.md](https://github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/pose.md) — world landmarks in meters; quality table including Apple Vision (checked 2026-10-27)
- [github.com/google-ai-edge/mediapipe/blob/master/mediapipe/tasks/python/components/containers/landmark.py](https://github.com/google-ai-edge/mediapipe/blob/master/mediapipe/tasks/python/components/containers/landmark.py) — visibility and presence fields (checked 2026-10-27)
- [github.com/google-ai-edge/mediapipe/blob/master/LICENSE](https://github.com/google-ai-edge/mediapipe/blob/master/LICENSE) — Apache-2.0 (checked 2026-10-27)
- [storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_full/float16/latest/pose_landmarker_full.task](https://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 (checked 2026-10-27)

## FAQ

### How many joints does Apple Vision detect compared with MediaPipe?

Apple's 2D request, VNDetectHumanBodyPoseRequest, detects up to 19 named body points: nose, eyes, ears, neck, shoulders, elbows, wrists, a root point at the waist, hips, knees and ankles. Its 3D request returns 17 joints. MediaPipe Pose Landmarker returns 33 landmarks, including eye and mouth corners, three points on each hand, and a heel and foot index on each foot, which Vision's 19 do not include.

[Permalink](https://aifitnessapi.com/compare/apple-vision-vs-mediapipe#faq-1)

### Can Apple Vision body pose run on Android?

No. Every platform Apple lists for VNDetectHumanBodyPoseRequest is an Apple one: iOS, iPadOS, Mac Catalyst, macOS, tvOS and visionOS. An Android version of the same app needs a different pose model. MediaPipe Pose Landmarker documents Android, iOS, Python and web, so teams shipping on both phones often use it everywhere and keep one set of joint rules.

[Permalink](https://aifitnessapi.com/compare/apple-vision-vs-mediapipe#faq-2)

### Does Apple Vision detect more than one person, unlike MediaPipe's default?

The 2D request does: Apple's article says it returns a unique observation for each detected human body pose, though it warns that dense crowd scenes are likely to produce inaccurate results. The 3D request supports only the most prominent person in the frame. MediaPipe Pose Landmarker detects up to num_poses people, an option that defaults to 1, so you raise it to track more.

[Permalink](https://aifitnessapi.com/compare/apple-vision-vs-mediapipe#faq-3)

### Is Apple Vision less accurate than MediaPipe BlazePose?

Apple publishes no accuracy figures to answer that. The only side-by-side numbers come from Google: MediaPipe's legacy Pose documentation scores Apple Vision at 32.8 to 44.5 mAP on Google's own Yoga, Dance and HIIT sets, against 68.1 to 74.0 for BlazePose GHUM Heavy. That is a vendor benchmarking a competitor on its own test set with no Vision version stated, so test both on your own footage.

[Permalink](https://aifitnessapi.com/compare/apple-vision-vs-mediapipe#faq-4)

### Does Apple Vision body pose need a depth camera for 3D?

No. Apple says VNDetectHumanBodyPose3DRequest runs without depth data, uses it when available, and that providing depth improves detection accuracy. Body height is measured only when the capture session uses the LiDAR camera; otherwise bodyHeight returns a reference height of 1.8 meters. MediaPipe's world landmarks come from ordinary image or video input, with no depth input in its guide.

[Permalink](https://aifitnessapi.com/compare/apple-vision-vs-mediapipe#faq-5)
