Implementierung eines einfachen neuronalen Netzes zur Erkennung von Ziffern. Der Algorithmus basiert auf dem, im Buch von Tariq Rashid 1 vorgestellten Algorithmus. Der Autor hat auch den Python-Code zu seinem Buch in Github abgelegt 2.
Unter mynnKlasse ist eine Cpp Implementierung von diesem Algorithmus zu finden.
Um dieses neuronale Netz praktisch zu testen und zu nutzen zu können, wird unter [mynncam] das in mynnKlasse erstellte und trainierte neuronale Netz genutzt, um per Webcam einzelne Ziffern zu erkennen. Dieses Programm läuft unter Windows und Linux, sowie als App auf einem Android Device.
Linux / Windows
Android
Als Framework für beide Programme wird QT in der Version 5.15.2 genutzt. 3. Da sich die Schnittstelle zwischen QML und den Multimedia Klassen in QT6 stark geändert hat, kann QT in der Version 6.x nicht für mynnwebcam genutzt werden.
Neben dem QT Framework, wird für Vector-Operationen, wie Transpose, die EigenLib 4 5 genutzt. Hier muss der Include-Pfad in der Datei mynn_eigenKlasse.pro angepasst werden:
z.B. INCLUDEPATH += C:\work\EigenLib\eigen-3.4.0
Die Software sollte als Release gebaut werden, da ansonsten die Berechnung des neuronalen Netzes deutlich länger dauert.
Die MNIST Trainings- und Testfiles können im cvs Format von 6 heruntergeladen werden.
mynn.exe bzw. mynn hat folgende Eingangsparameter:
-t Trainingsdatensatz
--cs berechnet die Scorecard mit dem übergebenen Testdatensatz
--wih gelernte Input – Hiddenlayer Werte
--who gelernte Hidden – Output Werte
--swih speichert die gelernten „Input – Hiddenlayer „Werte ab
--swho speichert die gelernten „Hidden – Outputlayer“ Werte ab
Trainieren und testen vom neuronalen Netz:
mynn -t mnist_train.csv –cs mnist_test.csv
Trainieren und testen vom neuronalen Netz inkl. abspeichnern der gelernten Werte:
mynn -t mnist_train.csv –cs mnist_test.csv --swih wih.cvs --swho who.cvs
In diesem Beispiel wird die in mynnKlasse erstellte Klasse, etwas angepasst, genutzt um Ziffern per Webcam bzw. der Smartphone-Kamera zu erkennen.
Als Basis für die Software, dient das Beispiel von Stephen Quan 7 zur Nutzung der QAbstractVideoFilter Klasse von QT. Auch hier wird die EigenLib 4 genutzt. Zur Bildaufbereitung wird die OpenCV Libary 8 verwendet. Getestet wurde die Software unter Windows mit der OpenCV Version 4.5.2 und Android mit der Version 4.5.4, siehe 9 bzw. 10. Unter Linux wurde, die mit der Linux-Distribution ausgelieferte, OpenCV Version genutzt.
Main: Hier werden die Klassen instanziert und die Verbindung zur QML GUI hergestellt.
MynnWrapper: Initialisiert das neuronale Netz und berechnet aus dem Bild die erkannte Ziffer.
Mynn: Neuronale Netz zur Berechnung der erkannten Ziffer.
MyImageProvider: Sendet das in MyFilter berarbeitete Bild an die QML GUI.
MyFilter: Wandelt das Kamerabild in ein Schwarzweiss-Bild um. Reduziert die Bildgroeße auf die fuer das neuronale Netz benoetigte Groesse von 28x28 Pixeln.
MyFilterRunnable: Stellt die Schnittstelle zwischen Kamera und QML GUI dar.
Je nach dem für welches Betriebssytem, die Software erstellt werden soll, müssen die Variablen, angepasst werden.
Anpassung Include-Pfad für die EigenLib:
z.B. INCLUDEPATH += C:\work\EigenLib\eigen-3.4.0
Anpassung der OPENCV_ANDROID_SDK_PATH Variable
z.B. OPENCV_ANDROID_SDK_PATH = /home/thomas/Spielwiese/OpenCV-android-sdk_4_5_4/
Hinweis für Windows:
Damit die OpenCV Libaries beim Ausführen der Software gefunden werden, muss die Windows Umgebungsvariable PATH muss auf die OpenCV Binaries gesetzt werden.
Beispiel:
Path=C:\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin
Hinweis für Linux:
Hier wurden die mit der Linux-Distribution ausgelieferte OpenCV Version genutzt.
Ggf. müssen die Variablen INCLUDEPATH und LIBS für OpenCV in mynn_eigenKlasse.pro angepasst werden.
Für das Deployment der wih.cvs & who.cvs Dateien, muss im QT Creator unter Einstellung zur Ausführung „install“ bei Make arguments angeben werden. Damit werden diese Dateinen in Build-Verzeichnis kopiert.
Hinweis für Android:
Als Target-Architektur wird arm64-v8a verwendet.
Deshalb darf im QT Creator unter Projekt Build Einstellungen, nur die arm64-v8a ABI ausgewählt sein.
Footnotes
-
Buch: Neuronale Netze selbst programmieren von Tariq Rashid
https://dpunkt.de/produkt/neuronale-netze-selbst-programmieren ↩ -
https://github.com/makeyourownneuralnetwork/makeyourownneuralnetwork ↩