signFinder – Borden Lezen vervolgd!

Enkele weken geleden rapporteerde ik over de eerste pogingen om signFinder verkeersborden te laten lezen. Inmiddels is de software met sprongen vooruit gegaan. Zie hier de resultaten.

dsc00180_result_resized

Om te beginnen heb ik de tesseract OCR netjes in de software geintegreerd. De gelezen tekst wordt in dit geval naast de borgen afgedrukt, maar kan natuurlijk ook zo na een database geschreven worden.

Daarnaast zijn de resultaten enorm verbeterd. Ik meet performance als het percentage van de borden die correct gedetecteerd worden in mijn eigen testset, dat vervolgens zonder enige fout door de OCR gelezen worden. Een stukje software wat dit getal genereerde, rapporteerde voor de initiele versie 42% performance.

Ik ben begonnen met de laatste versie van tesseract (2.04) te installeren. Dit zou performance moeten verbeteren, en bovendien kan ik hiermee een Nederlandse language file gebruiken. In eerste instantie was dit flink vloeken: zelfs met Nederlandse language file zakte de performance onmiddelijk naar slechts 24%. Vreemd genoeg bleek deze versie van tesseract, in tegenstelling van wat ik de vorige blogpost vermeldde, beter overweg te kunnen met greyscale images dan met de gegenereerde binaire images. Performance: rond de 58%.

Het is stom hoe de eenvoudigste oplossingen je soms weken kunnen ontschieten; In de vorige blogpost had ik het over het verbeteren van het contrast tussen de letters en de blauwe bordachtergrond. Nu worden deze plaatjes in RGB formaat opgeslagen, en de achtergrond heeft natuurlijk vooral brightness in het blue channel! Ik genereer nu mijn greyscale plaatje over alleen het red channel, en dit verbeterd het contrast behoorlijk.

eerst:aureliaweg_before

nu: aureliaweg_after Performance: Van 58% naar 75%

Dan zijn er van de 25% borden niet correct gelezen worden, veel borden met kleine foutjes. l wordt gezien als I, ruis zorgt, met name aan het begin en het eind, voor wat extra letters, enzovoort. Nu weten we een aantal dingen over verkeersborden die we kunnen gebruiken: Woorden op borden beginnen doorgaans met een hoofdletter, of zijn volledig in hoofdletters. Hoofdletters komen niet zomaar midden in een woord voor. We verwachten geen woorden van slechts een karakter, en bovendien beginnen borden vaak met een lidwoord.

Ik heb de vorige heuristieken toegevoegd, om kleine ocr-foutjes op te kunnen lossen:

  • Woorden van 1 karakter worden verwijderd.
  • Een I midden in een woord wordt in een l veranderd.
  • Eerste woorden, die met minder dan 2 veranderingen (Levenshtein distance) in ‘De’ of ‘Het’ kunnen veranderen, doen dat.

Met deze simpele heuristieken, gaat performance op mijn testset van 75% naar 92%!

Nu is het belangrijk te beseffen dat hier overfitting optreed; Ik heb fouten die ik zag optreden in mijn testset opgelost, en daarmee heb ik een set heuristieken die met name helpen deze testset correct te detecteren. Desalnietemin: een performance tussen de 75% en 90% lijkt me zeer mooi. Als we nu alleen nog een breder scala aan straatnaamborden konden detecteren..

Tags: , , , ,

Plaats een reactie

Spam protection by WP Captcha-Free