hamer-p150

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).

Quickstart

tt-model pull  changh95/hamer-p150 --with-weights
tt-model serve changh95/hamer-p150
  • Weights changh95/hamer-weights at e8217b46d54b go to your HF cache; the image does not contain them.
  • Serves on port 20000 (or the next free port); ready when the log says Application startup complete.

Run with tt-cli

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.

Response

{"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.
  • With MANO loaded the response also carries joints [21][3] and vertices [778][3] (metres), keypoints_2d [21][2] in original-image pixels, and faces [1538][3] on request.

Demo

Input (media/sample1.jpg, InterHand2.6M) Mesh overlay: input · torch CPU reference · tt-nn on p150a (media/sample1_result.png)

Accuracy and speed

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) 25 ms device · ~28 ms end-to-end (35 hands/s)

Caveats

  • One hand per request: the box is cropped to a 256×192 network input, batch 1; without bbox a centre square is used and the camera is meaningless.
  • bf16 / BFP8 on device: outputs differ slightly from the fp32 reference (PCC above); boot aborts if any warm-up PCC drops below 0.99.
  • 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).
  • Not an OpenAI-compatible API; GET /v1/models is a stub so the tt-model ready card does not 404.
  • Validated on tt-metal v0.78.0-dev20260820 (main 8b98410e730), single p150a only.

Licensing

Provenance

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
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Paper for changh95/hamer-p150