Zone Delineation — HDBSCAN + Network-Constrained Buffering
Raw perception data gives us 315 pole locations. The question: what shape does each school zone take on the road? We answer this by directly buffering the computed extent LineStrings (Deliverable 2) — each extent already traces the road from START sign to END sign. HDBSCAN clustering was explored for initial grouping but superseded: since extents already define the zone path, buffering them is simpler and more accurate.
Stage 1: Spatial Clustering (HDBSCAN)
HDBSCAN (Campello, Moulavi & Sander, 2013, JMLR) is a hierarchical density-based clustering algorithm. Unlike DBSCAN, it requires no manual ε parameter — it discovers clusters at varying density scales automatically.
| Parameter | Value | Rationale |
|---|---|---|
min_cluster_size | 2 | Even 2 nearby poles form a valid school zone |
min_samples | 1 | Permissive — we want all poles assigned, not discarded as noise |
metric | Euclidean | On UTM EPSG:25833 coordinates (metres, not degrees) |
cluster_selection_method | EOM | Excess of mass — produces stable, well-separated clusters |
Noise points (label = −1) are promoted to singleton clusters. The algorithm runs in O(n log n) time — 315 poles cluster in under 1 second.
Stage 2: Road-Network Buffering
Alpha shapes or convex hulls around point clusters produce circular blobs — geometrically incorrect for road-following speed restrictions. Instead, we use network-constrained buffering, a standard GIS technique from transport planning:
road_geometry.csv (27,943 links). Also collect secondary segments within 50m for junction coverage.unary_union. At junctions, overlapping buffers merge into natural polygon shapes.Post-Processing
| Step | Operation | Result |
|---|---|---|
| 1. Extent clipping | Trim zone polygons to computed extent endpoints (from Deliverable 2) | 89 zones trimmed — eliminates road overshoot beyond restriction boundary |
| 2. Same-status merge | Adjacent clusters with identical classification within 30m are merged | 97 extent-based zones → 82 after merging nearby same-status zones |
| 3. Sliver removal | Remove polygon fragments < 200m² | 2 fragments removed |
Cross-Validation
Zone Status Definitions
| Status | Count | Definition |
|---|---|---|
| CONFIRMED | 43 | ≥70% of poles classified AUTO_APPROVE |
| MIXED | 2 | Both APPROVE and EXCLUDE poles present, neither dominant |
| NEEDS_REVIEW | 8 | REVIEW poles present, no APPROVE poles |
| EXCLUDED | 29 | 100% of poles classified EXCLUDE |
1. Dataset Summary
| File | Rows | Key Columns | Purpose |
|---|---|---|---|
schoolzone_speedlimit_signs.csv | 326 | pole_lat/lon, bearing, ndetections, speedlimit_gfrgroup, supplemental_gfrgroup | School zone START signs (our primary input) |
remaining_speedlimit_signs.csv | 11,607 | lat/lon, bearing, pole_lat/lon, ndetections, speedlimit_gfrgroup | END signs + all other speed signs (extent validation) |
road_geometry.csv | 27,943 | id (UUID), link_geometry (WKT), travel_direction, road_name, average_speed | Road network for graph walking |
school_pointsofinterest.csv | 4,780 (filtered: educational only) | suppliers, longitude, latitude | School proximity gate (G2) |
traffic_data/HERE_DA_*.csv.gz | 48.5M records | LINK-DIR, DATE-TIME, SPDLIMIT, MEAN, COUNT | Speed anomaly cross-validation (Feb 2026) |
mapillary_images/ | 1,850 images | pt{ID}_id{MAPILLARY_ID}_date_lat_lon.jpg | Visual confirmation, OCR temporal classification |
enriched_master_v7_classified.csv | 315 poles | pole_id, classification, decision_path, confidence, nearest_school_dist_m | Final output of gate pipeline |
Gate 1 — Tempo-30 Zone Check
Does this sign sit inside an existing 30 km/h zone?
Before treating a school sign as a standalone speed restriction, we check whether the area already has a blanket Tempo-30 zone. If it does, the school sign is just an advisory warning (Zeichen 136), not a separate speed limit. Including it as a new restriction would double-count the rule. We exclude those poles immediately — the 30 km/h limit was already mapped through the zone, not the school sign.
How it works
We load the Berlin open-data Tempo-30 zone polygons and test whether each sign's position falls inside one. Signs within a zone boundary go to EXCLUDE. Signs right on the edge (within ~20 m) get flagged as KEEP_STRICTER — possible boundary cases that need a human check.
Example — pole excluded by zone overlap
| Field | Value |
|---|---|
| Pole ID | 30 |
| Gate 1 result | EXCLUDE |
| Spatial evidence strength | VERY_STRONG |
| Sign type | SpeedLimit2V30 |
| Weekly detections | 863 |
| Nearest school | 80 m |
Contrast — pole that passes G1
For comparison, here is a sign that is not inside any Tempo-30 zone and continues through the pipeline:
| Field | Value |
|---|---|
| Pole ID | 55 |
| Gate 1 result | PASS |
| Nearest school | 8 m |
| Weekly detections | 71 |
| Final classification | AUTO_APPROVE |
Gate 2 — School Proximity Check
Is there actually a school nearby?
A school zone sign should be near a school. We search our database of 4,780 educational facilities — schools, kindergartens, after-school care — filtered to genuine educational use only (photography studios and shared office spaces were removed from the raw data). The sign must be within a sensible distance to count as truly associated with a school.
Distance distribution
The vast majority of school zone signs sit within 300 m of an educational facility — confirming the sign placement is genuinely associated with a school, not a stray detection.
Example — strong proximity confirmation
| Field | Value |
|---|---|
| Pole ID | 319 |
| Gate 2 result | positive |
| Nearest school | 5 m |
| School type | — |
| Confirmed facility name | Kindervilla am Griebnitzsee |
| Schools within 300 m | — |
| Confidence score | TRIPLE_CONFIRMED |
Example — no school found (gate negative)
| Field | Value |
|---|---|
| Pole ID | 112 |
| Gate 2 result | negative |
| Nearest facility | 412 m |
| Facility type | Kindergarten and Childcare |
| Final classification | AUTO_APPROVE |
Gate 3 — Street-Level Image Check
Can we see the sign in Mapillary photos?
We pull street-level photos from Mapillary — a crowdsourced image platform where drivers upload dashcam footage. An AI model (Florence-2 vision) scans each image looking for school zone signs, children crossing warning signs, and speed plates. A visual score from 0 to 1 is assigned based on: how many images show the sign, how recent they are, and whether the camera was facing the sign front-on rather than shooting it from behind.
Images older than a few years are down-weighted — a 2017 photo confirming a sign does not tell us whether that sign is still there in 2026.
Example — high confidence visual confirmation (Pole 240)
| Field | Value |
|---|---|
| Pole ID | 240 |
| Gate 3 result | positive |
| Visual score | 1.000 |
| Evidence tier | HIGH |
| Mapillary images found | 8.0 |
| Camera quality score | 0.90 |
| Front-facing camera ratio | 1.00 |
| Matched road | Onkel-Tom-Straße |
Detection overlay — AI model marks the sign
Cropped sign patch — sent to OCR for text reading
Unverified case — no usable images
Some poles have no Mapillary coverage at all, or only low-quality images taken from too far away. These are marked unverified — the sign may well be real, but visual confirmation is unavailable. The pipeline falls back to gates 1–2 and 5–6 for its confidence score.
| Field | Value |
|---|---|
| Pole ID | 0 |
| Gate 3 result | unverified |
| Mapillary images | — |
| Visual score | 0.0 |
| Final classification | AUTO_APPROVE |
Florence-2 Detection Examples
Florence-2 (Microsoft, 2024) runs on GPU to detect and localise signs in street-level images. Below: bounding box detections and cropped sign regions fed to OCR.
Gate 4 — Permanent vs Conditional Check
Is this sign always active, or only at certain times?
German school zone signs come in two flavours. Permanent signs (Zeichen 274, plain speed plate) apply 24/7 — including weekends, evenings, and school holidays. Conditional signs have a supplemental plate below them showing something like "Mo–Fr 7–16 Uhr" (weekdays 7 am–4 pm only).
We determine which type each sign is through three independent checks, then cross-validate them:
- Supplemental flag in probe data — HERE's fleet tagged whether a sub-plate was observed
- OCR on cropped sign images — we read the text directly from the Mapillary photo
- Speed pattern from 48 million probe readings — if traffic slows down specifically during school hours and speeds up after, that is a conditional zone signal
Example — permanent restriction (Pole 107)
| Field | Value |
|---|---|
| Pole ID | 107 |
| Gate 4 result | positive_permanent |
| Temporal class | PERMANENT |
| Speed limit | 30.0 km/h |
| Mean speed — school hours | 15.7 km/h |
| Mean speed — rest of day | 15.2 km/h |
| Supplemental flag | — |
| OCR result | — |
Example — conditional restriction with OCR confirmation (Pole 322)
Mo-Fr| Field | Value |
|---|---|
| Pole ID | 322 |
| Gate 4 result | positive_conditional |
| Time restriction found | Mo-Fr |
| Raw OCR text (excerpt) | 人 | 30 | Mo-Fr | 6-18h | 7 | 人 | 30 | moto- | store | GNOH | Mo-Fr | 6-18h | 人 | 30 | Mo-Fr | 6-18h | moto- | store | GM |
| Speed read from image | 30.0 km/h |
| Useful sign crops | 11.0 |
| Mean speed — school hours | — km/h |
| Mean speed — rest of day | — km/h |
| Speed drop | — km/h |
Gate 5 — Detection Confidence Check
How many independent probe vehicles confirmed this sign?
HERE's fleet of connected vehicles drives past signs repeatedly. Each week, the system clusters nearby detections and produces a count: how many vehicles reported seeing this sign this week. A sign seen by 2 vehicles once is much less reliable than one seen by 400 vehicles over many weeks.
We use two metrics together: the weekly detection count (how many vehicles per week) and the number of weekly snapshots (how many separate weeks this sign was detected). A sign that appears consistently over many weeks is far more trustworthy than a one-off burst.
Distribution of weekly detection counts
Most school zone signs have strong repeated confirmation — the median is 243 detections per week. The small tail of low-confidence signs gets flagged for human review rather than auto-approved.
Example — high confidence (Pole 107)
| Field | Value |
|---|---|
| Pole ID | 107 |
| Gate 5 result | HIGH |
| Weekly detections | 2568 |
| Peak detections (best week) | 2568 |
| Weeks with detections | 1 |
| Final classification | AUTO_APPROVE |
Example — low confidence (Pole 180)
| Field | Value |
|---|---|
| Pole ID | 180 |
| Gate 5 result | LOW |
| Weekly detections | 9 |
| Weeks with detections | 1 |
| Final classification | EXCLUDE |
Gate 6 — Bearing & Alignment Check
Does the sign face the right direction for the road it is on?
A school zone sign governs traffic approaching from a specific direction. The sign faces the oncoming traffic — so if the sign face points east (bearing 90°), it is controlling westbound traffic (the cars heading towards it). We check whether that implied road direction matches an actual road near the sign's location.
We also check whether the Mapillary cameras that photographed the sign were approaching it head-on (front-facing) rather than driving away from it (rear-facing). A clear front-facing view confirms the sign placement relative to traffic flow.
Example — good alignment (Pole 272)
| Field | Value |
|---|---|
| Pole ID | 272 |
| Gate 6 result | GOOD |
| Sign bearing (face direction) | 138.0° |
| Angle to matched road | — (match via proximity) |
| Matched road name | Rudolf-Breitscheid-Straße |
| Cameras facing sign front-on | 1% |
| Camera faces sign? | — |
Example — ambiguous bearing (Pole 0)
Ambiguous cases usually occur at junctions, one-way systems, or where the road network topology does not clearly match the sign orientation. These are sent to human review rather than auto-approved.
| Field | Value |
|---|---|
| Pole ID | 0 |
| Gate 6 result | AMBIGUOUS |
| Sign bearing | 73.0° |
| Matched road | Am Weinberg |
| Front-facing ratio | 0.0 |
Gate 7 — Sign Context & OCR Check
What do the nearby signs and the sign text itself tell us?
The final gate combines two checks in one pass:
- Context signs on the same pole or within a few metres — what other signs share this pole? A school sign next to a 30 km/h plate and a "StartBUA" (built-up area) marker is exactly what we expect. A school sign surrounded by motorway signs is not.
- OCR text extraction from the sign crop — we read the cropped sign image and look for: speed numbers, day/time text ("Mo–Fr 6–18 Uhr"), and any other restriction text on sub-plates.
Images older than 2020 are down-weighted because the sign may have changed since the photo was taken. The crop_n_useful field counts how many readable sign crops the model found in recent images.
Example — positive with time restriction OCR (Pole 228)
Mo-Fr| Field | Value |
|---|---|
| Pole ID | 228 |
| Gate 7 result | positive |
| Context signs found | confirming context: SpeedLimit2V30 at 15m; StartBUA at 35m; SpeedLimit2V30 at 0m |
| OCR text (all crops) | 大 | 30 | Mo-Fr | 6-18h | 人人 | 30 | Mo-Fr | 人人 | 30 | Mo-Fr | Mo-Fr | 6-18h | 人人 | 30 |
| Time restriction matched | Mo-Fr |
| Speed read by OCR | 30.0 km/h |
| Useful sign crops | 7.0 |
| Has time restriction | True |
Example — confirmed by context signs (no time restriction) (Pole 208)
| Field | Value |
|---|---|
| Pole ID | 208 |
| Gate 7 result | positive |
| Nearby sign context | confirming context: SpeedLimit2V30 at 40m; SpeedLimit2V30 at 0m; SpeedLimit2V30 at 17m |
| Speed plate seen | 30.0 km/h |
| Useful sign crops | 0.0 |
| Final classification | AUTO_APPROVE |
Example — negative (context does not support school zone) (Pole 107)
| Field | Value |
|---|---|
| Pole ID | 107 |
| Gate 7 result | negative |
| Gate 7 detail | CONTRADICTIONS: SpeedLimit2V90 at 0m (same direction, bearing_diff=0°) |
| OCR text | H | E | 3 | 3 | L | 1 |
| Weekly detections | 2568 |
| Final classification | AUTO_APPROVE |
| Classification | Count | % | Meaning |
|---|---|---|---|
| AUTO_APPROVE | 219 | 69.5% | All gates passed — high confidence valid school zone |
| EXCLUDE | 80 | 25.4% | One or more gates failed — not a valid school zone speed restriction |
| REVIEW | 16 | 5.1% | Borderline — gates partially passed, requires human validator |
School Zone Analysis
| Outcome | Zones | Notes |
|---|---|---|
| Confirmed | 60 | Of 74 evaluated zones |
| Needs review | 2 | Borderline confidence |
| Excluded | 12 | Not valid school zone speed restrictions |
DBSCAN Cluster Analysis
DBSCAN (ε=300m, min_samples=1, UTM EPSG:25833) groups poles sharing a geographic cluster into a single logical school zone unit. This corrects the broken nearest-school assignment (91% of poles were >1km from their assigned school under naive nearest-neighbour matching) and handles directional sign pairs (opposing signs for the same zone).
Zone status breakdown: CONFIRMED: 84 | EXCLUDED: 25 | NEEDS_REVIEW: 9 | MIXED: 19
Educational POIs used: 3985 | Mean poles per cluster: 4.5
| Cluster | Poles | Nearest School | ≤500m? | School Name | Status |
|---|---|---|---|---|---|
| 1 | 55 | 106.5m | ✓ | unified_schools | NEEDS_REVIEW |
| 10 | 28 | 350.2m | ✓ | unified_schools | MIXED |
| 2 | 26 | 39.1m | ✓ | School | NEEDS_REVIEW |
| 5 | 26 | 83.7m | ✓ | School | NEEDS_REVIEW |
| 23 | 8 | 62.6m | ✓ | unified_schools | MIXED |
| 0 | 13 | 414.9m | ✓ | unified_schools | NEEDS_REVIEW |
| 22 | 11 | 187.1m | ✓ | unified_schools | MIXED |
| 33 | 10 | 94.4m | ✓ | School | MIXED |
| 26 | 7 | 77.2m | ✓ | School | MIXED |
| 44 | 6 | 35.1m | ✓ | School | CONFIRMED |
| 13 | 5 | 15.8m | ✓ | School,Kindergarten and Childcare | MIXED |
| 17 | 5 | 50.2m | ✓ | Kindergarten and Childcare | MIXED |
| 24 | 5 | 37.6m | ✓ | School,Education Facility,Kindergar... | MIXED |
| 35 | 5 | 200.8m | ✓ | School | MIXED |
| 4 | 4 | 86.6m | ✓ | Kindergarten and Childcare | CONFIRMED |
4. Deliverable 2: Zone Extent — Graph Walking Algorithm
Once a pole is classified as AUTO_APPROVE, we determine how far the speed restriction extends along the road network.
Extent Results
| Termination Type | Count | % | Description |
|---|---|---|---|
| END_SIGN | 77 | 37.0% | Zeichen 274 termination sign found during walk |
| DEAD_END | 57 | 27.4% | Road topology ends (cul-de-sac, dead end) |
| ROAD_END | 49 | 23.6% | Link boundary reached |
| MIRROR | 17 | 8.2% | Opposing direction sign found — symmetric zone |
| MAX_DIST | 8 | 3.8% | 500m cap reached — unusual, flagged for review |
HERE’s hackathon brief defines exactly 4 ways a school zone speed limit ends. We implement 3 of the 4 types directly.
| HERE Type | Description | Our Rule | Count |
|---|---|---|---|
| Type 1 | Text with distance — sign says “Schule 30 / 2 km” | Not implemented | — |
| Type 2 + 3 | “End of SL” / “End of all restrictions” / EndBUA or new higher speed limit sign (e.g. 50 km/h) | END_SIGN |
77 |
| Type 4 | Bounding logic — road graph terminates (cul-de-sac) | DEAD_END |
57 |
| Type 4 | Bounding logic — road link ends, no continuation | ROAD_END |
49 |
| Type 4 | Bounding logic — inferred from opposite-direction pole | MIRROR_FALLBACK |
17 |
| Type 4 | Bounding logic — safety cap at 500m, flagged for review | MAX_DISTANCE |
8 |
END_SIGN catches both HERE Type 2 (cancellation signs: EndSpeedLimit2V30, EndRestriction, EndBUA) and Type 3 (new higher speed limits) in a single road graph walk against all 11,607 signs in remaining_speedlimit_signs.csv.
| Input | Source | Role in extent computation |
|---|---|---|
road_geometry.csv | Given (HERE) | 27,943 road links — the graph we walk |
remaining_speedlimit_signs.csv | Given (HERE) | 11,607 speed signs — END_SIGN termination points |
| Pole bearings | Given (HERE perception) | Sign facing direction → governed direction via +180° flip |
| Graph walk algorithm | Our computation | Walk road topology in governed direction, select best-bearing link at junctions |
| Termination detection | Our computation | 5 termination rules: END_SIGN, DEAD_END, ROAD_END, MIRROR, MAX_DIST |
| Spatial join (pole → road) | Our computation | UTM EPSG:25833 nearest-neighbour matching (not string ID matching) |
Extents are purely topological — no images, no ML, no external APIs. The algorithm is fully deterministic: same input always produces same output.
Verification: How do we know the extents are correct?
Three independent verification methods confirm extent accuracy:
- End sign cross-validation (80.3%) — For each computed extent, we searched
remaining_speedlimit_signs.csv(11,607 records — a completely separate dataset from the school zone signs) for END signs within 50m of the predicted termination point. 167 of 208 extents have an independently confirmed end sign. This is the strongest validation: two independent HERE perception datasets agreeing on the same physical location. - Road topology validation — DEAD_END and ROAD_END terminations (106 extents, 51%) are structurally correct by definition: the road graph has no further links. These cannot be wrong unless the road geometry itself is wrong.
- Distance sanity check — Mean extent length is 224m (range: 15m–500m). 92% of extents are under 400m, consistent with German school zone regulations which typically span 100–300m around school entrances. The 8 extents that hit MAX_DIST (500m cap) are flagged for human review.
End Sign Cross-Validation
For each computed extent, we queried remaining_speedlimit_signs.csv (11,607 records) for independent END signs within 50m of the predicted termination point. This is a fully independent dataset from the schoolzone signs — any match is genuine cross-validation.
5. Florence-2 Detection Pipeline
Signs occupy <5% of a typical Mapillary dashcam frame. Direct VLM queries on full images hallucinate at high rates. Our pipeline: detect → isolate → read.
- 1,850 Mapillary images fed to Florence-2 (GPU: Lightning AI L4, 23GB VRAM)
- Florence-2 object detection: 451 images contain sign-type objects
- 1,640 individual sign detections across all images
- Bounding box crops extracted (1,639 crops)
- Tesseract OCR on crops → regex extraction
- 35 poles yield time text; 32 yield confirmed speed text
5.1 Detection Example — Pole 00250
Full scene — Florence-2 draws bounding boxes around 30 km/h sign and supplemental time plate
Bounding box crop — sign fills the frame. Tesseract reads "30" + "Mo-Fr 6-18 h"
"Mo-Fr 6-18 h"
→ CONDITIONAL
5.2 Detection Example — Pole 00235
Zeichen 136 (school crossing) + 30 km/h plate — both detected
Crop — clear school crossing warning sign
5. Deliverable 3: Permanent or Conditional? — Temporal Classification
German law (ADAC confirmed) states that permanent school zone speed limits apply even during holidays, weekends, and night. Only conditional zones have time restrictions. The supplemental_gfrgroup flag in the CSV indicates a time modifier exists — but does not provide the actual hours. The only source of truth is the physical sign text.
Florence-2 Detection Pipeline
lang=deu. Raw text normalised: strip whitespace, lowercase, handle OCR errors (Uhr→Uhr, rn→m etc.).Mo[-–]Fr\s+\d{1,2}[-–]\d{1,2}\s+Uhr and variants (Sa, Schulzeit, Schulbetrieb, während Schulbetrieb). Only strict matches accepted. No partial/fuzzy matching.Anti-Hallucination Benchmark
| Approach | False Positive Rate | Method |
|---|---|---|
| Our pipeline (Florence-2 + strict OCR) | 5.4% | Detect crop → OCR → strict regex only |
| Gemini Flash (VLM baseline) | 89.8% | Direct VLM query for time restrictions |
The 5.4% residual false positive rate comes from OCR misreads on poor-quality images (distance blur, vehicle motion, weather). These are flagged with low confidence scores for human review.
6. ML Experiments — What We Tried
| Approach | Outcome | Root Cause | Lesson |
|---|---|---|---|
| Random Forest classifier | Circular | Feature engineering derived from ground truth labels | Feature leakage invalidates cross-validation |
| CLIP-GTSRB fusion | Failed | Model load failure; German signs not in GTSRB training set | Domain mismatch between GTSRB (US/generic) and German road signs |
| Attention model (sign detection) | Insufficient data | 315 poles insufficient for deep learning generalisation | Deep learning requires orders of magnitude more samples |
| Gemini Flash VLM (temporal) | 89.8% FP | VLMs hallucinate plausible-sounding time text from scene context | No VLM in decision loop — only strict OCR regex |
| QwenVL (image classification) | Lower accuracy | Lower performance than Florence-2 on sign region crops | Florence-2 better calibrated for object detection pre-processing |
| Florence-2 + OCR (final) | 5.4% FP | — | Detection → crop → strict OCR is the right architecture |
Map Enrichment — Correcting Road Speed Limits
Our pipeline does more than validate school zone signs — it surfaces cases where HERE's base map speed limit is wrong. When our confidence pipeline approves a school zone with a 30 km/h restriction, but the road link in the map database still carries a higher speed (50 or 70 km/h), that is a direct enrichment opportunity: the school zone sign changes the legal limit, and the map needs updating.
confirmed school zone says 30
represent enrichment cases
on a confirmed school zone road
map agrees with sign
Road Speed Distribution — AUTO_APPROVE School Zones
The chart below shows the distribution of road average_speed for all
AUTO_APPROVE poles that could be matched to a road link. Red bars indicate roads where
the current map speed exceeds 30 km/h — these are the enrichment candidates.
Top Enrichment Cases
Roads with the largest discrepancy between sign speed (30 km/h) and the current map speed. Compliance is the proportion of probe vehicle observations at or below 30 km/h — where this is high, real-world drivers are already honouring the restriction the map doesn't yet record.
| Pole ID | Road | Sign Speed | Map Speed | Probe Mean | Compliance | n_detections |
|---|---|---|---|---|---|---|
| 304 | L77 | 30 km/h | 43.6 km/h | 22.3 | 100% | 153 |
| 147 | B1 | 30 km/h | 43.4 km/h | 31.6 | 85% | 23 |
| 240 | Onkel-Tom-Straße | 30 km/h | 41.8 km/h | 35.6 | 60% | 425 |
| 199 | Fischerhüttenstraße | 30 km/h | 41.5 km/h | 26.8 | 100% | 389 |
| 238 | B1 | 30 km/h | 41.2 km/h | 26.1 | 100% | 140 |
| 232 | Konrad-Wolf-Allee | 30 km/h | 40.9 km/h | 30.4 | 85% | 182 |
| 236 | Lindenthaler Allee | 30 km/h | 40.7 km/h | 34.0 | 85% | 2479 |
| 139 | Mariannenstraße | 30 km/h | 40.5 km/h | 24.1 | 100% | 18 |
| 227 | Clayallee | 30 km/h | 40.4 km/h | 29.4 | 100% | 61 |
| 235 | Mariannenstraße | 30 km/h | 40.2 km/h | 24.1 | 100% | 16 |
matched_link_id
(UUID) joined to road_geometry.id. Of 219 AUTO_APPROVE poles,
182 had a matched road link with a valid average_speed.
The remaining 37 poles either had no link match or a null
average_speed in the road geometry dataset.
7. Speed Anomaly Audit
We analysed 48.5M HERE probe speed records (Feb 2026, weekdays 06:00–20:00) to cross-validate school zone classifications via observed vehicle behaviour.
The null result is informative: the gate pipeline classifications are not contradicted by observed probe vehicle speeds. Zones classified as AUTO_APPROVE show speed patterns consistent with active 30 km/h restrictions during school hours. Zones classified as EXCLUDE show no such pattern.
8. Tempo-30 Overlap Analysis
Germany has extensive Tempo-30-Zone (SpeedLimitZoneV30) coverage in urban areas. These zones (Zeichen 274.1) establish area-wide 30 km/h limits independent of school zone signs.
School signs inside an existing Tempo-30-Zone are excluded (Gate G6). In that context, the school sign (Zeichen 136 — "Achtung Kinder") is advisory only, not a separate speed restriction. The 30 km/h limit comes from the zone, not the school sign. Counting these as independent school zone speed restrictions would double-count existing restrictions.
9. Scalability and Business Value
Pipeline Properties
| Property | Detail |
|---|---|
| Deterministic | No LLM in decision loop — same data always produces same output |
| Threshold-tunable | Gate parameters (min n_detections, max proximity, max zone length) are config values — adjust without retraining |
| City-agnostic | OSM road network + Mapillary available globally — deploy to any city with HERE perception data |
| Auditable | Every pole has a full decision_path field showing exactly which gates passed/failed and by what margin |
| QA prioritised | REVIEW poles sorted by uncertainty score — human validators check highest-risk first |
| Siemens AX4 ready | Confidence scores + decision paths exportable as structured JSON for logistics routing integration |
Data Sources Fused
| Source | Used For | Scale |
|---|---|---|
| HERE Perception (44M vehicles) | Sign detections, n_detections confidence | 315 poles (Potsdam/SW Berlin) |
| Mapillary | Visual confirmation, temporal OCR | 1,850 images, 1,639 crops |
| OpenStreetMap | Road graph for extent walking | 27,943 links |
| Berlin Geoportal schools | School proximity gate G2 | 4,780 POIs (filtered) |
| HERE probe speed data | Speed anomaly cross-validation | 48.5M records (Feb 2026) |
| Florence-2 (ML) | Sign region detection in images | 1,640 bounding boxes |
10. Exclusion Case Studies
A robust validation pipeline must demonstrate it rejects false positives, not merely that it approves true ones. The 80 EXCLUDED poles are not pipeline failures — they are correct decisions. The three cases below show the pipeline correctly withholding enrichment where a school sign exists physically but does not constitute a standalone speed restriction in law.
Case Study 1 — Pole 89 (The Clearest False-Positive Trap)
Location: 52.423073°N, 13.313412°E | Gate result: EXCLUDE — G6 Tempo-30 zone overlap at 19.9m
Pole 89 carries a SupplementalTimeModifier flag, indicating a conditional restriction. It sits 187.9m from a school, has 18 recent Mapillary images (80 days old), a perfect visual confirmation score of 1.00, and a weekly detection count of 565 — 47% above the dataset mean of 385.
Case Study 2 — Pole 80
Location: 52.418526°N, 13.336783°E | Gate result: EXCLUDE — G6 Tempo-30 zone overlap at 24.0m
Pole 80 is structurally similar to Pole 89: school nearby, perfect visual confirmation, SupplementalTimeModifier present. Weekly detections (145) are below the dataset mean, but still comfortably above the minimum threshold — a naive detector would pass this. The Mapillary images are 320 days old (versus 80 for Pole 89), slightly reducing temporal confidence, but Gate G6 is the operative gate here. Zone overlap at 24.0m places it firmly inside Tempo-30 territory. Excluded correctly.
Case Study 3 — Pole 12 (Multiple Red Flags)
Location: 52.391018°N, 13.092919°E — Rudolf-Breitscheid-Straße, Potsdam | Gate result: EXCLUDE — G6 Tempo-30 zone overlap at 22.0m
Pole 12 is the most straightforwardly incorrect candidate in this set. Three concurrent failure signals converge:
- Zone overlap (G6): 22.0m inside a SpeedLimitZoneV30 — operative exclusion gate.
- Low detection count (G1 pressure): n_detections = 7, compared to a dataset mean of 385. Only 7 probe vehicles per week confirmed this sign — the noise floor, not a reliable signal.
- School far away (G2 pressure): Nearest verified educational POI is 1,733m distant — nearly six times the G2 proximity threshold of 300m. No school is in range to justify a school zone restriction at this location.
decision_path field, so a human validator reviewing this EXCLUDE decision sees the full picture — not just why it was excluded, but how many independent signals agree. This is the QA prioritisation layer at work: Pole 12 ranks near the bottom of any validator queue, requiring minimal human attention.
HERE Technologies Berlin Hackathon 2026 · School Zone Speed Limit Validation · Technical Evidence Document
Generated: April 2026 · Map: http://89.167.96.65:8081/transport_map.html