Round-2 report — stroke & schedule ruled out

2026-07-11 · AI3D-338 · linebitmapsegmentation · program plan · round 1

Summary

Round 2 closed both open model-side levers, and both are nulls. (1) Per-class label stroke at physical paint width ({solid: 5, dashed: 3}): on both loss families, solid metrics reproduced round 1 exactly and dashed centerlines stayed found (clDice ~0.96–0.97) — the models simply painted the thinner label they were taught; only the measuring ruler moved. (2) 90-epoch schedule: early-stopped at 53 with test F1 0.8703 ≈ round-1's 0.8678 — the 60-cap was never binding. Together with round-1's data-volume null, the program has now confirmed from three independent directions that the remaining gap is label-geometry/data. One cheap implementation lever remains before declaring the exit: foreground-only class averaging in the dice/Tversky losses (background dilution), running as round 3.

Results (held-out 97-tile test)

Stroke runs — two rulers (native = s5d3 labels; yard4 = round-1 scalar-4 ruler)

runrulerF1 fgF1 S/DclDicecov S/Darea S/D
ft_r34_260624_s5d3
(best ep 24/35)
native0.83900.858/0.8200.9610.920/0.9131.14/1.10
yard40.82910.858/0.8010.9690.920/0.6941.14/0.73
dice_focal_260624_s5d3
(best ep 35/46)
native0.85290.865/0.8410.9620.883/0.8581.04/1.04
yard40.80420.865/0.7430.9670.883/0.6031.04/0.62
Round-1 references (yard4 ruler): ft_r34 0.8678 · cov 0.916/0.938 — dice_focal 0.8750 · cov 0.875/0.889

The bold dashed numbers are geometry, not regression: a model taught 3 px dashes covers 3/5 of a 5 px ruler (0.73 and 0.62 area ≈ 3/5 with fit error). Solid columns are byte-identical to round 1 on both families — a clean negative control, exactly as predicted once the odd-width quantization discovery showed solids were already painted at physical width.

Schedule control

runF1 fgclDicecov S/Dbest ep / trained
ft_r34_260624 (r1, cap 60)0.86780.9750.916/0.93854 / 60 (no early stop)
ft_r34_260624_e900.87030.9750.911/0.92447 / 53 (early stop)

Verdicts

Round 3 — last implementation lever, then exit

Per Miro's priority (recall > precision), one genuine wiring flaw found during the dice-loss review is still untested: smp's multiclass Dice/Tversky average over all classes including background by default. Background dice saturates ~0.99 within epochs, so a third of the loss is a flat constant diluting the marking-class gradient — a plausible recall drag. smp exposes classes=[1, 2]; our registry doesn't pass it.

runchangequestion
ft_r34_260624_fgTversky with classes=[1,2] Does removing bg dilution buy real coverage on the recall anchor?
dice_focal_260624_fgdice term with classes=[1,2], focal unchanged Does the calibration anchor recover FT-level coverage?

Registry change (~3 lines, expose classes) delegated to Grok 4.5 in Cursor. Scalar-4 labels, 90-epoch cap, seed 1337 — directly comparable to rounds 1–2. Exit rule: if coverage gains stay inside the seed band, the program declares data/label-geometry the bottleneck (three nulls + round-1 volume null) and closes with a final program report naming the ship checkpoint and the concrete data work (gore/wide-paint representation, faint-tile confirmation pass, asphalt-edge rule).