Neurotate Dokumentation

Belegarbeit für die Lehrveranstaltung Neuroinformationsverarbeitung

Jan Nerche und Andreas Reis
Studiengang Informatik,
HTW Dresden,
Mai 2005

Inhalt

Die Aufgabe

Diese Arbeit entstand als Beleg für das Fach Neuroinformationsverarbeitung. Wir entschieden uns für das selbstgewählte Thema Rotationserkennung von Fotografien. Es geht darum, bei präsentierten Bildern (Fotos) automatisch festzustellen, ob das Bild um 0, 90, 180 oder 270° gedreht werden muss, damit es sich in der für den Betrachter richtigen Position befindet. Konnte das Bild verarbeitet werden, wird es selbstständig so rotiert, dass die als "Oben" erkannte Seite auch nach oben zeigt.

Ergebnisse

Aus der Aufgabenstellung ist eine Applikation hervorgegangen, die es dem Nutzer möglich macht, eine Gruppe von Bildern zu laden, diese zu lernen und ähnliche Bilder anhand des Gelernten erfolgreich verarbeiten zu lassen.

Aus dem Bild wird ein Inputvektor gebildet, der sich aus Informationen zu Himmelsposition, Kantenstatistik und Helligkeitsverteilung (rezeptive Felder) zusammensetzt. Je nach Notwendigkeit können die einzelnen Komponenten an- und abgeschaltet werden. Dieser Inputvektor wird in ein neuronales Netz gegeben, das mittels der vorher gelernten Zusammenhänge einen Ausgabevektor produziert, der die vermutete durchzuführende Bildrotation enthält. Anhand des Outputvektors wird das Bild optional in die als richtig ermittelte Position gedreht.

Um das Training von Bildern zu erleichtern, ist in das Programm ein Trainingsdatengenerator integriert, der aus vorhandenen Bildern passende Lerndaten bereitstellt. Diese Lerndaten können dann im Programm geladen und durch ein Massentraining gelernt werden. Die so gelernten Daten können dann z.B. auf Bilder angewendet werden, die den originalen Bildern ähnlich sind. Dazu gibt es eine Massenverarbeitung, die ein Verzeichnis mit Bildern durcharbeitet und die Bilder in einem seperaten Ordner abspeichert.

Das neuronale Netz ist als Feed-Forward-Network mit einer variablen Anzahl an Eingängen (entsprechend des Inputvektors) und 4 Output-Neuronen (=Rotation um 0,90,180,270°) implementiert. Standardmäßig wird 1 Hiddenlayer mit 7 Neuronen verwendet. Als Lernalgorithmus kommt das Backpropagation-Verfahren mit optionalem Momentum zum Einsatz.

Die Implementation erfolgte in Java, wodurch das Programm auf allen Plattformen lauffähig ist, auf denen auch Java läuft. Als günstig erwies sich die Nutzung der Java Advanced Imaging-API (JAI) die viele nützliche Methoden zur Bildverarbeitung bereitstellt. Sofern JAI korrekt installiert ist, ist auch eine in JAI integrierte betriebssystemabhängige Beschleunigung möglich.

Ergänzend muss gesagt werden, dass die Lösung nur bestimmte Arten von Bildern verarbeiten kann. Die enormen menschlichen kognitiven Fähigkeiten des Bildverstehens lassen sich unserer Meinung nach nur unzureichend programmtechnisch nachbilden. Durch die Begrenzung auf die genannten Bildinformation ist es nicht möglich, alle möglichen Typen von Bildern ausreichend zu verwerten. Bei ausgewählten Bildern (siehe Testdaten) werden allerdings durchaus vorzeigbare Resultate erzielt:

Was geht?

Da das Netz seine Informationen aus bestimmten Inputvektoren bezieht, lassen sich nur Bilder verarbeiten, die durch den Inputvektor auch gut dargestellt werden können. Dies gilt vor allem für Landschaftsaufnahmen - dort ist oft ein ausgeprägter Himmel vorhanden (Himmelsfindung) - der gleichzeitig die hellste Seite des Bildes ist-, ebenso wie eine Horizontlinie (Kantenstatistik). Gleiches gilt für Bilder mit Wald und Architektur, wo vertikale Kanten vorherrschen. Am besten lassen sich natürlich Bilder lernen, deren Inputvektoren sich ähneln. Hervorragend funktionieren z.B. Bilder vom Typ "Oben ein heller Himmel (=hellste Seite des Bildes), vorherrschende horizontale Kanten und evtl. ähnliche Helligkeitsverteilung". Ebenso gut sollten sich Bilder von einem Winterwald (unten Schnee (=hellste Seite), viele vertikale Kanten) lernen lassen.

Was geht nicht?

Natürlich gibt es auch Bildtypen, die sich nicht gut verarbeiten lassen, z.B. Innenaufnahmen (keine hellste Seite, ggf. zu unterschiedliche Helligkeitsverteilung, kein Vorherrschen horizontaler bzw. vertikaler Kanten).
Vorsicht ist auch geboten, wenn Bilder zwar augenscheinlich einem bestimmten Bildtyp zuzuordnen sind, ihr Inputvektor aber trotzdem nicht in das Schema passt: So kann es sein, dass die Kantenfindung mehr vertikale Kanten findet, obwohl das Bild aussieht als enthielte es mehr horizontale Kanten.
Anderes Beispiel: Befindet sich in einer Reihe von Landschaftsaufnahmen, die alle oben einen hellen Himmel und unten einen dunklen Wald zeigen (= hellste Bildseite oben) ein Bild mit tiefblauem Himmel und sonnenbeschienenem Sandboden (= hellste Seite unten), so wird sich dieses Bild nicht richtig lernen lassen.
Um das Netz ordentlich trainieren zu können, müssen die Bilder anhand der Werte ihres Inputvektors sortiert werden.

Neurotate ist daher eher als Prototyp zu verstehen um die grundsätzlichen Möglichkeiten zum Problem aufzuzeigen. Über eine Weiterentwicklung würden wir uns freuen.

Bekannte Probleme

Zum Inhalt

Systemvoraussetzungen, Download und Installation

Neurotate benötigt :

Das Programm liegt als Zip-Datei (Download) vor und kann mit gängigen Tools in einen beliebigen Ordner entpackt werden. Neurotate wird als Quelltext bereitgestellt und muss kompiliert werden. Dazu ruft man unter Windows das Skript make.bat bzw. unter Linux/Unix das make-Kommando im Quellverzeichnis auf. Nach dem erfolgreichen Kompilieren kann das Programm mit run.bat bzw. run.sh gestartet werden.

Zum Inhalt

Testdaten

Als Testdaten sind einige Bilder verschiedener Kategorien enthalten:

Aus den Bildern in den Verzeichnissen müssen erst die Trainingsdaten generiert werden (siehe HowTos). Um die Paketgröße gering zu halten sind nur die Originalbilder enthalten.

Zum Inhalt

Nutzerdokumentation

Arbeit mit dem Programm

Training-Phase

Das Programm startet immer mit einem zufällig initialisierten Netz, das trainiert werden muss. Dazu dient der Dialog zum Erstellen von Lerndaten im Network-Menü. Nach Angabe von Quell- und Zielverzeichnis und Bestätigung werden aus den vorhandenen Dateien im Zielverzeichnis Trainingsdaten erzeugt. Diese Daten können von Neurotate im Mass Training verwendet werden. Um die nun erzeugten Testdaten und damit die Originalbilder zu lernen, kann das Zielverzeichnis mit File -> Open Dir geladen werden und anschließend mit Mass Training das Lernen gestartet werden (Trainingsphase). Der Fortschritt wird im unteren rechten Programmbereich angezeigt und kann jederzeit mit dem Abbruchknopf unten links beendet werden. Weiter kann während des Lernens der Verlauf des Fehlers (d.h. der Falscherkennung) mit dem NetWatcher (View -> Network Watcher) beobachtet werden, was die Geschwindigkeit des Lernens jedoch etwas herabsetzt.
Fertig trainierte Netze können mit Export profile (zusammen mit den Optionen) gespeichert und mit Import profile wieder geladen werden.

Recall-Phase

Nachdem das Netz trainiert ist, können die gelernten Bilder bzw. ähnliche Bilder im Mass Processing automatisch verarbeitet werden (Recallphase). Dafür wird das Quellverzeichnis geladen und "Process all" angewählt. Die Bilder werden nun nacheinander geladen, analysiert und im Zielordner (standardmäßig Unterverzeichnis "processed" im Quellverzeichnis) gespeichert. Der Vorgang kann ebenfalls jederzeit abgebrochen werden.
Es ist ebenfalls möglich, ein einzelnes Bild zu laden und analysieren zu lassen. Nach dem Laden wird es automatisch in die errechnete Position gedreht und kann gespeichert werden.

Zum Inhalt

HowTos

Erstellen von Trainingsdaten

Voraussetzung zum Erstellen von Trainingsdaten ist ein Verzeichnis mit Bildern, die richtig herum gedreht sind. Das Format der Bilder ist egal, es werden alle verarbeitet, die JAI öffnen kann (JPEG, BMP, GIF, PNG,...). Alle anderen werden ignoriert.
Über Network->Create training data wird die Generierungsmaske geöffnet. Dort wird das Quellverzeichnis mit den Originalbildern und ein Zielverzeichnis angegeben. Das Öffnen des Quellverzeichnisses dauert etwas, da versucht wird, jede Datei mit JAI zu öffnen. Bei einem Fehlschlag wird die Datei ignoriert. Auf diese Weise können alle Bildformate unterstützt werden, mit denen JAI umgehen kann. Nach einem Klick auf "Create" werden alle Bilder aus dem Quellverzeichnis gelesen, um (0°,) 90°, 180° und 270° gedreht und die vier resultierenden Bilder im JPEG-Format im Zielverzeichnis abgespeichert. Die Namen der Bilder erhalten einen Prefix, der angibt, auf welcher Seite des Bildes nach dem Drehen "oben" ist: T_ (top), B_ (bottom), L_ (left), R_ (right). Die Generierung kann jederzeit mit dem "Cancel"-Button abgebrochen werden. Nach der Generierung kann der Dialog mit "Cancel" geschlossen werden.

Trainieren eines ganzen Verzeichnisses

Um das Netz möglichst effizient zu trainieren, kann ein ganzes Verzeichnis voller Trainingsbilder verarbeitet werden. Hierzu öffnet man mit "Open folder" oder File->Open dir ein Verzeichnis mit vorher generierten Trainingsdaten (das kann etwas dauern, da jede Datei im Verzeichnis geprüft wird, ob sie ein unterstütztes Format hat). Die Namen der Trainingsbilder werden dann in der Liste links im Hauptfenser angezeigt. Klickt man auf einen Eintrag, wird das entsprechende Bild geladen und automatisch propagiert. Das Ergebnis des Propagierens (welche Seite des Bildes das Netz als "oben" erkannt hat) wird durch einen der vier Pfeil-Buttons neben dem Bild angezeigt. Das Bild wird automatisch entsprechend gedreht, falls die entsprechende Einstellung in den Optionen aktiviert wurde. Im Netwatcher-Fenster werden ausserdem die Werte für Input- und Outputvektor, Fehlerverlauf und Gewichtsmatrizen angezeigt. Um alle Bilder zu trainieren, klickt man auf "Train all". Der größte Teil der Benutzeroberfläche wird nun gesperrt. Den Fortschritt des Trainings kann man der Statusleiste entnehmen. Dort erscheint ganz links auch ein Button, mit dem das Training abgebrochen werden kann. Der Fortschrittsbalken in der Statusleiste bezieht sich auf die maximale Anzahl von Trainingszyklen (Optionen - Mass training cycles)
Im NetWatcher kann der Fehlerverlauf während des Lernens beobachtet werden (Performance sinkt), sodass das Lernen bei dem Eindruck, dass kein Lernerfolg erzielt wird, abgebrochen werden kann.
Ablauf des Trainings: Vor dem eigentlichen Training werden alle Bilder im Verzeichnis geladen und ihre Inputvektoren gebildet, die in einer Liste verwaltet werden. Der Fortschritt dieses "Preloading" kann in der StatusBar verfolgt werden. Die Liste der Input-Vektoren verbleibt im Speicher, bis wieder ein Verzeichnis geladen wird, d.h startet man mehrmals hintereinander das MassTraining für das gleiche Verzeichnis, so wird das "Preloading" nur einmal durchgeführt. Die Bilder aus der Liste werden zufällig ausgewählt (jedes aber nur einmal). Für das gewählte Bild wird dann eine Anzahl Lernschritte durchgeführt (siehe "Learning steps" in den Optionen). Wurde jedes Bild in der Liste einmal bearbeitet, ist ein Lernzyklus beendet und der nächste beginnt. Die Anzahl dieser Lernzyklen lässt sich in den Optionen festlegen ("Mass training cycles"). Befindet sich nach einem Zyklus der Gesamtfehler aller Bilder in der Liste unterhalb der gewählten Schwelle (siehe Optionen: Error Threshold), wird das Lernen abgebrochen. Man sollte eine große Anzahl von Zyklen (ca. 1000) und eine niedrige Fehlerschwelle (ca. 0.09...0.2) wählen, um sicherzugehen, dass die Bilder ordentlich gelernt werden. Wird mit diesen Einstellungen die komplette Anzahl von Zyklen durchlaufen, konnten die Bilder wahrscheinlich nicht zufriedenstellend gelernt werden und das Netz wird evtl. keine guten Resultate erzielen (Ursachen könnten sein: Bilder oder Input ungünstig gewählt, viel zu geringe Fehlerschwelle, zu wenige Lernzyklen).

Trainieren eines einzelnen Bildes

Es ist möglich, ein einzelnes Bild zu lernen. Dazu lädt man das Bild über das Menü File -> Open bzw. Open-Button der Toolbar oder durch Anwählen in der Dateiliste, falls ein Verzeichnis geladen wurde. Es können alle Bildtypen geöffnet werden, die JAI verarbeiten kann (z.B. JPG, PNG, GIF, BMP, uvm.). Das Bild wird nun angezeigt und analysiert, automatisch in die richtige Position gedreht und der entsprechende Auswahlbutton hervorgehoben. Im Falle eines untrainierten Netzes ist das Ergebnis dieses Vorgangs eher zufällig. Um das Bild nun zu trainieren, genügt es die richtige Ausrichtung mit dem jeweiligen Button anzugeben und auf den Learn-Button zu klicken. Das Bild wird nun solange gelernt, bis es die in den Optionen festgelegten Kriterien lokale Fehlerschwelle und maximale Lernschritte erreicht. Dieser Lernvorgang kann nicht unterbrochen werden. Im Fenster des Netwatchers kann man sich die Outputwerte ansehen. Sollte der Maximalwert sehr nah an einem anderen Wert liegen, empfiehlt es sich, das Bild nochmals durch Klicken auf den Learnbutton zu lernen.
Ablauf des Trainings: Aus dem geladenen Bild wird eine Liste erstellt, die die Inputvektoren des jeweils um 0, 90 ,180 und 270° gedrehten Bildes enthält. Aus diesen Vektoren wird einer zufällig ausgewählt und solange gelernt, bis das Netz den gewünschten Output mit dem festgelegten lokalen Fehler liefert oder die maximale Anzahl an Lernschritten erreicht ist. Anschließend wird der nächste Vektor per Zufall bestimmt, wobei jeder Inputvektor aber nur einmal pro Zyklus gewählt wird. Sind alle Vektoren gelernt (= ein Zyklus ist durchlaufen), beginnt der Vorgang von vorn bis eine der Abbruchbedingungen eintritt: Erreichen der maximalen Anzahl an Trainingszyklen (wie beim Mass Training) oder das Unterschreiten der totalen Fehlerschwelle.
Hinweis: Das Netz ist nun nur auf dieses Bild trainiert und vorher gelernte Zusammenhänge sind evtl. verlorengegangen. Mit sehr ähnlichen Bildern können brauchbare Resultate ohne weiteres Lernen erzielt werden, jedoch ist ein unzuverlässiges Abarbeiten wahrscheinlich. Für das Lernen von mehreren Bildern ist der Mass Training-Modus weitaus bequemer zu bedienen ist und liefert bessere Ergebnisse, da durch die größere Anzahl an Daten eine bessere Generalisierung erfolgt.

Bearbeiten eines ganzen Verzeichnisses

Nachdem ein ausreichend trainiertes Netz bereitgestellt wurde, kann ein gesamtes Verzeichnis verarbeitet werden. Dazu ist zuerst das Quellverzeichnis zu laden. Durch Drücken auf den Button Mass Process startet das Abarbeiten des Verzeichnisses. Im Statusbereich wird das aktuelle Bild angezeigt. Dort kann auch ähnlich zum Mass Training der Vorgang abgebrochen werden. Es werden nun die Dateien in der Bilderliste nacheinander im Hintergrund geladen, analysiert, verarbeitet, gedreht und in einem Unterverzeichnis (siehe Optionen) gespeichert.

Zum Inhalt

Das Hauptfenster

Hauptfenster

1: Menü

File

Open file:
Öffnen eines einzelnen Bildes zur Bearbeitung.

Open dir:
Öffnet ein ganzes Verzeichnis. Die Namen sämtlicher Bilder werden in der Liste links im Hauptfenster angezeigt.

Save file:
Das angezeigte Bild speichern.

Import profile:
Lädt eine Profildatei (= ein Netz + Optionen)

Export profile:
Speichert eine Profildatei

Import network:
Lädt ein gespeichertes Netz. Das funktioniert nur dann, wenn seine Anzahl Inputneuronen mit den Inputeinstellungen (-> Optionen) übereinstimmen. Diese Option sollte man nur nutzen, wenn man weiss, was man tut. Besser ist, stattdessen "Import/Export profile" zu benutzen.
Hinweis: Schlägt das Laden eines Netzes fehl, wird ein neues initialisiert. Die Gewichtswerte des momentanen Netzes gehen verloren!

Export network:
Speichert das aktuelle Netzwerk in einer Datei.

Quit:
Neurotate verlassen.


View

Network watcher:
Blendet das Network watcher Fenster ein bzw. aus.


Options

Neurotate options:
Öffnet das Optionen-Fenster


Network

Create training Data:
Öffnet ein Fenster, über das sich Trainingsdaten generieren lassen.


2: Werkzeugleiste

Über die Werkzeugleiste sind die wichtigsten Funktionen aus dem Menü erreichbar:
Open = File->Open file
Folder = File->Open dir
Save file = File->Save file
Export profile = File->Export profile
Import profile = File->Import profile
Options = Options->Neurotate options


3: Bildbereich

Hier wird das gerade geladene Bild angezeigt. In den Optionen lässt sich einstellen, wie groß dieser Bereich maximal sein darf. Das geladene Bild wird auf die Größe des Bereichs skaliert.


4: Richtungsanzeige-Buttons

Über diese Buttons wird angezeigt, wo bei dem geladenen Bild "oben" ist.
Vor dem Lernen eines einzelnen Bildes (Learn-Button) muss der Button aktiviert werden, der der Seite entspricht, die bei dem Bild "oben" ist.
Nach dem Propagieren das angezeigten Bildes wird der Button aktiviert, der nach Meinung des Netzes "oben" entspricht.


5: Buttons für Netz-Funktionen

Process:
Bildet für das angezeigte Bild den Inputvektor und propagiert es.

Learn:
Führt eine (in den Optionen einstellbare) Anzahl Lernschritte für das angezeigte Bild durch.

Train all:
Trainiert alle Bilder eines geöffneten Verzeichnisses (= alle Bilder, deren Namen in der Liste links im Hauptfenster angezeigt werden).

Process all:
Alle Bilder im geladenen Verzeichnis propagieren, entsprechend dem Ergebnis drehen und abspeichern (Zielverzeichnis in den Optionen angeben).


6: Buttons für Bildbearbeitungsfunktionen

Über diese Buttons kann am gereade geladenen Bild die Bildung einzelner Teile des Inputvektors nachvollzogen werden.

Sobel H:
Faltet das Bild mit dem Sobel-Oerator für die horizontale Kantenfindung.

Sobel V:
Faltet das Bild mit dem Sobel-Oerator für die vertikale Kantenfindung.

Grayscale:
Wandelt das Bild in Graustufen um.

Brightness:
Ermittelt die Helligkeitswerte an den Bildseiten (Ausgabe in Statusleiste).

White Pixel:
Ermittelt das Verhältnis von weißen Pixeln zur Gesamtzahl der Bildpixel. Interessant im Zusammenhang mit der Kantenfindung ("Sobel"-Buttons). Der Schwellwert, ab wann ein Pixel als "weiss" bewertet wird, ist in den Optionen einstallbar (von 0 = schwarz bis 255 = echtes weiß)

Rec. Fields:
Ermittelt die Helligkeitswerte der rezeptiven Felder. Momentan erfolgt keine Ausgabe. Die Helligkeitswerte der rezeptiven Felder kann man im Netwatcher-Fenster nach dem Propagieren des Bildes sehen (falls sie in den Optionen aktiviert sind).

Reset:
Setzt das Bild in seinen ursprünglichen Zustand zurück.


7: Bilderliste

Wird ein Verzeichnis geladen, werden in der Liste die Namen aller Bilder daraus angezeigt. Klickt man auf eine Eintrag, wird das entsprechende Bild geladen, angezeigt und automatisch verarbeitet (wenn in den Optionen festgelegt).


8: Statusanzeige

Hier erscheinen Statusmeldungen sowie eine Fortschrittsanzeige beim Trainieren eines ganzen Verzeichnisses. Dieser Vorgang kann über den Button, der ganz links erscheint, abgebrochen werden.


Der NetWatcher

NetWatcher

1: Input

Hier wird der ermittelte Inputvektor angezeigt. Die Anzeige ist aufgeteilt in eine numerische Anzeige der Kanten- und Himmelstatistik und eine grafische Darstellung der rezeptiven Felder. Die Werte werden während des Lernvorgangs bzw. Bildverarbeitung aktualisiert.

2: Output

Die jeweiligen ermittelten Ausgaben werden hier angezeigt. Nach einem Lerndurchgang oder einer Bildverarbeitung aktualisiert sich die Ausgabe.

3: Auswahl

Hier kann man zwischen der Anzeige des Fehlers des Netzwerkes und den Gewichtsmatrizen umschalten.

4: Fehleranzeige

Beim Lernen (Mass Training/Einzelbild) werden hier die berechneten Fehlerwerte am Ende eines Lernzyklus angezeigt. Integriert sind die Anzeige des initialen Fehlers und der unteren Fehlerschwelle, die das Mass Training stoppt.

Gewichtsmatrizen (nicht abgebildet)

Die Gewichtsmatrizen welche die Verbindungen zwischen den Neuronen verschiedener Layer bewerten.

Die Optionen

Zur Laufzeit kann zu den meisten Optionen ein Tooltip angezeigt werden, wenn der Mauszeiger über der Option verharrt. (Möglicherweise nicht in jeder Java-Version verfügbar)

Sektion "Main"

Interpolation method for image display:
Wenn ein Bild angezeigt wird, muss es meist skaliert werden (s. "Display size"). Hiermit kann die Interpolationsmathode für die Skalierung festgelegt werden: "Nearest Neighbor" ist am schnellsten, "Bicubic 2" liefert die beste Qualität.

Display size:
Hier kann eingestellt werden, in welcher Grösse die geladenen Bilder angezeigt werden. Sie werden dazu entsprechend skaliert.

Standard image path:
Hier kann ein Pfad angegeben werden, der als Einstiegspunkt für den Auswahldialog beim Öffnen von Dateien oder Verzeichnissen dient.

Standard output image path:
Hier kann ein relativer Pfad angegeben werden, wo Bilder standardmässig gespeichert werden (z.B. beim Mass processing).

hide Netwatcher during masstraining:
Ist diese Option aktiviert, wird das Netwtcher-Fenser automatisch während des Mass Trainings geschlossen. Das beschleunigt erheblich den Trainingsvorgang (bleibt das Fenster offen, wird es sehr häufig aktualisiert und eine Menge Rechenzeit geht verloren).

Auto-rotate images:
Normalerweise wird nach dem Propagieren das Ergebnis nur über die vier Richtungsbuttons neben dem Bild angezeigt. Ist diese Option aktiviert, wird das Bild auch entsprechend gedreht. Das Anzeigen eines Bildes dauert damit etwas länger.




Sektion "Network"

Learning rate:
Die Lernrate. Sie sollte nicht zu hoch gewählt werden. Ein vernünftiger Wert ist < 0,6.

Learning steps:
Die Lernschritte, die bei einem Bild auf einmal durchgeführt werden - sowohl beim Masstraining als auch bei einem einzelnen Bild ("Train"-Button).

Local error threshold:
Die Schwelle für den Fehler des gerade aktuellen Bildes (fällt der Fehler unter diesen Wert, wird das Lernen des Bildes abgebrochen, auch wenn noch nicht alle Lernschritte durchlaufen wurden).

Mass training cycles:
Anzahl, wie oft die Bilderliste beim Mass training komplett trainiert wird. Hier kann ein sehr grosser Wert gewählt werden (z.B. 1000). Er beeinflusst zusammen mit den Learning steps die Maximaldauer des Mass training-Vorgangs. Es werden nur dann alle Zyklen durchlaufen, wenn der Fehler nicht vorher unter die gewählte Schwelle (s. "Error Threshold") fällt.

Error threshold:
Die Fehlerschwelle des Netzes für alle zu lernenden Bilder. Das Mass Training wird abgebrochen, wenn der Fehler des Netzes unter diesen Wert fällt (nachzuvollziehen im Netwatcher)

Momentum:
Hier kann das Momentum aktiviert und dessen Wert eingegeben werden.

Network layout:
Über diese Einstellungen kann die Anzahl der Hidden Layer und die Neuronen pro Hidden Layer eingestellt werden. Man sollte nur einen Hidden Layer oder zwei Hidden Layer mit wenigen Neuronen wählen, weil sonst das Training sehr langsam wird.
HINWEIS: Werden diese Einstellungen geändert wird das Netz neu aufgebaut und die Gewichtsmatrizen mit Zufallswerten initialisiert. Das aktuelle Netz geht verloren und sollte vorher ggf. exportiert werden!

Sektion "Image analysis"

Sky detection width:
Um den "Himmel" (=die hellste Seite) in einem Bild zu ermitteln, wird die Helligkeit an allen vier Seiten des Bildes untersucht. Hier kann eingestellt werden, wie breit (in % der Gesamtbreite/-höhe des Bildes) die untersuchten Bildstreifen sind.

Edge detection threshold:
Um zu ermitteln, ob in einem Bild vertikale oder horizontale Kanten vorherrschen, wird das Bild mit dem entspechenden Sobel-Operator gefaltet und im Ergebnis alle Pixel gezählt, deren Grauwert grösser oder gleich der hier eingestellten Schwelle liegt. (0=schwarz, 255=weiss). Damit kann bestimmt werden, ob nur "harte" (etwa 250-255) oder auch "weiche" Kanten (ab 128) benutzt werden. Nachzuvollziehen über die "Image Op"-Buttons im Hauptfenster.

Receptive fields:
Hier kann eingestellt werden, in wieviele rezeptive Felder das Bild horizontal und vertikal aufgeteilt wird und wieviel sie sich überlappen sollen. Es sollten nicht zuviele Rezeptive Felder benutzt werden, da der Inuptvektor sonst sehr groß wird und die Verarbeitungsgeschwindigkeit sehr bescheiden ausfällt.
HINWEIS: Bei einer Änderung an diesen Optionen muss das Netz neu aufgebaut werden (und wird mit Zufallswerten initialisiert). Das aktuelle Netz geht verloren und sollte vorher ggf. exportiert werden!

Input for processing:
Hier kann die Zusammenstellung des Inputvektors variiert werden, bzw. welche Verfahren bei der Bildvorverarbeitung zum Einsatz kommen.
HINWEIS: Bei einer Änderung an diesen Optionen muss das Netz neu aufgebaut werden (und wird mit Zufallswerten initialisiert). Das aktuelle Netz geht verloren und sollte vorher ggf. exportiert werden!

Günstige Einstellungen

Beim Trainieren des Programms sollte man darauf achten, dass die Bilder eine gewisse Ähnlichkeit aufweisen müssen, da widersprüchliche Zusammenhänge nicht gelernt werden können. In diesem Fall schwingt der Netzfehler über hunderte Zyklen hin und her und nähert sich kaum oder nur schwach dem Wert 0.

Ausserdem ist es empfehlenswert, kleine Lernraten zu verwenden (~ 0,2) wenn Momentum verwendet wird.

Im Test des Programmes haben sich folgende Einstellungen als günstig erwiesen:

Attribut Wert
Lernrate 0,2
Lernschritte 100
Fehlerschwelle lokal ~0,1
Trainingszyklen mind. 1000
Fehlerschwelle total ~0,1
Momentum 0,65

Zum Inhalt

Entwicklerdokumentation

Vom Patternvektor zum Featurevektor

Um das Bild zu verarbeiten bieten sich die Möglichkeiten an, das Bild vorzuverarbeiten und/oder das Bild als ganzes dem neuronalen Netz zu übergeben. Letztere Möglichkeit würde in einem enorm großen Netz resultieren und bedeutete den Patternvektor unverändert ins Netz zu geben. Besser ist die Reduktion des Bildes in einige wenige Merkmale, also die Überführung des Patternvektors in einen Featurevektor.

Wir entschieden uns für die Merkmale Kantenstatistik, Himmelsposition und rezeptive Felder (Helligkeitsverteilung) als charakteristische Merkmale. Für eine große Anzahl Bilder sollte es möglich sein, mit diesen einzelnen oder kombinierten Informationen das Bild hinreichend zu beschreiben. Die Verwendung der Inputs kann optional festgelegt werden. Für die Kantenstatistik wird ein Überhang an horizontalen oder vertikalen Kanten festgestellt und die beiden Verhältnisse zum Maximum verwendet. Zur Himmelsfindung wird die hellste der vier Seiten eines Bildes ermittelt und die Helligkeitswerte aller vier Seiten verhältnismäßig zur hellsten Seite in den Inputvektor aufgenommen. Mit den rezeptiven Feldern wird das Bild stark vereinfacht im Netz abgebildet. Über das Ursprungsbild wird eine Anzahl Rechtecke gelegt, die den jeweiligen Farbmittelwert (auf Graustufen bezogen) des darunterliegenden Bildbereiches enthalten.

Die offensichtliche Vermutung, dass allein schon die Himmelsfindung zum erfolgreichen Erkennen des Bildes führt, können wir nicht bestätigen. Im Test war das Netz nicht in der Lage, größere Mengen von geeigneten Bildern (mehr als 20) in angemessenen Zyklen zu lernen. Erst das Hinzufügen von Kantenstatistik und/oder Rezeptiven Feldern führte zu einer schnellen Konvergenz des Lernfehlers gegen 0.

Für den Inputvektor (=Featurevektor) ergibt sich die Dimension:

In der vorgegebenen Konfiguration mit Kantenstatistik, Himmelsfindung und rezeptiven Feldern (3x3) ergibt sich demzufolge die Dimension des Featurevektors :
2 + 4 + 9 = 15

Die besten Resultate erreichten wir im Test mit allen 3 Inputs, bei einer Netzgröße von 1 Hidden Layer und 7 Hidden-Neuronen.

Zum Inhalt

Bildung des Inputvektors

Die Bestandteile der Inputvektors sind optional Kantenstatistik, Himmelsfindung und Rezeptive Felder. Die Informationen werden wie folgt ermittelt:

Kantenstatistik

Das untersuchte Bild wird in ein Graustufenbild umgewandelt und anschließend einer vertikalen bzw. horizontalen Sobel-Operation unterzogen. Dabei finden JAI-Methoden Anwendung. Anschließend wird das so entstandene Bild, in welchem nur noch die Kanten von schwarzem Hintergrund hell abgehoben sind, nach der Anzahl der Pixel untersucht, die einen bestimmten Helligkeitswert* überschreiten. Dies erfolgt einmal mit einer horizontalen und einmal mit einer vertikalen Gradientenmaske für die Sobeloperation. Die Anzahl der so gefundenen Pixel wird später auf den Wertebereich von 0.0 bis 1.0 abgebildet, wobei der höhere der beiden Werte den Wert 1.0 repräsentiert.

Methoden :

Himmelsfindung

Hier wird der Rand des monochromen Bilds in 4 Streifen gleicher Breite* aufgeteilt die sich an den Positionen Oben, Rechts, Unten, Links befinden. Von diesen Streifen wird die durchschnittliche Helligkeit ermittelt. Die 4 Werte werden wieder auf 0.0 bis 1.0 normiert, wobei der höchste Wert 1.0 einnimmt.

Methoden :

Rezeptive Felder

Das Bild wird in eine Anzahl* von sich überlappenden Feldern zerlegt. Die so enstandenen Bildteile werden auf den mittleren Helligkeitswert mit JAI-Methoden untersucht. Die so gewonnen Werte werden wie gewohnt auf 0.0 bis 1.0 normiert und als zweidimensionales Feld zurückgegeben.

Methoden:

* Anzahl bzw. Breite können in den Optionen eingestellt werden und werden über entsprechende Methoden abgerufen.

Zum Inhalt

Klassendiagramm und Beschreibung

Das UML-Klassendiagramm : Klassendiagramm

Die Klassen wurden Javadoc-konform dokumentiert. Die generierte Dokumentation findet sich hier.

Zum Inhalt

Netztopologie

Bei dem implementierten neuronalen Netz handelt es sich um ein Perzeptron, ein einfaches Feed Forward-Netz mit Bias-Neuronen und ohne Shortcuts.

Die Dimension des Inputvektors (=Featurevektor) beträgt im Standardfall 15, ist jedoch konfigurationsabhängig (siehe). Der Outputvektor ist 4-dimensional, enstprechend den 4 Möglichkeiten das Bild zu drehen.

Outputvektor Bild wird gedreht um ° Obere Seite im Bild ist
1,0,0,0 0 Oben
0,1,0,0 90 Rechts
0,0,1,0 180 Unten
0,0,0,1 270 Links
Die hier aufgeführten Output-Vektoren entsprechen dem Idealfall. In der Praxis entscheidet der größte Wert im Output-Vektor über die Rotation des Bildes.

Der Signalbereich liegt für Input und Output zwischen 0 und 1 mit der Genauigkeit des Java-Datentyps double.
Als Lernverfahren wird der Backpropagation-Algorithmus verwendet, optional mit einstellbarem Momentum.
Bei der Aktivierungsfunktion handelt es sich um
fact=tanh(x)
Die erste Ableitung dazu lautet:
fact= 1- tanh(x)^2

Es steht dem Nutzer frei sich ein eigenes Netz "zusammenzubauen". Das bedeutet, dass er die Anzahl der Hidden-Layer und der darin enthaltenen Neuronen über die Optionen wählen kann. Die Anzahl der Neuronen ist bei allen Hidden-Layern gleich.

Das neuronale Netzwerk besteht aus den Java-Klassen Network und Neuron. Network enthält eine Liste für die Layer, die die Neuronen enthalten und eine Liste für die dazugehörigen Gewichtsmatrizen. Außerdem befinden sich hier die Methoden zum Lernen, Propagieren und Fehlerberechnen, die vom Hauptprogramm aufgerufen werden.
Neuron beeinhaltet den Typ des Neurons (Input-, Output-, Hidden-, oder BIAS-Neuron), die Aktivierungsfunktion, den Nettoinput, das aktuelle und das vorherige Delta des Gewichtswerts (für Momentum) und die Ausgabe des Neurons.

Zum Inhalt

Quellen

Zum Inhalt


Valid HTML 4.01! (c) 2005, Jan Nerche und Andreas Reis