Strömende Tensoren – Teil 2

Dies ist der zweite Teil der Artikelserie Strömende Tensoren.

Wenn man sich mit neuronalen Netzen befassen möchte, ist es gut, ein kleines Projekt zu haben, an dem man die ganzen benötigten Dinge lernen und ausprobieren kann.

Mein Projekt ist ein Würfelerkenner. Bilder von einer Kamera, auf denen ein Würfel vor einem einfarbigen Hintergrund zu sehen ist sollen untersucht werden. letzten Endes soll das System ausspucken, welchen Wert der Würfel zeigt.

Das Vorgehen ist bisher zweiteilig geplant:

  1. Auf einem Bild mit reduzierter Auflösung soll identifiziert werden, wo sich der Würfel befindet
  2. Der entsprechende Bereich, in dem sich der Würfel befindet, soll in voller Auflösung untersucht werden und als Ergebnis den gewürfelten Wert liefern

Dementsprechend benötige ich als erstes ein Netz, welches mir aus einem kleinen Bild eine 2D-Koordinate oder eine Bounding-Box liefert, wo der Würfel zu finden ist.

Als erste Testdaten habe ich Bilder mit der Kamera meines Telefons vor weißem Hintergrund aufgenommen. In dem Bilder sind an den Rändern noch Teile des Tisches zu sehen, aber das sollte das Netz nicht weiter stören.

Die Bilder habe ich, zur Positionserkennung, bisher auf eine Größe von 92×69 Pixel reduziert und in Grauwertbilder umgewandelt.

In diesen Bildern soll nun die Position des Würfels bestimmt werden. Wir benötigen also ein neuronales Netzwerk mit zwei Ausgangsneuronen, welche je einen Schätzwert für die X- und Y-Position liefern sollen.

Vermutlich wird ein mehrschichtiges neuronales Netzwerk (deep neuronal network – DNN) am besten dafür geeignet sein. Von den vorhandenen Klassen in TensorFlow hört sich tf.estimator.DNNRegressor nach dem Mittel der Wahl an.

Leider musste ich feststellen, daß diese Klasse mit mehreren Ausgabeneuronen ein gewisses Problem hat. Vielleicht habe ich mich nur ungeschickt angestellt oder die entsprechende Beschreibung nicht gefunden. Wenn ihr also Hinweise habt, wie man dies mit einem DNNRegressor bewerkstelligt, nutzt bitte die Kommentar-Funktion.

Nun gut, also wird ein eigener tf.estimator.Estimator geschrieben.

Der Sourcecode zu diesem Projekt ist unter meinem Account auf GitHub GitLab unter dem Namen dice zu finden.

Der Estimator wird (zur Zeit) in der Datei dice.py über die Methode cnn_model_fn definiert und in der Methode train der Klasse Trainer instanziiert. Der Code wird jedoch auf Dauer mit Sicherheit noch in eine eigene Datei verschoben werden.

In der ersten Fassung wird das Netz zum Test mit den gleichen Daten trainiert, mit denen es auch überprüft wird. Das soll später natürlich anders werden, hier ging es erst einmal darum das Netz überhaupt zum Laufen zu bekommen.

Als Nächstes geht es damit weiter, ein kleines GUI zu basteln, mit der man einen Trainingsdatensatz laden, erweitern und speichern kann und in der man die Ergebnisse visualisiert bekommt. Als Toolkit dafür wird PyQt5 zum Einsatz kommen.

Zum dritten Teil

Links zu weiterführenden Informationen dieser Artikelserie:

Schreibe einen Kommentar

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