Instance Panoramax Nederland?

Yes, Emwee — your help is certainly welcome!

For the Dutch deployment it is important that we establish a robust and consistent annotation system for traffic signs. For now I focus specifically on the main signs, not yet on subsigns or supplementary panels. Below is the current structure …

Each traffic sign is assigned a fixed‑length identifier of 38 characters, built from five defined segments.
This structure brings together the logic of RVV, NDW, and VNVF, and ensures the system remains flexible so it can reference these sources reliably.

Segments

Nr Length Name Description Alignment
1 10 Source Origin of the data or issuing authority Left
2 6 RVV Code (Law) Legal traffic-sign code according to the RVV Left
3 3 Zone (NDW) NDW zone or area classification Left
4 4 Value (NDW black code) NDW numerical or coded parameter Right
5 15 VNVF Sign Code Unique sign identifier following the VNVF standard Left
6 38 Code The concatenated full code (segments 1–5)

Purpose of this structure

This approach creates a single, stable reference that can reflect:

  • the legal classification (RVV),
  • the operational NDW coding model,
  • and the detailed VNVF sign definitions.

It also ensures that once the imagery dataset is published, each sign can be traced back to authoritative and technical sources.

At this moment the catalogue includes 188 traffic signs.

Panoramax_classify_nl_road_signs.txt (17,0 KB)

In the coming weeks we expect to release the images linked to each generated code.

Is is related enough to OSM? What are your thoughts?

RVV / RVV 1990 is the Reglement Verkeersregels en Verkeerstekens or in English Regulations Traffic rules and traffic signs. It is the law.

NDW is an partnership between Government organizations that is collecting, managing, and sharing mobility data.

VNVF is the “Vereniging Nederlandse Verkeersborden Fabrikanten” or in English Association of Dutch Traffic Sign Manufacturers

Only the RVV defines traffic signs.

NDW/VNVF do not have their own traffic sign codes but use those of the RVV, so #5 can be left out.

ZoneCode/blackCode are fields you probably found in the verkeersborden_actueel_beeld_wgs84.geojson.gz I linked above.

ZoneCode: ZE = Zone-Eind, ZB = Zone-Begin, (ZH=Zone-Herhaling, ZO = Zone-Onbekend)
blackCode is text on a sign.

With that introduction, I would:

  1. Start with the “extended” RVV code, B6, G11, G12a, A1-60, A1-30-ZE, E10-ZB, C2,OB54 see https://verkeersbordenoverzicht.nl/ for a de facto standaard overview. This includes the zone, “blackCode” and possible a lower-plate OB (onderbord)
  2. The coordinate
  3. Add a (possibility) for a direction
  4. A link to the image where the sign has been detected
    • I assume that image has the date that the picture was taken

An ask: what is goal for this robust and consistent annotation system for traffic signs, i.e. how is it going to be populated and used?

For dutch users:

Ik vond dit document: Informatiemodel verkeerstekens: Framework, een “Informatiemodel Verkeerstekens”…

Nice post Emvee :+1:

That is not correct. VNVF uses the extra 0 (voorloopnul) . So A01 instead of A1 and may also add the indicated maxspeed value. In OSM-NL you will find both NL:G07 and NL:G7 since there is not a defined standard in OSM (whats new :wink:).

Very interesting :+1:

Hoewel ik OSM niet terug zie in dat document zie ik wel mogelijke synergie voordelen. :wink:

1 Like

De voorgestelde coderingen zoals A1‑60, A1‑30‑ZE, E10‑ZB, C2 laten meteen zien waar het schuurt: E10 heeft twee cijfers, A1 één. Zodra je varianten krijgt zoals A1‑30 en A1‑130, worden de velden automatisch verschillend van lengte. Voor snelheid is het denk ik daarom handig om uit te gaan van minimaal 3 karakters en deze rechts uit de lijnen.

NDW biedt daarnaast recent mogelijkheid om ook de plaatsnaam in de blackcode op te nemen, waardoor de code nóg langer wordt. Het is een keuze om die op te nemen. Het is denk ik minder nuttig om plaatsnamen of waardes van gewichtsbeperking te registeren, voor maximum snelheid zie ik meer toegevoegde waarde. Maar dat is een keuze.

In de VNVF‑logica staan blackcode‑ en zone‑informatie bovendien niet op vaste posities. Ook gebruikt VNVF voorloopnullen (bijv. RVV C2 → VNVF C02). Richtingen van pijlen zijn in het RVV nauwelijks gecodeerd, maar in VNVF wel, waardoor combineren mogelijk is.

Het RVV bevat daarnaast geen codes voor diverse moderne of aanvullende borden, zoals E8Q (parkeren voor deelauto’s), en ook geen bebakening zoals chevronborden, die wél in VNVF zijn opgenomen: Making sure you're not a bot!

Voor het samenstellen van de lijst heb ik gebruikgemaakt van:

Het CROW‑Informatiemodel Verkeerstekens is gebaseerd op IMBOR, maar is niet volledig en volgt niet consequent RVV, NDW en VNVF niet consequent.

https://www.verkeersbordenoverzicht.nl/ is ook geen officiële bron; de definities zijn deels gebaseerd op RVV, VNVF en NDW. Het overzicht is wel uitgebreid en de codering is logisch opgebouwd.

At this moment the catalogue includes 188 traffic signs.

Panoramax_classify_nl_road_signs.txt (17,0 KB)

The complete list:

list

Code
dynamisch_A1__________________________
FPV_______BW410_______________________
RVV1966___57a_________________________
RVV1990___A1_______10_________________
RVV1990___A1_______100_A01100_________
RVV1990___A1_______120_A01120_________
RVV1990___A1_______15__A0115__________
RVV1990___A1_______25_________________
RVV1990___A1_______30__A0130__________
RVV1990___A1_______5__________________
RVV1990___A1_______50__A0150__________
RVV1990___A1_______60__A0160__________
RVV1990___A1_______70__A0170__________
RVV1990___A1_______80__A0180__________
RVV1990___A1_______90_________________
RVV1990___A1____ZB_30__A0130zb________
RVV1990___A1____ZB_60__A0160zb________
RVV1990___A2_______50__A0250__________
RVV1990___A2_______60__A0260__________
RVV1990___A2_______70__A0270__________
RVV1990___A2____ZE_____A0230ze________
RVV1990___A2____ZE_60__A0260ze________
RVV1990___A4__________________________
RVV1990___A5__________________________
RVV1990___A5___________A05____________
RVV1990___B1___________B01____________
RVV1990___B2___________B02____________
RVV1990___B3___________B03____________
RVV1990___B4___________B04____________
RVV1990___B5___________B05____________
RVV1990___B6___________B06____________
RVV1990___B7___________B07____________
RVV1990___C1___________C01____________
RVV1990___C10__________C10____________
RVV1990___C11__________C11____________
RVV1990___C12__________C12____________
RVV1990___C13__________C13____________
RVV1990___C14__________C14____________
RVV1990___C15__________C15____________
RVV1990___C16__________C16____________
RVV1990___C17__________C17____________
RVV1990___C18__________C18____________
RVV1990___C19__________C19____________
RVV1990___C2___________C02____________
RVV1990___C20__________C20____________
RVV1990___C21__________C21____________
RVV1990___C22__________C22____________
RVV1990___C22a_________C22a___________
RVV1990___C22c_________C22c___________
RVV1990___C3___________C04____________
RVV1990___C4___________C04l___________
RVV1990___C4___________C04r___________
RVV1990___C5___________C05____________
RVV1990___C6___________C06____________
RVV1990___C7___________C07____________
RVV1990___C7____ZB_____C07____________
RVV1990___C7____ZE_____C07____________
RVV1990___C7a__________C07a___________
RVV1990___C8___________C08____________
RVV1990___C9___________C09____________
RVV1990___D1___________D01____________
RVV1990___D2___________D02lo__________
RVV1990___D2___________D02ro__________
RVV1990___D3___________D03____________
RVV1990___D4___________D04____________
RVV1990___D5___________D05l___________
RVV1990___D5___________D05r___________
RVV1990___D6___________D06l___________
RVV1990___D6___________D06r___________
RVV1990___E1___________E01____________
RVV1990___E1____ZB_____E01zb__________
RVV1990___E1____ZB_____E01zbh_________
RVV1990___E1____ZE_____E01ze__________
RVV1990___E2___________E02____________
RVV1990___E3___________E03____________
RVV1990___E3____ZE_____E03ze__________
RVV1990___E4___________E04____________
RVV1990___E6___________E06____________
RVV1990___E7___________E07____________
RVV1990___E8b__________E08b___________
RVV1990___E8c__________E8c____________
RVV1990___F1___________F01____________
RVV1990___F14__________F14____________
RVV1990___F16__________F16____________
RVV1990___F2___________F02____________
RVV1990___F3___________F03____________
RVV1990___F5___________F05____________
RVV1990___F6___________F06____________
RVV1990___F7___________F07____________
RVV1990___F8___________F08____________
RVV1990___G1___________G01____________
RVV1990___G10__________G10____________
RVV1990___G11__________G11____________
RVV1990___G12__________G12____________
RVV1990___G12a_________G12a___________
RVV1990___G12b_________G12b___________
RVV1990___G13__________G13____________
RVV1990___G2___________G02____________
RVV1990___G3___________G03____________
RVV1990___G4___________G04____________
RVV1990___G5___________G05____________
RVV1990___G6___________G06____________
RVV1990___G7___________G07____________
RVV1990___G7____ZB_____G07zb__________
RVV1990___G7____ZE_____G07ze__________
RVV1990___G8___________G08____________
RVV1990___G9___________G09____________
RVV1990___H1___________H1_____________
RVV1990___H1___________H1_skyline_____
RVV1990___H2___________H2_____________
RVV1990___H2___________H2skyline______
RVV1990___J10__________J10____________
RVV1990___J11__________J11____________
RVV1990___J14__________J14____________
RVV1990___J15__________J15____________
RVV1990___J16__________J16____________
RVV1990___J17__________J17____________
RVV1990___J18__________J18____________
RVV1990___J19__________J19____________
RVV1990___J2___________J02____________
RVV1990___J20__________J20____________
RVV1990___J21__________J21____________
RVV1990___J22__________J22____________
RVV1990___J23__________J23____________
RVV1990___J24__________J24____________
RVV1990___J25__________J25____________
RVV1990___J26__________J26____________
RVV1990___J27__________J27____________
RVV1990___J28__________J28____________
RVV1990___J29__________J29____________
RVV1990___J3___________J03____________
RVV1990___J30__________J30____________
RVV1990___J32__________J32____________
RVV1990___J36__________J36____________
RVV1990___J37__________J37____________
RVV1990___J38__________J38____________
RVV1990___J4___________J04____________
RVV1990___J5___________J05____________
RVV1990___J7___________J07____________
RVV1990___J8___________J08____________
RVV1990___J9___________J09____________
RVV1990___K1___________K1_____________
RVV1990___K10__________K10____________
RVV1990___K11__________K11____________
RVV1990___K12__________K12____________
RVV1990___K13__________K13____________
RVV1990___K14__________K14____________
RVV1990___K2___________K2_____________
RVV1990___K3___________K3_____________
RVV1990___K4___________K4_____________
RVV1990___K5___________K5_____________
RVV1990___K6___________K6_____________
RVV1990___K7___________K7_____________
RVV1990___K8___________K8_____________
RVV1990___K9___________K9_____________
RVV1990___L1___________L01____________
RVV1990___L2___________L02____________
RVV1990___L8___________L08____________
RVV1990___L9___________L09____________
TB____________________________________
VNVF___________________BB01___________
VNVF___________________BB03___________
VNVF___________________BB04___________
VNVF___________________BB08___________
VNVF___________________BB11r__________
VNVF___________________BB12l__________
VNVF___________________BB12r__________
VNVF___________________BW101rbSp10____
VNVF___________________BW101S104______
VNVF___________________BW111zb________
VNVF___________________BW202b_________
VNVF___________________BW501__________
VNVF___________________D103___________
VNVF___________________D104___________
VNVF___________________E8n____________
VNVF___________________L14____________
VNVF___________________L20____________
VNVF___________________L201___________
VNVF___________________L306___________
VNVF___________________L51____________
VNVF___________________L51a___________
VNVF___________________N______________
VNVF___________________VR07___________
VNVF___________________VR09-01________
VNVF___________________H3_____________
VNVF___________________H4_____________
VNVF___________________BW415__________
VNVF___________________BW41x__________

Ja, zo kan je dingen zien maar er ook een andere manier:

A1‑30‑ZB vs A1____ZB_30__A0130zb

Waarom is de variabele lengte wel een probleem voor de code kolom maar niet voor de value kolom? De codes die je op https://www.verkeersbordenoverzicht.nl worden wel door de meeste mensen herkend.

Ik vraag me ook af wat het doel is van de source kolom voor welke gebruikers is die data interessant? Dat volgt een beetje mijn eerdere vraag wat betreft het doel van dit formaat. Wie gaat de data aanleveren en wie het gebruiken?

I would suggest non fixed length values like A1-30-ZB or maybe better A1-ZB-30 because it defines a speed limit on a zone which value is 30 (or 60)

The OSM tag could be NL:A1-ZB[30]

Waarom de source belangrijk is?

Paar jaar terug had de branche behoefte aan een extra E8 wordt en hadden ze

  • E08a Parkeergelegenheid alleen bestemd voor vrachtwagens en bussen
  • E08b Parkeergelegenheid voor het parkeren met twee wielen op het trottoir
  • E08c Parkeergelegenheid alleen bestemd voor vrachtwagens
    … bedacht

Toen kwam het ministerie, die ging parkeerplaats borden maken voor elektrische laden en koos nummer E8a die al door de branch in gebruik was.
bron: Introductie nieuwe E8 parkeerborden kan tot verwarring leiden

Het kan dus voorkomen dat een bordcode wordt gebruikt door meerdere instanties met een verschillende betekenis. Je wil dan dat het eenduidig blijft

Daarom is ‘source’ denk ik heel belangrijk om mee te nemen.

Door te werken met een vaste lengte staat de zelfde soort informatie altijd op dezelfde plek.
Het kan uiteraard ook met een scheidingsteken, maar die moet dan nooit gebruikt worden voor andere zaken. Vaste lengte helpt denk ik aan het koppelen aan de NDW verkeersborden data.

In de de annotatie missen we nog voldoende voorbeelden van onderstaande borden om het algoritme alle borden te leren. Als iemand foto’s heeft van deze borden, laat het weten. .

NB: Het is wel van belang dat de afbeelden rechten vrij zijn.

Moeten het fotos zijn of mogen het ook .svg zijn? Wikimedia heeft er best veel. Zie bv deze

foto’s, en dan het liefst vanuit verschillende perspectieven. Dus niet allemaal van frontaal. Dan gaat het trainen van het algoritme het beste

To train a classification model you need that kind of cropped road sign pictures.
The goal is to have at least 100 samples for each type.
In my last training on NL signs there was 10k samples like that with more than 100 types.

Perhaps we can make a jsom query for the relevant signs and then check nearby Panos.

But many signs are rather specific with low frequencies

For logic I should go with what used is in the field and that is what you can find on https://www.verkeersbordenoverzicht.nl/. Yes, this is not an official source but even CROW is saying that it is de facto standard.

Ook www.verkeersbordenoverzicht.nl gebruiken voorkomt dit probleem, het wordt naar mijn idee niet duidelijker met RVV1990 E08a en VNNF E8-1 o.i.d.

If there is missing training data it would be good to have a list and a place where people can upload photo’s. With a list of missing sign data I could make a script that finds them in the NDW data and make some software so people can input there coordinates and get a list of sign’s that need additional photo’s in their neighborhood.

Can you refer to your source?

https://docs.crow.nl/verkeersborden/framework/#verkeersbordenoverzicht-nl

Hieronder een lijst van locaties waar er volgens de NDW data een RVV bord staat in Amsterdam van de volgende RVV code (‘J31’,‘J32’,‘J33’,‘J34’,‘J35’,‘J36’,‘J39’,‘K14’).
Zie de images hierboven met de plaatjes bij deze codes.

Hiervan missen we nog voldoende trainingen foto’s die dus waarschijnlijk makkelijk te vinden zijn op de Panorama foto’s op data.amsterdam.nl
Ik zie niet hoe ik 123 een url kan maken zodat ik direct op de juiste locatie ben via de website van Amsterdam

Summary
rvvCode st_x st_y ndw_url
J32 4.969714333404022 52.36640246628761 Wegkenmerken - NDW
K14 4.816661254645875 52.39149170844741 Wegkenmerken - NDW
K14 4.794375846988815 52.39632604255612 Wegkenmerken - NDW
J32 4.760440593047991 52.401325944288686 Wegkenmerken - NDW

I will add the complete list later as an attachment.

I’ve setup a temporary Panoramax instance as a proof-of-concept using pictures from Amsterdam.

https://nl.panoramax.xyz

A few explanations:

  • Amsterdam pictures are “rotated” to always have the north in the middle of the picture. This is unusual and Panoramax viewer does not work well with this when moving between pictures in the same sequence, meaning you have to turn around from time to time.
  • road sign detection is using the standard detection model that has not been trained on NL road signs, meaning that some of them will not be detected (this can be improved by training a new model with NL signs in the training dataset which I plan to do quite soon)
  • road sign classification does not know the 180 types that have been mentionned here, but a subset of 120+
  • the tag I’ve used is also something temporary, closer to OSM tags (example: NL:A01[30] for a maxspeed=30), this can be changed later
  • I’ve uploaded some pictures shot in Amsterdam from early 2023, with quite bad weather !!

The instance is not open for uploads, it is really a PoC so far, runnning from my basement. I’ve not added it to the meta-catalog.

5 Likes

https://nl.panoramax.xyz/?background=streets&focus=map&map=12.71/52.34865/4.93495&speed=250
Directly focused on Amsterdam

I have installed the Android Panoramax app and taken my first photos. I now want to upload these but I am having trouble finding how to do this. Is there some kind of manual or basic instruction?