signFinder

De afgelopen vijf weken heb ik gewerkt aan het ‘signFinder‘ project voor de Google Summer of Code. Doel van het project is om Nederlandse straatnaamborden automatisch te detecteren, segmenteren, en pogen te lezen. Stefan mentort.

Er wordt histogram matching gebruikt om ‘straatnaambord blauw’ te detecteren. Gebieden met de juiste kleur worden in blobs verdeeld door middel van blob detection. Vervolgens worden een aantal statistieken gegenereerd van de blobs, waarna met decision boundaries blobs die onvoldoende op straatnaamborden lijken uitgesloten worden.

Tot dusver kunnen ‘mooie’ foto’s van nette straatnaamborden vrij goed gesegmenteerd worden.

Hoekborden correct geclassificeerd.

Hoekborden correct geclassificeerd.

Maar foto’s met verroeste borden, foto’s onder een grote hoek, foto’s genomen op grote afstand, of foto’s die overbelicht of onderbelicht zijn, of zelfs foto’s genomen met een camera die de kleuren anders renderd, leveren aanmerkelijk slechtere resultaten op.

Rusty street sign

Rusty street sign

Voor nu concentreer ik me op straatnaamborden, maar deze technologie kan ook gebruikt worden voor de detectie van andere borden, waarbij nummerborden een logische stap zijn.

Momenteel lijkt het probleem voornamelijk te zijn dat mijn trainset voor de histogram matching te eenzijdig is. Ik heb onlangs meer data verzameld, waarmee ik hoop de detectie robuuster te kunnen maken. Ook: Hoe meer data hoe nauwkeuriger het systeem. Als iemand nog een stapel foto’s van straatnaamborden heeft liggen, ik heb ze graag!

straatnaambord met slechte histogram matching.

straatnaambord met slechte histogram matching.

Voor wie er mee wil spelen, de code is te downloaden op google code. Ik zal vanmiddag wat readme filetjes toevoegen, maar eigenlijk is het verhaal simpel: Built de signFinder executable met make (opencv is vereist), en voor foto’s die op de command-line opgegeven worden, wordt er een <filename>_result.jpg bestand weggeschreven met een lijntje om de gedetecteerd straatnaamborden heen.  datasets zijn ook beschikbaar.

Ondertussen ga ik gewoon verder met het verfijnen van het systeem, binnenkort meer!

UV mapping

Omdat ik toch nog even zat na te denken over het ortografisch maken van afbeeldingen, en wat voor functionaliteit je daar nu eigenlijk voor nodig zou hebben, ben ik eens gaan kijken in Blender wat er nu zoal beschikbaar is.

In eerste instantie wilde ik kijken of zoiets al kon in The Gimp om een of andere reden deed mijn versie geen realtime voorweergave in het perspectief gereedschap. Zo kwam ik op een website over trein railsen en modelbouw uit, waar in The Gimp werd gebruikt om een plaatje met perspectief plat te slaan.

Ik realiseerde me dat je zoiets in Blender ook moet kunnen doen, en wellicht zelfs wat interactiever. Door middel van UV mapping kun je met een deegroller over een 3D object heen gaan en er een plaatje op plakken.

UV Mapping in Blender

UV Mapping in Blender

Wij willen eigenlijk anders om te werk gaan, immers we hebben een plat plaatje en daar een 3D representatie van maken. Echter voor ‘plat’ materiaal zoals gebruikt wordt om kaarten te maken is dat niet zo belangrijk. Een resultaat als dit is daarom best acceptabel, mits je de verhoudingen laat kloppen:

Een stukje gerenderd op een Plane

Een stukje gerenderd op een Plane

Een tool zoals Bundler is in staat om in principe overeenkomstige punten te matchen en daardoor te weten waar de camera zich bevond. En door de punten onderling te verbinden in de originele afbeeldingen de mogelijkheid te geven om op een willekeurige positie te gaan staan en te kijken.

Nu is er een nieuwe versie (0.3) uit die kan exporteren naar de volgende enorm gesloten tool… maar om te kijken of Bundler beter is geworden kan dat vast geen kwaad. Ook heeft wat overleg met wat andere mensen zoals Etienne er toe geleid dat focussen op het SIFT alleen niet zo handig is, en ook SURF eens getest moet worden. Zo veel te doen… zo weinig tijd!

Straatborden Dataset

Zoals een aantal van jullie weten wordt momenteel voor het OpenStreetPhoto project software ontwikkeld dat borden op straat kan herkennen. Nu is zoals bij veel projecten ‘bronmateriaal’ nogal schaars.

Tijs is momenteel bezig met een basis herkenner. Ik zou me kunnen voorstellen dat meer mensen eens willen pielen met OpenCV of in The Gimp met wat mooie Python filters. Daarom heb ik op de OpenStreetMap mirror mijn telefoon leeggegooid. M’n Amaryllo is de laatste tijd soms wat raar met opslaan van data, dus nog geen foto annotatie.

Omdat het erg handig is de algoritmes te vergelijken met hoge en lage resolutie, dan ook twee datasets.