Pose estimation keypoint maps
9 schemes · 321 points · 53 crosswalk rows · read from the sources on 2026-10-17
A keypoint scheme is the fixed list of body points a pose model outputs, in a fixed order: index 5 is left_shoulder in COCO 17 but RIGHT_EYE in BlazePose 33. This reference reads 9 schemes from their own source files and lists all 321 points exactly as those sources spell them. Its crosswalk joins two points only when their names match once lowercased with separators removed, which gives 53 shared rows and leaves 127 points unmapped rather than guessed.
Choosing a model comes first: pose estimation models compared and what each licence allows. This page is for the step after, when code has to read point 13 and needs to know which joint that is.
The 9 schemes
Each row links to the full index table. “Used by” lists only models a fetched source ties to the scheme; the sentence that does so is quoted on the scheme’s page.
| Scheme | Points | Named in | Used by |
|---|---|---|---|
| BlazePose 33 | 33 landmarks | the PoseLandmark enum in MediaPipe's Tasks pose_landmarker.py | MediaPipe Pose Landmarker (Tasks API); MediaPipe Pose (legacy Solutions API); BlazePose in TF.js pose-detection |
| ML Kit 33 | 33 landmarks | the int constants of com.google.mlkit.vision.pose.PoseLandmark (Android reference) | ML Kit Pose Detection (base and accurate SDKs) |
| COCO 17 | 17 keypoints | keypoint_info in MMPose's configs/_base_/datasets/coco.py | MoveNet (TF.js pose-detection); PoseNet (TF.js pose-detection); Ultralytics YOLO26 default pose models; RTMPose 17-keypoint body models (MMPose) |
| Halpe26 | 26 keypoints | keypoint_info in MMPose's configs/_base_/datasets/halpe26.py | RTMPose 26-keypoint body models (MMPose) |
| COCO-WholeBody 133 | 133 keypoints | keypoint_info in MMPose's configs/_base_/datasets/coco_wholebody.py | RTMPose WholeBody 2d models (MMPose: RTMPose, RTMW and DWPose-distilled checkpoints) |
| OpenPose BODY_25 | 25 body parts | POSE_BODY_25_BODY_PARTS in OpenPose's src/openpose/pose/poseParameters.cpp | OpenPose BODY_25 model |
| OpenPose COCO 18 | 18 body parts | POSE_COCO_BODY_PARTS in OpenPose's src/openpose/pose/poseParameters.cpp | OpenPose COCO model (PoseModel::COCO_18) |
| Apple Vision 2D | 19 joints (no index) | the static joint-name constants of VNHumanBodyPoseObservation.JointName | Apple Vision VNDetectHumanBodyPoseRequest |
| Apple Vision 3D | 17 joints (no index) | the static joint-name constants of VNHumanBodyPose3DObservation.JointName | Apple Vision VNDetectHumanBodyPose3DRequest |
Crosswalk: the same name across schemes
Two points share a crosswalk row only when their names are identical after lowercasing and removing every character that is not a letter or a digit. left_knee, LEFT_KNEE and leftKnee all become leftknee and share a row; MOUTH_LEFT and LEFT_MOUTH, or RShoulder and right_shoulder, do not, and stay unmapped rather than guessed.
A shared row says the names match. It does not say two models put the point in the same place on the body. Cells show the index (Apple’s joints have none, so their cells show the name) and the spelling the source uses.
| Name | BlazePose 33 | ML Kit 33 | COCO 17 | Halpe26 | COCO-WholeBody 133 | OpenPose BODY_25 | OpenPose COCO 18 | Apple Vision 2D | Apple Vision 3D |
|---|---|---|---|---|---|---|---|---|---|
| nose | 0NOSE | 0NOSE | 0nose | 0nose | 0nose | 0Nose | 0Nose | nose | – |
| left_eye_inner | 1LEFT_EYE_INNER | 1LEFT_EYE_INNER | – | – | – | – | – | – | – |
| left_eye | 2LEFT_EYE | 2LEFT_EYE | 1left_eye | 1left_eye | 1left_eye | – | – | leftEye | – |
| left_eye_outer | 3LEFT_EYE_OUTER | 3LEFT_EYE_OUTER | – | – | – | – | – | – | – |
| right_eye_inner | 4RIGHT_EYE_INNER | 4RIGHT_EYE_INNER | – | – | – | – | – | – | – |
| right_eye | 5RIGHT_EYE | 5RIGHT_EYE | 2right_eye | 2right_eye | 2right_eye | – | – | rightEye | – |
| right_eye_outer | 6RIGHT_EYE_OUTER | 6RIGHT_EYE_OUTER | – | – | – | – | – | – | – |
| left_ear | 7LEFT_EAR | 7LEFT_EAR | 3left_ear | 3left_ear | 3left_ear | – | – | leftEar | – |
| right_ear | 8RIGHT_EAR | 8RIGHT_EAR | 4right_ear | 4right_ear | 4right_ear | – | – | rightEar | – |
| left_shoulder | 11LEFT_SHOULDER | 11LEFT_SHOULDER | 5left_shoulder | 5left_shoulder | 5left_shoulder | – | – | leftShoulder | leftShoulder |
| right_shoulder | 12RIGHT_SHOULDER | 12RIGHT_SHOULDER | 6right_shoulder | 6right_shoulder | 6right_shoulder | – | – | rightShoulder | rightShoulder |
| left_elbow | 13LEFT_ELBOW | 13LEFT_ELBOW | 7left_elbow | 7left_elbow | 7left_elbow | – | – | leftElbow | leftElbow |
| right_elbow | 14RIGHT_ELBOW | 14RIGHT_ELBOW | 8right_elbow | 8right_elbow | 8right_elbow | – | – | rightElbow | rightElbow |
| left_wrist | 15LEFT_WRIST | 15LEFT_WRIST | 9left_wrist | 9left_wrist | 9left_wrist | – | – | leftWrist | leftWrist |
| right_wrist | 16RIGHT_WRIST | 16RIGHT_WRIST | 10right_wrist | 10right_wrist | 10right_wrist | – | – | rightWrist | rightWrist |
| left_pinky | 17LEFT_PINKY | 17LEFT_PINKY | – | – | – | – | – | – | – |
| right_pinky | 18RIGHT_PINKY | 18RIGHT_PINKY | – | – | – | – | – | – | – |
| left_index | 19LEFT_INDEX | 19LEFT_INDEX | – | – | – | – | – | – | – |
| right_index | 20RIGHT_INDEX | 20RIGHT_INDEX | – | – | – | – | – | – | – |
| left_thumb | 21LEFT_THUMB | 21LEFT_THUMB | – | – | – | – | – | – | – |
| right_thumb | 22RIGHT_THUMB | 22RIGHT_THUMB | – | – | – | – | – | – | – |
| left_hip | 23LEFT_HIP | 23LEFT_HIP | 11left_hip | 11left_hip | 11left_hip | – | – | leftHip | leftHip |
| right_hip | 24RIGHT_HIP | 24RIGHT_HIP | 12right_hip | 12right_hip | 12right_hip | – | – | rightHip | rightHip |
| left_knee | 25LEFT_KNEE | 25LEFT_KNEE | 13left_knee | 13left_knee | 13left_knee | – | – | leftKnee | leftKnee |
| right_knee | 26RIGHT_KNEE | 26RIGHT_KNEE | 14right_knee | 14right_knee | 14right_knee | – | – | rightKnee | rightKnee |
| left_ankle | 27LEFT_ANKLE | 27LEFT_ANKLE | 15left_ankle | 15left_ankle | 15left_ankle | – | – | leftAnkle | leftAnkle |
| right_ankle | 28RIGHT_ANKLE | 28RIGHT_ANKLE | 16right_ankle | 16right_ankle | 16right_ankle | – | – | rightAnkle | rightAnkle |
| left_heel | 29LEFT_HEEL | 29LEFT_HEEL | – | 24left_heel | 19left_heel | – | – | – | – |
| right_heel | 30RIGHT_HEEL | 30RIGHT_HEEL | – | 25right_heel | 22right_heel | – | – | – | – |
| left_foot_index | 31LEFT_FOOT_INDEX | 31LEFT_FOOT_INDEX | – | – | – | – | – | – | – |
| right_foot_index | 32RIGHT_FOOT_INDEX | 32RIGHT_FOOT_INDEX | – | – | – | – | – | – | – |
| neck | – | – | – | 18neck | – | 1Neck | 1Neck | neck | – |
| left_big_toe | – | – | – | 20left_big_toe | 17left_big_toe | – | – | – | – |
| right_big_toe | – | – | – | 21right_big_toe | 20right_big_toe | – | – | – | – |
| left_small_toe | – | – | – | 22left_small_toe | 18left_small_toe | – | – | – | – |
| right_small_toe | – | – | – | 23right_small_toe | 21right_small_toe | – | – | – | – |
| RShoulder | – | – | – | – | – | 2RShoulder | 2RShoulder | – | – |
| RElbow | – | – | – | – | – | 3RElbow | 3RElbow | – | – |
| RWrist | – | – | – | – | – | 4RWrist | 4RWrist | – | – |
| LShoulder | – | – | – | – | – | 5LShoulder | 5LShoulder | – | – |
| LElbow | – | – | – | – | – | 6LElbow | 6LElbow | – | – |
| LWrist | – | – | – | – | – | 7LWrist | 7LWrist | – | – |
| RHip | – | – | – | – | – | 9RHip | 8RHip | – | – |
| RKnee | – | – | – | – | – | 10RKnee | 9RKnee | – | – |
| RAnkle | – | – | – | – | – | 11RAnkle | 10RAnkle | – | – |
| LHip | – | – | – | – | – | 12LHip | 11LHip | – | – |
| LKnee | – | – | – | – | – | 13LKnee | 12LKnee | – | – |
| LAnkle | – | – | – | – | – | 14LAnkle | 13LAnkle | – | – |
| REye | – | – | – | – | – | 15REye | 14REye | – | – |
| LEye | – | – | – | – | – | 16LEye | 15LEye | – | – |
| REar | – | – | – | – | – | 17REar | 16REar | – | – |
| LEar | – | – | – | – | – | 18LEar | 17LEar | – | – |
| root | – | – | – | – | – | – | – | root | root |
Points left unmapped (127)
A point is unmapped when no other scheme here spells its name the same way. That is a statement about names, not anatomy; it is the honest result of the rule above, not a judgement that the point has no counterpart.
- BlazePose 33: 9 MOUTH_LEFT, 10 MOUTH_RIGHT
- ML Kit 33: 9 LEFT_MOUTH, 10 RIGHT_MOUTH
- COCO 17: none
- Halpe26: 17 head, 19 hip
- COCO-WholeBody 133: 110 points, from 23 face-0 to 132 right_pinky_finger4
- OpenPose BODY_25: 8 MidHip, 19 LBigToe, 20 LSmallToe, 21 LHeel, 22 RBigToe, 23 RSmallToe, 24 RHeel
- OpenPose COCO 18: none
- Apple Vision 2D: none
- Apple Vision 3D: topHead, centerHead, centerShoulder, spine
The models on this site
- MediaPipe Pose Landmarker: lite vs full vs heavy →
- MoveNet Lightning, Thunder and MultiPose →
- Ultralytics YOLO pose models →
- RTMPose models (MMPose) →
- ML Kit Pose Detection →
- OpenPose models →
- Apple Vision body pose →
Keypoints in two or three dimensions are a separate question, covered in 2D vs 3D pose estimation.
Download the maps
One row per scheme and point, with the crosswalk key and the schemes it is shared with, under CC BY 4.0: pose-keypoint-maps-2026.json and pose-keypoint-maps-2026.csv, listed with the other open datasets.
Questions
What is a keypoint scheme in pose estimation?
It is the fixed list of body points a pose model outputs and the order it outputs them in, so code reads a point by its position. The same number means different points in different schemes: index 5 is left_shoulder in COCO 17 but RIGHT_EYE in BlazePose 33. This reference reads 9 schemes from their own source files on 2026-10-17 and lists all 321 points exactly as those sources spell them.
Can pose keypoints be converted between COCO, MediaPipe and OpenPose?
Only where the names agree, and this site joins nothing else: Two points share a crosswalk row only when their names are identical after lowercasing and removing every character that is not a letter or a digit. left_knee, LEFT_KNEE and leftKnee all become leftknee and share a row; MOUTH_LEFT and LEFT_MOUTH, or RShoulder and right_shoulder, do not, and stay unmapped rather than guessed. That gives 53 shared rows across the 9 schemes and leaves 127 of 321 points unmapped. Every COCO 17 name appears in BlazePose 33, ML Kit 33, Halpe26, COCO-WholeBody 133 and Apple Vision 2D. OpenPose spells sides as L and R (RShoulder), so 16 of its rows join only its own two models.
Do ML Kit and MediaPipe use the same 33 pose landmarks?
Nearly. Both number their landmarks 0 to 32, and 31 of ML Kit's 33 PoseLandmark constants carry exactly the name MediaPipe's PoseLandmark enum uses at the same index. The 2 exceptions are LEFT_MOUTH (ML Kit 9) against MOUTH_LEFT (MediaPipe 9) and RIGHT_MOUTH (ML Kit 10) against MOUTH_RIGHT (MediaPipe 10): the words are in a different order, so this reference leaves them unmapped instead of assuming they are the same point.
Sources (19)
Read by scripts/fetch-pose-keypoints.mjs, which refuses to publish when a count differs from the last verified read or two sources disagree about the same scheme. GitHub files are read on the branch shown; the hash is SHA-256 of the bytes served.
- MediaPipe Tasks pose_landmarker.py · google-ai-edge/mediapipe, branch master · read 2026-10-17 · sha256 bb49f0c12742
- MediaPipe legacy Pose solution pose.py · google-ai-edge/mediapipe, branch master · read 2026-10-17 · sha256 dcf9bdcfc1f4
- TF.js pose-detection constants.ts · tensorflow/tfjs-models, branch master · read 2026-10-17 · sha256 2463578c8dd9
- TF.js pose-detection README · tensorflow/tfjs-models, branch master · read 2026-10-17 · sha256 805c17684646
- MMPose coco.py dataset meta info · open-mmlab/mmpose, branch main · read 2026-10-17 · sha256 e4b308286849
- MMPose halpe26.py dataset meta info · open-mmlab/mmpose, branch main · read 2026-10-17 · sha256 b0115f045ade
- MMPose coco_wholebody.py dataset meta info · open-mmlab/mmpose, branch main · read 2026-10-17 · sha256 8c7397129651
- RTMPose README · open-mmlab/mmpose, branch main · read 2026-10-17 · sha256 21a455d285fb
- Ultralytics coco-pose.yaml · ultralytics/ultralytics, branch main · read 2026-10-17 · sha256 06a3a4ab8960
- Ultralytics pose task docs (pose.md) · ultralytics/ultralytics, branch main · read 2026-10-17 · sha256 5fd4e786153c
- OpenPose poseParameters.cpp · CMU-Perceptual-Computing-Lab/openpose, branch master · read 2026-10-17 · sha256 d2e441fa73f9
- OpenPose output format doc (02_output.md) · CMU-Perceptual-Computing-Lab/openpose, branch master · read 2026-10-17 · sha256 a42392573734
- ML Kit PoseLandmark (Android reference) · read 2026-10-17 · page last updated 2024-10-31 · sha256 211ef8c098c3
- Detect poses with ML Kit on Android · read 2026-10-17 · page last updated 2026-10-15 · sha256 dfe15ff2410d
- VNHumanBodyPoseObservation.JointName · read 2026-10-17 · sha256 fe73c7fb2ae2
- VNHumanBodyPose3DObservation.JointName · read 2026-10-17 · sha256 0f03e72204ce
- VNDetectHumanBodyPoseRequest · read 2026-10-17 · sha256 8513a041dcf7
- VNDetectHumanBodyPose3DRequest · read 2026-10-17 · sha256 926efd6c2c85
- VNHumanBodyPose3DObservation · read 2026-10-17 · sha256 8fff13ea2364
Compiled by AIFitnessAPI from each model’s own published source. The sources remain the authority.