Sipho

Belegarbeit zur inhaltlichen Erkennung von Fotos mit der Hilfe von neuronalen Netzen.

Im Fach Neuroinformationsverarbeitung bei Prof. Iwe ist zur Vertiefung des Lehrstoffes eine Belegarbeit zum Thema "Neuronale Netze" zu programmieren.

Dieses Dokument dient zur ausführlichen Beschreibung des entstandenen Softwarestückes und den technischen Hintergründen, sowie den Besonderheiten und Problemen bei der Umsetzung. Dabei wird auch auf das verwendete neuronale Netz und die Programmbedienung aus Nutzersicht eingegangen.

Der Stand des Dokumentes ist der 3. Januar 2006 und nun viel Spass beim Lesen ...
Christoph Zirkelbach

 


 

Inhaltsverzeichnis

I. Allgemeine Information
1. Einleitung
2. Grundidee
3. Namensgebung
II. Entwickler Dokumentation
1. Verwendete Techniken
2. Netzklassen
2.1 Klassenübersicht
2.2 Klasse Neuron
2.3 Klasse Layer
2.4 Klasse Net
3. Oberflächenprogramme
3.1 NN - Editor
3.2 NN - Learn
3.3 NN - Search
4. Bildverarbeitung
5. Neuronales Netz
6. Datenhaltung
III. Nutzer Dokumentaion
1. Voraussetzungen
2. Übersetzen, Installieren und Starten
3. Neuronale Netze erstellen
4. Projekt erstellen und Fotos anlernen
5. Fotos durchsuchen und erkennen
Fazit
Quellen
Sourcen

 


 

I. Allgemeine Informationen

1. Einleitung

Im Fach Neuroinformationsverarbeitung bei Prof. Iwe ist zur Vertiefung des Lehrstoffes eine Belegarbeit zum Thema "Neuronale Netze" zu programmieren. Sie soll die mögliche Einsetzbarkeit von neuronalen Netzen mit theoretischen und praktischen Ansätzen aufzeigen. Gleichzeitig ist es ebenfalls eine gute Übung das gelernte theoretische Wissen in diesem Fach anzuwenden und zu vertiefen.

Eine zusätzliche interessante Herausforderung, stellte die Einarbeitung in die grafische Komponentenbibliothek GTK+ 2.0 dar, welche sich ideal mit dem Beleg verbinden lies.

2. Grundidee

Die Idee, welche hinter der Belegarbeit steckt, ist bei einer Diskussion zur Verwaltung von Fotoverzeichnissen entstanden. Speziell ging es dabei um das Problem des vorhanden seins von mehreren Versionen des gleichen Fotos in unterschiedlichen Grössen, wobei die Dateinamen der Fotos nicht als Vergleichsargumente genommen werden konnten. Mit unterschiedlichen Grössen sind die Fotoabmessungen, Vorschaubilder und zum Teil verringerte Farbtiefen gemeint. Als Möglichkeit blieb nur die Bewertung des Fotoinhaltes, um somit Rückschlüsse auf gleiche Fotos zu schliessen. Eventuell wird so sogar die Möglichkeit geboten ähnliche Fotos vom Inhalt her zu erkennen.

Grundidee

Da das erkennen von Mustern, abstrahiert auf Zahlenbereiche, ein ideales Einsatzgebiet für Neuronale Netze ist und ich mein Wissen auch in Bildverarbeitung auf der Codeebene vertiefen wollte, stellte diese Grundidee die erforderliche Basis und auch einen reellen Nutzen für meine Belegarbeit dar.

3. Namensgebung

Der Projektname Sipho ist eine Kombination aus den englischen Wörtern similar und photo. Übersetzen kann man es frei mit ähnliche Fotos. Da dies die Grundidee des Software Beleges ist, wurde daraus der Name gebildet.

 


 

II. Entwickler Dokumentation

1. Verwendete Techniken und Werkzeuge

Programmiersprache ... C++, ist eine Programmiersprache für allgemeine Anwendungen und stellt Sprachmittel für abstrakte Datentypen sowie modulare, generische, objektorientierte und strukturierte Programmierung zur Verfügung.

Benutzeroberfläche ... GTK+ 2.0 (the GIMP Toolkit), ist eine freie Komponentenbibliothek unter der LGPL, mit welcher Grafische Benutzeroberflächen (GUI) für Softwareprogramme erstellt werden können.

Entwicklungsumgebung ... Entwickelt wurde die Belegarbeit mit dem universal Editor Vim, welcher unter dem unixoiden Betriebssystem FreeBSD eingesetzt wurde. Nicht zu vergessen seien, für die Brainstormingphasen, der Bleistift und das Blatt Papier. Zur Erstellung der Dokumentation wurde zusätzlich der Webbrowser Mozilla Firefox und zur Bilderstellung das Grafikprogramm Gimp verwendet.

2. Netzklassen

2.1 Klassenübersicht

Die Netzklasse besteht aus den drei Klassen 'Neuron', 'Layer' und 'Net', welche nach folgender Beziehung von einander abhängig sind:

Ersichtlich wird die Bedingung, wonach ein Netz aus mindestens drei Layern und ein Layer aus mindestens einem Neuron bestehen muss.

2.2 Klasse Neuron

Die Klasse 'Neuron' beschreibt die Definition eines Neuronenes mit den benötigten Methoden und Variablen. Die wichtigsten Attribute sind dabei der Zustand Value, die Gewichtskorrekturen Delta, Delta_old und der Eingabe- und Gewichtsvektor x, w. Der Eingabevektor spiegelt die Zustände jedes Neurones der vorherigen Schicht dar. Die entsprechenden Verbindungsgewichte sind dazu im Gewichtsvektor enthalten.

Eine Neuroninstanz stellt die kleinste Komponente, ein Neuron, eines Netzes dar.

2.3 Klasse Layer

Die Klasse 'Layer' beschreibt die Definition eines Layers mit den benötigten Methoden und Variablen. Die wichtigsten Attribute sind dabei der Neuronenvektor LayerNeuron und die Angaben über die Anzahl der Neuronen in der vorherigen und eigenen Schicht PrevNeuronCount, NeuronCount.

Eine Layerinstanz kann ein oder mehrere Neuroninstanzen enthalten und spiegelt eine Schicht des Netzes dar.

2.4 Klasse Net

Die Klasse 'Net' beschreibt die Definition eines Netzes mit den benötigten Methoden und Variablen. Am wichtigsten ist dabei die Darstellung der Beziehungen der einzellnen Schichten und ihrer Neuronen. Die Rahmenbedingungen des Netzes, wie die Startgewichte WeightMin, WeightMax und das Momentum Momentum, sowie die Anzahl der enthaltenen Hiddenlayer LayerCount.

Die Funktionalität und die verwendeten Algorithmen, die zum Lernen, Arbeiten und Erstellen des Netzes dienen, sind ebenfalls in der Klasse enthalten. Als Beispiel seien hier die Funktionen Propagate () und Backpropagate () genannt.

Eine Netinstanz stellt ein Neuronales Netz dar und enthällt drei oder mehr Layerinstanzen. Drei, weil es eine Eingabeschicht, mindestens eine Hiddenschicht und eine Ausgabeschicht geben muss.

3. Oberflächenprogramme

Als Nutzerschnittstelle wurden drei von einander unabhängige Programme entwickelt, welche speziellen Aufgaben im Bezug zum Belegthema gewidmet wurden. Die Aufgaben sind das Erstellen eines Netzes, das Anlernen eines Netzes und die Arbeit mit dem angelernten Netz.

3.1. NN - Editor

Die Oberfläche des 'Editor' Dialoges ermöglicht das komfortable Anlegen, Bearbeiten, Speichern und Laden eines Netzes. Neben der Festlegung von Struktur und Netzvariablen wird eine grafische Darstellung des Netzes erzeugt. Die Darstellung erfolgt dynamisch und passte sich dem Anzeigebereich an. Wird ein festgelegtes Maximum von Neuronen in einem Layer erreicht, so wird die Neuronenanzahl in Anhängigkeit zu diesem Maximum dargestellt. Dies war nötig, da der Rechenaufwand zur Darstellung sonst die Resourcen zu sehr auslastete.

3.2. NN - Learn

Die Oberfläche des 'Learn' Dialoges dient dazu die zum Anlernen benötigten Fotos auszuwählen, umzuwandeln und dem geladenen Netz Anzulernen. Es können maximal zehn Fotos angelernt werden. Der grösste Schwerpunkt liegt hier bei der Umformatierung der Fotos in den Eingabevektor für das Netz, mehr Informationen dazu unter dem Punkt Bildverarbeitung, und die grafische Veranschaulichung des Fortschrittes des Anlernvorganges.

Ein zu lösendes Problem war hierbei die Eigenart des gekapselten Lernvorganges in der Netzklasse. Dies führte zu einem Hängenbleiben der Oberfläche bis der Anlernvorgang abgeschlossen oder unterbrochen wurde. Aus diesem Grunde wurden die entsprechenden Funktionen der Netzklasse in einzelne Funktionen aufgeteilt. Mit diesen Funktionen wurde der Anlernvorgang dann innerhalb von Oberflächenfunktionen durchgeführt, wo es dann auch möglich war Zwischenwerte und Fortschritte über die Oberfläche anzeigen zu lassen. Dazu musste an den entsprechenden Stellen ein Neuzeichnen der Oberfläche extra hervorgerufen werden:

// initiere neuzeichnen des Dialoges
while (gtk_events_pending()) gtk_main_iteration();

3.3. NN - Search

Die Oberfläche des 'Search' Dialoges dient zum Finden von gleichen oder ähnlichen Fotos. Es wird ein angelerntes Projekt geladen und mit einem Fotoverzeichniss verglichen, dabei können einige Netzvariablen beeinflusst werden. Es wird beim Suchdurchlauf, jedes Foto nach einer entsprechenden Bildverarbeitung an das Netz angelegt und an Hand der Netzausgabe mit den Toleranzvariablen eine Entscheidung über die Ähnlichkeit getroffen und dargestellt. Das Ergebnis des Suchvorganges wird mit einer kleinen Vorschauansicht in einer Liste dargestellt.

Während des Suchdurchganges, welcher je nach Anzahl der zu durchsuchenden Fotos etwas dauern kann, werden Fortschritts- und Fotoinformationen im Dialog dargestellt.

4. Bildverarbeitung

Damit das Netz mit Fotos von unterschiedlichen Grössen und Farbtiefen umgehen kann, muss jedes zu behandelnde Foto in ein einheitliches Format umgewandelt werden. Dieses Format wird in einem Pixelbuffer gehalten und beträgt 20x15 Pixeln mit einer Farbtiefe von 512 Farben. Die Reduzierungen waren nötig, damit die angelegten Daten und die Anzahl der Eingangsneuronen des Netzes nicht unnötig, aber doch ausreichend, gross sind.

Somit muss das Netz aus 20x15 Pixeln gleich 300 Eingangsneuronen bestehen, welche Eingangsfarbwerte zwischen 0 und 512 besitzen. Folgende Schritte muss dabei jedes Foto durchlaufebn:

Laden in einen Pixelbuffer

// lade Foto
pb_foto = gdk_pixbuf_new_from_file(vImages[i].c_str(), NULL);

Anpassung der Bildgrösse

Als nächstes wird das Bild im Pixelbuffer von seiner orginalen Grösse verkleinert. In 160x120 Pixel für die Vorschauansicht im Dialog und in 20x15 Pixel für das Anlegen an das Neuronale Netz.

// erstelle Vorschau
pb_preview = gdk_pixbuf_scale_simple(pb_temp1,160,120,GDK_INTERP_BILINEAR);

// erstelle Miniaturfoto fuer Searchvector und Ergebnissliste
pb_k = gdk_pixbuf_scale_simple(pb_preview,20,15,GDK_INTERP_BILINEAR);

Anpassung der Farbtiefe

Die Umwandlung der Farbtiefe des Pixelbuffers erfolgt durch die Reduzierung der RGB Farbwerte jedes Pixels. Jeder Farbwert wird durch die drei Angaben für rot, grün und blau bestimmt und liegt zwischen 0 und 255. Mit einem festgelegten Faktor von 32 wird jede Angabe auf maximal 8 Abstufungen reduziert, was ein Bild somit auf 8 x 8 x 8 (RxGxB) Farbkombinationen beschränkt. Dies entspricht der einfachen Reduzierung auf 8x8x8 = 512 Farben.

// Umwandlung der Farbtiefe eines Pixels
new_red = (int) ((((int) red ) / factor) * factor);
new_green = (int) ((((int) green) / factor) * factor);
new_blue = (int) ((((int) blue ) / factor) * factor);

Zusammengefasst in einer Funktion, kann ein Pixelbuffer somit einfach und ausreichend Farbreduziert werden:

// Umwandlung Farbtiefe des Pixelbuffers
// color_reduce entspricht dem festgelegten Faktor 32
simple_reduce_colorchart_picture (pb_k, color_reduce);

Zusammenfassung des RGB-Farbwertes

Das anzulegende Bildmuster besteht nun aus 20x15 gleich 300 Bildpunkten, welcher jeweils aus den drei reduzierten RGB-Farbwerten besteht. Dies entspräche somit 3x300 = 900 Werten, welche als Eingangsneuronen an das Netz angelegt werden müssten.

Deshalb werden jeweils die drei reduzierten RGB-Farbwerten zu einem eindeutigen Wert zwischen 0 und 511 zusammengefasst. Die einzelnen Farbwerte werden durch den Faktor 32 auf Werte zwischen 0 und 7 gebracht. Mit der Formel: value = red * 64 + green * 8 + blue werden die drei Werte dann zu einem zusammengefasst.

// factor entspricht dem festgelegten Faktor 32
factor_new = 256 / factor;

value_red = (red / factor) * (factor_new * factor_new)
value_green = (green / factor) * factor_new
value_blue = blue / factor
value = value_red + value_gree + value_blue;

5. Neuronales Netz

Für die Realisierung der Aufgabe wurde ein neuronales feed-forward Netz verwendet, welches für das Anlernen und Erkennen von ausgewählten Fotos zuständig ist. Die angelegten Fotos werden wie unter dem Punkt Bildverarbeitung erklärt, für die Eingangsneuronen des Netzes angepasst.

Das Netz besteht aus der Eingabeschicht (Inputlayer), den versteckten Layern (Hiddenlayer) und der Ausgabeschicht (Outputlayer). Jedes Neuron einer dieser Schichten ist mit jedem Neuron der nächsten Schicht verbunden, womit ein voll vorwärts verbundenes Netz (feedforward) entsteht. Zusätzlich wird noch ein Biasneuron in jeder Schicht, ausser den Ausgabeschicht, verwendet. Als Aktivierungs- bzw. Ausgabefunktion wurde folgende sigmoide Funktion verwendet:

y=1/1+exp(-x)

Für das Anlernen und erkennen wurden das Propagation- und Backpropagationverfahren verwendet. Die Musterfotos werden dem Netz solange angelernt, bis eine Mindestfehlerate unterschritten wurde oder ein vorher festgelegter maximaler Wert von Lernschritten erreicht wurde.

Die genaue Struktur des Netzes besteht aus 300 Inputneuronen, aus zwei Hiddenlayern mit 100 und 50 Neuronen sowie 4 Ausgangsneuronen. Eine schematische Veranschaulichung stellt die folgende Grafik dar:

Netzstruktur

6. Datenhaltung

Die Speicherung der Projektdaten erfolgt in mehrere Dateien, welche alle den Namen des Projektes besitzen und durch ihr Dateiendung unterschieden werden können. Ein typisches Projekt besteht aus den folgenden Dateien:

testproject.pr
testproject.nn
testproject_foto_0.jpg
testproject_foto_2.jpg
testproject_foto_5.jpg
testproject_foto_6.jpg

Projektdatei 'pr'

Die Datei mit der Endung pr beschreibt das Projekt. Es enthält den Projektnamen, den Dateinamen des dazugehörigen Netzes und die Dateinamen der Vorschauen von den gelernten Fotos. Hier ein Beispiel:

!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Dont edit this file !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!

Projektdaten
Datum: 00.00.2005
Projekt: testproject
Netz: testproject.nn

Fotodaten
Fotovorschau: testproject_foto_0.jpg
Fotovorschau: testproject_foto_2.jpg
Fotovorschau: testproject_foto_5.jpg
Fotovorschau: testproject_foto_6.jpg

!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Dont edit this file !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!

Netzdatei 'nn'

Sämtliche Daten, welche das neuronale Netz betreffen sind in der Datei mit der Endung nn gespeichert. Sie beinhaltet am Anfang die beschreibenden Netzdaten, wie die Lernrate, das Momentum, den minimalen und maximalen Bereich der Startgewichte. Danach folgen die Daten der einzelnen Neuronen für den Inputlayer, den Outputlayer und die verfügbaren Hiddenlayer.

!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Dont edit this file !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!

Netzdaten
Datum: 00.00.0000
Lernrate: 0.25
Momentum: 0
Startgewicht min: -2.5
Startgewicht max: 2.5
Zielrate min: 0.2
Zielrate max: 0.8

Inputlayer
Neuronen: 3

Outputlayer
Neuronen: 1
delta[0] biasx[1] biasw[0.97] w[-1.31] w[-0.95]

Hiddenlayer
Layer: 1
Neuronen: 2
delta[0] biasx[1] biasw[1.98] w[-1.59] w[-0.84] w[-2.08]
delta[0] biasx[1] biasw[0.55] w[-1.65] w[-2.4] w[-0.99]

!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Dont edit this file !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!

Fotovorschaudateien

Diese Bilddateien enthalten die Vorschauen der angelernten Fotos und sind entsprechend ihrer Position durchnummeriert.

 


 

III. Nutzer Dokumentation

1. Voraussetzungen

Um das Programm zu verwenden, wird ein linux- oder unixbasiertes Betriebssystem benötigt. In wie weit es auf einem windowsbasiertem Betriebssystem unter der Umgebung von Cygwin läuft, habe ich nicht getestet. Da die Programme eine grafische Oberfläche besitzen, ist ebenfalls ein X Window System Voraussetzung.

Weiterhin werden ein C++ Kompiler, wie z.B. g++, und die GTK+ Oberflächenbibliotheken ab Version 2.x (besser ab 2.6) benötigt. Welche Versionen und ob es überhaupt installiert ist, kann man mit folgenden Kommandos sehen:

g++

$ g++ --version
g++ (GCC) 3.4.4 [FreeBSD] 20050518
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

GTK+ 2.x

$ pkg-config --modversion gtk+-2.0
2.8.8

2. Übersetzen, Installieren und Starten

Man entpackt die Quelldateien in ein Verzeichnis seiner Wahl. In diesem Verzeichnis wurde nun ein neues Verzeichnis angelegt, welches die benötigten Quelltexte und andere Dateien beinhaltet. Zum erstellen der drei Programmteile wechselt man in das Verzeichnis Sourcen und führt ein make aus.

Entpacken

$ tar -xzf <file>

Übersetzen

$ cd sourcen
$ make
make editor teacher search
g++ `pkg-config --cflags --libs gtk+-2.0` nn_gtk_editor_dialog.cpp -o sipho-editor
g++ `pkg-config --cflags --libs gtk+-2.0` nn_gtk_teacher_dialog.cpp -o sipho-teacher
g++ `pkg-config --cflags --libs gtk+-2.0` nn_gtk_search_dialog.cpp -o sipho-search

Starten

Die drei Programme des Beleges werden mit folgenden Aufrufen gestartet:

$ ./sipho-editor
$ ./sipho-teacher
$ ./sipho-search

3. Neuronale Feed Forward Netze erstellen

Mit dem Programm sipho-editor können neuronale feed-forward Netze erstellt, geändert und entsprechend geladen und gespeichert werden. Zu beachten sei, dass schon angelernte Netze nach einer Bearbeitung oder Veränderung neu angelernt werden müssen.

Bereich Netzaufbau

In diesem Bereich werden die Anzahl der Input- und Outputneuronen festeglegt. Über den Button '+' können Hiddenlayer hinzugefügt und über den Button '-' wieder entfernt werden. Die Neuronananzahl der Hidenlayer kann nachträglich über den Button 'Set' angepasst werden.

Bereich Netzvariablen

Hier werden die netzspezifischen Umgebungsvariablen angegeben und zwar die Lernrate, das Momentum und die minimal und maximal Werte der zufälligen Startgewichte.

Bereich Grafische Netzstruktur

Eine grafische Darstellung des erstellten Netzes wird in diesem Bereich gezeigt, wobei automatisch Biasneuronen eingefügt werden und die Darstellung bis zu einem gewissen Grad in den Anzeigebereich automatisch eingepasst wird.

Bereich Netz

Mit den Buttons 'load' und 'save' können erstellte Netze geladen und gespeichert werden. Um das erstellte Netz zurück zu setzen, ist der Button 'reset' zu verwenden.

4. Projekt erstellen und Fotos anlernen

Das Programm sipho-teacher dient zum Anlernen der gewünschten und später zu findenden Fotos.

Bereich Projekt Daten

Der Projektname beschreibt das Projekt unter welchem es gespeichert werden soll. Gesetzt wird er über den Button 'set'. Mit den beiden Buttons '..' wird der Speicherort des Projektes und das verwendete Netz ausgewählt.

Bereich Fotos zum Anlernen

In diesem Bereich werden die anzulernenden Fotos ausgewählt und angezeigt. Es können maximal zehn Fotos gewählt werden. Über einen Mausklick (linke Taste) wird eines der zehn Fotoslots ausgewählt, was man an dem etwas grösser dargestellt Fotoslot erkennt. Darunter wird das gewählte Foto in einer Vorschauansicht (linkes Bild) und in einer für das Anlernen bearbeiteten Version angezeigt. Leere Fotoslots sind jeweils weiss dargestellt.

Über die Buttons '+' und '-' kann ein Foto dem ausgewählten Fotoslot zugewiesen werden oder wieder entfernt werden. Mit Hilfe der Butons 'inv', 's/w', 'flip' und 'res' kann das ausgewählte Foto noch invertiert, in schwarz/weiss umgewandelt, vertikal gespiegelt und wieder zurück gesetzt werden.

Bereich Lernparameter

Die benötigten Parameter zum Anlernen und einige des neuronalen Netzes können hier über die entsprechenden Schieberegler angepasst werden. Dies wären die Lernrate, das Momentum, die Entscheidungsrate und die Lernschritte und Lernwiederholungen. Letzter Beiden legen fest wie lange der Lernvorgang maximal andauern soll, bevor er abgebrochen wird.

Bereich Lernverlauf

Hier werden grafische Darstellungen zum Verlauf während des Lernvorganges angezeigt. Sie zeigen zum einen den Gesamtfehler und die Fehler der einzelnen Muster an. Im unteren Teil wird über Balken der Fortschritt des Lernvorganges, entsprechend der maximalen Lernschritte, dargestellt.

Bereich Projekt

Über die Buttons 'load' und 'save' kann ein Projekt geladen oder gespeichert werden. Dies ist mit angelernten sowie ungelernten Projekten möglich. Mit den Buttons 'reset', 'break' und 'learn' wird der Lernvorgang zurückgesetzt, unterbrochen und gestartet. Zu beachten wäre, dass mindestens ein Fotoslot mit einem Foto belegt sein muss, um den Lernvorgang zu starten.

5. Fotos durchsuchen und erkennen

Das Programm sipho-search dient zum Durchsuchen und Erkennen von ähnlichen oder gleichen Fotos, welche vorher angelernt wurden. Auch kann das gefundene Foto mit dem angelernten nach dem Suchdurchgang nochmal extra verglichen werden.

Bereich Zu durchsuchendes Fotoverzeichnis

Mit dem Button '..' wird ein Verzeichnis ausgewählt, welches die zu durchsuchenden Fotos enthält. Zu beachten wäre, dass nur Fotos mit der Endung .jpg beachtet werden.

Bereich Suchverlauf und Vorschau

In der linken Bildfläche wird immer das gerade zu prüfende Foto angezeigt und dir rechte Bildfläche bleibt hier ungenutzt. Darunter wird eine grafische Verteilung der Farbwerte für jeden Bildpunkt dargestellt. Diese Anzeige spielt dann mehr beim Vergleichen der Ergebnisse eine Rolle. Der Fortschrittsbalken zeigt die schon geprüften und noch anstehenden Fotos an, um den Verlauf des Suchvorganges zu erkennen.

Bereich Suchparameter

Hier wird die Entscheidungsrate eingestellt, ab wann gewisse Teile als richtig oder flasch erkannt werden. Dieser Schieberegler legt gleichermassen die ober und untere Grenze fest, nach welcher sich für 1 oder 0 entschieden wird. Bei einem Wert von 0.8, wird der Wert 1 ab 0.8 angenommen. Der Wert 0 wird entsprechend ab 0.2 angenommen, da er aus 1 - 0.8 gleich 0.2 bestimmt wird.

Bereich Ergebnisse

Die Ergebnissliste enthält die gefunden Fotos, welche mit den angelernten Fotos gewisse Ähnlichkeit besitzen. Wird eines dieser Ergebnisse ausgewählt, so wird es im Bereich Suchverlauf und Vorschau mit seinem ähnlichen Foto angezeigt. Hier sieht man dann wie gut oder schlecht die Erkennung funktioniert hat. Zusätzlich kann man sich die beiden Fotos zum vergleich auch in der für das neuronale Netz bearbeiteten und gerasterten Variante anschauen lassen.

Bereich Projekt

Über den Button 'load' wird ein angelerntes Projekt geladen. Mit den Buttons 'reset', 'break' und 'search' wird der Suchdurchgang zurückgesetzt, unterbrochen und gestartet.

Fazit

Das Ziel des Beleges angelernte Fotos inhaltlich zu erkennen oder sogar ähnliche Fotos zu finden wurde nicht ganz erreicht. Es ist aber möglich mit einem einmal erfolgreich angelerntes Netz, aus einer Menge von verschiedenen Fotos, die passenden Fotos zu erkennen.

Es ist der Anlernvorgang der teilweise schlechte Ergebnisse liefert, da es zu keinem erfolgreichen Lernen des Netzes kommen kann. Dies liegt zum einen an der recht grossen Anzahl von Eingangsneuronen (300) und den nicht optimal gewählten Hiddenschichten. Auch schien im Endeffekt das gewählte Feed Forward Netz (FFN) nicht ganz so optimal wie ein Self Organisation Map (SOM) zu sein, gerade was die Ausrichtung der Fotos betrifft.

Ein Plus an Wissen und Verständnis für Neuronale Netze brachten die intensive Beschäftigung mit dem Beleg mit sich. Auch konnte ich meine Erfahrungen in den verwendeten Techniken der Programmiersprache C/C++ vertiefen und die Oberflächen Bibliothek Gtk+ kennen und anwenden lernen.

 


 

Quellen

- Einführung in Neuronale Netze
- Backpropagation: Prinzip und Herleitung
- Neuroinformationsverarbeitung
- GTK+ Documentation
- The gdk-pixbuf Library

 


 

Sourcen

Hier befinden sich die Sourcen zum Beleg zum herunterladen. Der Beleg befindet sich in einem zur Abgabe und Vorführung befindlichem Zustand, ist aber für die öffentliche Nutzung nicht ausgereift genug. Ich übernehme keine Haftung für Schäden, welche durch Nutzung des Beleges entstehen.

Belegarchiv: niv_beleg.tar.gz