Handschrift Erkennung

Die Handschrift entstand im 1. bis zum 3. Jahrhundert. Im Lauf der Geschichte hat sie sich über viele Jahre weiterentwickelt.

 

Im Jahr 2000 gibt es die unterschiedlichsten Handschriften. Die verschiedenen Variationen machen das lesen von Handschriften,selbst in der gleichen Sprache oft schwer. Wie soll es dann möglich sein das ein Computer die Handschrift erkennenund lesenkann?Ich werde hier das Vorgehen beschreiben,mit Hilfe von Tensorflow,eine Handschrifterkennungzuimplementieren. Ich gehe auf die Hilfe durch Tensorflow einund werde das fertige Ergebnis bewerten. Ausserdem werde ich die Methode hinterfragenund Überlegungen anstellenwie das Vorgehen verbessert werden könnte.

Wie geht man also vor,wenn man eine Handschrift erkennen will?Da ein Computer nicht Augen wie ein Mensch hat, muss eine Möglichkeit gefunden werden um herauszufinden welches Zeichen gerade angezeigt wird. Dabei kommt im Maschine Learning die Wahrscheinlichkeitsrechnung zum Einsatz. Ihr kennt das sicher noch aus der Schule. Wie Wahrscheinlich ist es das ein Würfelwurf eine 1 Ergibt. Wir wissen die Formel ist einfach 16. Die Chance mit einen Wurf irgendeine Zahl zu würfeln ist für alle Zahlen gleich nämlich 16.Um den Computer die Wahrscheinlichkeiten errechnen zulassen sind allerdings zuerst einmal Datennotwendig.In dem Tutorial von Tensorflow werden uns 70000Bilder von Zahlen zwischen 0 und 9 zur Verfügung gestellt. Davon sind 55000 zufällige Bilder zum Lernen. 1000 Bilder werden zum Testen verwendet. Die letzten 5000 Bilder dienen zum Validieren der Daten. Jedes der Bilderhat 28x28 (784) Pixel. Nun gilt es eine Möglichkeit zu finden um die Wahrscheinlichkeiten zu berechnen das ein Bild eine bestimmte Zahl darstellt.

Um eine Wahrscheinlichkeit für eine Zahl zu bestimmen muss ich jedoch tiefer gehen.Hierfürgehen wir Schritt für Schritt das Tutorial von Tensorflow[1]durch.Zuerst gilt es,für jedenPixel,im Bild eine Gewichtung festzulegen.Wir können aus jeden Bild ein Array [784] mit Nummern bilden. Wie das Array gebildet wirdspielt dabei keine Rolle.Es muss jedoch bei allen Bildern konsistent sein. In dem Array wird für jedenPixel eine Gewichtung angegeben. Diese gibt an wie stark der Druck in diesem Pixel ist. So hat man für jedes Bild ein Array mit 784 Nummern zwischen 0 und 1. Diese starke Vereinfachung macht das Auslesen der 2D Struktur des Bildes unmöglich. Für Die Softmax Methode die im Tensorflow Tutorial verwendet wird sind diese Daten allerdings unerheblich.Wenn alle Bilder vereinfacht sind hat man ein Mehrdimensionales Array zur Verfügung. Dieses ist wie folgt aufgebaut: [Bilder, Pixel] oder hier [55000,784]. Für jedes Bild gibt es für jeden Pixel eine float Nummer welche die Nummer angibt zwischen 0 und 1.In den Daten von Tensorflow haben wir entsprechende One Hot Vectors.One Hot Vecotren sind Vectoren welche inden meisten Dimensionen0 sind und nur an einer Stelle 1. Folglich haben wir in unseren Testdaten nur ein Array von [55000,10].Die 5 wäre also in unserem Fall [0,0,0,0,0,1,0,0,0,0].

Da wir nun die Daten haben können wir unser Modell erstellen.Wir setzen in unserem Beispiel aufSoftmaxRegression. Das heisst wir können für jedes Bild sagen das es zum Beispiel zu 80% eine 9 ist aber zu 5% eine 8 usw. Softmax wird eingesetzt,wenn sie einemObject Wahrscheinlichkeiten zuordnen wollen welches eines von mehreren Dingen ist. In unserem Fall wollen wir also einem Object,was eine Zahl zwischen [0-9] ist,eine Wahrscheinlichkeit geben.Die Softmax Methodebestehtaus 2 Schritten. Im Schritt 1 werden die Beispiele Klassenzugeordnet. Im Schritt 2 wandeln wir unsere Beweise in Wahrscheinlichkeiten um.

In unseren Fall sind also die Zahlen [0-9] Klassen. Um nun ein Bild einer bestimmten Klasse zuzuordnen summierenwir die Gewichtung der einzelnen Pixelintensitäten. Ein Pixel hat eine negative Gewichtung, wenn die Intensität ein Beweis gegen die Zugehörigkeit der Klasse ist. Ist die Intensitätjedoch ein Beweis für die Klasseso ist die Gewichtung positiv. Das Model lernt also eine eigene Gewichtung für jede Klasse. JederPixel hat einen positiven oder negativen Wert.

In unserem Beispiel fügen wir noch ein extra Beweismittel hinzu. Wir nenne es Bias. Als Ergebnis wollen wir sagen können das mansche Dinge nahezu unabhängig vom Input sind.

Unsere Beweisgleichung sieht wie folgt aus:

 

W ist unsere Gewichtung der Klasse i. X ist der Eingabewert und j ein Index zum Summieren der Pixel in unserem Eingabebild. Diesen Beweis wandeln wir dann mit der Softmax Methode in Wahrscheinlichkeiten um.

Dafür istdie Funktion:  y = softmax(Beweis).

Softmax dient als Aktivierungs-Funktionum unsere lineare Funktion in die gewünschte Form bringt also einer Wahrscheinlichkeitsverteilung über unsere 10 Klassen. So legen wir für jeden Input eine Wahrscheinlichkeit für jede Klasse fest.

Durch exponentieren und späteres normalisierender Inputs erhöht eine weitere Beweiseinheit die Gewichtung. Umgekehrt wird die Gewichtung bei anderen Hypothesen auf einen Bruchteil ihres vorherigen Wertes reduziert.

Wir sind in unserem Beispiel aber einfach unterwegs und so ist unser Funktion Kompakt dargestellt.

 

Tensorflow vereinfacht uns diese Sache extrem.

Das Tutorial führt einen den Weg vor vereinfacht aber die Rechnung extrem. Die Implementierung der Regression sieht dann wie folgt aus. Ich definiere zuerst x.

x = tf.placeholder(tf.float32, [None, 784])

X ist dabei aber kein fester Wert, sondern wird als Platzhalter genutzt. Es ist ein Wert den wir eingeben werden,wenn wir Tensorflow benutzen. None sagt aus das dieser Part beliebig lang sein kann.
Anschliessend legen wir Bias und die Gewichtung als Variablen fest.

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))

Auch hier nimmt uns Tensorflow wieder sehr viel Arbeit ab. Variablen können in Tensorflow nämlich modifizierbar in der Applikation bestehen. So ist es möglich diese als Operator zu verwenden und sogar durch Operationen zu modifizieren.

So können wir nun die Funktion von y schreiben.

Daraus bilde ich nun mein Model,y = tf.nn.softmax(tf.matmul(x, W) + b), was unserer Gleichung y = Wx + b entspricht.

Mit dem Model kann das Training gestartet werden.

Im Machine Learning sagt man einem Model typischerweise was es bedeutet schlecht zu sein. Man spricht dabei von einem Verlust. Diesen versucht man durch umstellen des Models zu minimieren.

Wir benutzen dafür in dem Tutorial die Kreuzentropie. Diese gibt an wie unsicher ein Model ist. Wenn wir in unserem Fall y die vorhergesagte Wahrscheinlichkeit ist dann y_ die tatsächliche Eingabe.

y_ = tf.placeholder(tf.float32, [None, 10])

cross_entropy= tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),

reduction_indices=[1]))

Es wird also das Bild mit den Wahrscheinlichkeiten für alle Bilder verglichen. Daraus wird die durchschnittliche Unsicherheit gemessen.

Als nächstes legen wir einen Trainingsschritt fest.Auch hier bietet Tensorflow wieder ausgezeichnete Hilfe an. Da Tensorflow die gesamten Berechnungen kennt kann es automatisch den Backpropagation-Algorithmus verwenden.

Dieser macht die Berechnung um bis zu 10 Millionenschnellerals eine Native Implementierung.

Unser Trainingsschritt wird also wie folgt festgelegt.

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

Nun will ich das Ganze auch Ausführen.

Dafür initialisiere ich die Anwendung und hole mir die Aktuelle Session.

init = tf.initialize_all_variables()

sess = tf.Session()

sess.run(init)

Die Ausführung des eigentlichen Trainings sind dann tatsächlich nur 3 Zeilen Code. for i in range(1000):

batch_xs, batch_ys = mnist.train.next_batch(100)

sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

Zuerst wird eine Schleife mit 1000 Durchläufen deklariert. In der Schleife hole ich mir zufällig 100 Bilder zum Lernen.Das Verwenden von vielen kleinen Datenblöcken nennt man auch stochastisches Training.

Anschliessend wird der Trainingsschritt welcher oben definiert ist ausgeführt.Nach einigen Minuten Rechenzeit bekommt man dann einen Wert um 0.92 was rund 92% als Ergebnis.

DieTrefferwahrscheinlichkeit unseres Models liegt also bei rund 92%.
Der Lernvorgang wird in dem Tensorflow genau beschrieben. Es wird die Methodik grob aber nicht im Detail erklärt. Ich kennealso nach abschliessen des TutorialsdenGrundlegenden Ablauf von Maschine Learning. Wie müssten wir nun vorgehen wenn wir nicht nur Zahlen sondern auch Buchstaben erkennen wollten.

Zuerst müssten wir uns um geeignete Daten kümmern. Wir haben für die Zahlen 70000 Bilder zur Verfügung gehabt. Wenn wir davon ausgehen das diese Menge schon befriedigende Ergebnisse liefert gehe ich davon aus das wir pro Zeichen welches wir lernen wollen im Schnitt 7000 Daten benötigen. Im Alphabet haben wir 26 Buchstaben diese können gross und klein geschrieben werden. Dies muss unterschieden werden da wir sonst in unseren Weights zu grosse Abweichungen bekommen würden. Wir brauchen also 26 x 2 * 7000 Datensätze zum Lernen.Das erhöht die Anzahl der Daten benötigten Daten auf 364000. Mit mehr Daten steigt natürlichauch die benötigte Rechenleistung was wohl einer der Gründe dafür war das im Tutorial nur Zahlen gelesen werden. Weiter muss man natürlich den One Hot Vector anpassen. Wenn man nur Handschrift lesen möchte benötigt dieser 52 Dimensionenwenn man Handschrift und Zahlen lesen möchte benötigt er sogar 62 Dimensionen.Wenn man also die Daten hat und den Vector angepasst hat könnte man meiner Meinung nach auf die gleicheArt und Weise die Handschrift lernen.Schauen wir uns nun das Ergebnis näher an. 92% kann einfach nicht das Ziel sein. Dieser Wert mag für eine Veranschaulichung tauglich sein, nicht aber für ein produktives System. Nehmen wir mal an, ich lese Handschriften einum diese später zu archivieren. Bei einer Fehlerquote von 8% Müsste man, wenn man von 500 Zeichen pro Seite ausgeht, 40 Fehler je Seite suchen. Nun ist Korrektur lesen kein einfaches Unterfangen und so wäre ein enormer zusätzlicher Arbeitsaufwand notwendig.Das ganze wird erweitert das man sich auch überlegen müsste wie man auf die einzelnen Zeichen kommt. Es gibt noch Leerschlag, Satzzeichen und Sonderzeichen. All das muss abgefangen werden. Hinzu kommt das es Trainingsdaten geben muss. Ich glaube nicht, dass es sich lohnt wenn man Bilder von Briefen oder anderen handschriftlichen Dokumenten in kleine Bilder je Zeichen aufteilt. Die Aufbereitung der Daten sehe ich da als grösstes Problem. Gerade eine Handschrift ist ja meist zusammenhängend. Wo ziehe ich die Grenze zwischenden Wörtern? Wie erkenne ich einen Leerschlag? Diese Punkte sind wichtig beim Erstellen einer Routine. Das zeigt auf das es mit dem Wissen wie man lernt allein nicht getan ist. Bevor Daten zum Analysieren und Lernen nutzen kann müssen diese aufbereitet werden. Erst wenn sie in der richtigen Form zur Verfügung hat kann man mit dem lernen beginnen. Das Vorgehen zum Ermitteln der Gewichtung hätte ich ähnlich vorgenommen. Ich würde für jedenPixel eine Wahrscheinlichkeit für jeden Buchstaben berechnen. Genauso würde ich für Pixel welche noch nie in einem Bild vorgekommen sind negative Wahrscheinlichkeiten vergeben. Ich würde anschliessend beim Prüfen die Wahrscheinlichkeiten für jeden Buchstaben analysieren.Dazu würdeich die Wahrscheinlichkeiten welche aufgetreten sind aufsummieren und einen Mittelwert bilden. Ob dies dann Zielführend ist müsste ich mit Tests und Validierung feststellen. Leider werden einem in diesem Punkt zu wenig Erläuterungen zu dem Vorgehen inTensorflow gegeben. Das Model ist hier schon vorgegeben. Gerade dies ist aber der Kernpunkt eines Lernprozesses. Das Model ist sehr einfach gehalten und ich verstehe welche Funktionsweise es hat. Leider bestehtkeinerlei Möglichkeit dieses sinnvoll zu beeinflussen. Will ich also ein Model aufbauen muss ich mich vorher mit den statistischen Rechenmethoden auseinandersetzen. Wenn ich diese nicht verstehe ist es mir nahezu unmöglich ein eigenes Model zu erstellen.


Als Fazit kann ich sagen das mir das Tensorflow Tutorial einen guten Einstieg in die Materie bietet. Um jedoch eigene Models zu erstellen und eigene Lernprozesse zu kreieren braucht es mehr als das. Wahrscheinlichkeitsrechnung und Datenanalyse sind ein Muss für dieses Thema. Ist das Thema Handschrifterkennung nicht vorgegeben muss noch analysiert werden was überhaupt gelernt werden soll. Oft sind im Unternehmen Terabyte von Daten vorhanden welche einfach nicht genutzt werden. Hier bedarf es Möglichkeiten die Abhängigen Variablen zu bestimmen. Dafür ist Domänenwissen unabdingbar. Wir stehen mit dem Thema auch noch am Anfang der Entwicklung und es wird eine Freude sein dies weiter zu beobachten.

Literaturverzeichnis

[1] https://www.tensorflow.org/versions/r0.9/tutorials/mnist/beginners/index.html#mnist-for-ml-beginners 19.112016

[2] http://www.schulschrift.ch/d/pdf/a_6_16_entsteh_handsch.pdf 19.11.2016

[3] http://www.coli.uni-saarland.de/courses/mathe3/SS12/Vorlesungen/info_thy.pdf 20.11.2016

[4] http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ 21.11.2016

[5] http://ffb.uni-lueneburg.de/ffb-files/File/Fuenfter%20Teil.pdf 21.11.2016

[6] http://colah.github.io/posts/2015-08-Backprop/ 21.11.2016

Kommentar einfügen: