3D reconstruction workbench — every stage, 20 samples

Not a results figure: this is the full chain with every tunable quantity exposed, so a defect can be attributed to a stage. Columns: 1 raw · 2 reference · 3 dI = img−ref (×3) · 4 max|dI| · 5 valid mask · 6 LUT bin observed? · 7 gx · 8 gy · 9 |grad| · 10 div(g) = Poisson RHS · 11 depth · 12 depth halo-removed · 13 radial profile vs analytic cap · 14 Open3D mesh. Reproduce: xvfb-run -a -s "-screen 0 1400x1000x24" python -m force_recovery.recon_study glowtact, then python -m force_recovery.recon_study page. The source here (GlowTact) is markerless, so the adopted marker step (marker_removal.stages_depth) is a bit-exact no-op on these frames; on a marker gel it inpaints the dots out of the reference and the frame before column 3.

What external ground truth did to this page

Everything below used to be scored against our own expectations. It is now scored against exact per-pixel ground truth — ray-cast mesh depth on 420 Tactile MNIST touches (mnist_validation) — and two of the three defects we published moved:

claimstatus after per-pixel GT
Flat-topped indenters over-dome badly (centre/rim 1.23–1.42 where 1.0 is correct) retracted and re-measured. Compliant gel wraps a flat edge, so c/r > 1 is expected: the true depth map of a pressed digit has c/r 1.400 (gel surface 1.334) and we reconstruct 1.539–1.562 (+10–12%); on an enclosed plateau control whose truth is exactly 1.000 we measure 1.069 (+7%). Most of the 1.23–1.42 in the table below is real curvature, not artefact.
Up to 22% of contact pixels land in unobserved LUT bins — a top defect demoted to a minor factor. On the GT set 13.8% / 16.9% of contact pixels are unobserved, and their correlation with per-touch Type-2 error is only 0.098 / 0.294. Still worth showing (column 6), no longer worth blaming.
The valid mask is halo-dominated confirmed and quantified. Against the true contact region the |dI| > 8 mask scores IoU 0.614, recall 0.917, over-segmentation 0.531 — it finds nearly all of the contact and then adds half as much again in halo.
(new) the photometric table is the weak link ruled out. LUT gradient direction vs true gel gradient is 24.4° on the GT renders against 26.1° for this table on its own real sensor — the same statistic, no worse off-domain.

The real headline: accuracy is a function of press depth

Same digit meshes, re-rendered at five penetrations, no per-frame fitting of any kind (the photometric table is calibrated once on that sensor's own sphere presses, the recipe we already use per sensor):

press depth [mm]0.300.601.00 1.502.25 (what the dataset ships)
MAE [µm]11.235.0 67.8127.4281.1
Type-2 error [µm]96.5186.3 308.6514.6961.8
peak ours / GT1.000.970.770.68 0.55

So the honest public claim is a range, not a number: at ≤0.6 mm this reconstruction is accurate on non-spherical ground truth with zero fitting; by 2.25 mm it recovers barely half the peak. No accuracy figure on this site should be quoted without the press depth it was measured at.

Per-sample diagnostics

centre/rim is reported descriptively — read it against the GT ratio for that geometry (1.33–1.40 for a compliant press), never against 1.0.

samplepeak [mm]unobserved LUTcentre/rim
GT for a compliant press: 1.33–1.40
grad angle
chance 90°
profile RMS
round z=2.12mm F=4.4N1.600%1.466.869
round z=3.21mm F=9.4N2.554%1.435.835
round z=3.80mm F=14.8N2.941%1.445.1105
star z=1.73mm F=3.0N1.612%1.44
star z=2.34mm F=8.0N2.0710%1.33
star z=2.96mm F=11.0N2.0314%1.36
star z=3.53mm F=16.0N2.3022%1.35
triangle z=2.28mm F=4.9N1.405%1.42
triangle z=3.11mm F=9.7N2.059%1.31
triangle z=3.75mm F=14.7N2.6610%1.32
quad z=2.16mm F=3.6N1.194%1.32
quad z=2.94mm F=9.2N1.759%1.24
quad z=3.52mm F=14.2N2.3210%1.23
quad_small z=1.51mm F=3.9N1.437%1.32
quad_small z=2.55mm F=9.2N2.516%1.35
quad_small z=3.47mm F=13.7N2.938%1.35
quad_small z=3.97mm F=17.4N2.6612%1.42
B z=2.91mm F=4.9N1.967%1.39
B z=4.04mm F=10.6N2.836%1.39
B z=4.48mm F=13.7N2.875%1.40

Grad angle and profile RMS are only defined where the indenter is a sphere of known radius (the round family): the LUT gradient sits 5.1–6.8° from the analytic sphere gradient and the radial profile matches the cap to 35–105 µm, so on this sensor the table and the solver are both sound. Every one of these frames is a deep press (1.5–4.5 mm) — i.e. the regime the sweep above shows is our worst.