FAH: Fast and Accurate Hand Estimation

in Pixels, Interaction and World Space

Jinkun Cao

www.jinkuncao.com

FAH-H outputs on ten scenes: 2D keypoints, dense surface points, fitted MANO mesh, part segmentation and per-vertex contact
Five outputs of FAH-H on ten scenes. Left to right: 2D keypoints, dense surface points, fitted MANO mesh, hand parts and contact (grey to violet). Outlines: right hand blue, left hand orange. Image sources and licences are listed in Credits.

Method

FAH on one frame of a held-out HOT3D benchmark clip: detector outputs, crop and ViT encoder, 2D and 3D hand points, MHR-Hand and MANO fits, parts in the mask, contact on the surface, the causal video track and world-space placement
FAH on one frame of a held-out HOT3D benchmark clip. The detector returns each hand’s box, handedness and instance mask (drawn on the frame) and its crop for the ViT encoder. On the crop, the heatmap head predicts 2D joints and dense surface points with root-relative 3D (inset), to which MHR-Hand and MANO are fitted (dashed; inset: side view, MANO outlined); the part head labels each pixel inside the detector mask with its hand part, and the contact head estimates per-vertex contact probabilities, shown on the fitted MANO hand (0–1, grey to violet; inset: palm side). Bottom: the causal video model refines the joints from past frames only (frames 4 apart, with thumb and index fingertip trails), and the camera model places the hands in world space (camera grey, wrists coloured). Blue: right hand; orange: left.
Adapted from a frame of a held-out HOT3D benchmark clip (CC BY-SA 4.0); this figure is CC BY-SA 4.0.

In-the-wild test videos (all outputs)

Two of our own videos, full length and without cuts, made with the release’s one-command script (fah-video, see the README): FAH-L with the shipped video preset and every output, hands with confidence ≥ 0.3. Tiles: input | 2D keypoints | 3D hand mesh (the fitted MANO mesh), then hand parts + instance masks | per-vertex contact (grey ≤ 0.3 to violet ≥ 0.7) | the last tile (below), over the per-hand contact timeline (violet bar: the video contact model’s flag; thin pink bar: the image head’s).

Gestures, overlapping hands and object handling facing the camera. Final tile: palm-side contact.
Egocentric desk work with a camera, toy, mouse and keyboard. Final tile: hands and offline camera trajectory in world space.

Contact vs HACO on the test videos

Comparison with HACO using its paper protocol (2× crop, threshold 0.56). HACO contact is shown on WiLoR’s mesh; FAH-L uses its own fitted mesh. Grey to violet indicates increasing contact probability. Timelines show contact scores and flags; pink marks FAH-L’s image head. HACO flags contact throughout these videos; FAH-L flags 69–95% of object holds and 8–10% of gestures, with more switching. FAH-L can also flag hand-hand or hand-face contact.

Camera and charger holds, gestures and self-contact.
Desk work with object holds and an open-hand reach.

Outputs

FAH-L outputs on a held-out HOT3D clip: joints, surface points, mesh, hand parts and masks.

Contact

Contact on six held-out HOT3D and DexYCB hands: input crop, ground truth, HACO and FAH-L on the ground-truth MANO mesh, with per-hand vertex F1
Contact on held-out hands (training-disjoint HOT3D benchmark clips and DexYCB s0 test of the contact table, ground-truth boxes). Per hand: the input crop, the ground-truth contact (vertices within 10 mm of or inside the object), HACO and FAH-L, all three on the same ground-truth MANO mesh, viewed from its contact side; grey to violet, each method mapped so that 0.5 is its validation threshold (FAH-L: the released, calibrated head, as in the contact table); per-hand vertex F1 under each prediction. Hands: the first in a fixed random order of the hands with at least 30 contact vertices for each grasp type (HOT3D pinch, power, fingers; DexYCB pinch, power; no object twice) and, last, the first with FAH-L vertex F1 below 0.3. HACO is better on the fourth hand; the last shows a missed fingertip contact at the onset of a reach.
Top row: adapted from frames of the held-out HOT3D benchmark clips (CC BY-SA 4.0) and their hand annotations (the ground-truth meshes and contact; CC BY-NC-SA 4.0), so these tiles are CC BY-NC-SA 4.0. Bottom row: adapted from the DexYCB s0 test split (Chao et al., CVPR 2021; CC BY-NC 4.0); CC BY-NC 4.0.

Selected examples from held-out HOT3D benchmark clips, chosen to illustrate (not random samples). Mesh colour = FAH-L per-vertex contact probability (grey at ≤ 0.3 to violet at ≥ 0.7); panel header = hand-level contact flag (FAH-Video). Timeline: FAH-Video contact (violet), the image head alone (pink), ground truth (grey). On HOT3D, the video model switches the contact flag less often (clip 002606); on other datasets the effect differs, see the paper’s contact family table. Limitation: contact can also fire on self-contact (hand-face, hand-hand).

HOT3D clip-002606. Contact-flag switches: video 14, image 28, ground truth 28.
HOT3D clip-001910, from 1.0 s.
HOT3D clip-001881.
HOT3D clip-002511.
FAH-L image contact on three held-out HOT3D frames and three in-the-wild photos, each over its palm-side view
Selected examples: FAH-L image contact on held-out HOT3D frames and in-the-wild photos (credits below). Colour = per-vertex contact probability (grey to violet, linear from 0 to 1). Quantitative results are in the paper’s contact family table. Limitation: contact can also fire on self-contact (hand-face, hand-hand).
Left to right: tiles 1–3 adapted from frames of the held-out HOT3D benchmark clips (CC BY-SA 4.0; these tiles are CC BY-SA 4.0); 4 “Nadya and Jeff making cellphones” by David Mellis (CC BY 2.0); 5 “Snack Break” by Eden, Janine and Jim (CC BY 2.0); 6 “vincent’s last night in town” by brooke (CC BY-SA 2.0; this tile is CC BY-SA 2.0). Photos 4–6 via COCO train2017, cropped around the hand and overlaid with our mesh render.

FAH-L vs WiLoR / HaWoR on contact juggling

Hands with confidence ≥ 0.3 shown for every method; fps on a desktop RTX 4070 Ti SUPER (FAH-L: the shipped video preset).

All contact juggling footage: KUMA Films (@kumakumafilms). Cropped and overlaid with model predictions.

Contact juggling. Video: KUMA Films.
Contact juggling. Video: KUMA Films.

Head-mounted (egocentric): FAH-L vs WiLoR / HaWoR

HoloLens 2 head-camera video from HoloAssist. Panels: FAH-L (video) | WiLoR | HaWoR, 2D joints (top) and meshes (bottom); hands with confidence ≥ 0.3 shown for every method; fps on a desktop RTX 4070 Ti SUPER (FAH-L: the shipped video preset). On this footage all three methods find a hand in nearly the same frames (92–100%); they differ in the finger poses around the held objects.

Tool work on an ATV engine.
DSLR battery and lens handling.

Egocentric-10K: factory work, head-mounted fisheye, rectified to a pinhole camera

Every method gets the rectified camera; same panels and threshold as above.

Picking and fitting small electronic parts on a mat.
Smoothing and folding a large piece of fabric.

In-the-wild close-ups: FAH-L vs WiLoR / HaWoR

Close-up hand work seen from above and in front (not head-mounted). Panels: FAH-L (video) | WiLoR | HaWoR, 2D joints (top) and meshes (bottom); hands with confidence ≥ 0.3 shown for every method; fps on a desktop RTX 4070 Ti SUPER (FAH-L: the shipped video preset).

Knitting: hand pose and mesh comparison.
Crochet: hand pose and mesh comparison.

Real to sim

FAH-L’s hands (video mode, released model) and the object from SAM 3D Objects, replayed in MuJoCo (supplementary material). Panels: input video | FAH-L hand + reconstructed object | MuJoCo physics (free object, the hand as 16 convex parts). Real to sim on 54 held-out clips (30 DexYCB, 24 HOT3D egocentric), success rule fixed in advance, 3 replays per clip: 7 / 54 pass with the primary controller (joint-space finger closing), 5 / 54 with the Cartesian controller; no egocentric clip passes. Shown: 5 of the 6 clips that pass all 3 replays.

Marker held in a precision grasp (DexYCB; sequence not in FAH’s training data).
Coffee can lifted with the left hand (DexYCB; sequence not in FAH’s training data).
Power drill lifted by its handle (DexYCB; a sequence in FAH’s training data).
Banana picked up and lifted (DexYCB; a sequence in FAH’s training data).
Soup can lifted with a top grasp (DexYCB; a sequence in FAH’s training data).

Adapted from DexYCB (Chao et al., CVPR 2021; CC BY-NC 4.0); these videos are CC BY-NC 4.0. Object reconstruction: SAM 3D Objects (Meta). Simulation: MuJoCo.

Results

3D accuracy on HOT3D v1 and EgoStandard

HOT3D v1EgoStandard (held out)
methodfpsPAPA-pPVErootMRRPEacceljitterPAPA-pPVErootacceljitter
per frame
MediaPipe Hands—19.6167.01—87.72119.7920.5920.61——————
HaMeR4.69.4614.489.2441.6249.266.756.84——————
Hamba5.09.2814.319.0240.6647.837.227.31——————
WiLoR4.76.7211.856.4943.8948.578.308.487.268.597.5264.186.646.71
SAM 3D Body hand10*8.30—8.4940.0052.365.625.81——————
FAH-S1015.255.514.8911.9416.205.605.877.317.607.2830.665.555.61
FAH-B894.574.844.289.7613.194.584.907.117.407.1230.184.774.84
FAH-L654.314.584.028.8912.133.834.197.107.397.1230.213.994.06
FAH-H274.124.393.859.1211.653.954.317.147.447.1528.533.954.01
video
HaWoR115.8914.785.5729.5127.671.942.03——————
FAH-S video885.085.284.8011.5915.702.242.457.357.507.3030.752.142.14
FAH-B video794.424.654.199.4212.691.892.157.167.307.1530.251.911.91
FAH-L video594.164.383.958.5511.581.651.927.177.317.1530.291.671.66
FAH-H video263.984.193.778.3410.721.661.947.207.357.1828.841.651.63

mm; accel and jitter in mm/frame²; PA-p: coverage-aware PA-MPJPE (each missed hand counts as a canonical hand). fps on HOT3D frames on an NVIDIA RTX 4070 Ti SUPER (16 GB) desktop GPU, slower of two rounds; FAH fps end to end (detection, pose, mesh fit, fingertips; optional parts excluded), all four models timed in one session. *Our CUDA-graph implementation (5.9 fps eager). Crop-based baselines use WiLoR’s detector. The four models share data, losses and schedule and differ only in encoder initialisation and input size. EgoStandard: held-out test, aggregate metrics only, scored once per released model and not used to choose among them.

2D accuracy on bench2d v2 and the challenging-pose, low-light and shadow sets

bench2d v2challenging poseslow lightshadows
methodfpsPCKincl.3D fitoverlaprecallPCKincl.recallPCKincl.recallPCKincl.
MediaPipe Hands—0.650.340.550.280.050.940.050.330.650.220.580.890.51
RTMPose-m890.710.40—0.230.070.820.060.350.700.240.450.940.42
RTMW-l320.680.65—0.560.130.840.110.850.650.560.980.890.87
HaMeR4.60.710.660.650.550.840.930.780.820.700.570.950.970.92
Hamba5.00.720.660.650.550.840.930.780.810.700.570.950.970.92
WiLoR4.70.690.640.770.520.840.940.780.810.670.550.950.970.92
FAH-S1010.800.780.790.600.900.990.890.960.760.731.000.980.97
FAH-B890.820.800.820.620.900.990.890.960.790.761.000.990.99
FAH-L650.830.810.830.640.900.990.900.960.810.781.000.990.99
FAH-H270.830.810.830.640.900.990.900.970.810.781.000.990.98

PCK@0.1 on matched hands; incl.: missed hands count as failures; 3D fit: 3D joints projected at the best-fitting translation; overlap: PCK@0.1 incl. misses on 387 overlapping hands; shadows: the 278 scored hands of shadow_v1. fps as in the 3D table.

Hand contact

HOT3DDexYCB s0
methodF1APflagF1APflag
HACO0.580.470.820.660.610.86
FAH-S0.770.830.980.750.810.98
FAH-B0.790.850.980.760.820.98
FAH-L0.800.850.980.760.820.98
FAH-H0.800.860.980.770.820.98
full-pipeline detections†
FAH-L, per frame†0.800.850.980.760.810.98
FAH-L video†0.800.860.970.770.810.97
rules: distance to the known object mesh
rule: dense points0.72—0.980.56—0.95
rule: fitted MANO0.65—0.960.56—0.94

Training-disjoint HOT3D (5,172 hands, every 5th frame; HACO zero-shot) and DexYCB s0 test (9,506 hands; HACO trains on s0 train): pooled vertex F1 / AP and hand F1 (flag; vertices within 10 mm of or inside the object), ground-truth boxes, validation-calibrated thresholds, one model per size. †Full-pipeline detections (25,431 / 9,319 hand-frames). Rules: distance to the known object mesh (25,378 / 9,225 detected hands). Model selection consulted these evaluation sets; HOI4D, ARCTIC and MOW: the paper’s contact family table and supplement.

Hands in world space

FAH-L’s video hands with the real-time camera model run at 29 fps; with the offline camera mode at 7.1 fps. All camera stages; real time: joints and dense points without mesh fitting, parts or contact; offline: MANO fitting included. Desktop RTX 4070 Ti SUPER, 4 EgoStandard test clips, slower of 2 rounds; real time: streaming frame source, slower of the swap-free runs on this desktop (16 GB RAM; WSL2 VM 14 GB), whose memory is otherwise the limit; two processes are time-sliced on one GPU (no MPS under WSL2). Accuracy: the paper’s world-space table.

Training of the released models

modelencoder initialisationinputDexYCB
FAH-Sdistilled ViT-S/16320 px6.26
FAH-Bdistilled ViT-B/16320 px5.67
FAH-Ldistilled ViT-L/16320 px5.40
FAH-Hteacher's own ViT-H+/16448 px5.12

Shared data, losses and schedule for all four: two 12k-step blocks and 6k steps with the WiLoR targets; teacher inputs at 384 px, student inputs at 256 px; DexYCB: s0 test PA-MPJPE (mm) of the image model. FAH-L (ViT-L at 320 px; model name fah) is the default.

Apple silicon

FAH supports Core ML inference on Apple silicon. See the acceleration guide for export and timing instructions. Pose exports use float32 by default; throughput depends on the model, precision and device.

SAM 3D Body's hand branch vs FAH-L

Public test hands: input, SAM 3D Body hand branch and FAH-L, with per-hand PCK@0.1
bench2d v2 hands (held-out HOT3D benchmark clips, COCO and HInt with EPIC-KITCHENS-100 frames; ninth: synthetic low light), scored by per-hand PCK@0.1 against the 2D ground truth (numbers under the panels). One column per stratum (view, size, setting, skin tone, pose, two hands, back of hand, low light, blur): the first fitting hand in a fixed random order found by both with correct handedness (outdoor, blur: the first where FAH-L gains at least 0.1). FAH-L is 6.4× faster (65 vs 10 fps with CUDA graphs, 5.9 fps eager; desktop RTX 4070 Ti SUPER).
Left to right: 1 HOT3D benchmark clip-003029 frame 60; 2 EPIC-KITCHENS-100 via HInt, P18_02 frame 5994; 3 New Days via HInt, ND_DJnh5wqcr04 frame 16745; 4 “Luggage and all” by Sally Taylor (CC BY-NC 2.0) via COCO val2017 / COCO-WholeBody; 5 New Days via HInt, ND_YgnSpdJBNtc frame 60601; 6 New Days via HInt, ND_Uh5yhms9Zi4 frame 2991; 7 Flickr photo 7173995615 via COCO val2017 (CC BY-NC 2.0; author page no longer online); 8 EPIC-KITCHENS-100 via HInt, P09_02 frame 6972; 9 HOT3D benchmark clip-002044 frame 110, with our synthetic low light; 10 EPIC-KITCHENS-100 via HInt, P07_101 frame 16822. HOT3D: CC BY-SA 4.0, hand annotations CC BY-NC-SA 4.0; EPIC-KITCHENS-100 (Damen et al.): CC BY-NC 4.0; New Days of Hands (Cheng et al., NeurIPS 2023) frames via HInt (Pavlakos et al.; public test split; no separate frame licence stated); COCO-WholeBody: Jin et al. Overlays are ours.

BibTeX

@misc{cao2026fastaccuratehandestimation,
  title         = {Fast and Accurate Hand Estimation in Pixels, Interaction and World Space},
  author        = {Jinkun Cao},
  year          = {2026},
  eprint        = {2611.07711},
  archivePrefix = {arXiv},
  primaryClass  = {cs.CV},
  url           = {https://arxiv.org/abs/2611.07711}
}

Credits