Traffic Sign Recognition
Traffic sign recognition spots standardized road signs early and reads their class, so speed limits and warnings reach planning before the car passes them.
Why Does This Exist?
A speed-limit sign matters 100 m before the car reaches it, when it spans barely a dozen pixels. Braking after passing it is a violation plus a hazard. Traffic sign recognition exists to buy that distance: detect tiny standardized objects early, classify them reliably under glare and rain, and hold the reading across frames until planning acts. Generic detectors miss the small-object and temporal parts.
For generic boxes see object detection and for single-shot heads see one-stage detectors.
Think of It Like This
Reading an exit sign through rain
You squint at a small green rectangle far ahead, guess the number from its shape, then confirm it across three wiper sweeps before changing lanes. The model does the same: fine-scale detection for the squint, classification for the number, tracking for the three sweeps. The analogy stops at guessing: the model must also report calibrated doubt when the sign is unreadable.
How It Actually Works
Input feeds a multi-scale detector where fine strides such as 8 pixels catch distant signs. Here stride means pixels per feature cell. Each detection yields a box plus a sign class from dozens of standardized types. Detections associate across frames, and a majority or confidence-weighted vote confirms the class before it reaches planning. Map priors can gate impossible classes, for example a highway-only limit on a city street is downweighted.
Worked example
A 60 km/h sign at 80 m spans about pixels on a 2 MP camera. A stride-32 head sees it as less than half a cell and misses it, while a stride-8 head sees about cells and fires. Across five frames the classes read 60, 60, 80, 60, 60: the single 80 from a glare frame loses the 4-to-1 vote and the car holds 60. That vote is the difference between a ticket and a smooth slowdown.
Code
This snippet votes a stable class across frames.
from collections import Counter
def stable_class(reads: list[int]) -> int: return int(Counter(reads).most_common(1)[0][0])
print(stable_class([60, 60, 80, 60, 60])) # -> 60print(stable_class([30, 30, 30, 50, 50])) # -> 30The second case holds 30 despite two late 50s. Hysteresis like this stops flickering limits.
Watch Out For
Backlit signs that classify with confidence
Sun behind a sign washes red borders to white, and the classifier still returns a confident wrong limit. The symptom is sudden braking for phantom restrictions at sunrise and sunset. The fix combines exposure-robust training, a reject option below an evidence threshold, and map gating before planning consumes the reading.
The Quick Version
- Signs must be read at distance when they are a dozen pixels wide.
- Fine feature strides catch what coarse heads miss.
- Frame-to-frame voting beats any single-frame guess.
- Standardized shapes help, but glare and blur still demand a reject option.
- Feed planning a confirmed class, not raw per-frame logits.