View on Pictograph · Pictograph Research · Keypoint Detection · RF-DETR Keypoint Preview · FP32 · Creative Commons Attribution-NonCommercial-ShareAlike 4.0
Overview
This is a keypoint detection model built on RF-DETR Keypoint Preview, trained on the Hand Keypoints dataset. It expects 576x576 input and runs in FP32 precision. It finds each hand and its 21 keypoints: the Skeleton section lists them in output order, with the joints each connects to. The ONNX weights are in this repo; run them with the Pictograph SDK (below) or open the model on Pictograph to test it in-browser, call the hosted API, or deploy it as an always-on endpoint.
Performance
Headline: 81.8% OKS.
| Metric | Value |
|---|---|
| OKS | 81.8% |
| OKS@50 | 92.7% |
| OKS@75 | 84.0% |
| Recall | 85.1% |
OKS is COCO's keypoint AP: the average precision over object keypoint similarity (OKS) thresholds 0.50 to 0.95. OKS@50 and OKS@75 are the AP at one threshold; Recall is the average recall over 0.50 to 0.95.
Skeleton
Each object the model finds is one instance: its keypoints share an instance_id, are named for their joint and carry their own confidence. The keypoint index is the model's output order.
| # | Keypoint | Connects to |
|---|---|---|
| 0 | wrist | thumb_cmc, index_finger_mcp, pinky_mcp |
| 1 | thumb_cmc | wrist, thumb_mcp |
| 2 | thumb_mcp | thumb_cmc, thumb_ip |
| 3 | thumb_ip | thumb_mcp, thumb_tip |
| 4 | thumb_tip | thumb_ip |
| 5 | index_finger_mcp | wrist, index_finger_pip, middle_finger_mcp |
| 6 | index_finger_pip | index_finger_mcp, index_finger_dip |
| 7 | index_finger_dip | index_finger_pip, index_finger_tip |
| 8 | index_finger_tip | index_finger_dip |
| 9 | middle_finger_mcp | index_finger_mcp, middle_finger_pip, ring_finger_mcp |
| 10 | middle_finger_pip | middle_finger_mcp, middle_finger_dip |
| 11 | middle_finger_dip | middle_finger_pip, middle_finger_tip |
| 12 | middle_finger_tip | middle_finger_dip |
| 13 | ring_finger_mcp | middle_finger_mcp, ring_finger_pip, pinky_mcp |
| 14 | ring_finger_pip | ring_finger_mcp, ring_finger_dip |
| 15 | ring_finger_dip | ring_finger_pip, ring_finger_tip |
| 16 | ring_finger_tip | ring_finger_dip |
| 17 | pinky_mcp | ring_finger_mcp, wrist, pinky_pip |
| 18 | pinky_pip | pinky_mcp, pinky_dip |
| 19 | pinky_dip | pinky_pip, pinky_tip |
| 20 | pinky_tip | pinky_dip |
Training
| Setting | Value |
|---|---|
| Base dataset | Hand Keypoints |
| Dataset size | 26,677 images |
| Input size | 576x576 |
| Epochs | 12 |
| Batch size | 4 |
| Learning rate | 0.0001 |
| Model size | preview |
| Precision | FP32 |
| Version | 1.0.0 |
Use this model
The weights ship as ONNX (pg-handpose.onnx) with a config.json. The Pictograph SDK applies the model's exact pre/post-processing for you:
Pictograph SDK
pip install "pictograph[inference]"
from huggingface_hub import hf_hub_download
from pictograph import load_model, KeypointModel
onnx = hf_hub_download("pictograph/pg-handpose", "pg-handpose.onnx")
config = hf_hub_download("pictograph/pg-handpose", "config.json")
model: KeypointModel = load_model(onnx, config, task="keypoint_detection")
result = model.predict("photo.jpg") # KeypointResult
for obj in result.instances: # one list of joints per object
print(f"instance {obj[0].instance_id}: {len(obj)} joints")
for j in obj: # j.name IS the joint class
print(f" {j.name} ({j.keypoint.x:.0f},{j.keypoint.y:.0f}) {j.confidence:.2f}")
Example output (illustrative; your exact values depend on the image):
instance 1: 21 joints
wrist (512,143) 0.97
thumb_cmc (498,131) 0.96
instance 2: 21 joints
wrist (188,160) 0.93
Raw ONNX Runtime (no SDK)
from huggingface_hub import hf_hub_download
import onnxruntime as ort
onnx = hf_hub_download("pictograph/pg-handpose", "pg-handpose.onnx")
sess = ort.InferenceSession(onnx, providers=["CPUExecutionProvider"])
inp = sess.get_inputs()[0]
print(inp.name, inp.shape) # NCHW float32; input size + normalization in config.json
# outputs = sess.run(None, {inp.name: preprocessed_batch})
# Decoding is architecture-specific; the Pictograph SDK (above) does it for you.
- Test it in-browser, call the hosted API, or deploy an endpoint: open the model on Pictograph.
- SDK + local inference guide: docs.
License
Released under Creative Commons Attribution-NonCommercial-ShareAlike 4.0.
Citation
This model uses the RF-DETR Keypoint Preview architecture:
@inproceedings{robinson2026rfdetr,
title = {RF-DETR: Real-Time Detection Transformer},
author = {Robinson, Isaac and Robicheaux, Peter and Popov, Matvei and Ramanan, Deva and Peri, Neehar},
booktitle = {International Conference on Learning Representations (ICLR)},
year = {2026},
url = {https://arxiv.org/abs/2511.09554}
}
Trained and published with Pictograph - annotate, train, and deploy from one API.
- Downloads last month
- 22
Dataset used to train pictograph/pg-handpose
Paper for pictograph/pg-handpose
Evaluation results
- OKS on Hand Keypointsself-reported0.818
- OKS@50 on Hand Keypointsself-reported0.927
- OKS@75 on Hand Keypointsself-reported0.840
- Recall on Hand Keypointsself-reported0.851
