YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
classify_nl_traffic_signs
YOLOv26 image classification model for identifying Dutch traffic sign classes. Trained on cropped sign images from the Panoramax platform.
This model is the second stage in a two-step pipeline:
- Detection β
Panoramax/detect_face_plate_signlocalises the sub-sign crop - Classification β this model identifies the traffic sign class from the crop
Which signs are included?
The model includes the most common traffic signs in the Netherlands, such as warning signs, priority signs, parking signs, and speed signs. It classifies the signs by the Dutch RVV-code (RVV 1990), for example A1 for a speed limit sign. A full overview of these classes can be found below. In addition, the model also includes some signs that are not strictly traffic signs but are nonetheless detected as a sign by the detection model. Some of these include dry standpipe connection points (droge blusleidingen), chevron signs (bochtschilden), channelizing panels (geleidebakens), a few nautical traffic signs such as max speed for boats, and no-alcohol signs.
Model details
| Property | Value |
|---|---|
| Architecture | YOLO26s-cls (Ultralytics) |
| Base model | yolo26s-cls.pt (pretrained ImageNet) |
| Fine-tuning epochs | 30 |
| Input size | 224 Γ 224 px |
| Classes | 170 |
| Training images | 19,374 |
| Validation images | 4,760 |
Classes
The following are the classes that have an official code:
| ID | Class | Description |
|---|---|---|
| 0 | A04-15 |
adviessnelheid_15 |
| 1 | A04-30 |
adviessnelheid_30 |
| 2 | D02-LO |
arrow_left |
| 3 | C04-L |
arrow_left_rect |
| 4 | D03 |
arrow_left_right |
| 5 | D02-RO |
arrow_right |
| 6 | C04-R |
arrow_right_rect |
| 7 | D04 |
arrow_through |
| 8 | D05-L |
arrow_turn_left |
| 9 | D07 |
arrow_turn_left_right |
| 10 | D06-L |
arrow_turn_left_through |
| 11 | D05-R |
arrow_turn_right |
| 12 | D06-R |
arrow_turn_right_through |
| 13 | G12 |
bicycle_end |
| 14 | L1002-A |
bicycle_priority |
| 15 | G11 |
bicycle_start |
| 16 | G12-B |
moped_end |
| 17 | G12-A |
moped_start |
| 18 | BW410 |
bike_route |
| 19 | BB12 |
bochtschild |
| 20 | C05 |
bothways |
| 21 | BW03 |
bromfiets_hier |
| 22 | F13 |
bus_start |
| 23 | F14 |
bus_end |
| 24 | L05 |
doorgaand_plus_einde_rijstrook |
| 25 | L06 |
doorgaand_plus_splitsing |
| 26 | G05 |
erf |
| 27 | BB01 |
exit |
| 28 | BB35 |
geleidebakens |
| 29 | B06 |
give_way |
| 30 | J37 |
hazard |
| 31 | J30 |
hazard_airport |
| 32 | J28 |
hazard_animals |
| 33 | J24 |
hazard_bicycle |
| 34 | J39 |
hazard_bollard |
| 35 | J29 |
hazard_bothways |
| 36 | J38 |
hazard_bump |
| 37 | J01 |
hazard_bumps |
| 38 | J08 |
hazard_crossing |
| 39 | J26 |
hazard_dock |
| 40 | J25 |
hazard_gravel |
| 41 | J36 |
hazard_ice |
| 42 | J07 |
hazard_incline |
| 43 | B03 |
hazard_intersection |
| 44 | B04 |
hazard_intersection_left |
| 45 | B05 |
hazard_intersection_right |
| 46 | J03 |
hazard_left_turn |
| 47 | J10 |
hazard_level_crossing |
| 48 | C1-snor |
hazard_moped |
| 49 | J15 |
hazard_moving_bridge |
| 50 | J17 |
hazard_narrow_both |
| 51 | J19 |
hazard_narrow_left |
| 52 | J18 |
hazard_narrow_right |
| 53 | J22 |
hazard_pedestrian_crossing |
| 54 | J23 |
hazard_pedestrian |
| 55 | J16 |
hazard_road_works |
| 56 | J1004 |
hazard_rocks |
| 57 | J09 |
hazard_roundabout |
| 58 | J21 |
hazard_school |
| 59 | J20 |
hazard_slippery |
| 60 | J32 |
hazard_traffic_signal |
| 61 | J11 |
hazard_train |
| 62 | J14 |
hazard_tram |
| 63 | J02 |
hazard_right_turn |
| 64 | J27 |
hazard_wild_animals |
| 65 | J04 |
hazard_zigzag |
| 66 | J05 |
hazard_zigzag_left |
| 67 | G09 |
horse_start |
| 68 | C20 |
maxaxleweight |
| 69 | C19 |
maxheight |
| 70 | C17 |
maxlength |
| 71 | A01-5 |
maxspeed_5 |
| 72 | A01-10 |
maxspeed_10 |
| 73 | A01-15 |
maxspeed_15 |
| 74 | A01-20 |
maxspeed_20 |
| 75 | A01-25 |
maxspeed_25 |
| 76 | A02-30 |
maxspeed_30_end |
| 77 | A01-40 |
maxspeed_40 |
| 78 | A01-50 |
maxspeed_50 |
| 79 | A02-50 |
maxspeed_50_end |
| 80 | A01-60 |
maxspeed_60 |
| 81 | A02-60 |
maxspeed_60_end |
| 82 | A01-70 |
maxspeed_70 |
| 83 | A02-70 |
maxspeed_70_end |
| 84 | A01-80 |
maxspeed_80 |
| 85 | A02-80 |
maxspeed_80_end |
| 86 | A01-90 |
maxspeed_90 |
| 87 | A01-100 |
maxspeed_100 |
| 88 | A02-100 |
maxspeed_100_end |
| 89 | A01-120 |
maxspeed_120 |
| 90 | A01-30 |
maxspeed_30 |
| 91 | C21 |
maxweight |
| 92 | C18 |
maxwidth |
| 93 | C22-E |
milieu |
| 94 | G02 |
motorway_end |
| 95 | G01 |
motorway_start |
| 96 | C08 |
no_agriculture |
| 97 | C09 |
no_agriculture_bicycle |
| 98 | C22-C |
no_bestelbus_vrachtwagen |
| 99 | C14 |
no_bicycle |
| 100 | C07-A |
no_bus |
| 101 | C12 |
no_car_motorcycle |
| 102 | C06 |
no_car |
| 103 | C22 |
no_dangerous |
| 104 | C02 |
no_entry |
| 105 | L08 |
noexit |
| 106 | C07 |
no_hgv |
| 107 | C13 |
no_moped |
| 108 | C11 |
no_motorcycle |
| 109 | F01 |
no_overtaking |
| 110 | F02 |
no_overtaking_end |
| 111 | F03 |
no_overtaking_hgv |
| 112 | F04 |
no_overtaking_hgv_end |
| 113 | E03 |
no_parking_bicycle |
| 114 | E01 |
no_parking |
| 115 | C16 |
no_pedestrian |
| 116 | E02 |
no_stop |
| 117 | F07 |
no_u_turn |
| 118 | C01 |
no_way |
| 119 | L09-2L |
noexit_left |
| 120 | F08 |
no_end |
| 121 | T201 |
omleiding |
| 122 | C03 |
oneway |
| 123 | G13 |
onverplicht_fietspad |
| 124 | E09 |
parkeren_vergunninghouders |
| 125 | E04 |
parking |
| 126 | E08-9 |
parking_bicycle |
| 127 | E08 |
parking_car |
| 128 | E102-2 |
parking_card |
| 129 | E08o |
parking_charging |
| 130 | E105 |
parking_covered |
| 131 | E07 |
parking_delivery |
| 132 | E06 |
parking_disabled |
| 133 | E08-7 |
parking_moped |
| 134 | E101-2 |
parking_payment |
| 135 | E08-11 |
parking_police |
| 136 | E05 |
parking_taxi |
| 137 | G08 |
pedestrian_end |
| 138 | G07 |
pedestrian_start |
| 139 | L02 |
pedestrian_crossing |
| 140 | B01 |
pedestrian_start |
| 141 | F05 |
priority_backward |
| 142 | B02 |
priority_end |
| 143 | F06 |
priority_forward |
| 144 | L14 |
rest |
| 145 | D01 |
roundabout |
| 146 | B07 |
stop |
| 147 | F15 |
tram_start |
| 148 | F17 |
tram_bus |
| 149 | G04 |
trunk_end |
| 150 | G03 |
trunk_start |
| 151 | BB04 |
versmalling_vluchtstrook |
| 152 | L04 |
voorsorteren |
As mentioned before, there are also a number of other classes that are not strictly traffic signs. Further, there are a number of bad classes such as windows, buildings and the backs of traffic signs. These accidentally get detected as signs in step 1 of the pipeline.
Design choices: numbers on signs and zone signs
As stated above, the model classifies signs by RVV-code, such that it can distinguish between for instance a zebra-crossing sign and a weight limit sign. However, there are no separate classes for different numerical values on the signs, for instance a weight limit sign with weight limit 7.5 tons vs. a weight limit sign with weight limit 20 tons. There is a separate model for reading the numerical values on signs, found at Panoramax/????. Speed limit signs are an exception: For these, separate classes are included per speed limit.
There are also no separate classes for whether a sign is a zone sign or not. For instance, a speed limit 30 sign in the Netherlands can be a regular sign, or a sign indicating the start, end, or repetition of a speed limit zone. Both of these signs will receive the class A1 in this model. To distinguish between them, there is a separate model that classifies signs by whether they are a zone-start, zone-repetition, zone-end, or no-zone sign. The model can be found at Panoramax/????.
Performance
Validation set (4,760 images)
| Metric | Value |
|---|---|
| Top-1 accuracy | 98.4% |
| Top-5 accuracy | 99.8% |
Usage
from ultralytics import YOLO
model = YOLO("Panoramax/????")
results = model.predict("sign_crop.jpg", conf=0.50)
for r in results:
print(r.probs.top1, model.names[r.probs.top1], float(r.probs.top1conf))
The model expects a cropped image of a sign β not a full street photo.
Use Panoramax/detect_face_plate_sign to obtain the crop first.
Predictions of classes ????? should be forwarded to XXXX. Predictions of classes ??? should be forwarded to XXXX.
Training
| Parameter | Value |
|---|---|
| Epochs | 30 |
| Batch size | 16 |
| Image size | 224 Γ 224 |
| Optimizer | AdamW |
| Initial LR | 0.001 |
| Augmentation | RandAugment, fliplr disabled, translate=0.2, shear=10.0, erasing=0.2, dropout=0.3 |
The training dataset used for this model is based on the dataset Panoramax/Panoramax/classified_nl_road_signs. The dataset was extended with additional Dutch traffic sign and non-traffic sign classes. Zone- and non-zone signs of the same RVV code were merged into a single class.
Dataset
See Panoramax/???
for the training and validation images.
License
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)