# PG-HandPose

PG-HandPose is a public keypoint detection model by Pictograph Research on Pictograph, trained on the Hand Keypoints dataset and exportable to ONNX for inference. Reported OKS of 0.818.

## Overview

- Type: keypoint detection model
- Task: Keypoint detection (https://pictograph.io/explore/task/keypoint-detection)
- Architecture: RF-DETR Keypoint Preview
- Owner: Pictograph Research
- Trained on: Hand Keypoints (https://pictograph.io/datasets/pictograph-research/hand-keypoints)
- License: Creative Commons Attribution-NonCommercial-ShareAlike 4.0 (https://creativecommons.org/licenses/by-nc-sa/4.0/)
- Export: ONNX
- Stars: 0
- Page: https://pictograph.io/models/pictograph-research/pg-handpose
- Hugging Face: https://huggingface.co/pictograph/pg-handpose

## Evaluation metrics

- OKS: 81.8%
- OKS50: 92.7%
- OKS75: 84.0%
- recall: 85.1%

## About

# PG-HandPose

> A keypoint detection model (RF-DETR Keypoint Preview), locating each hand and its 21 keypoints, scoring 81.8% OKS.

**[Pictograph Research](/org/pictograph-research)** · Keypoint Detection · RF-DETR Keypoint Preview · FP32 · [CC-BY-NC-SA-4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/) · Public

## Overview

This is a keypoint detection model built on **RF-DETR Keypoint Preview**, trained on the [Hand Keypoints](/datasets/pictograph-research/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.

## 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](/datasets/pictograph-research/hand-keypoints) |
| Export | Hand Keypoints-base |
| 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

Run inference with the Pictograph SDK:

```python
from pictograph import Client, get_model, KeypointModel, KeypointResult

client = Client(api_key="pk_live_...")  # Settings -> API Keys

# Downloads + caches the weights on first use
model: KeypointModel = get_model(
    name="PG-HandPose",
    task="keypoint_detection",
    format="onnx",
    precision="fp32",
    device="cpu",
    client=client,
)
result: KeypointResult = model.predict(image="photo.jpg")
print(result)
```

```python
# Fully offline (no API key) once you have the weights + config.json
from pictograph import load_model, KeypointModel, KeypointResult

model: KeypointModel = load_model(
    "/path/to/weights.onnx",
    "/path/to/config.json",
    task="keypoint_detection",
    format="onnx",
)
result: KeypointResult = model.predict(image="photo.jpg")
```

- Full inference guide: [local inference docs](https://pictograph.io/docs/local-inference).
- REST + CLI: [models API reference](https://pictograph.io/docs/api-reference/models).
- Deploy it as an always-on endpoint: [deployments](https://pictograph.io/docs/deployments).

## License

Released under [CC-BY-NC-SA-4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/).


---

Free to view. Sign in at https://app.pictograph.io to fork this model, run batch inference, or deploy it as a live endpoint.
