AI3D-382 · before / after gallery
All numbers below are measured on the six validation segments 003 / 022 / 023 / 087 / 093 / 094, which were never used while tuning, plus the human-annotated ground truth on 085. Every image is a click away from full resolution; arrow keys / A D step through the images of one section.
| gate metric | BEFORE | AFTER | read |
|---|---|---|---|
| canopy recall above 10 m | 0.018 | 0.769 | the upper canopy was simply not painted before |
| canopy recall 4–10 m | 0.750 | 0.903 | positive on 6/6 segments |
| foliage-cell recall, segment-wide | 0.494 | 0.860 | unmasked remainder 16.1 M → 4.5 M points |
| hard-structure cells inside tree paint | 111 | 26 | hard points −75 %; down on 6/6 |
| signs / delineators | 4 / 88 | 5 / 88 | +1 real sign, 0 signs and 0 delineators lost |
| 085 GT precision | 0.489 | 0.543 | veg-tolerant 0.741 → 0.853 |
| 085 GT recall (annotator class “tree”) | 0.755 | 0.755 | unchanged — every precision gain cost zero true tree |
| runtime, worst segment | 308 s | 447 s | +45 %, still 37 % of the 20 min budget |
How to read the renders
Every close-up is one spot in the raw point cloud, always four panels wide, top row an oblique elevation view, bottom row the same points seen from above:
- true RGB — what is actually there.
- number_of_returns — the new signal: grey = single return (hard surface), orange = 2, red = 3+. Foliage is orange/red, guardrail and asphalt are grey.
- BEFORE — the detector's point masks with the packaged defaults.
- AFTER — the same masks with the recommended config.
unmasked tree medium_vegetation sign / delineator / pole guardrail other
Panels 3 and 4 use the identical viewpoint, extent, sub-sample and colour table, so anything that changes between them is a real change in the output. The dashed blue line marks 10 m — the height where the old candidate slab stopped. The title line of each render gives the exact position and the tree-painted point count before → after.
1. Whole segments, top-down
2. The main win — canopy recall above 10 m (0.018 → 0.769)
The old candidate slab stopped at 10 m
Pooled over the six validation segments: > 10 m 0.0175 → 0.7693, 4–10 m 0.7503 → 0.9031, segment-wide foliage cells 0.4942 → 0.8601 — positive on every one of the six.
3. Hard structure that used to be painted as tree
Billboards, lane markings, vehicle streaks and road slivers
Validation split: hard cells 111 → 26, hard points 137 009 → 34 057 (−75 %), hard fraction of the tree paint 0.00363 → 0.00068. 9 tree detections dropped, 9/9 road / mast / barrier, 0 vegetation.
4. Guardrail inside the foliage
Point-level unpaint using the seg3d guardrail masks
7 of the 7 largest unpainted blobs on the validation split were guardrail beam or single-return artefact. None was vegetation. The rail half-post CSVs are md5-identical on all six segments — the rail detection path itself is untouched.
5. Signs
One ghost killed, one real sign found, one plate cleaned
sign_post_with_plate detections of 82 and 91 points at h = 1.8 m: 173 magenta points floating in mid-air over bare asphalt, with no post and nothing underneath. AFTER: nothing. Real signs run 1 014–2 951 points per metre, these two ran 45–51 — a 20× margin.Validation split: signs 4 → 5, delineators 88 → 88, 0 signs and 0 delineators removed on any of the six segments, half-post CSVs md5-identical, cluster-verdict churn on the sign path 22 / 3 964 = 0.55 %.
6. Honest panel — what did not improve
Unchanged failures and the one real cost
lowrej_023_c3_s2 (−2860.99, −1920.11): a dry grass / reed bank on an embankment, labelled not_tree by two judges, painted as tree by both configs (100 278 → 100 782 points, i.e. no change). This class is ~67 % of the residual false positives on the 085 ground truth and is a definition question, not a bug: does vegetation attached under a tree count as tree?lowrej_087_c3_s0 (2456.99, 1312.86) is the only one of the 50 truth spots that loses paint: 436 623 → 425 309 (−2.6 %). The render shows why — the entire loss is the guardrail bar crossing the top of the circle. The crown itself is pixel-identical. 47/50 spots gain paint, 2 are unchanged, this one loses 2.6 %.guardrail_mask_unpaint_classes = ["w_beam"] plus mask erosion.Also unchanged and deliberately so: mega-instances. On 085 a single tree instance covers 102 × 75 m and holds every true positive and the road and rail inside it. Splitting it is seg3d’s job, not this detector’s.
Full accounting of costs, open items and the decisions Miro needs to make: AI3D-382 summary · guardrail pass detail: pass 9 report.