Handgeschriebene Zahlen mit Künstlicher Intelligenz erkennen

| Autor / Redakteur: Alex Wong und Elod Gyorgy * / Michael Eckstein

Adlerauge: Beispiel eines kostengünstigen Systems zum Erkennen handgeschriebener Zahlen. Die Basis bilden Boards von Digilent.
Adlerauge: Beispiel eines kostengünstigen Systems zum Erkennen handgeschriebener Zahlen. Die Basis bilden Boards von Digilent. (Bild: Digilent)

Das Erkennen handgeschriebener Zahlen ist mit traditionellen Programmiermethoden schwer zu realisieren. Künstliche Neuronale Netzwerke sind besser dafür geeignet, bringen aber ganz eigene Anforderungen mit. Wie lässt sich so ein System implementieren?

In der Welt der Künstlichen Intelligenz (KI) ist das Erkennen von handgeschriebenen Zahlen so etwas wie „Hello World“ in der Softwareentwicklung: Es beweist, dass ihre Neuronen richtig angeordnet und arbeitsfähig sind. Wie „Hello World“ ist diese Anwendung der KI bereits recht alt und hatte ihren Durchbruch 1989: Damals gelang eine zuverlässige maschinelle Erkennung von Postleitzahlen für die Briefzustellung.

Erst kurz zuvor war nachgewiesen worden, dass mehrschichtige, rückgekoppelte (Feed-Forward) Neuronale Netze jede Funktion realisieren können. Wenig später übernahmen Finanzinstitute die Technik zum automatischen Lesen von Kontonummern auf Überweisungsträgern oder Schecks. Heutzutage wird das Erkennen von handgeschriebenen Ziffern mithilfe von verschiedenen KI-Techniken auch an Hochschulen für Lehr- und Lernzwecke verwendet.

Während sich die Problemstellung im Laufe der Zeit kaum verändert hat, ist die verfügbare Rechenleistung in den letzten Jahrzehnten drastisch gestiegen. So ist es heute möglich, das Erkennen selbst auf einem kleinen, für den Unterricht geeigneten FPGA-(Field-Programmable-Gate-Array-)Board mit Digitalkamera auszuführen. Trotzdem ist es immer noch eine der schwierigsten Aufgaben für eine Künstliche Intelligenz. Handschriftliche Zahlen unterscheiden sich in Größe, Breite und Ausrichtung, von Person zu Person. Und selbst eine persönliche Handschrift weist Variationen auf. Zudem bestehen je nach Kulturkreis verschiedene Versionen. So schreiben beispielsweise Amerikaner und Europäer die Ziffern 1, 4, oder 7 unterschiedlich.

Das Erkennen handgeschriebener Zahlen ist aufwändig

Weitere Erkennungsprobleme gibt es aufgrund der Ähnlichkeiten zwischen einigen Zahlen: 3 und 8, 5 und 6, 2 und 7, usw. Und nicht zuletzt hat die Bildqualität selbst einen großen Einfluss, besonders auch beim Training. Denn ist die Künstliche Intelligenz nicht richtig trainiert, wird sie viele Zahlen falsch klassifizieren. Und: Der Versuch, ein derartiges Erkennungssystem mit einem klassischen Programmieransatz zu implementieren, wird Software-Entwickler aufgrund der unzähligen Details und Sonderfälle in Teufels Küche bringen.

Aber wie funktioniert die Erkennung? Oberflächlich betrachtet, ist das recht einfach: Ein Bild der Zahl muss erfasst, verarbeitet und analysiert werden, um dem Benutzer ein Ergebnis zu präsentieren. Bei einer gründlicheren Analyse wird schnell deutlich, dass die Aufgabe aber viel umfangreicher ist und etliche Probleme zu lösen sind. Die Hardware ist dabei für ein solches System nicht die eigentliche Schwierigkeit.

So hat Digilent ein Musterbeispiel einer derartigen Zahlenerkennung mittels KI als Proof-of-Concept auf ihrem Entwicklungsboard „Zybo Z7 Xilinx Zynq-7000 ARM/FPGA“ zusammen mit ihrem 5-Megapixel-Pcam-5C-Farbkameramodul für die Bilderfassung implementiert. Das Zybo-Z7-Board basiert auf der „All Programmable System-on-Chip“-(AP SoC-)Architektur von Xilinx, die einen Dual-Core-ARM-Cortex-A9-Prozessor mit einer FPGA-Logik der Xilinx-7-Serie kombiniert. Als Benutzerschnittstelle und zum Anzeigen des Ergebnisses wurde zusätzlich das Pmod-MTDS-Multi-Touch-Display von Digilent verwendet (Bild 1).

Vorverarbeitung der Aufnahme per FPGA

Die Pcam-5C-Kamera nimmt eine Zahl mit einer Auflösung von 1000 Pixel x 1000 Pixel auf, was für diese Anwendung eigentlich sehr hoch aufgelöst ist. Über die MIPI-CSI-2-Schnittstelle (MIPI Camera Serial Interface 2) gelangt das Bild auf das Zybo-Z7-Board (Bild 4). Dort wird das Bild vom FPGA vorverarbeitet, auf 500 Pixel x 500 Pixel verkleinert und zunächst in Graustufen und schließlich in ein rein schwarz-weißes Bild umgewandelt. Die Weiterverarbeitung erfolgt auf dem mit 667 MHz getakteten ARM-Cortex-A9 Prozessor. Dieser führt zunächst eine Bounding-Box-Suche aus, sucht also nach dem kleinstmöglichen Begrenzungsrahmen, der die Ziffer enthält. Danach erfolgt das Zentrieren der Zahl im Rahmen (eine Zentrierung um den Massenschwerpunkt innerhalb eines größeren Fensters wäre eine andere Möglichkeit).

Bild 2: Aufbau der Neuronen im FPGA. „w“ ist die Gewichtung, „b“ der Bias und Sigma die Sigmoid-Funktion.
Bild 2: Aufbau der Neuronen im FPGA. „w“ ist die Gewichtung, „b“ der Bias und Sigma die Sigmoid-Funktion. (Bild: Digilent)

Schließlich wird die Bounding-Box auf eine Bildgröße von 28 Pixel x 28 Pixel skaliert. Diese Größe wurde gewählt, da das Trainingsset für das neuronale Netz in dieser Auflösung vorliegt. Jedes Pixel des Bildes wird als Eingang zu einem der 784 (28 x 28) Eingangsneuronen des rückgekoppelten Künstlichen Neuronalen Netzwerks (KNN) auf dem FPGA benutzt. Jedes künstliche Neuron verwendet eine Q4.11-Festkommadarstellung und besteht aus einem Multiplizierer, der das Eingangspixel gewichtet, und einem Addierer, der einen Bias zum Ergebnis der Multiplikation addiert (Bild 2). Beide Werte, die Gewichtung und der Bias, wurden zuvor aus dem Training abgeleitet. Auf das Additionsergebnis wendet das System schließlich eine Sigmoid-Funktion an, um den Aktivierungsausgang des Neurons zu erzeugen. Die folgenden Gleichungen zeigen die mathematischen Details, wobei die Variablen w die Gewichtung, b den Bias und s die Sigmoid-Funktion repräsentieren:

a= s(w∙x+b)

s(z)= 1/(1+e^(-z) )

Bild 3: Die Struktur des verwendeten Künstlichen Neuralen Netzwerks mit 784 Eingangsneuronen, zwei verdeckten Schichten mit je 16 Neuronen und zehn Ausgangsneuronen.
Bild 3: Die Struktur des verwendeten Künstlichen Neuralen Netzwerks mit 784 Eingangsneuronen, zwei verdeckten Schichten mit je 16 Neuronen und zehn Ausgangsneuronen. (Bild: Digilent)

Der Aktivierungsausgang der Eingangsebene wird dann als Eingangswert für alle 16 Neuronen der ersten verdeckten Zwischenschicht (Hidden Layer) verwendet. Der zunächst mysteriös klingende Begriff „Hidden Layer“ bedeutet dabei nur, dass die zu dieser Schicht gehörenden Neuronen weder Eingangs- noch Ausgangsneuronen sind. Der Ausgangswert der ersten verdeckten Zwischenschicht wird anschließend als Eingangswert für alle Neuronen der zweiten verdeckten Zwischenschicht benutzt, die ebenfalls aus 16 Neuronen aufgebaut ist (Bild 3). Mit zwei versteckten Schichten qualifiziert sich das System technisch als tiefes Neuronales Netzwerk (Deep Neural Network, DNN), ist aber mit komplexeren Systemen, die mehrere tausend Schichten aufweisen können, nicht vergleichbar.

Training ist das Wichtigste für ein Neuronales Netz

Die Ausgabeschicht schließlich besteht aus 10 Neuronen, eines für jede Ziffer im Bereich von Null bis neun. Jedes Ausgangsneuron besitzt einen Aktivierungswert und das Neuron mit dem höchsten Aktivierungswert gilt als die richtige Annahme. Besitzt also beispielsweise das Ausgangsneuron, das die Zahl 4 repräsentiert, den höchsten Wert, betrachten wir die Zahl 4 als die beste Schätzung. Da die Ergebnisse des Neuronalen Netzwerks an sich keine Wahrscheinlichkeiten darstellen, kann der Wahrscheinlichkeitsgrad des Ergebnisses nicht bestimmt werden. Dies könnte jedoch durch das Hinzufügen einer Softmax-Schicht zum Netzwerk gelöst werden, die die Zahlen in Wahrscheinlichkeiten umwandelt. Zuletzt wird das Endergebnis der Erkennung auf dem Display angezeigt (Bild 5).

Bild 5: Die Schätzung des Ergebnisses wird im Beispielssystem auf einem Pmod MTDS von Digilent ausgegeben.
Bild 5: Die Schätzung des Ergebnisses wird im Beispielssystem auf einem Pmod MTDS von Digilent ausgegeben. (Bild: Digilent)

Wie bei allen Künstlichen Neuronalen Netzen muss das System vor dem Einsatz trainiert werden. Im Beispiel wurde das Universalitätstheorem (Universality Theorem) angewendet, um die Gewichte und den Bias aus den Bildern in der weit verbreiteten MNIST-(Modified NIST-)Datenbank zu berechnen. Diese umfasst 60.000 Trainingsbilder und 10.000 Testbilder in zwei Sets, die aus gekennzeichneten Bildern handschriftlicher Zahlen im Bereich von Null bis neun bestehen. Der Name MNIST leitet sich von der Tatsache ab, dass die Datenbank eine Teilmenge der von der NIST, dem United States National Institute of Standards and Technology, gesammelten Datensätze darstellt. Das Training wurde überwacht und auf einem PC mittels Python-Skript durchgeführt, wobei jeder Trainingssatz aus dem Paar „Eingabe“ und „gewünschte Ausgabe“ besteht. Der Trainingsalgorithmus dazu wurde aus dem Open-Source-Lehrbuch von Michael A. Nielsen übernommen .

Höhere Erkennungsraten mithilfe von Convolutional-Neural-Networks (CNN)

Nach dem Training erreichte das KNN bei den MNIST-Testbildern eine Erkennungsrate von 95,2%. Höhere Raten können durch das Verwenden eines Convolutional-Neural-Networks (CNN) erzielt werden. Die besten akademischen Ergebnisse mit einer Fehlerquote von 0,23% wurden mit einem CNN mit 35 Schichten realisiert, etwas, das den Rahmen dieses Proof-of-Concepts gesprengt hätte. Es zeigte sich auch, dass die Live-Erkennungsrate stark von der Ausrichtung der Zahl vor der Kamera abhing, da die Zahlen nicht automatisch gerade ausgerichtet wurden. Als schwierigste Ziffer für das Erkennungssystem stellte sich die Zahl neun (9) heraus, die kaum erkannt wurde. Einmal gedreht, wurde sie jedoch meist als die Zahl sechs (6) identifiziert, was darauf hindeutet, dass ein zusätzliches Training des Systems Abhilfe schaffen könnte.

Bild 4: Ein relativ kleines FPGA-Entwicklungsboard ist für die Implementation einer Künstlichen Intelligenz ausreichend.
Bild 4: Ein relativ kleines FPGA-Entwicklungsboard ist für die Implementation einer Künstlichen Intelligenz ausreichend. (Bild: Digilent)

Die Vorverarbeitung dauerte 1664 ms, wenn sie ausschließlich auf dem ARM-Cortex-A9-Prozessor auf dem Zybo-Z7-Entwicklungsboard durchgeführt wurde, und 999 ms, sobald sowohl der ARM-Prozessor als auch das FPGA verwendet wurden. Die Ausführungszeit des KNN betrug 73 ms auf dem ARM und 57 ms auf dem ARM plus FPGA. Diese Lehrbuch-Implementation einer Erkennung handgeschriebener Zahlen zeigt, dass es möglich ist, ein Künstliches Neuronales Netzwerk mit integrierter Deep-Learning-Fähigkeit auf einem FPGA-Board zu realisieren. Entwicklungsboards wie das Zybo-Z7-Board von Digilent ermöglichen eine günstige Realisierung. Der Prototyp hat sich zwischenzeitlich auf mehreren Messen bewährt.

„Der dedizierte KI-Prozessor ist tot!“: Erweiterbare KI-Architektur für das Smart Edge

„Der dedizierte KI-Prozessor ist tot!“: Erweiterbare KI-Architektur für das Smart Edge

22.10.19 - Seine neue KI-Prozessorarchitektur NeuPro-S hat Ceva für Inferenzaufgaben wie Imaging und Vision am Edge optimiert. Der Clou: Über die integrierte „CDNN-Invite“-Programmierschnittstelle können Entwickler ihre eigenen anwendungsspezifischen Neuronalen Netzwerke einbinden. lesen

Integration von KI in industriellen Mensch-Maschine-Schnittstellen

Integration von KI in industriellen Mensch-Maschine-Schnittstellen

30.08.19 - KI verbessert moderne Mensch-Maschine-Schnittstellen, lässt aber deren Bedarf an die Rechenleistung nach oben schnellen. Das hat Auswirkungen auf die verwendeten Mikrocontroller und Prozessoren. lesen

Ist Europa tatsächlich das KI-Schlusslicht?

Ist Europa tatsächlich das KI-Schlusslicht?

14.10.19 - Im Vergleich zu den Aktivitäten der US-Internetriesen und den massiven Förderungen des chinesischen Staates für Künstliche Intelligenz (KI) scheint es laut vieler Umfragen in Europa eher beschaulich zuzugehen. Spiegeln sie tatsächlich die Realität wider? Wir klären auf und differenzieren das Bild. lesen

Dieser Beitrag ist erschienen in der Fachzeitschrift ELEKTRONIKPRAXIS Ausgabe 21/2019 (Download PDF)

* Alex Wong arbeitet als Distribution Sales Manager bei Digilent, einer Firma von National Instruments, in Seattle/USA.

* Elod Gyorgy arbeitet als Engineering Manager (Hardware) in der rumänischen Niederlassung von Digilent, einer Firma von National Instruments.

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de/ (ID: 46155530 / KI/Machine Learning)