MacroHands: 3D hands and camera pose from egocentric video
MacroHands, our 3D hand tracking and camera pose models for egocentric video, in mono and stereo, against every open-source baseline we tested.
- Robotics data
- Hand tracking
TL;DR
- We introduce MacroHands: our state-of-the-art model family for 3D hands and camera path from egocentric video, with monocular (mono) and stereo variants
- MacroHands-Mono beats every open-source baseline we tested, including all stereo baselines (32.2 mm on SHOW3D [1] vs 55.9 for HaWoR [2], and 46.4 for the best stereo baseline)
- MacroHands-Stereo brings further improvements over Mono, with 2.5× lower error (13.1 vs 32.2 mm on SHOW3D, mostly due to better depth estimates)
- MacroHands handles partial and even brief full occlusions (on clips where the hands are often partly hidden it still finds 80% of hands vs at most 59% for baselines)
- MacroHands distinguishes wearer from other hands (0.2% of detections land on someone else's hands, vs ~24% for HaWoR), works on footage with gloves and in other common real-world scenarios where most models fall short
- Our camera pose is also state of the art, even more so when IMU is available (~4× less drift than DROID-SLAM [3] on Monado [4] and Aria Gen 2 [5])
- Send us a small sample of your footage (mono or stereo) and we'll run MacroHands on it for free, so your team can compare it with your current hand tracking.
The rise of egocentric video
Bigger and more capable robotics models keep getting released, trained on ever larger amounts of data. In our latest blogpost, we went deep into egocentric data, a cheaper and more scalable way than robot teleoperation to get training data, using simple head-strapped cameras.
Since then, interest in egocentric data has kept growing, and early results from NVIDIA (EgoScale, Zheng et al., 2026, earlier this year) and, more recently, Dyna (Dyna‑2, Dyna Robotics, 2026, pretrained on over a million hours of egocentric video) show real promise (Figure). On the commercial side, several companies have announced large run rates selling this kind of data.
But egocentric data has no actions by default. In our previous blogpost, "Turning Egocentric Video into Robot Actions", we discussed how researchers typically rely on hand tracking and retargeting to make it training-ready. We had also looked at the existing open-source hand tracking options, and how brittle they were on real-world egocentric footage.
Unfortunately, most of the 3D hand tracking models and pipelines available today still suffer from the same issues we had found: partial occlusions make footage unusable, hands become unreliable when operators wear gloves or work in crowded settings, or even when bare feet are visible (which many models mistake for hands). Overall, the estimates, especially depth (the distance from the camera), are far from good enough, despite the "sub-mm precision" claims from some vendors.1
We spent the last few months tackling this problem, and today we are announcing MacroHands, our family of 3D hand tracking and camera pose models for egocentric video. MacroHands comes in two variants: Mono, which works on footage from any single camera, and Stereo, which uses both views of a stereo rig.
MacroHands‑Mono beats every open-source baseline we tested, including the stereo ones on SHOW3D, and Stereo cuts the error by another 2.5×. Both keep tracking through occlusions and stick to the wearer's hands. They also estimate the camera pose, meaning where the head-mounted camera is and where it points in every frame, so the hands can be placed in the world as the wearer moves. Our camera pose beats leading open-source SLAM (Simultaneous Localization And Mapping) systems, and improves further when an IMU (Inertial Measurement Unit: the accelerometer and gyroscope built into most headsets and phones) is available.
Benchmarking 3D hands and camera pose
The first step in tackling a problem like this is establishing a benchmark with accurate ground truth labels. Unfortunately, for 3D hand positions and camera pose, getting ground truth labels after the fact is next to impossible, even for a human. A person can roughly place 2D keypoints, but 3D depth is extremely tricky. Occluded hands are another big issue, and so is estimating how the camera moved. You can see for yourself how hard this is by guessing them in Figure and Figure below.
So the ground truth has to be captured while the footage is recorded. For hands, datasets use motion capture: ARCTIC (Fan et al., 2023) and HOT3D (Banerjee et al., 2025) track small markers on the hands with a studio camera system, and SHOW3D (Rim et al., 2026) uses a backpack rig of outward-facing cameras, synchronized with the headset, and no markers. For camera pose, the reference comes from the device's own closed-loop tracking (Aria Gen 2, Meta Reality Labs Research, 2025) or from an external tracking system (SteamVR Lighthouse in Monado, de Mayo et al., 2025). All of this needs a studio or special hardware, which is why only a handful of such datasets exist.
Evaluating 3D hands
Each hand is represented by 21 keypoints in 3D: the wrist and four joints along each finger, in the camera's own coordinates.
We used the following datasets as benchmarks:
| Dataset | Device | Size |
|---|---|---|
| SHOW3D (Rim et al., 2026) | Quest 3 stereo | 93 scenes, 32 people, 0.89 h |
| HOT3D (Banerjee et al., 2025) | Quest 3 stereo | 6 sequences, 6 people, 0.21 h |
| ARCTIC s05 (Fan et al., 2023) | egocentric camera (mono) | 34 recordings, 0.24 h |
We focus on two kinds of metrics: the mean error in millimeters between predicted and ground-truth joint positions (MPJPE), and recall of full hand detections. Most papers report MPJPE only after aligning the prediction to the ground truth: at the wrist (root-relative MPJPE), or also in rotation and scale (PA-MPJPE). While we still report PA‑MPJPE, as it isolates hand shape quality, our main metric is the error with no alignment at all, which we call Cam-MPJPE, since real footage has no ground truth to align to. Alignment also hides the hardest part, predicting depth (see Figure).

Metrics:
- Cam-MPJPE (mm): the average distance between predicted and true joints in camera space, with no alignment, reported as mean / median / 90th percentile.
- Recall: the share of ground-truth hands the model finds. A hand counts as found when the model labels it correctly as left or right, and the box around its predicted joints (projected into the image, no padding) overlaps the box around the true joints with IoU > 0.5.
- PA-MPJPE (mm): the joint error after aligning each predicted hand's rotation, translation, and scale to the ground truth, so it measures hand shape only.
Extended benchmark details+
- Full sequences at 30 fps (SHOW3D is released at 60 fps; we use every second frame to match the usual camera frame rate).
- A hand is scored when ≥12 of its joints are inside the main camera image; all its labeled joints count, off-screen ones included. This rule only looks at the main camera, so stereo models, which also see the second camera, are scored on exactly the same hands as mono models.
- GT quality: frames failing the dataset's own QA (HOT3D qa_pass, ARCTIC validity filter) are not scored. SHOW3D: frames where the released headset pose is frozen (exact repeat of the previous frame) misplace the hand labels; scenes with >5% such frames are dropped (3) and the other 207 frames are not scored (see Full sampling and scoring details below).
- Baselines use their public code and weights with the settings their authors recommend, with no retraining or tuning on these benchmarks, and get the same input frames as MacroHands.
Full sampling and scoring details+
Benchmark sampling. Every listed sequence is used in full, at 30 fps.
| Benchmark | Sequences | Cameras and images |
|---|---|---|
| HOT3D | 6 Quest 3 sequences with public ground truth, one per participant: P0002_45904c71, P0003_90feb35f, P0010_5edabbe9, P0013_b6ee6ae4, P0017_1a07e9e7, P0018_2188e5dc. 22,608 frames at 30 fps. | Quest 3 front tracking cameras 1201-1 and 1201-2, each fisheye rectified to one shared upright 512×640 pinhole camera. Left = scored camera. |
| SHOW3D | 96 scenes, 3 per subject for all 32 subjects of the release with hand pose (train split, the only split with released hand pose). Per subject, scenes are taken in md5(scene_id) order, skipping any activity already taken, so the set covers 96 different activities. 3 scenes are dropped and 207 more frames are not scored because the release's headset pose is frozen there (an exact repeat of the previous frame), which misplaces the hand labels: 93 scenes, 95,857 frames, 60 fps release used at 30 fps. The excluded scenes and frames are published with the sequence lists. | Quest 3 headset0 and headset1, the released undistorted 1024×1280 portrait images. headset0 = scored camera. |
| ARCTIC s05 | All 34 recordings of the validation subject s05. 25,917 frames at 30 fps. | Egocentric camera 0, undistorted with its calibration and resized to 672×480. |
Ground truth.
- 21 joints per hand (wrist, then 4 per finger). SHOW3D labels 20 (no thumb base joint).
- A joint counts as labeled when it is at least 5 cm in front of the camera and passes the dataset's own quality flags: HOT3D qa_pass and hand_pose_available; SHOW3D annotation confidence above 0.5 and a tracked (not synthesized) headset pose; ARCTIC frames in EgoForce's hand-present list with the visible_hand flag.
3D hand scoring.
- All predictions and ground truth are in the scored camera's frame, in millimeters.
- Left/right comes from the model's own label, with no re-matching.
- Errors are pooled over all scored joints of all output hands: no per-hand or per-sequence averaging. Hands that are not output only lower recall.
- PA-MPJPE aligns each predicted hand to ground truth with the best similarity transform (scale, rotation, translation), for hands with at least 4 scored joints.
Evaluating camera pose
For every frame we also need the camera pose: the camera's rotation and translation in a fixed world frame (the camera-to-world transform). It is what places the hands from every frame in one shared 3D space, so the motion of the hands can be told apart from the motion of the head.
We used the following datasets as benchmarks:
| Dataset | Device | Size |
|---|---|---|
| HOT3D (Banerjee et al., 2025) | Quest 3 stereo (no IMU) | 6 sequences, 0.21 h |
| Monado Index (de Mayo et al., 2025) | Valve Index stereo + IMU | 11 recordings, 0.99 h |
| Aria Gen 2 Pilot (Meta Reality Labs Research, 2025) | Aria Gen 2 stereo + IMU | 12 recordings, 1.10 h |
We compare the predicted camera path with the reference path. The same caveat as for hands applies: SLAM papers usually report the absolute trajectory error (ATE), the camera position error over the whole recording, only after fitting the predicted path to the reference with a rotation, translation, and scale. Our metrics fit no scale (ATE after one rigid alignment, RPE 1 s, and scale error), because getting the size of the motion right is the hardest part with a single camera (see Figure).


Metrics:
- RPE 1 s (cm / °): the error of the camera's motion over every 1-second step, translation and rotation, with no alignment.
- Scale error (%): for every 1-second step where the camera moved more than 5 cm, we divide the predicted distance traveled by the true one. The scale error is how far the median of these ratios is from 1 (e.g. 10% if the camera's motion comes out 10% too long or too short).
- ATE (cm): the camera position error (RMSE) over the whole recording, after one rigid alignment of the whole path with rotation and translation only, no scale (often called ATE-SE3).
Extended benchmark details+
- Full recordings, capped at 30 fps, the frame rate of most egocentric footage: HOT3D at 30 fps and Aria Gen 2 at 15 fps (their native rates), Monado at 27 fps (every second frame of its native 54 fps). Every method gets the same frames.
- Baselines use their public code and weights with the settings their authors recommend, with no retraining or tuning on these benchmarks, and get the same frames and calibrated intrinsics as MacroHands.
Full sampling and scoring details+
Benchmark sampling.
| Benchmark | Sequences | Cameras and images |
|---|---|---|
| HOT3D | 6 Quest 3 sequences with public ground truth, one per participant: P0002_45904c71, P0003_90feb35f, P0010_5edabbe9, P0013_b6ee6ae4, P0017_1a07e9e7, P0018_2188e5dc. 22,608 frames at 30 fps. | Quest 3 front tracking cameras 1201-1 and 1201-2, each fisheye rectified to one shared upright 512×640 pinhole camera. |
| Monado Index | MIPT02, MIPT03, MIPP06, MIPP01, MIPB03, MIPB01, MIO13, MIO12, MIO01, MIO04, MIO02 (VR games and hand-heavy sessions). Left out: calibration recordings, recordings under 11 s, and one 37-minute session. Used at 27 fps (half the native 54 fps). | Valve Index stereo fisheye pair (13.4 cm baseline), undistorted. Ground truth: SteamVR Lighthouse tracking. |
| Aria Gen 2 Pilot | walk_0, walk_1, clean_0, cook_0, eat_0–eat_3, play_0–play_3: complete recordings with a closed-loop trajectory, longest first within each activity, taken in turn across activities. 15 fps. | Aria Gen 2 front stereo pair, rectified. Reference: Aria MPS closed-loop trajectory. |
Camera pose scoring.
- Scored at the ground-truth timestamps. A prediction is interpolated there when two predicted frames are at most 0.2 s apart, and counts as missing otherwise.
- We score each recording separately and report the average over all recordings, weighted by length.
MacroHands‑Mono
MacroHands‑Mono needs only one camera: from ordinary video, it predicts the 21 joints of each of the wearer's hands directly in 3D, in the camera's own coordinates.
On the benchmarks (Figure), MacroHands‑Mono is the most accurate model on two of the three datasets and finds nearly every hand on all of them. The clearest case is SHOW3D, which none of the models compared here has trained on: our joints land 32.2 mm from the truth on average, against 55.9 mm for HaWoR, the best open-source baseline, which also misses about one hand in five. We fall slightly behind only on ARCTIC, where ACE‑Ego‑Hand, trained on ARCTIC itself, reaches 18.7 mm to our 19.4 mm. MacroHands has never seen an ARCTIC frame, not even from its training split.
Quest 3, 93 scenes, 32 people, 143.9k hands. No model in the comparison trained on SHOW3D.
Ruler test
The only 3D hand benchmark where a baseline has lower error than ours is ARCTIC (18.7 vs 19.4 mm), and that baseline, ACE‑Ego‑Hand, trained on ARCTIC's training split. This is a small example of a bigger problem: benchmark contamination. Early on, when we tested hand-tracking models for our own use, we kept seeing models post great numbers on the benchmarks they had trained on, then lose depth entirely on footage from a different device. We think the cause is scarce data: there are only a handful of labeled 3D hand datasets, so most models train on the few that can be used as benchmarks. The cameras, people, and rooms in a benchmark's training split match its test split, so a model only has to learn the typical hand sizes and distances of those recordings to score well.
Testing for this properly means recording your own held-out ground-truth dataset in a motion-capture studio, which takes time and money. But the gap is often so large that a far simpler test shows it. Take a phone with known camera intrinsics and a tape measure, and turn off video stabilization (since it crops and shifts the image, invalidating the intrinsics). Then record yourself placing your wrist at 10, 20, 30, 40, and 50 cm along the tape (50 cm is a stretch, but doable), run the model with the phone's intrinsics, and compare its wrist depth with the tape.
Your measurement will only be good to 1–3 cm, but that should be plenty. Many of the other hand-tracking models we tried were not off by a few centimeters, but by 10 to 20 cm, and the error grew the further the hand moved from the camera. If you are benchmarking a hand-tracking model, we think this is the first test you should run.
0.0 sMacroHandsno hand
Finding the right hands
Beyond depth, the second problem we kept running into on real egocentric data was how well models find and track the right hands in the first place. Unlike benchmark videos, real footage is full of things that trip them up: other people's hands reaching into the frame, the wearer's bare feet (which can look a lot like hands), the wearer's own hands disappearing behind the tools they hold, and work gloves, which fully occlude the hands.
The benchmark. To measure how well our model and others handle these cases, we built an internal benchmark of egocentric clips that none of the models trained on. Every frame is hand-labeled with a bounding box for each of the wearer's hands, marked left or right. We also label the hands of other people in view (about a third of all labeled hands), and a model that reports one of them as the wearer's is marked wrong. Clips are also tagged by situation: feet in view, occlusion, gloves, and no wearer hands.
Scoring. We score every model the same way, from the 3D hands it outputs. We project its 21 joints into the image and take their outline, padded by 15% (our labeled boxes are hand-drawn and a bit larger), as the box. A detection is correct when its score is above 0.5 and its box overlaps the labeled wearer hand by at least 50% (IoU ≥ 0.5). AP50, the average precision at that overlap, combines precision and recall over all confidence thresholds; higher is better.
Everything else is an error. A box that is not correct goes to the labeled hand it overlaps most, if that overlap is at least 20%: the correct hand (the box is only partly on it), the wearer's other hand (left/right swapped), or someone else's hand. A box that overlaps no labeled hand by 20% is a false detection. A wearer hand with no correct box is missed. The chart below shows both sides: what happened to each of the wearer's hands, and where each box the model reports lands.
All clips. MacroHands puts 0.2% of its boxes on someone else's hand; HaWoR, HaMeR, and WiLoR each put 23.6% there.
MacroHands finds 83% of the wearer's hands at 84% precision. The strongest baseline, HaWoR, finds 51% at 66%.
The gap is widest when someone else is in the shot. On clips with long stretches of no wearer hands, often with another person's hands in view, the right answer is to output nothing. There, none of MacroHands' boxes land on another person's labeled hands, while HaWoR, HaMeR, and WiLoR put 89% of their boxes there.
The baselines also lose the wearer's hands exactly where the footage gets hard. With gloves on, the best of them finds 48% (MacroHands: 79%). Under occlusion, 59% (MacroHands: 80%).
We can't release this benchmark because it contains internal data, but Figure shows examples from open-source videos.
- Left hand
- Right hand
- Wrist
MacroHands‑Stereo
Everything so far used one camera. While MacroHands‑Mono is fairly accurate, it can still get depth wrong. Stereo cameras help with depth by adding a second, slightly shifted view of the same scene (see Figure). We trained a variant of our model specifically to ingest stereo footage: MacroHands-Stereo. MacroHands‑Stereo's error drops from 32.2 mm to 13.1 mm on SHOW3D, two and a half times lower, and from 12.2 mm to 10.6 mm on HOT3D. The hardest frames improve just as much: the 90th-percentile error falls from 65.0 mm to 24.7 mm on SHOW3D, and from 23.8 mm to 19.2 mm on HOT3D.


Only two of the benchmarks originally used for mono have stereo footage: SHOW3D and HOT3D, both recorded with the two front cameras of a Quest 3. ARCTIC's egocentric view comes from a single head-mounted camera, so it appears only in the mono results. Mono models are scored on the left camera, on the same hands. Surprisingly, the other models built for stereo do little better than the mono baselines. UmeTrack (Han et al., 2022), Meta's multi-view hand tracker and the best of them, is at 46.4 mm on SHOW3D against 55.9 mm for HaWoR with one camera, and at 46.2 mm on HOT3D against 48.4 mm for HaWoR*.
Quest 3, both cameras, 93 scenes, 32 people, 143.9k hands. No model in the comparison trained on SHOW3D. Mono models see the left camera and are scored on the same hands.
The gain is almost entirely depth. After Procrustes alignment (PA‑MPJPE), the two models are level on SHOW3D, 8.5 mm with two cameras and 8.4 mm with one. What a second camera adds is how far away the hand is, which a single view can only infer from appearance. So if you're choosing a capture rig, we recommend stereo. If you already paid for large amounts of mono footage, MacroHands‑Mono still beats every stereo baseline we ran.
Camera pose
As we showed in our previous post, knowing how the hands move relative to the camera is not enough. Robot training and scene reconstruction both need to know where the camera itself is going, so we trained our model to also estimate camera movement.
The camera path matters at two scales: over a whole recording it must not drift, so the scene can be rebuilt or turned into a simulation, and over a single second it must be precise, since that is the horizon over which policies are typically trained to predict action chunks. We designed our pipelines for both uses and report the error at each scale. Monado and Aria Gen 2 also record an IMU (motion sensor), and MacroHands uses it when available. On HOT3D, which has no IMU, every method uses only the cameras and MacroHands still leads (0.96 vs 1.22 cm RPE in stereo).
Quest 3, 6 sequences, 0.21 h.
As with the hands, a single camera struggles most with depth: from the images alone, a 10 cm step and a 100 cm step can look the same. DROID‑SLAM with one camera gets the size of the motion wrong by 66% to over 800%, and even ViPE, which estimates metric depth, is 10–12% off. MacroHands‑Mono stays at 5–8%, and over a full recording it drifts less than DROID‑SLAM does with two cameras, on all three headsets. With stereo, MacroHands drifts two to four times less than DROID‑SLAM stereo.
Putting it together: hands in the world
Finally, with both components in place, we can measure what a robot policy actually learns from: how the wearer's hands move through the world, seen from where the wearer was looking when the motion started.
We measure it with Action MPJPE, the metric from our previous post. For every frame, we take the hand motion over the following chunk, place the predicted joints with the method's own camera path and the true joints with the true one, both relative to the camera at that first frame, and compare them joint by joint with no alignment. A hand that looks right in the image but is carried along by a drifting or wrongly scaled camera still counts as wrong. We report 1 s chunks, as in the previous post, and 2 s chunks (Figure).
We leave SHOW3D out here, because its released camera poses miss large head turns in 25 of its 93 scenes. Its hand labels stay accurate in those scenes, but its world camera path does not.
Quest 3, 6 sequences, stereo and mono.
*Trained on these sequences.
Over a one-second chunk, MacroHands keeps the hands within 13.6 mm of the truth on HOT3D with stereo and 15.9 mm with a single camera. HaWoR, with its own SLAM, is at 65.9 mm, four to five times further off. On ARCTIC, MacroHands‑Mono reaches 26.9 mm against HaWoR's 67.8 mm.
Conclusion
Most open-source hand trackers fall short on real egocentric footage, and each gap shows up further down the pipeline. Missed hands lower the yield of your data, throwing out valuable recordings, while hands that jump onto other people or feet put nonsense actions into training and destabilize it. Imprecise hand shapes make fine manipulation harder to learn, and depth errors of 5 cm or more on real footage teach a robot to reach for the wrong place.
We believe the quality of the data, and of the targets extracted from it, is the main lever for better robot policies. That is why we built MacroHands: over the one-second chunks a policy learns from, its hand trajectories are four to five times closer to the truth than the best open-source pipeline we tested on HOT3D, and more than twice as close on ARCTIC. Both variants are available today, and the easiest way to try them is on your own data:
Send us a small sample of your footage, mono or stereo, and we'll annotate it with MacroHands for free, so your team can compare the results with your current hand tracking.