EgoWM Lane B — Iter 208 3-way Benchmark

Date: 2026-07-10 · Author: Haoran Geng (@geng-haoran) with Claude Opus 4.7 (1M context) · Branch: h200_1_dev

Fair 3-way comparison of the three currently-trained models — v8d, v9a, v9b — on the same ARCTIC val split (N=40 clips), running each ckpt's native inference recipe against Iter 206's oracle upper bound.

Quick links: Setup · Video · Dashboard · Numbers · Verdict · Blueprint report ↗


Experimental setup


Video (4-column side-by-side)

Three ARCTIC val clips shown in parallel. Columns from left to right: GT / v8d / v9a / v9b. Each column overlays the per-hand 21-keypoint skeleton and shows the per-frame MPJPE for that model in the top-left corner.

What to look at:


Dashboard (9-panel)

Iter 208 benchmark dashboard

A. Absolute MPJPE — all three models still >200 mm; oracle at 54 mm is achievable. B. Root-relative — v9b (92) < v9a (94) < v8d (102). Dense head is helping the trunk learn global orient even at 200 steps. C. Procrustes-aligned — all ~13 mm; hand shape has been solved since Iter 201. D. Wrist translation error — v9a/v9b worse than v8d because of misplacement from pixel error. E. Pixel error distribution — mean/median/quartiles per model; v9b tighter than v9a but still ~two orders of magnitude above the σ=5 px Iter 206 target. F. v9b error decomposition — most of the 222 mm absolute is wrist trans (130 mm), then global orient (79 mm), leaving only 13 mm shape. G. Gap to Iter 206 oracle — 157-172 mm for all three, no model yet in the "oracle neighborhood". H. Numeric summary table with all metrics side-by-side. I. Verdict + next steps (see below).


Full numeric results

Full N=40 clips, N=~1000 valid frame-hand pairs per model:

Metric (mm) v8d step 3000 v9a step 200 v9b step 200 Iter 206 oracle
absolute MPJPE 211.4 226.1 222.2 54.1
root-relative 101.9 94.2 91.7
Procrustes (PA) 13.3 13.8 13.4
wrist trans ~110 ~132 ~130 0
pixel error 335 px 327 px 0 px

(Bold = best in row for the trained models.)


Interpretation

  1. Hand shape is completely solved (PA ≈ 13 mm for all three models). This has been true since Iter 201's oracle bound — MANO betas + pose from pooled features are more than sufficient. No further shape-capacity work is needed.

  2. Root-relative error is decreasing across iterations: v8d 102 → v9a 94 → v9b 92. Even though v9b was only trained 200 steps, the dense root_head auxiliary supervision forced the trunk to learn better spatial-orient features, which the shared hand_head also benefits from.

  3. Absolute MPJPE regressed in v9a/v9b vs. v8d. This is not a training failure — it's because both models actively replace v8d's (mean-collapsed but center-ish) wrist translation with a lifted 3D point derived from a still-noisy pixel prediction (~327-335 px error). At high pixel error, the lift REPOSITIONS the wrist to worse places than the collapsed mean.

  4. The pixel error is the sole gating factor for absolute MPJPE. If pixel error dropped from 327 px to Iter 206's σ=5 px target, absolute MPJPE would drop from 222 mm toward the 54 mm oracle bound.

  5. v9b's 200 steps is not enough: v9a step 200 vs v9b step 200 shows only a small pixel-error improvement (335 → 327 px mean). But v9b's val_pix loss dropped 0.145 → 0.048 during training (−67 %), suggesting the model is still far from convergence.


Verdict

The architecture change is right; training needs to continue.

The Iter 207b dense root_head fix works structurally (val_pix loss trends down cleanly), but 200 steps of warm-start from v9a is not enough to reach the pixel accuracy that Iter 206 oracle requires for absolute MPJPE to fall below 100 mm. The three metrics tell a coherent story:

Next steps

Ordered by expected impact:

  1. Continue v9b training to 2000-3000 steps — the val_pix trajectory (0.145 → 0.048 at step 200) suggests it should reach 0.01 (RMS ~40 px) with more training. This alone should get absolute MPJPE below 120 mm.
  2. Add presence head — the 25% long tail on pixel error (p75=216 px in Iter 207b diag) is almost certainly out-of-frame frames that shouldn't be supervised.
  3. Implement Iter 208 full architecture (see blueprint): decoupled representation + VGGT point_head reuse + PnP-based lift. This is the route to <70 mm.
  4. Fix data-engine debts (asmhand mask, dexycb OOB, drop HO3Dv3) before scaling to full 33k pool.

Reproducibility

The benchmark was produced by:

python data_engine/comprehensive_3way_eval.py --n-clips 40 --n-video-clips 4
python data_engine/viz_iter208_3way_video.py --n-clips 3 --fps 8
python data_engine/viz_iter208_benchmark_dashboard.py

Ckpts required: - _ckpt/lane_b/v8d_all7_fixlabels/ckpt_step003000.pt - _ckpt/lane_b/v9a_arctic_lift/ckpt_step000200.pt - _ckpt/lane_b/v9b_arctic_dense_root/ckpt_step000200.pt

Outputs: - _logs/comprehensive_3way/summary.json — full metric breakdown - _logs/comprehensive_3way/video_predictions.npz — per-frame predictions for 4 clips - _viz/iter208_3way_comparison.mp4 — 4-column comparison video - _viz/iter208_benchmark_dashboard.png — 9-panel dashboard


Downloads

Asset Path
3-way comparison video (mp4, 3.9 MB) assets/videos/iter208_3way_comparison.mp4
Benchmark dashboard (PNG, 473 KB) assets/figures/iter208_benchmark_dashboard.png
Companion blueprint report iters/iter208_blueprint.md

Meta