Hand keypoints (RTMPose-M, 256, 21 joints)
This is an RTMPose-M top-down model. It predicts 21 hand keypoints in MediaPipe joint order from a hand box. OpenGraph
Labs uses it after the bare-hand detector in its NVIDIA V2D Challenge Track 3 pipeline (og_v2d.hands.front_end).
| Architecture | MMPose TopdownPoseEstimator: CSPNeXt-P5 backbone (deepen 0.67, widen 0.75) and an RTMCCHead with 21 keypoints (GAU 256, s 128) |
| Codec | SimCCLabel, input 256 x 256, sigma 5.66, split ratio 2.0 |
| Input | The detector box is expanded by 25 % per side, then GetBBoxCenterScale (padding 1.25) and TopdownAffine map it to 256 x 256. Mean (123.675, 116.28, 103.53), std (58.395, 57.12, 57.375), BGR to RGB. Flip test is on |
| Output | 21 keypoints (wrist, then thumb, index, middle, ring and little finger, each base to tip), with scores clipped to [0, 1] |
| Runtime used | mmpose 1.3.2, mmdet 3.2.0, mmcv 2.1.0, torch 2.1.2 |
| File | rtmpose_m_hand21_256.pth: 55,334,196 bytes, sha256 9fcb071d40ae2bd6ec53d99ddbbf2d43e7f2b79e03921d84dcbe99c295fcf91e |
This is a weights-only export of the training checkpoint (sha256 76df865f48119d3a5a88cbf9ac3a54d2e64d865fc453fa4bc6b2a68e3535c9ab)
that produced the challenge submission. It keeps state_dict and meta.dataset_meta, which are the parts that MMPose's
init_model reads, and both are bit-identical to the original. Training-run metadata, logs and the EMA copy were
removed.
Training data
We trained the model on OpenGraph Labs' internal hand keypoint dataset. That dataset is not released.
Evaluation
On our internal validation set, measured end to end from detector boxes:
| Metric | Value |
|---|---|
| PCK@0.1 | 0.916 |
| NME | 0.052 |
| Median endpoint error | 9.4 px |
Usage
For inference, use og_v2d.hands.front_end in the og-v2d-track3 repository. It ships the matching MMPose config.
License
Apache-2.0.