Reconstructing Hands in 3D with Transformers
Paper • 2312.05251 • Published
HaMeR (Hand Mesh Recovery, ViT-H/16 + MANO regression head) running on one Tenstorrent Blackhole p150a via tt-nn: a full frame plus one hand box in, MANO pose/shape/camera out (and, with your own MANO_RIGHT.pkl, the 778-vertex mesh and 21 joints). Weights: changh95/hamer-weights · Paper: arXiv:2312.05251 · Upstream code: geopavlakos/hamer · Port: changh95/tt-hamer
Runs on p150 (mesh P150).
Packaged and published with tt-model-manager 0.1.0 (manifest schema 5.1).
tt-model pull changh95/hamer-p150 --with-weights
tt-model serve changh95/hamer-p150
changh95/hamer-weights at e8217b46d54b go to your HF cache; the image does not contain them.Application startup complete.tt serve changh95/hamer-p150
printf '{"image":"%s","bbox":[20,170,295,260],"is_right":true}' "$(base64 -w0 media/sample1.jpg)" > req.json
curl -s localhost:20000/predict -H 'Content-Type: application/json' -d @req.json
tt model stop changh95/hamer-p150
POST /predict: image (base64 PNG/JPEG of the full frame), bbox [x1, y1, x2, y2] in original pixels (boxes for the samples: media/bboxes.json); optional is_right (true), rescale_factor (2.0), return_vertices (true), return_faces (false).GET /health, GET /info.{"image_size": [334, 512], "bbox": [20.0, 170.0, 295.0, 260.0], "is_right": true,
"rotmats": [[[0.957649, 0.103436, 0.268718], "..."], "..."], "betas": [-0.257281, -0.099984, -0.43662, "..."],
"cam": [4.691406, -0.051758, 0.003906], "cam_t_full": [-0.059121, -0.027873, 7.751116],
"mano_available": false, "trace_active": true,
"timing_ms": {"preprocess": 2.45, "device": 25.06, "mano": 0.0, "total": 27.64}}
rotmats is [16][3][3] (index 0 = global orientation, 1..15 = MANO hand pose), betas [10], cam [s, tx, ty] in crop space, cam_t_full [tx, ty, tz] for the full frame (focal_length = 5000/256*max(W, H)); left hands are mirrored through the right-hand model and mirrored back.joints [21][3] and vertices [778][3] (metres), keypoints_2d [21][2] in original-image pixels, and faces [1538][3] on request.Input (media/sample1.jpg, InterHand2.6M) |
Mesh overlay: input · torch CPU reference · tt-nn on p150a (media/sample1_result.png) |
|---|---|
![]() |
![]() |
| Metric | Value |
|---|---|
| Regression-vector PCC vs torch CPU reference, real checkpoint (served warm-up gate) | 0.99953 eager · 0.99946 trace replay, fresh input (gate 0.99) |
Regression-vector PCC vs torch CPU reference, harness (tests/test_pcc.py, seeded random weights) |
0.9988 |
| Inference, served over HTTP (warm, one hand, 256×192 crop) |
bbox a centre square is used and the camera is meaningless.MANO_RIGHT.pkl is not redistributed: copy your own to ~/.cache/tt-model/hamer-p150/weights/ for mesh, joints and 2-D keypoints; otherwise the server returns MANO parameters only (mano_available: false).GET /v1/models is a stub so the tt-model ready card does not 404.v0.78.0-dev20260820 (main 8b98410e730), single p150a only.code/): from changh95/tt-hamer, published under the upstream terms (mit-code-mano-non-commercial).The exact sources the image was built from — code/ in this repo is byte-identical to the model code inside the image:
| component | built from |
|---|---|
| tt-metal | 8b98410e730bb504fea43a88609756e34821d91d |
code/ digest |
0d1f79931ad3462f (sha256, first 16 hex digits) |
| built | 2026-09-12T13:36:38+00:00 by tt-model 0.1.0 |