Skip to content
AF

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.

SchemePointsNamed inUsed by
BlazePose 3333 landmarksthe PoseLandmark enum in MediaPipe's Tasks pose_landmarker.pyMediaPipe Pose Landmarker (Tasks API); MediaPipe Pose (legacy Solutions API); BlazePose in TF.js pose-detection
ML Kit 3333 landmarksthe int constants of com.google.mlkit.vision.pose.PoseLandmark (Android reference)ML Kit Pose Detection (base and accurate SDKs)
COCO 1717 keypointskeypoint_info in MMPose's configs/_base_/datasets/coco.pyMoveNet (TF.js pose-detection); PoseNet (TF.js pose-detection); Ultralytics YOLO26 default pose models; RTMPose 17-keypoint body models (MMPose)
Halpe2626 keypointskeypoint_info in MMPose's configs/_base_/datasets/halpe26.pyRTMPose 26-keypoint body models (MMPose)
COCO-WholeBody 133133 keypointskeypoint_info in MMPose's configs/_base_/datasets/coco_wholebody.pyRTMPose WholeBody 2d models (MMPose: RTMPose, RTMW and DWPose-distilled checkpoints)
OpenPose BODY_2525 body partsPOSE_BODY_25_BODY_PARTS in OpenPose's src/openpose/pose/poseParameters.cppOpenPose BODY_25 model
OpenPose COCO 1818 body partsPOSE_COCO_BODY_PARTS in OpenPose's src/openpose/pose/poseParameters.cppOpenPose COCO model (PoseModel::COCO_18)
Apple Vision 2D19 joints (no index)the static joint-name constants of VNHumanBodyPoseObservation.JointNameApple Vision VNDetectHumanBodyPoseRequest
Apple Vision 3D17 joints (no index)the static joint-name constants of VNHumanBodyPose3DObservation.JointNameApple 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.

NameBlazePose 33ML Kit 33COCO 17Halpe26COCO-WholeBody 133OpenPose BODY_25OpenPose COCO 18Apple Vision 2DApple Vision 3D
nose0NOSE0NOSE0nose0nose0nose0Nose0Nosenose–
left_eye_inner1LEFT_EYE_INNER1LEFT_EYE_INNER–––––––
left_eye2LEFT_EYE2LEFT_EYE1left_eye1left_eye1left_eye––leftEye–
left_eye_outer3LEFT_EYE_OUTER3LEFT_EYE_OUTER–––––––
right_eye_inner4RIGHT_EYE_INNER4RIGHT_EYE_INNER–––––––
right_eye5RIGHT_EYE5RIGHT_EYE2right_eye2right_eye2right_eye––rightEye–
right_eye_outer6RIGHT_EYE_OUTER6RIGHT_EYE_OUTER–––––––
left_ear7LEFT_EAR7LEFT_EAR3left_ear3left_ear3left_ear––leftEar–
right_ear8RIGHT_EAR8RIGHT_EAR4right_ear4right_ear4right_ear––rightEar–
left_shoulder11LEFT_SHOULDER11LEFT_SHOULDER5left_shoulder5left_shoulder5left_shoulder––leftShoulderleftShoulder
right_shoulder12RIGHT_SHOULDER12RIGHT_SHOULDER6right_shoulder6right_shoulder6right_shoulder––rightShoulderrightShoulder
left_elbow13LEFT_ELBOW13LEFT_ELBOW7left_elbow7left_elbow7left_elbow––leftElbowleftElbow
right_elbow14RIGHT_ELBOW14RIGHT_ELBOW8right_elbow8right_elbow8right_elbow––rightElbowrightElbow
left_wrist15LEFT_WRIST15LEFT_WRIST9left_wrist9left_wrist9left_wrist––leftWristleftWrist
right_wrist16RIGHT_WRIST16RIGHT_WRIST10right_wrist10right_wrist10right_wrist––rightWristrightWrist
left_pinky17LEFT_PINKY17LEFT_PINKY–––––––
right_pinky18RIGHT_PINKY18RIGHT_PINKY–––––––
left_index19LEFT_INDEX19LEFT_INDEX–––––––
right_index20RIGHT_INDEX20RIGHT_INDEX–––––––
left_thumb21LEFT_THUMB21LEFT_THUMB–––––––
right_thumb22RIGHT_THUMB22RIGHT_THUMB–––––––
left_hip23LEFT_HIP23LEFT_HIP11left_hip11left_hip11left_hip––leftHipleftHip
right_hip24RIGHT_HIP24RIGHT_HIP12right_hip12right_hip12right_hip––rightHiprightHip
left_knee25LEFT_KNEE25LEFT_KNEE13left_knee13left_knee13left_knee––leftKneeleftKnee
right_knee26RIGHT_KNEE26RIGHT_KNEE14right_knee14right_knee14right_knee––rightKneerightKnee
left_ankle27LEFT_ANKLE27LEFT_ANKLE15left_ankle15left_ankle15left_ankle––leftAnkleleftAnkle
right_ankle28RIGHT_ANKLE28RIGHT_ANKLE16right_ankle16right_ankle16right_ankle––rightAnklerightAnkle
left_heel29LEFT_HEEL29LEFT_HEEL–24left_heel19left_heel––––
right_heel30RIGHT_HEEL30RIGHT_HEEL–25right_heel22right_heel––––
left_foot_index31LEFT_FOOT_INDEX31LEFT_FOOT_INDEX–––––––
right_foot_index32RIGHT_FOOT_INDEX32RIGHT_FOOT_INDEX–––––––
neck–––18neck–1Neck1Neckneck–
left_big_toe–––20left_big_toe17left_big_toe––––
right_big_toe–––21right_big_toe20right_big_toe––––
left_small_toe–––22left_small_toe18left_small_toe––––
right_small_toe–––23right_small_toe21right_small_toe––––
RShoulder–––––2RShoulder2RShoulder––
RElbow–––––3RElbow3RElbow––
RWrist–––––4RWrist4RWrist––
LShoulder–––––5LShoulder5LShoulder––
LElbow–––––6LElbow6LElbow––
LWrist–––––7LWrist7LWrist––
RHip–––––9RHip8RHip––
RKnee–––––10RKnee9RKnee––
RAnkle–––––11RAnkle10RAnkle––
LHip–––––12LHip11LHip––
LKnee–––––13LKnee12LKnee––
LAnkle–––––14LAnkle13LAnkle––
REye–––––15REye14REye––
LEye–––––16LEye15LEye––
REar–––––17REar16REar––
LEar–––––18LEar17LEar––
root–––––––rootroot

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.

The models on this site

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.

Compiled by AIFitnessAPI from each model’s own published source. The sources remain the authority.