Instructions to use Panoramax/detect_nl_subsigns with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- ultralytics
How to use Panoramax/detect_nl_subsigns with ultralytics:
from huggingface_hub import hf_hub_download from ultralytics import YOLO # pick the weights file from this repo's "Files and versions" tab weights = hf_hub_download("Panoramax/detect_nl_subsigns", "<weights>.pt") model = YOLO(weights) source = 'http://images.cocodataset.org/val2017/000000039769.jpg' model.predict(source=source, save=True) - Notebooks
- Google Colab
- Kaggle
detect_nl_subsigns
YOLOv8 model for detecting sub-signs (Dutch: onderbord) below main road signs in the Netherlands.
Fine-tuned from Panoramax/detect_fr_road_signs_subsigns
on Dutch street-level imagery from the Panoramax platform.
What is an onderbord?
An onderbord is a supplementary sign from the Dutch OB-series (RVV 1990) mounted directly below a main road sign. This model detects their presence as a single class โ it does not classify the OB type or code.
Model details
| Property | Value |
|---|---|
| Architecture | YOLOv8 (Ultralytics) |
| Base model | Panoramax/detect_fr_road_signs_subsigns (panonceau class) |
| Fine-tuning epochs | 500 |
| Input | Cropped image around a detected main sign |
| Output class | onderbord (1 class) |
| Training data | Dutch Panoramax imagery โ see dataset card |
Performance
Validation set (sign crops, 80/20 split)
| Metric | Value |
|---|---|
| mAP50 | 0.993 |
| Precision | 0.977 |
| Recall | 0.962 |
Live evaluation on 727 real Dutch road signs (Panoramax DataFusion, 2026-07-13)
Evaluated per main sign using the /v1/annotate/ API endpoint. ~13% of signs had a real sub-sign.
| Confidence threshold | Precision | Recall | F1 |
|---|---|---|---|
| 0.25 (default) | 68.3% | 99.0% | 80.9% |
| 0.60 (balanced) | 79.5% | 96.9% | 87.3% |
| 0.90 (best F1) | 90.3% | 87.5% | 88.9% |
Note on precision at conf=0.25: the low precision reflects a class imbalance in the live dataset (13% positive rate) and a per-box counting method. The model misses only 1 in 96 real sub-signs at this threshold. For production use, conf=0.60โ0.90 is recommended depending on your tolerance for false positives.
Usage
from ultralytics import YOLO
model = YOLO("Panoramax/detect_nl_subsigns")
results = model.predict("sign_crop.jpg", conf=0.60)
The model expects a crop around a detected main sign โ not a full street photo. Use a bounding box expanded slightly below the main sign to ensure the sub-sign is visible in the crop.
Training
Fine-tuned with the following hyperparameters:
| Parameter | Value |
|---|---|
| Epochs | 500 |
| Batch size | 16 |
| Frozen backbone layers | 10 |
| Initial learning rate | 0.01 |
| Framework | Ultralytics YOLOv8 |
Training data sourced from Panoramax via STAC, filtered on osm\|traffic_sign semantics with
Dutch (NL:) values. Images were annotated in Label Studio.
License
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
- Downloads last month
- -
Model tree for Panoramax/detect_nl_subsigns
Base model
Panoramax/detect_fr_road_signs_subsigns