Belegarbeit im Fach Neuroinformationsverarbeitung
"NumberOCR"
Dozent: |
|
|
|
Name: |
Maik Zachacker |
Studiengang: |
Allgemeine Informatik |
eMail: |
Einleitung
Aufgabe dieser Belegarbeit war es auf Basis des SOM simulator-Frameworks, von Markus Schubert, die Erkennung von Nummern mittels einer self organizing map zu realisieren. Das Programm NumberOCR wurde daher als PlugIn für diesen konzipiert und entsprechend umgesetzt. Das PlugIn fügt sich nahtlos in den SOM simulator ein und nutzt die damit erstellte Kohonen-Karte.
Das SOM (Kohonen Karte)
Kohonen-Karten (benannt nach dem Erfinder Teuvo Kohonen) oder auch bekannt unter dem Namen self organizing maps (SOM) sind eine Art von neuronalem Netz, welches Nachbarschaftsbeziehungen im Eingaberaum durch Nachbarschaften in den Neuronenbeziehungen ausdrückt. Das heißt, werden ähnliche Eingaben an das Netz angelegt, so reagieren auch benachbarte Neuronen auf diese Eingabe. Die self organizing map besitzt 2 Schichten. Eine Eingabe-Schicht und eine nach dem Entwickler benannte Kohonen-Schicht. Self organizing map's sind in der Lage mehrdimensionale Eingabemuster auf eine zweidimensionale Struktur abzubilden, welche sich durch Wettbewerbslernen (competitive learning) in einem unüberwachten Lernprozess von selbst ausbildet. Anhand folgender Skizze kann man sich eine Vorstellung eines SOM's machen.

Im Projekt wird wie im Bild zu erkennen eine zweidimensionale Kohonen-Karte verwendet. Jedes der Inputneuronen ist mit allen Neuronen der Karte verbunden, jedoch sind die Inputneuronen voneinander unabhängig. Die Neuronen in der Kohonen-Karte besitzen eine Nachbarschaftsbeziehung, die wichtig ist um ein auseinanderfalten der Karte zu ermöglichen. Die Karte kann dabei geschlossen oder geöffnet sein. Ist die Karte geschlossen, so haben Neuronen am Rand der Karte weniger Nachbarn als die in der Mitte und es erfolgt kein Lernen über die Ränder hinaus, siehe linkes Bild. Bei einer geöffneten Karte haben dagegen alle Neuronen die gleiche Anzahl an Nachbarn und es wird über den Rand der Karte hinaus gelernt, siehe rechtes Bild.
![]() |
![]() |
Der Lernprozess
Als erstes wir für jedes Zeichen, dass später einmal erkannt werden soll, eine Muster benötigt. Im Beleg werden diese Muster als XML-Datei geliefert, welche für jedes Zeichen eine Matrix mit 5x7 Pixeln beinhaltet, aus welchen die Merkmale extrahiert werden. Prinzipiell überprüft das SOM ob ein bestimmtes Pixel zum Symbol oder zum "weißen" Hintergrund gehört. Dieses wird im Featurevektor entsprechend codiert eingetragen. Der Inputvektor hat folgenden Aufbau:
Die Neuronen in der Kohonen-Karte werden nun mit den angelegten Mustern verglichen. In der Lernphase erfolgt dabei eine Veränderung der Gewichte der Neuronen der Kohonen Karte. Bei der späteren Erkennung erfolgt nur noch ein Vergleich. Damit überhaupt zulässige Vektoroperationen möglich sind ist es zwingend notwendig, dass die Neuronen der Karte mindestens genauso viele Elemente haben wie Inputneuronen:
Liegen die Eingabevektoren vor, kann das Netz angelernt werden. Im Allgemeinen wird ein SOM mit zufälligen Werten initialisiert. Auch wenn das Netz bereits angelernt ist können neue Eingabemuster angelernt werden.
Beim Lernen werden nun alle Inputneuronen der Reihe nach immer wieder mit allen Kartenneuronen verglichen. Es wird ein Gewinner in der Kohonen-Karte für das angelegte Muster ermittelt. Das Neuron mit dem kleinsten Abstand zwischen den beiden Vektoren ist das so genannte Gewinnerneuron.
Systemvoraussetzungen
- Zur Programmausführung wird ein Java kompatibles Betriebssystem, wie beispielsweise Linux oder Windows, vorausgesetzt.
- Des Weiteren muss eine Java JRE von Sun im System installiert sein, empfohlen wird die Version 1.5.0 oder höher.
- Es wird zwingend die Installation von Java Advanced Imaging 1.1.2 benötigt, da das PlugIn NumberOCR auf dessen Funktionen zugreift.
Installation
Installation von Java 2 unter Windows
Laden Sie die Datei „jre-1_5_0_06-windows-i586-p.exe“ von „http://www.java.com/de/download/manual.jsp“ herunter und führen Sie die Datei aus.
Installation von Java 2 unter Linux
- Laden Sie die Datei
jre-1_5_0_06-linux-i586-rpm.exevon „http://www.java.com/de/download/manual.jsp“ herunter. - Machen Sie die Datei ausführbar mit:
chmod a+x jre-1_5_0_06-linux-i586-rpm.bin - Starten Sie den Installationsvorgang und bestätigen Sie den Lizenzvertrag mit „Ja“:
./jre-1_5_0_06-linux-i586-rpm.binDie Installationsdatei erstellt im aktuellen Verzeichnis die Datei jre-1_5_0-linux-i586.rpm. - Führen Sie den RPM-Befehl am Terminal aus, um die Pakete zu installieren:
rpm -iv jre-1_5_0_06-linux-i586.rpmJRE wird im aktuellen Verzeichnis im Unterverzeichnis jre1.5.0_06 installiert. - Exportieren Sie das Verzeichnis
./jre1.5.0_06alsJAVA_HOMEundJAVA_ROOT:export JAVA_HOME=“IHR VERZEICHNIS“/jre1.5.0_06/export JAVA_ROOT=“IHR VERZEICHNIS“/jre1.5.0_06/Exportieren Sie das Verzeichnis./jre1.5.0_06/binalsJAVA_BINDIR:export JAVA_BINDIR=“IHR VERZEICHNIS“/jre1.5.0_06/bin/Fügen Sie die Exports der Pfadvariablen hinzu:export PATH=$JAVA_ROOT:$JAVA_BINDIR:$PATHTragen Sie diese Zeilen am besten in die .profile oder .bash_rc ein, damit JAVA auch nach einem Neustart sofort verfügbar ist.
Installieren des Programmes SOM simulator
Das Programm SOM simulator liegt als ausführbare Java-Anwendung vor: som.jar Zusätzlich werden folgende Dateien benötigt: Ziffern.xml jai_codec.jar jai_core.jar Die Musterbilder liegen im Verzeichnis: Pattern Eine Installation ist nicht erforderlich, es reicht die Dateien aus dem Archiv zu entpacken.
Installation von Java Advanced Imaging
Kopieren Sie die Dateien „jai_codec.jar“ und „jai_core.jar“ in das Unterverzeichnis „jdk1.5.0_04\lib\ext“ Ihres Java-Installationsverzeichnisses (C:\Programme\Java\jdk1.5.0_06\lib\ext\ oder JAVA_ROOT/lib/ext/).
Einschränkungen
Es werden Eingabebilder der Dimension 300x100 Pixel benötigt, die ausschließlich aus Hintergrund und Text bestehen. Das SOM erkennt kursive Ziffern nur unzureichend. Die Zeichentrennung muss manuell durchgeführt werden, da eine automatische Trennung durch Zeichenüberlappung nicht umsetzbar war.
Das Programm SOM simulator
Der SOM simulator wird mittels des Kommandozeilenbefehles „java -jar som.jar“ im von Ihnen gewählten Verzeichnis oder per Doppelklick auf die Datei „som.jar“ im Explorer gestartet. Nach dem Starten des Programms finden Sie die Oberfläche des SOM simulators vor, wo nur eine leere Arbeitsfläche und eine Menüleiste zu sehen ist. Der SOM Simulator bietet die Möglichkeit ein ein- oder zweidimensionales SOM mit einer beliebigen Anzahl von Inputvektoren zu erzeugen. Außerdem kann das SOM mit verschiedenen Lernfunktionen trainiert werden und bietet mehrere Optionen das Lernverhalten zu beeinflussen. Die zum lernen notwendigen Muster müssen als PatternFile vorliegen, welche in XML verfasst sind und der beiliegenden XML Schema Definition genügen müssen . Als PlugIns werden die Darstellung einer Topologischen Karte des SOM, eine grafische Anzeige für das Handlungsreisenden Problem, eine zweidimensionale Karte und eine Komponentenkarte angeboten. Im Rahmen dieses Beleges wurde das PlugIn NumberOCR hinzugefügt. Dieses dient der Erkennung von Ziffern, die in verschiedenen Schriftarten als 6-stellige Zahl im JPG-Format vorliegen. Die Zeichentrennung wird dabei manuell durch den Nutzer durchgeführt.
Die Musterdatei
Die Musterdatei, auch PatternFile genannt, beinhaltet die Informationen über ein PatternSet. Das PatternSet besteht aus einem Namen, der Anzahl der im Set enthaltenen Muster, der Featurevektorgröße, der Position der einzelnen Featurevektoren in einer zweidimensionalen Karte und natürlich den Mustern (Pattern). Die Musterdatei ist entsprechend einer XML-Notation aufgebaut, welche in der Datei PatternSet.xsd beschrieben ist.
Im PatternFile enthaltene Informationen:
- NameOfPatternSet
- - Name des Mustersatzes
- NumberOfPattern
- - Anzahl der Muster
- DimensionOfFeatureVector
- - benötigte Featurevektorgröße
- NameOfData
- - Position der Featurevektorelemente im 2D-Raum
- Pattern
- - Muster
- NameOfPattern
- - Name des jeweiligen Musters
- Data
- - Wert des Featurevektors an der jeweiligen Position
Auszug aus dem PatternFile Ziffern.xml:
<?xml version="1.0" encoding="UTF-8"?> <PatternSet> <NameOfPatternSet>Ziffern in 5x7 Matrix</NameOfPatternSet> <NumberOfPattern>10</NumberOfPattern> <DimensionOfFeatureVector>35</DimensionOfFeatureVector> <NameOfData>0-0</NameOfData> <NameOfData>1-0</NameOfData> <NameOfData>2-0</NameOfData> <NameOfData>3-0</NameOfData> <NameOfData>4-0</NameOfData> <NameOfData>0-1</NameOfData> <NameOfData>1-1</NameOfData> <NameOfData>2-1</NameOfData> <NameOfData>3-1</NameOfData> <NameOfData>4-1</NameOfData> <NameOfData>0-2</NameOfData> <NameOfData>1-2</NameOfData> <NameOfData>2-2</NameOfData> <NameOfData>3-2</NameOfData> <NameOfData>4-2</NameOfData> <NameOfData>0-3</NameOfData> <NameOfData>1-3</NameOfData> <NameOfData>2-3</NameOfData> <NameOfData>3-3</NameOfData> <NameOfData>4-3</NameOfData> <NameOfData>0-4</NameOfData> <NameOfData>1-4</NameOfData> <NameOfData>2-4</NameOfData> <NameOfData>3-4</NameOfData> <NameOfData>4-4</NameOfData> <NameOfData>0-5</NameOfData> <NameOfData>1-5</NameOfData> <NameOfData>2-5</NameOfData> <NameOfData>3-5</NameOfData> <NameOfData>4-5</NameOfData> <NameOfData>0-6</NameOfData> <NameOfData>1-6</NameOfData> <NameOfData>2-6</NameOfData> <NameOfData>3-6</NameOfData> <NameOfData>4-6</NameOfData> <Pattern> <NameOfPattern>0</NameOfPattern> <Data>0</Data> <Data>1</Data> <Data>1</Data> <Data>1</Data> <Data>0</Data> <Data>1</Data> <Data>0</Data> <Data>0</Data> <Data>0</Data> <Data>1</Data> <Data>1</Data> <Data>0</Data> <Data>0</Data> <Data>0</Data> <Data>1</Data> <Data>1</Data> <Data>0</Data> <Data>0</Data> <Data>0</Data> <Data>1</Data> <Data>1</Data> <Data>0</Data> <Data>0</Data> <Data>0</Data> <Data>1</Data> <Data>1</Data> <Data>0</Data> <Data>0</Data> <Data>0</Data> <Data>1</Data> <Data>1</Data> <Data>1</Data> <Data>1</Data> <Data>1</Data> <Data>1</Data> </Pattern> ... <Pattern> <Data>... ...</Data> </Pattern> </PatternSet>
Das Plugin NumberOCR
Das Programm NumberOCR wurde entwickelt um Ziffern verschiedener Schriftarten zu erkennen. In den letzten Jahren wurden einige Websites mit einem Zugangsschutz für Bots ausgerüstet, dies wird über eine Grafik erreicht, welche Buchstaben oder Zahlen, teilweise auch beides enthält. Durch die Verwendung verschiedenster Schriftarten wird eine Erkennung durch Bots umgangen, selbst der Mensch hat oft Probleme die Zeichen zu erkennen. Dies war die Inspiration für dieses PlugIn, welches die Erkennung der Ziffern ermöglichen soll. Eine automatische Zeichentrennung ist leider noch nicht implementiert, daher gibt es die Möglichkeit die Zeichen selbst zu trennen. Das PlugIn NumberOCR besteht aus mehreren Bereichen. Im linken oberen Bereich befinden sich die Buttons zum öffnen eines Verzeichnisses, in welchem sich die zu Erkennenden Bilder befinden, sowie zum Invertieren des Bildes, Leeren des Anzeigebereiches und zum Auffinden der Randpixel der Zahl. Darunter befinden sich vier Schieberegler, mit denen Sie die vier Grenzen (oben, unten, links und rechts) der Ziffern einstellen können. Die rechte Seite unterteilt sich in den Anzeigebereich der Zahl, sowie 6 Anzeigeelementen für die getrennten Ziffern und den Ausgabebereich, wo das Ergebnis ausgegeben wird. Links und rechts des Anzeigebereiches sind Buttons zum Wechseln des Bildes positioniert. Die Buttons darunter sorgen für die Übertragung des markierten Bereiches in das darunter befindliche Anzeigeelement. Der Inhalt des markierten Bildausschnittes wird dabei auf eine Größe von 5x7 Pixel heruntergerechnet.


