Inhaltsverzeichnis:

Ist das eine Hand? (Raspberry Pi Kamera + neuronales Netzwerk) Teil 1/2 - Gunook
Ist das eine Hand? (Raspberry Pi Kamera + neuronales Netzwerk) Teil 1/2 - Gunook

Video: Ist das eine Hand? (Raspberry Pi Kamera + neuronales Netzwerk) Teil 1/2 - Gunook

Video: Ist das eine Hand? (Raspberry Pi Kamera + neuronales Netzwerk) Teil 1/2 - Gunook
Video: Machine Learning – Pi and More 11 - Uni Trier - 3. November 2018 2024, November
Anonim
Ist das eine Hand? (Raspberry Pi Kamera + Neuronales Netzwerk) Teil 1/2
Ist das eine Hand? (Raspberry Pi Kamera + Neuronales Netzwerk) Teil 1/2
Ist das eine Hand? (Raspberry Pi Kamera + Neuronales Netzwerk) Teil 1/2
Ist das eine Hand? (Raspberry Pi Kamera + Neuronales Netzwerk) Teil 1/2
Ist das eine Hand? (Raspberry Pi Kamera + Neuronales Netzwerk) Teil 1/2
Ist das eine Hand? (Raspberry Pi Kamera + Neuronales Netzwerk) Teil 1/2

Vor ein paar Tagen habe ich mich im Fitnessstudio am rechten Handgelenk verletzt. Danach verursachte es jedes Mal, wenn ich meine Computermaus benutzte, aufgrund des steilen Handgelenkwinkels große Schmerzen.

Da fiel mir ein "Wäre es nicht großartig, wenn wir jede Oberfläche in ein Trackpad umwandeln könnten" und ich weiß nicht warum, aber aus irgendeinem Grund dachte ich an sie, den Film SIE, ich werde euch das herausfinden lassen aus. Es war ein aufregender Gedanke, aber ich wusste nicht, ob ich es schaffen würde, also beschloss ich, es auszuprobieren.

Dieser Artikel hält fest, was dabei herausgekommen ist.

Bevor wir beginnen, habe ich einen Haftungsausschluss-

' Am Ende dieses Artikels konnte ich keine Oberfläche in ein Trackpad umwandeln, aber ich habe nicht viel gelernt und mein Arsenal um große Werkzeuge erweitert. Ich hoffe das passiert dir auch '

Lass uns anfangen.

Schritt 1: Video

Image
Image

Hier ist ein kleines 5-minütiges Video, das alle Schritte abdeckt. Schau mal.

Schritt 2: Hardware

Hardware
Hardware

Ich habe einen Himbeer-Pi zusammen mit einer Himbeer-Pi-Kamera in einer Höhe von ca. 45 cm aufgebaut. Damit haben wir eine Überwachungsfläche von ca. 25x25 cm unter der Kamera.

Raspberry Pi und Raspberry Pi Kamera sind leicht erhältlich, googeln Sie einfach und Sie sollten in der Lage sein, einen lokalen Laden zu finden.

Werfen Sie einen Blick auf diesen Link oder eine meiner Raspberry-Pi-Playlists, um Ihren Headless-Pi zum Laufen zu bringen.

Nach diesem Setup benötigen wir einen Code, der entscheidet, ob sich eine Hand in dem Bereich befindet, den die Kamera überwacht, und wenn ja, wo sie ist.

Schritt 3: Stück Code

Codestück
Codestück
Codestück
Codestück

Ein Teil des Codes, der uns entscheiden lässt, ob ein Interessenbereich vorliegt, verwendet ein sogenanntes neuronales Netzwerk. Sie fallen in die Kategorie der Programmierung, in der wir keine Regeln definieren, um Entscheidungen zu treffen, aber wir zeigen dem neuronalen Netzwerk genügend Daten, um die Regeln selbst zu ermitteln.

In unserem Fall zeigen wir, anstatt zu codieren, wie eine Hand aussieht, neuronale Netzwerkbilder, die von Raspberry Pi aufgenommen wurden und die Hand enthalten und die keine Hand enthält. Diese Phase wird als Training des neuronalen Netzes bezeichnet und die verwendeten Bilder werden als Trainingsdatensatz bezeichnet.

Schritt 4: Bilder erhalten

Bilder abrufen
Bilder abrufen

Ich habe mich remote bei meinem Himbeer-Pi angemeldet und mit dem folgenden Befehl eine Reihe von Bildern aufgenommen.

sudo raspistill -w 640 -h 480 -rot 90 -t 250000 -t1 5000 -o frame%04d.jpg

Ich habe 80 Bilder mit der Hand aufgenommen und 80 Bilder, die keine Hand enthalten. 160 Bilder reichen nicht aus, um ein neuronales Netz richtig zu trainieren, sollten aber für einen Machbarkeitsnachweis ausreichen.

Neben 160 Bildern habe ich weitere 20 Bilder aufgenommen, um unser Netzwerk zu testen, sobald es trainiert ist.

Sobald der Datensatz fertig war, begann ich, Code für das neuronale Netzwerk zu schreiben.

Schritt 5: Verwendete Tools und Sprache

Verwendete Tools und Sprache
Verwendete Tools und Sprache
Verwendete Tools und Sprache
Verwendete Tools und Sprache

Ich habe mein neuronales Netzwerk in der Python-Deep-Learning-Bibliothek namens Keras geschrieben und der Code ist auf dem Jupyter-Notebook von Anaconda Navigator geschrieben.

Schritt 6: Vorbereiten des Datensatzes für das Training

Vorbereiten des Datensatzes für das Training
Vorbereiten des Datensatzes für das Training
Vorbereiten des Datensatzes für das Training
Vorbereiten des Datensatzes für das Training
Vorbereiten des Datensatzes für das Training
Vorbereiten des Datensatzes für das Training
Vorbereiten des Datensatzes für das Training
Vorbereiten des Datensatzes für das Training

Zuerst (Bild 1) habe ich alle für dieses Projekt benötigten Bibliotheken hinzugefügt, darunter PIL, matplotlib, numpy, os und Keras. In der zweiten Zelle des Python-Notebooks (Bild 2) definiere ich Pfade zum Datensatz und drucke die Probenanzahl aus. Jetzt müssen wir alle Bilder in ein numpy-Array laden, daher habe ich in der dritten Zelle (Bild 2) ein numpy-Array von 82 (Nummer der Handprobe) + 75 (Nummer der Nicht-Handprobe) erstellt, dh 157x100x100x3. 157 ist die Gesamtzahl der Bilder, die ich habe, 100x100 ist unsere geänderte Bildgröße und 3 ist für rote, grüne und blaue Farbebenen im Bild.

In der vierten und fünften Zelle laden wir Bilder, die hand enthalten, gefolgt von Bildern, die keine hand im numpy-Array enthalten. In der sechsten Zelle teilen wir jeden Wert durch 255, wodurch der Wertebereich von 0 bis 1 begrenzt wird. (Bild #3)

Es tut mir leid, wenn die angehängten Bilder nicht gut genug sind. Hier ist ein Link zum GITHUB-Repository, damit Sie sich den Code ansehen können. Vergessen Sie nicht, die Verzeichnispfadnamen durch Ihren Pfad zu ersetzen:).

Weitergehen.

Als nächstes müssen wir jedes Bild beschriften, also erstellen wir ein eindimensionales numpy-Array von 157 Länge. Die ersten 82 Einträge werden auf 1 gesetzt und die restlichen 75 Einträge werden auf 0 gesetzt, was dem neuronalen Netzwerk vermittelt, dass die ersten 82 Bilder von einer Klasse und die restlichen von einer anderen sind. (Bild #4)

Lassen Sie uns nun ein neuronales Netzwerk erstellen.

Schritt 7: Neuronales Netzwerk

Neurales Netzwerk
Neurales Netzwerk
Neurales Netzwerk
Neurales Netzwerk

In der neunten Zelle definieren wir unser neuronales Netz. Es enthält drei Wiederholungen von Faltungsschichten, gefolgt von Maxpool-Schichten mit 8, 12 bzw. 16 Faltungsfiltern. Danach haben wir zwei dichte neuronale Netze. Anhängen von zwei Bildern für diesen Schritt. Erstens ist ein Code-Schnappschuss, der ein neuronales Netzwerk erstellt, und zweitens ist die bildliche Darstellung des neuronalen Netzwerks mit Ausgabedimension und annotierten Operationen.

Schritt 8: Neuronales Netzwerk trainieren

Neuronales Netzwerk trainieren
Neuronales Netzwerk trainieren

In der zehnten Zelle konfigurieren wir den neuronalen Netzwerkoptimierer auf 'adam' und die Verlustfunktion auf 'binary_crossentropy'. Sie spielen eine wichtige Rolle bei der Aktualisierung von Netzwerkgewichtungen. Schließlich, wenn wir die elfte Zelle betreiben, beginnt das neuronale Netzwerk zu trainieren. Während das Netzwerk trainiert, schauen Sie sich die Verlustfunktion an und stellen Sie sicher, dass sie abnimmt.

Schritt 9: Testen des neuronalen Netzwerks

Testen von neuronalen Netzwerken
Testen von neuronalen Netzwerken

Sobald das neuronale Netzwerk trainiert ist, müssen wir den Testdatensatz vorbereiten. Wir wiederholen die Prozedur, die durchgeführt wurde, um den Trainingssatz in der 3., 4., 5. und 6. Zelle auf Testdaten vorzubereiten, um einen Testsatz zu erstellen. Wir bereiten auch das Label für den Testsatz vor, aber diesmal führen wir ein Modell auf diesem Datensatz aus, um Vorhersagen zu erhalten und nicht zu trainieren.

Schritt 10: Ergebnis und nächster Teil…

Ergebnis und nächster Teil…
Ergebnis und nächster Teil…

Ich habe eine Testgenauigkeit von 88% erhalten, aber nehmen Sie dies mit einer Prise Salz, da die zum Trainieren und Testen dieses Modells verwendeten Datensätze sehr, sehr klein und unzureichend sind, um dieses Modell richtig zu trainieren.

Ich hoffe jedenfalls, dass Ihnen dieser Artikel gefallen hat. Meine Absicht hinter dieser Übung ist noch nicht abgeschlossen und achte auf den 2. Teil. Ich werde es so schnell wie möglich hochladen.

Im nächsten Teil werden wir ein weiteres neuronales Netzwerk trainieren, das uns die Position der Hand in einem von Hand erkannten Bild mitteilt.

Alle Anfragen sind willkommen.

Wenn jemand daran interessiert ist, meinen kleinen Datensatz zu verwenden, lassen Sie es mich in Kommentaren wissen. Ich werde es zur Verfügung stellen.

Danke fürs Lesen. Wir sehen uns demnächst mit dem zweiten Teil bis dahin warum nicht ein neuronales Netz aufbauen und trainieren.

Bearbeiten: - Die nächsten Schritte sind für den zweiten Teil.

Schritt 11: Objekterkennung

Objekterkennung
Objekterkennung

In den vorherigen Schritten haben wir ein NN erstellt, das uns sagt, ob das Testbild Hand enthält oder nicht. Nun, was als nächstes? Wenn NN das Bild als Hand enthaltend klassifiziert, möchten wir die Position der Hand wissen. Dies wird in der Computer-Vision-Literatur als Objekterkennung bezeichnet. Lassen Sie uns also NN trainieren, das genau dasselbe tut.

Schritt 12: Video

Image
Image

Ein 3-minütiges Video, das alle verbleibenden Schritte erklärt. Schau mal.

Schritt 13: Beschriftung

Beschriftung
Beschriftung
Beschriftung
Beschriftung
Beschriftung
Beschriftung

Wenn Sie möchten, dass ein neuronales Netzwerk die Position der Hand ausgibt, müssen wir es auf diese Weise trainieren, d. h. im Gegensatz zu früheren neuronalen Netzwerken, bei denen jedes Bild entweder mit Hand oder ohne Hand gekennzeichnet war. Dieses Mal haben alle Bilder mit Hand vier Beschriftungen, die den diagonalen Koordinaten des Begrenzungsrahmens um die Hand in diesem Bild entsprechen.

Das angehängte Bild der CSV-Datei enthält ein Label für jedes Bild. Bitte beachten Sie, dass die Koordinaten mit der Bilddimension normalisiert sind, d. h. wenn die obere X-Koordinate beim 320.

Schritt 14: GUI beschriften

Beschriftungs-GUI
Beschriftungs-GUI
Beschriftungs-GUI
Beschriftungs-GUI
Beschriftungs-GUI
Beschriftungs-GUI
Beschriftungs-GUI
Beschriftungs-GUI

Sie fragen sich vielleicht, wie ich es geschafft habe, alle 82 Bilder zu beschriften. Nun, ich habe eine GUI in Python geschrieben, die mir bei dieser Aufgabe geholfen hat. Sobald das Bild in die GUI geladen wird. Ich klicke mit der linken Maustaste auf die obere Koordinate und klicke mit der rechten Maustaste auf die untere Koordinate des wahrscheinlichen Begrenzungsrahmens um die Hand. Diese Koordinaten werden dann in eine Datei geschrieben, nachdem ich auf die Schaltfläche Weiter klicke, um das nächste Bild zu laden. Ich habe diesen Vorgang für alle 82 Zug- und 4 Testbilder wiederholt. Sobald die Etiketten fertig waren, war es Zeit für das Training.

Schritt 15: Bibliotheken benötigt

Bibliotheken benötigt
Bibliotheken benötigt
Bibliotheken benötigt
Bibliotheken benötigt
Bibliotheken benötigt
Bibliotheken benötigt

Zuerst müssen wir alle notwendigen Bibliotheken laden. Welches beinhaltet

  • PIL zur Bildbearbeitung,
  • matplotlib zum Plotten,
  • numpy für Matrixoperation,
  • os für betriebssystemabhängige Funktionalität und
  • Keras für neuronale Netze.

Schritt 16: Verbleibende Zellen

Verbleibende Zellen
Verbleibende Zellen
Verbleibende Zellen
Verbleibende Zellen
Verbleibende Zellen
Verbleibende Zellen
Verbleibende Zellen
Verbleibende Zellen

In der 2., 3., 4. und 5. Zelle laden wir Bilder in ein numpy-Array und erstellen ein vierdimensionales Array aus der CSV-Datei, um als Labels zu fungieren. In Zelle Nummer 6 erstellen wir unser neuronales Netz. Seine Architektur ist identisch mit dem neuronalen Netzwerk, das für die Klassifizierung verwendet wird, mit Ausnahme der Dimension der Ausgangsschicht, die 4 und nicht 1 ist. Ein weiterer Unterschied kommt von der verwendeten Verlustfunktion, die der mittlere quadratische Fehler ist. In Zelle Nummer 8 beginnen wir mit dem Training unseres neuronalen Netzwerks, nachdem ich dieses Modell auf einem Testsatz trainiert habe, um Vorhersagen für die Begrenzungsbox auf überlagernden Koordinaten der Begrenzungsbox zu erhalten, die ziemlich genau aussahen.

Danke fürs Lesen.

Empfohlen: