Gestenerkennung mit Neuronalen Netzen

Aus toolbox_interaktion
Version vom 5. November 2014, 22:22 Uhr von Bruenig (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Folgende Dokumentation bezieht sich auf die Projekt-Arbeit "Gestenerkennung mit Neuronalen Netzen", die im Rahmen des Studiensemesters (SS 2009) durchgeführt wurde.

Einleitung

In diesem Projekt haben wir zwei Themen (Bildverarbeitung und Neuronale Netze), die uns interessierten, kombiniert.

Grundidee: Eine Kamera nimmt die Gesten auf einem schwarzen Hintergrund auf und leitet als Video an den Rechner weiter. Das Bild mit der Geste wird verarbeitet und mit Hilfe von Neuronalen Netzen erkannt.

Man kann das Projekt in 3 Hauptteile zerlegen:

  • Bild-/Videoverarbeitung mit EyesWeb
  • Aufbau von Neuronalen Netzen mit MemBrain

Bild-/Videoverarbeitung mit EyesWeb

Allgemeiner Ablauf: Grundstruktur.jpg

Gesamtstruktur im EyesWeb: Gesamtbild eyesweb1.jpg

Beispiel Herunterladen

Betrachtung der einzelnen Bausteine:

Als Input dient entweder Videodatei .avi oder Videostream direkt vom Webcam: Input.jpg

Das Videosignal von der Kamera wird zum Schwarz-Weiß-Stream konvertiert und zum Snapshot-Aufnahme Modul weitergereicht. Nachdem der Bildzähler bis 10 gezählt hat, schaltet das Hysterese-Modul durch und löst die Hintergrundaufnahme aus. Dabei soll der „leere“ Hintergrund aufgenommen werden, es dürfen sich keine Objekte zu dem Zeitpunkt im Sichtfeld befinden. Das aufgenommene Einzelbild bleibt im Modul gespeichert, und wird dem Subtraktion-Modul zugeführt. Am anderen Eingang wird das laufende Videosignal eingespeist. Das statische Bild wird von dem Videosignal subtrahiert, so dass am Ausgang nur das zu erkennende Objekt hervor kommt.

Baustein1.jpg

Danach wird das Videosignal auf zwei Farben reduziert und mit dem Median-Filter geglättet , um das Rauschen zu vermindern.

Median1.jpg

Im HU-Block werden die so genannten HU-Momente berechnet und am Ausgang als eine 1x7 Matrix bereitgestellt. Der Datenstrom kommt dann durch zwei Umschalter durch, die von den zwei unterschiedlichen Filtern gesteuert werden. Der erste ist ein Bewegungsfilter. Das Videosignal wird vor dem HU-Block abgenommen und zum SMI-Modul geleitet. Dieses Modul berechnet das Ausmaß der Bewegung. Das nachgeschaltete Hysterese-Modul schaltet bei wenig Bewegung um, und löst den Umschalter aus, der den Datenstrom durch leitet. Damit wird verhindert, dass die Werte für die Erkennung bei dem bewegten Objekt geliefert werden, bevor die Aufnahmeposition erreicht wurde. Der zweite Filter dient zur Erkennung von Flächen (SMI Block). Erst wenn das gesamte Objekt sich im Bildbereich befindet, wird der Datenstrom durchgelassen. Dazu zählt das Area-Modul die Punkteanzahl des Bildes, beim Erreichen eines bestimmten Wertes wird umgeschaltet. Wenn sich keine Objekte im Aufnahmebereich befinden, liefert das Area-Modul nicht zulässige Werte, die durch das Validierungsmodul blockiert werden. Nach den beiden Filtern erreicht der Datenstrom den Schaltungsteil in dem die Daten für das Senden an das Programm, in dem eine weitere Verarbeitung erfolgt, aufbereitet werden.

Baustein2.jpg

Zuerst werden die einzelnen HU-Momente aus dem Matrixstrom entnommen. Anschließend werden die Zahlen vom Typ scalar zum Typ string konvertiert. Das Keyboard-Modul liefert den Zahlencode für die gedruckten Tasten als 1x2 Matrix. Die beiden Werte werden einzeln entnommen und zur Zeichenketten konvertiert. Danach werden alle Daten zu einem Zeichenketten-Rahmen zusammengestellt. Der Rahmen (Frame) sieht folgendermaßen aus:

HEAD:hu1:hu2:hu3:hu4:hu5:hu6:hu7:key.

’:’- Trennzeichen

HEAD – Header

key– Tastencode

Der Header dient zur Synchronisation der Daten beim Empfang und der Tastencode dient zur Steuerung des externen Programms.

Ausgabe.jpg

Aufbau von Neuronalen Netzen mit MemBrain

Gesamtstruktur: Membrain.jpg

Beispiel aus der Projektarbeit "Gestenerkennung mit Neuronalen Netzen"

Als Netztopologie wurde das Madaline-Modell ausgewählt. Das Modell entsteht aus einem Madaline-Netz durch hinzufügen von mehreren Ausgabeelementen.

In der oberen Reihe sind sieben Eingangsneuronen angeordnet. Für jedes Neuron wird durch eine Normalisierung-Einstellung der Wertebereich entsprechend der Eingangsdaten angepasst. In der Mitte der Abbildung sind versteckte Neuronen zu sehen. Die Anzahl von diesen Neuronen wurde experimentell ermittelt. Schon ab drei versteckten Neuronen wurde die erforderliche Funktion erfüllt, die Trainingsphase bei diesem Aufbau dauert aber deutlich länger als beispielsweise bei einem Aufbau mit 10 versteckten Neuronen.

In der untersten Reihe sind die Ausgangsneuronen angeordnet. Bei diesen Elementen wurde die binäre Aktivierungsfunktion eingestellt, so dass diese nur die logischen Werte '1' und '0' einnehmen können. was die Nimmer der Geste etspricht ( gezählt von rechts nach links von 1 bis 7).

Nach dem im MemBrain der Target Error erreicht ist (d.h. dass Lernprozess erfolgreich war), werden 2 Dateien: NeuralNetDef.c und NeuralNetDef.h mit allen nötigen Daten zum Gestenerkennung erstellt.

Realisierung der Kommunikationsschnittstelle

Datenübertragung im Eyesweb

Die einzige Möglichkeit mit Standardwerkzeugen in Eyesweb Daten in Echtzeit mit einem externen Programm auszutauschen ist die Übertragung über das Netzwerk. Die Eyesweb Version 3 unterstützt die TCP-IP Übertragung. Ab der Eyesweb Version 5 ist noch das UDP-Modul dazugekommen. Der Vorteil von TCP ist, dass hier eine zuverlässige Datenübertragung garantiert wird. Dabei wird beispielsweise sichergestellt, dass ein Paket, welches nach einer gewissen Zeit nicht beim Empfänger ankommt, erneut gesendet wird. Ebenso wird die richtige Reihenfolge der einzelnen Datenpakete von TCP garantiert, in der diese losgeschickt wurden. Zusammengefasst erhält man beim TCP-Protokoll eine Ende-zu-Ende-Kontrolle, ein Verbindungsmanagement, eine Zeitkontrolle, eine Flusskontrolle sowie eine Fehlerbehandlung der Verbindung. Das Modul sent_to_network bietet die Möglichkeit Daten via TCP-IP Protokoll an den lokalen oder einen entfernten Rechner zu Übertragen. Dabei agiert Eyesweb als TCP-Client und eine Anwendung als TCP-Server. Auf die Netzwerkeinstellungen im Eyesweb wurde bereits in dem früheren Kapitel eingegangen.

Erstellen einer Server-Anwendung

Zur Netzwerk- oder Interprozess-Kommunikation werden bi-direktionale (Vollduplex) Software-Strukturen, sogenannte Sockets benötigt. Ein Socket ist eine Schnittstelle zwischen einem Prozess (Anwendung) und einem Transportprotokoll. Seit 1983 verwendet BSD die Netzwerk-Sockets in seiner Berkeley Sockets API. Ebenso Linux, Solaris und viele andere UNIX'e verwenden die BSD-Sockets. MS-Windows verwendet eine ähnliche API wie von den Berkeley Sockets, dem Windows Sockets (kurz Winsock). Da die UNIX -Variante viel besser dokumentiert ist und für viele Betriebssysteme entsprechende Open-Source Compiler verfügbar sind, wurde im Rahmen des Projektes für diese Variante entschieden (siehe TCP/IP-Schnittstelle mit BSD-Sockets). Zum Kompilieren der Anwendung wird ein frei verfügbarer GCC-Compiler benötigt.

Programm "Lernen"

Zur Aufnahme einer CSV-Datei wird die Anwendung lernen.c verwendet. Der Empfang von Daten-Frames erfolgt wie oben beschrieben über eine TCP-IP Verbindung. Die angekommenen Frames werden in eine als RAW-CSV formatierte Textdatei umgeleitet. In der ersten Zeile einer CSV-Datei werden die Aliase für die Ein- und Ausgänge des neuronalen Netzes beschrieben. Danach folgen durch ein Strichpunkt getrennt die aufgenommenen HU-Momente und entsprechende Soll-Werte für die Ausgänge. Jede Zeile ist mit einem Newline-Operator ('\n') abgeschlossen. Hier ist ein Beispiel für eine CS-Datei mit drei Eingangsneuronen und einem Ausgangsneuron:

In1;In2;In3;Out1

0.0023;0.223;0.444;1

0.23;0.005;0.044;0

Als Ziel des Projektes wurde die Erkennung von sieben unterschiedlichen Objekten angesetzt. Deswegen wurden in dem neuronalen Netz sieben Eingangsneuronen für die sieben HU-Momente und genauso viele Ausgangsneuronen reserviert. Nach einer Testphase wurde jedoch festgestellt, dass die eingesetzte Erkennungsmethode mit guter Treffsicherheit nur etwa fünf verschiedene Objekte identifizieren kann. Damit die Ergebnisse an den Ausgangsneuronen eindeutig erscheinen wurde an diesen Ausgängen die Binäre-Aktivierungsfunktion eingestellt. D.h. die Ausgänge von dem neuronalen Netz können in diesem Fall nur Werte 0 und 1 einnehmen. Jeder Ausgang ist einem bestimmten Objekt zugeordnet. Die Aufnahme wird aktiv solange die Leertaste gedrückt gehalten wird. Vor der Aufnahme muss noch mit den Nummerntasten 1-7 die entsprechende Objektnummer gewählt werden. Mit dem Betätigen der Escape-Taste wird die Anwendung beendet.

Programmtext Lernen - Herunterladen

Programm "Erkennen"

Diese Anwendung fährt eine direkte Verarbeitung der empfangenen Daten, Ergebnisanzeige und eine Fehlerkorrektur durch. Der Programmaufbau ist der Anwendung „lernen“ sehr ähnlich. Zusätzlich wurden die Source- und Headerdateien eingebunden die von dem Membrain Simulator bereitgestellt werden und zwei Headerdateien die nach dem Training des neuronalen Netzes exportiert wurden. Nach dem Einbinden stehen in der Anwendung Funktionen zur Arbeit mit den neuronalem Netzen zur Verfügung. Als erstes soll das Netz mit der Funktion NeuralNetInitAndReset() initialisiert werden. Die empfangene Werte werden mit Hilfe der Funktion NeuralNetApplyInputAct( nummer, wert) an die Eingangsneuronen gelegt.

Programmtext Erkennen - Herunterladen

Dateien zu Projektarbeit und Literaturverzeichnis

Kinnebrock Werner "Neuronale Netze"

Hamilton Patrick "Künstliche Neuronale Netze"

Projektbericht und -daten


Teilnehmer

Alexander Marquardt

Igor Chyzh

Susanna Paul

Dieter Frühsorger