A4_5 line-width production run

2026-07-21 · AI3D-346 · technical report for the 3DAI team

Summary

Step 7 ran over all 143 segments of Abschnitt 4_5 on Battlebox with the new two-edge line-width measurement (branch ai3d-341-line-width). 1778 lane segments were fitted with zero errors; 99.4 % of widths came from the plateau fit (11 mask-integral fallbacks, 40 flagged). Dashed lines median 0.151 m, solid lines median 0.286 m — matching the 0.15 m Leitlinie / ~0.30 m Randlinie standards. The production XML run7_lanes_20260721-120038.xml carries a <Width> element on all 1710 exported Lines/Splines, with a geoshift identical to previous runs. 5323 control plots and width-scaled overlays on the step-4 and step-6b intensity rasters were generated. Measured width overhead: +5.8 % fit time (isolated A/B).

Width results

typenmedianIQRp5–p95min–maxσw median
DASHED10550.151 m0.146–0.2180.142–0.3030.040–0.4951.3 mm
SOLID7230.286 m0.278–0.2930.256–0.3460.086–0.5970.9 mm

The dashed population is bimodal: the main mode sits exactly on the 0.15 m Leitlinie; a genuine secondary population near 0.30 m corresponds to wide (Breitstrich-type) dashes on exit/entry lanes — that is real paint, not fit error. Solid edge lines cluster tightly at 0.28–0.29 m. Median per-edge blur is ≈1 cm; Jacobian σw is ≈1 mm (optimistic under spatial correlation, as documented in the design report).

width plateau fit
Typical solid line (segment_050): two-edge plateau fit, w = 0.29 m, independent edge blurs.
line end fit
Line-end control plot (segment_000): rising-edge erf fit on the inward arc-length histogram.

QA & flags

fit 1767 mask-integral 11 flagged 40 errors 0

worn dash
Flagged narrow (segment_139, w = 0.04 m): worn dash, Gaussian profile, no plateau — flag fires correctly.
double line
Flagged wide (segment_134, w = 0.60 m): double-hump lateral distribution — two adjacent lines in one cluster.

All 5323 control plots (every accepted end + width fit, all 143 segments) are on Battlebox: /home/ai/ai3d346_linewidth/control_plots_full/. Control plots are off by default; future runs can enable them via the new opt-in histogram_dir config key in lane_segment_ends / lane_segment_width.

Overlays

The overlay renderer now draws each Line/Spline at its measured metric width (Value × pixels_per_meter) instead of a fixed 4 px stroke; flagged widths draw red. Rendered on both the step-4 road intensity tiles and the new step-6b cluster rasterizations (intensity channel — RGB cluster tiles are blank in this dataset, and the package default now uses intensity).

overlay on road raster
segment_050 on the step-4 intensity raster: dashes (yellow) and edge lines (magenta) drawn at measured width, road axis cyan.
overlay on cluster raster
Zoom on the step-6b cluster raster: the width-scaled dash stroke covers the cluster pixels (gray fringes visible at the ends where paint extends past the fitted axis span).
collage part
Collage part 2/5 (segments 29–57) over the cluster tiles.

XML

run7_lanes_20260721-120038.xml (17.8 MB) contains 1710 <Width> elements — one per exported Line and Spline:

<Width>
  <Value>0.12996</Value>
  <Sigma>0.02281</Sigma>
  <Status>fit</Status>
  <Flagged>false</Flagged>
</Width>

Value/Sigma are omitted when no width was measured (Status failed); the element is omitted entirely for segments without a measurement. Geoshift consistency: the new XML's <Geoshift> (725883.5409 / 5422097.8089 / 390.8318) is byte-identical to the previous production XML — the dataset's stored geoshift is loaded unchanged; none of the width changes touch coordinate frames.

Timing

measurementresult
Isolated A/B (width on/off, 47 clusters, quiet machine)+5.8 % fit time (mean 178 ms/cluster)
Direct measure_line_width callsmedian 44 ms, mean 87 ms
Heaviest mid-dataset clusters (315k–480k pts)ends+width = 1–2 % of an 11–24 s fit
Full run wall clock vs 2026-07-20 baseline106 → 151 min (+42 %) — contaminated

The +42 % wall-clock comparison is not attributable to the width code: the eval job ran concurrently on the same box for the first two hours and the control-plot generation for the last hour. The clean isolated numbers put the real overhead at ≈6 % (ends+width), shrinking to 1–2 % on the heavy middle segments where total time is dominated by the pre-existing solid-spline fitting. GPU offload was evaluated and is not worthwhile at ≤6 %. A further ~3 % is recoverable by sharing one axis frame between the ends and width fits.

Artifacts & code

whatwhere
XML with widths…/260416_Abschnitt_4_5/lane_points/run7_lanes_20260721-120038.xml (D: drive, Battlebox)
Full run log/home/ai/ai3d346_linewidth/step7_full.log
Per-cluster eval JSON/home/ai/ai3d346_linewidth/eval_full.json (1778 rows)
Control plots (5323)/home/ai/ai3d346_linewidth/control_plots_full/
6b cluster tiles…/lane_points/topdown_tiles_run6_clusters/
Width overlays (cluster tiles)…/lane_points/topdown_tiles_run6_clusters_run7_overlay_int/ + _collage/
Width overlays (road tiles)…/lane_points/topdown_tiles_run7_overlay_width/ + _collage/
PRcontent
modellinglines #8axis frame, ends rewrite, width measurement, snapshot + info_dict export, control-plot tooling, opt-in histogram_dir
modellingexport #3<Width> element on Line/Spline
visualizationoverlays #1metric-width rendering, flagged color, geoshift frame hint (integrated Battlebox WIP), step6b intensity default, v0.3.0

Battlebox wiring: LaneFinder pyproject.toml points iolabs-point-cloud-visualization-overlays at the branch worktree /home/ai/ai3d346_linewidth/overlays-width (editable); modelling-lines/-export ran via PYTHONPATH shadowing of the branch checkouts. The overlays repo's main checkout on Battlebox still holds the (now-integrated) uncommitted WIP — it can be reset once PR #1 lands.

Known issues & next steps