Hier kannst Du uns persönlich treffen.

Unsere Lösung für den internen Ideenaustausch

Hören, lesen, sehen – der neue IT-Blog der Lösungsfinder

kununu widget

Unser IT-Blog

Handschriftenerkennung auf Basis eines Neuronalen Netzes

6 min Lesedauer

Von Daniel D. und Artem Z.

Wie lassen sich handschriftlich erfasste Steuer-ID-Nummern automatisch erkennen? Unsere Lösungsfinder haben dazu eine Lösung gefunden, bei der Convolutional Neuronal Network (CNN) eingesetzt wird. Ein spannendes Projekt aus dem Geschäftsbereich Enterprise Application & Integration (EAI), in dem ein CNN trainiert wurde, dass Handschriften fast so gut wie das menschliche Auge erkennt.


Jeder, der schon mal versucht hat, seine Handschrift durch eine App erkennen zu lassen weiß, dass man sehr sorgfältig schreiben muss, damit diese Apps funktionieren. Negativquoten von 5 bis 10 Prozent sind in diesem Kontext keine Seltenheit – für einen Entwickler jedoch kein zufriedenstellendes Ergebnis.

Bei der FI-SP ist es uns gelungen eine Lösung zu entwickeln, mit der beliebige Handschriften erkannt und die ausgelesenen Daten gespeichert werden können. Die Negativquote konnten wir auf 2 Prozent senken. Auf dem Weg dorthin haben wir viel gelernt, zum Beispiel, was die Möglichkeiten und Grenzen unterschiedlicher Neuronaler Netzwerke betrifft. Auch haben wir Erkenntnisse über die Eignung von Datensätzen im Rahmen der Verprobung sammeln können, die darauf hinausliefen, speziell für diesen Zweck geeignete Datensätze zu erstellen.


Eine Lösung für elf Ziffern

Die Aufgabenstellung einer automatisierten Handschriftenerkennung hat sich aus einem konkreten Bedarf heraus entwickelt: Für einen Kredit ab 12.000 Euro ist der Antragsteller gefordert, dem Kreditgeber seine Steueridentifikationsnummer (Steuer-ID) mitzuteilen. Dies gilt sowohl für neue als auch für bestehende Kredite. In der Praxis hatte dies für die Institute zur Folge, dass sie die Steuer-IDs ihrer Kreditkunden anfordern und nachträglich erfassen mussten. Hierfür wurden Formulare mit Kästen versendet, in die die Kunden ihre elfstellige Steuer-ID eintragen sollten.

Was einfach gedacht war, entwickelte sich zu einer veritablen Herausforderung: Die händisch ausgefüllten Formulare kamen per Fax, E-Mail und per Post wieder zurück und erzeugten einen hohen Arbeitsaufwand. Daher wurde unserem Team die Aufgabe gestellt eine Lösung zu entwickeln, die zum einen die relevanten Informationen erkennen und zum anderen automatisiert erfassen kann.

Zunächst stellten wir fest, dass mit marktgängigen Lösungen nicht die gewünschte Treffergenauigkeit zu erzielen war. Daher fokussierten wir uns auf Lösungen zur Mustererkennung, wie zum Beispiel Neuronale Netze. Nach längerem Suchen fiel die Entscheidung auf ein Convolutional Neural Networks (CNN). Solche komplexeren Netze wurden für das Verarbeiten von Bildern entwickelt. Sie sind einfachen Neuronalen Netzwerken in punkto Mustererkennung überlegen und können trainierte Muster auch dann noch erkennen, wenn sich deren Position innerhalb des Eingangsbilds verschiebt.


Die ersten Schritte zur neuen Lösung

Zunächst experimentierten wir mit einer Lösung auf Basis der in Java implementierten CNN-Bibliothek, JavaCNN. Die Einstiegshürden sind dabei sehr gering, sodass lediglich einige Anpassung am Quellcode vorgenommen wurden, um die Bibliothek in den Build-Prozess zu integrieren. Die anfängliche Begeisterung war es bald vorbei: Wir mussten realisieren, dass die zunächst gewählte Netzwerkkonfiguration nicht ausreichend war und für eine höhere Erkennungsrate mehr Layer benötigt würden. Doch trotz sorgfältiger Auswahl der Koeffizienten führte das Hinzufügen von Layern immer wieder zu Laufzeitfehlern. Damit war die Anzahl der einsetzbaren Convolutional Layer praktisch auf zwei limitiert und eine Steigerung der Komplexität und Tiefe des Netzes nicht möglich. In der Praxis kamen die Netze auf Basis von JavaCNN nicht über eine Erkennungsrate von 85 Prozent hinaus. Für den geforderten Einsatzzweck war dies zu wenig.


Größere Flexibilität mit Deeplearning4J

Daher begaben wir uns auf die Suche nach einer Java-Bibliothek, die eine größere Flexibilität bei der Konfiguration der Netzwerkstruktur erlaubt. Fündig wurden wir bei der plattformübergreifenden Java-Programmbibliothek für Künstliche Intelligenz, Deeplearning4J. Die Bibliothek setzt tiefergehende Kenntnisse über die Konfigurationsmöglichkeiten von CNNs voraus, bietet aber die Möglichkeit, die Netzwerk-Layer freier und umfangreicher zu konfigurieren. Mit dem inzwischen vorhandenen Wissen über die Konfiguration von CNNs wurde das Netz Schritt für Schritt so dimensioniert, dass es optimale Ergebnisse lieferte. Vielversprechend war, dass bereits die erste evaluierte Netzstruktur eine Erkennungsrate von rund 88 Prozent ohne weitere Optimierungen der Trainingsdatensätze erbrachte.


Über Training und  Back Propagation

Neuronale Netze werden gewöhnlich mittels sogenannter Back Propagation trainiert. Hierbei wird das Netz nacheinander mit zahlreichen Trainingsdaten versorgt. Die Abweichung an den Ausgängen des Netzes zwischen erwarteten und tatsächlichen Werten werden als Fehler klassifiziert. Erkennt ein Netzwerk eine Ziffer „1“ als Ziffer „8“, so wird der Fehler vom Ausgang zurück zum Eingang durch alle Layer des Netzes nachverfolgt. Die Fehlerentwicklung verteilt sich dabei auf einzelne Koeffizienten. Diese Koeffizienten werden entsprechend korrigiert. Dabei werden Koeffizienten, die stark an einem falschen Ausgangssignal beteiligt sind, stärker geändert als Koeffizienten, die im konkreten Fall weniger Einfluss auf den Fehler des Ausgangssignals hatten.

Je komplexer eine Netzwerkstruktur ist, desto mehr Trainingsdatensätze sind notwendig, damit der Back Propagation-Algorithmus die Koeffizienten des Netzes korrekt einstellen kann. Ein ausreichend großer Trainingsdatensatz ist daher von entscheidender Bedeutung für den Erfolg einer Lösung. Eine zu komplex gewählte Netzwerkstruktur verbraucht beim Training unnötige Ressourcen und bietet keine höhere Erkennungsleistung. Daher ist auch Fingerspitzengefühl beim Auswählen und Anpassen der Netzwerkstruktur gefragt.

Die Back Propagation ist zeitaufwändig. Erst durch zahlreiche Testdaten und durch wiederholte Ausführung „lernt“ das Netz mit der Zeit anhand der Trainingsdaten Ziffern zu erkennen. Im vorgestellten Fall haben wir das Netz darauf trainiert, dass genau an einem der zehn Ausgänge ein großer Wert im Sinne einer hohen Erkennungsrate anliegt. Jeder der zehn Ausgänge ist hierbei genau einer der zehn Dezimalziffern zugeordnet.

Nach mehreren Iterationen und Anpassungen an der Netzwerkstruktur bestand das Netz schließlich aus insgesamt neun Layern. Während der erste Layer sich auf die Erkennung von einfachen geometrischen Mustern, wie horizontale, vertikale und diagonale Farbverläufe einstellt, werden im nächsten Layer beispielsweise Kreissegmente und Bögen erkannt. Der abschließende Fully Connected Layer dient zur Gewichtung der Merkmale, die vom letzten Convolutional Layer erkannt wurden und die für die Erkennung einer konkreten Ziffer notwendig sind.

In der späteren Praxis zeigte sich Deeplearning4J dann noch einmal von einer ganz unerwarteten Seite: Kurz vor der ersten Produktivnahme stellte sich heraus, dass der Ansatz, in der Programmbibliothek möglichst viel nativen Code für zahlreiche Plattformen bereitzustellen, einen hohen Speicherbedarf erfordert. Daher wurde durch die Build-Konfiguration  die überflüssigen Code-Binaries entfernt, was die ausgelieferte WAR-Datei wieder auf eine akzeptable Größenordnung brachte.


Der Datenschatz für die Trainings

Neben der Auswahl und Strukturierung eines geeigneten Netzes kommt dem Einsatz eines geeigneten Trainingsdatensatzes eine entscheidende Rolle zu. In der Literatur liest man, dass für die Handschriftenerkennung der MNIST-Datensatz weit verbreitetet ist. Erste Tests zeigten aber, dass die US-amerikanischen MNIST-Daten in Deutschland wenig hilfreich sind, da sich die Schreibweisen für die Ziffer „1“ und in vielen Fällen auch für die Ziffer „7“ unterscheiden.

Da alternative Datensätze mit einer europäischen Schreibweise nicht verfügbar waren, suchten wir nach einer Alternative zu MNIST: Wir baten kurzerhand Kollegen um Schriftproben. Diese Ziffern wurden zunächst noch halbautomatisch aus den Formularen separiert. Im Laufe der Entwicklung wurden Schriftproben von weiteren Kollegen aus dem ganzen Unternehmen geliefert und die Separation der Ziffern aus den Formularen automatisiert. So konnten wir in relativ kurzer Zeit einen Test- und Trainingsdatensatz generieren, der parallel zur Weiterentwicklung der Netzwerkstruktur stetig anwuchs.

Mit diesem Datensatz begannen die Tests, um Formular-Daten optimal zu extrahieren. Dieser Schritt war notwendig, da die Ziffern der Steuer-ID auf den Formularen in Kästchen eingetragen waren. Also entwickelten wir einen Algorithmus, der in mehreren Schritten die Ziffern aus den Kästchen extrahiert. Zunächst führt der Algorithmus mittels Gauß-Filters eine Weichzeichnung des Eingangsbildes durch. Damit wird das oft stark auftretende Rauschen bei unterschiedlichen Quellen gedämpft. Im nächsten Schritt werden mittels des Canny-Edge-Algorithmus die Kanten des Formulars extrahiert. In einem weiteren Bearbeitungsschritt wird das Bild ausgehend von den Eckpunkten einheitlich eingefärbt. Das Resultat ist ein Bild, in dem die Kästchen des Formulars eindeutig hervortreten. Durch die Berechnung eines horizontalen und vertikalen Histogramms können in diesem Bild die Positionen der Kästchen nun sehr genau bestimmt werden. Das ist die Voraussetzung, um die Ziffer anschließend extrahieren und dem Neuronalen Netzwerk zur Verfügung stellen zu können.


Training des Netzwerks

Um die Erkennungsrate auf eine Zielgröße von 95 und mehr Prozent zu steigern, mussten wir das CNN weiter trainieren. Dazu haben wir den Trainingsdatensatz erweitert. Der Testdatensatz umfasste knapp 60.000 eigene Samples. Darüber hinaus wurde der MNIST-Datensatz durch einen selbstentwickelten Algorithmus an den Ziffern „1“ und „7“ modifiziert, der die für die deutsche Schreibweise fehlenden Querstriche ergänzte. Damit vergrößerte sich der Testdatensatz um weitere rund 68.000 Ziffern. Weitere 20.000 Trainingsdatensätze lieferten die Formularfeldausschnitte aus Live-Daten. Letztere brachten immer wieder neue praxisnahe Herausforderungen mit sich, wie etwa schiefe Kästchen oder auch Steuer-IDs, die in Form von Handy-Fotos vorlagen. Die Trainingsdurchläufe dienten daher nicht nur dem Training des Netzwerkes, sondern auch, die Vorverarbeitung zur Extraktion der Ziffern so zu organisieren, dass sie den realen Begebenheiten entsprach. Gleichwohl stand die Entwicklung einer optimalen Struktur des CNNs stets im Vordergrund. Unsere Anstrengungen wurden belohnt – zuletzt wurden hervorragende 98 Prozent der eingelesenen Ziffern richtig erkannt.