Gestenerkennung mit Hilfe von Convolutional Neural Network (CNN)

In unserem Beitrag „Was sind künstliche Neuronale Netze: Ein praktischer Einstieg“ sind wir bereits auf die Grundlagen zu künstlichen neuronalen Netzwerken eingegangen. In der dort vorgestellten Demoanwendung zur Erkennung von Handgesten wurde ein relativ simples Feed Forward Netz verwendet, welches in der Handhabung für den Nutzer aber mit einigen Regeln verbunden ist.

Feed Forward Netz (Quelle:http://www.texample.net/tikz/examples/neural-network/)
Abbildung 1: Beispiel Feed Forward Netz. Quelle: http://www.texample.net/tikz/examples/neural-network/
  1. Die zu klassifizierenden Bilder müssen quadratisch auf die Hand im Zentrum zugeschnitten sein.
  2. Der Hintergrund musste einfarbig sein und einen entsprechend hohen Kontrast zur Hautfarbe wiederspiegeln (z.B. eine weiße Wand im Hintergrund).
  3. Es musste sich immer um eine rechte Hand handeln, die von unten gerade ins Bild ragt und die Fingerzahl auf die im Trainingsdatensatz präsentierte Art und Weise darstellt.

Wurden diese Regeln eingehalten, dann konnten wir auf neuen Testdaten, die wir bei uns aufgenommen haben, eine Genauigkeit von etwas über 90 Prozent erreichen. Das ist ein sehr gutes Ergebnis, dafür dass hier ein einfaches künstliches neuronales Netzwerk mit zwei relativ kleinen versteckten Ebenen verwendet wurde.

In diesem Artikel möchte ich zeigen, mit welchen Ansätzen es gelungen ist unser Modell:

  1. zu verbessern, also eine höhere Genauigkeit zu erzielen und
  2. zu verallgemeinern, also möglichst beide Hände in verschiedenen Positionen, mit weiterem Bilderausschnitt und beliebigem Hintergrund klassifizieren zu können.

 

Hier geht´s direkt zum Demomodell

Austausch der verwendeten Architektur: Convolutional Neural Network (CNN)

Im letzten Jahrzehnt hatten Convolutional Neural Networks (CNN) – also faltbare neuronale Netzwerke – ihren Durchbruch bei vielen Klassifizierungsaufgaben mit Bild- und Audiodaten und konnten sich für diese als State-of-the-Art-Methode etablieren.

Ein CNN setzt sich aus mehreren Bausteinen zusammen:

  1. Filter, die als Convolutional Layer bezeichnet werden
  2. Aggregations-Schichten, die als Pooling Layer bezeichnet werden und
  3. klassische Neuronale Netze, die als Dense oder Fully Connected Layer bezeichnet werden.

 

Dabei wiederholen sich sich Convolutional (1.) und Pooling (2.) Layer abwechselnd und werden dann von einer oder mehrerer Schichten Dense/Fully Connected (3.) am Ende abgeschlossen.

Beispiel für CNN. Quelle: https://de.wikipedia.org/wiki/Datei:Typical_cnn.png
Abbildung 2: Beispiel für CNN. Quelle: https://de.wikipedia.org/wiki/Datei:Typical_cnn.png

Die Convolutional Layer repräsentieren die Vorverarbeitung der Eingabedaten und filtern bestimmte Eigenschaften des Bildes wie z.B. Kanten, bestimmte Flächen, Farben oder Strukturen. Hierzu tastet ein Filter (auch als Sliding Window bezeichnet), fester Größe (z.B. 3 x 3 Pixel) über das Eingabebild. Dieser Filter versucht dabei den Input auf gewisse Eigenschaften zu reduzieren. Über die Nutzung mehrerer Filter, können nun unterschiedliche Eigenschaften herausgefiltert werden.

3D Convolution Animation Quelle: https://de.wikipedia.org/wiki/Datei:3D_Convolution_Animation.gif
Abbildung 3: 3D Convolution Animation. Quelle: https://de.wikipedia.org/wiki/Datei:3D_Convolution_Animation.gif

Da jeder Filter jedoch ein eigenes, verändertes Bild erzeugt, erhöht sich die zu verarbeitende Datenmenge mit jeder weiteren Convolutional Ebene im CNN deutlich. Daher versucht man die Daten mit Hilfe von Pooling Layern zu verdichten. Hierzu werden mehrere Pixel zu einem reduziert, z.B. indem eine 4 x 4 Pixel Matrix auf ein Pixel reduziert wird, indem man aus dieser Matrix den Maximalwert herauszieht.

 

Max pooling Quelle:https://de.wikipedia.org/wiki/Datei:Max_pooling.png
Abbildung 4: Max pooling. Quelle: https://de.wikipedia.org/wiki/Datei:Max_pooling.png

Angelehnt ist dieses zweistufige Vorgehen an das Verhalten des visuellen Cortex des Menschen, der für die visuelle Wahrnehmung zuständig ist.

Anschaulich lässt sich das zum Beispiel am Training mit Gesichtern visualisieren:

Learned features from a CNN 95 Quelle: https://www.researchgate.net/figure/Learned-features-from-a-Convolutional-Neural-Network_fig1_319253577
Abbildung 5: Learned features from a CNN 95. Quelle: https://www.researchgate.net/figure/Learned-features-from-a-Convolutional-Neural-Network_fig1_319253577

 

Ein weiteres, sehr plastisches Beispiel ist hier zu finden.

 

Implementierung des Convolutional Neuronal Network mit dem Framework Keras

Zur Implementierung des CNNs wurde Keras genutzt. Keras ist eine high-level API für Tensorflow. Sie erlaubt schnelles Experimentieren mit verschiedenen Netzwerkkonfigurationen und liefert einige Features zur abstrahierten Datenvorverarbeitung.

Schließlich entschieden wir uns für ein CNN mit vier Convolutional-Ebenen mit jeweils 32, 64, 128 und 128 Filtern, gefolgt von einem neuronalen Netzwerk mit 512 Neuronen. Mit dieser Konfiguration konnten wir die Genauigkeit auf über 95 Prozent anheben.

 

Vergrößern des Trainingsdatensatzes für das Convolutional Neural Network

Schließlich widmeten wir uns der Verallgemeinerung des Modells. Um dies zu tun, benötigen wir vor allem eines: Daten, Daten, Daten.
Im ersten Schritt haben wir also weitere Daten gesammelt. Das geschah über einen weiteren Datensatz (senz3d) und durch Bilder, die wir selbst aufgenommen haben. Die auf diese Weise hinzugefügten Bilder enthielten keinen einfarbigen ruhigen Hintergrund mehr und zeigten beide Hände. Sie waren auch nicht unbedingt groß oder zentriert sondern in verschiedenen Positionen abgebildet. Außerdem waren sie nicht mehr nur quadratisch.

Aufnahme Hand 1Aufnahme Hand 2

Mit diesem Vorgehen vergrößerten wir den Datensatz von etwa 1000 Bildern auf rund 4000 Bilder. Da diese Anzahl jedoch weiterhin unter dem typischen Minimum zum Training tiefer neuronaler Netzwerke liegt, bedienten wir uns darüber hinaus der Image Augmentation, die Keras mitliefert. Darunter versteht man in diesem Kontext die künstliche Vervielfältigung der Daten mit leichten Abwandlungen, bzw. die künstliche Erzeugung neuer Daten.

Somit lässt sich beispielsweise durch spiegeln aus einer rechten eine linke Hand produzieren oder durch rotieren, reinzoomen, zuschneiden und verzerren verschiedene Aufnahmewinkel simulieren.
All dies führt dazu, dass viele neue Bilder generiert werden mit jeweils leichten Abwandlungen. Jedes dieser künstlich erzeugten Bilder ist dennoch für das Training des CNN geeignet, da es jeweils eine neue Situation abbildet (linke Hand, rechte Hand, Winkel der Hand,…) und dadurch hilft die Genauigkeit des trainierten Modells zu verbessern.

Auf einem weiteren selbstgesammelten Testdatensatz mit mäßiger Schwierigkeit (relativ ruhiger, aber nicht einfarbiger Hintergrund, Hand zentriert von unten ins Bild, …) ließ sich so die Genauigkeit von knapp 30 Prozent mit der alten Architektur auf über 85 Prozent steigern.

Da die Daten durch diese Erweiterung nicht mehr „so sauber“ waren wie der originale Datensatz und das Netzwerk mit dieser Methode selbst die Hände in den Bildern finden, als solche erkennen und klassifizieren muss, ist das Ergebnis sehr zufriedenstellend.

Das so trainierte Modell ersetzt inzwischen die vorherige Demoversion und kann hier getestet werden:

Hier gehts zur Demoanwendung

Zusammenfassung

Für die Verbesserung der Gestenerkennung in unserer Demoversion haben wir eine spezielle Art künstlicher neuronaler Netze, sogenannte Convolutional Neural Networks eingesetzt, die ihre besondere Stärke in der Verarbeitung von Bild- und Audiodaten haben. Gleichzeitig haben wir die Anzahl der Trainingsdatensätze stark erhöht. Beides hat dazu geführt, dass wir eine große Verbesserung in der Qualität der Gestenerkennung erreichen konnten. Nun ist es mit der Anwendung auch möglich, Handzeichen in komplexeren Situationen korrekt zu klassifizieren.

 


Mehr zu neuronalen Netzen erfahren
Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*Pflichtfelder

*