Downloads · 30 days
0
chomeed/dinov3-geohead-threading-d0
dinov3-geohead-threading-d0 is a robotics model from chomeed. Use it for the robotics task on the model card, and read the license before you ship it in a product.
Decode metric 3D object position from vision features on MimicGen threadingd0. Task requirement for reliable insertion is ~4 mm; the offset target (needle − tripod) is the decision metric, because relative pose is wha…
Downloads · 30 days
0
Access
Public
Updated Sep 2, 2026
Repo size
76.2 MB
Likes
0
Public
Click a slice to open those files.
.safetensors76.2 MB · 100%
From the Hugging Face model README
threading_d0Decode metric 3D object position from vision features on MimicGen threading_d0. Task requirement
for reliable insertion is ~4 mm; the offset target (needle − tripod) is the decision metric,
because relative pose is what the controller consumes.
All numbers are mean Euclidean distance in millimetres on held-out episodes — that is,
mean_i ||p_i − t_i||₂, the average 3D miss distance, not RMSE (an earlier revision of this card
called it RMSE; the code has always computed the mean of the per-sample norm). RMSE would be the
larger sqrt(mean_i ||p_i − t_i||²). Readout is a dual-form ridge (closed form, λ swept,
best-val) unless stated.
One caveat on offset (needle − tripod): roughly half its error comes from a small set of frames in
failure rollouts where the tripod has been knocked over and lies on the floor (z ≈ 43 mm against a
894 mm nominal height). Those frames are 1.6% of the evaluation set but are far outside the training
distribution of tripod positions. The needle number is not affected by this. Camera geometry: 45° fovy, 0.762 m to the target plane, 631 mm view height
→ 2.82 mm per pixel at 224 px; one patch-16 token spans ≈39.5 mm.
| readout on frozen DINOv3-S/16 | needle | offset |
|---|---|---|
| linear ridge probe (the campaign's baseline) | 11.3 | 19.3 |
| GeoHead, 9.6k train windows | 8.9 | 13.9 |
| GeoHead, 25k | 7.7 | 12.7 |
| GeoHead, 60k | 6.6 | 10.6 |
| GeoHead @448 px, 25k | 6.6 | 10.5 |
| target | 4.0 | 4–6 |
The geometry was never missing from frozen DINOv3 features — it was not linearly decodable. A 3.8M-parameter decoder recovers 2.4 mm on needle and 5.4 mm on offset at matched sample size, and keeps improving with data (~1.15 mm per 2.5× data, no saturation observed).
Decoder removed from the loop entirely: replay a stored sim_state, re-render, displace one object
by a known amount, re-render, and measure the feature change. The renderer is deterministic, so
re-rendering an identical state gives a bit-identical feature vector — a true zero noise floor.
| displacement | ‖Δfeatures‖ | d′ |
|---|---|---|
| 0 mm | 0.0000 | — |
| 1 mm | 10.52 | 4.85 |
| 2 mm | 14.01 | 5.99 |
| 4 mm | 17.88 | 5.64 |
| 8 mm | 23.60 | 6.59 |
| 32 mm | 45.32 | 6.74 |
A 1 mm displacement produces a large, consistent response. Every remaining millimetre is a decoding problem, not an information limit. Caveat: this measures signal in isolation, not signal against nuisance variation (arm motion, occlusion), so "present" ≠ "easily recoverable".
| intervention | result |
|---|---|
| model capacity — DINOv3 S / B / L (22M → 303M) | needle 11.3 / 11.4 / 11.8 — flat |
| patch size — DINO v1 s16 vs s8, identical pretraining | 12.5 vs 12.9 — flat/worse |
| native patch-8 at 28×28 (4× tokens) | needle 12.0, offset 19.4 — same as patch-14 |
| input resolution 224 → 896 px (16× tokens, upsampled) | needle 14.1 → 13.8 |
| TRUE 896 px pixels (sim-state replay re-render, same frames) | 7.7 → 8.2 — real pixels did not help |
| prediction-loss finetuning of DINO blocks | 12.0 → 18.7 / 20.2 — actively worse, PCA variance 44% → 82% |
| DINOv2 → DINOv3 at matched grid | needle 12.0 → 11.6, offset 19.3 → 19.1 |
| mean-pooling the patch grid | roughly doubles error, always |
Scaling the vision side is closed. Changing the readout is what moved the number.
| variant | fine grid | params | needle | offset |
|---|---|---|---|---|
| no upsampling | 14×14 | 1.90M | 9.2 | 15.4 |
| learned ×2 | 28×28 | 3.67M | 9.8 | 14.7 |
| learned ×4 | 56×56 | 10.75M | 8.8 | 14.7 |
| bilinear ×2 (parameter-free) | 28×28 | 1.90M | 9.6 | 14.5 |
| flat MLP (no soft-argmax) | 28×28 | 10.07M | 201.5 | 197.1 |
With no upsampling at all most of the gain is already there; a parameter-free bilinear upsample matches the learned one. Replacing soft-argmax with a flat MLP is catastrophic (201 mm). The active ingredient is the soft-argmax spatial prior, not the fine map and not nonlinearity per se.
Mechanism: soft-argmax returns the expected position of a spatial distribution, so the output moves continuously as probability mass shifts and can localize within a patch. A global linear map cannot express that. Measured: the head reads out at 6.6 mm from tokens spanning 39.5 mm.
| needle, n=25k | k=8 | k=16 | k=32 | k=64 |
|---|---|---|---|---|
| width 512 | 7.9 | 7.2 | 8.0 | 6.9 |
| width 256 / 1024 (k=16) | 7.6 / 7.1 |
Non-monotonic in k (32 worse than both neighbours) ⇒ single-run noise is ≈ ±0.5 mm.
Quadrupling keypoints to 384 scalars does nothing for offset. k=16, width=512 is at the optimum.
RGB 224² → facebook/dinov3-vits16-pretrain-lvd1689m (FROZEN, 22M) → 14×14 × 384
→ LayerNorm+Linear 384→256 → Conv3×3 → Conv3×3+PixelShuffle×2 → Conv3×3
→ fine feature map (256, 28, 28) ← consumed by the world model
→ 1×1 conv → 16 heatmaps → spatial softmax → soft-argmax (u,v,conf) per camera
→ MLP 96→512→256→12 = (eef, needle, tripod, offset) × xyz
GeoHead 3.83M trainable · world-model predictor 2.51M · trunk frozen. Two cameras
(agentview, robot0_eye_in_hand). Patch tokens start at index 5 (CLS + 4 registers).
Weights for the full 150k-window training run land in geohead/, wm_residual/ and
wm_absolute/ when the overnight pipeline completes. This card documents the measurement campaign
that selected the architecture.