Inhaltsverzeichnis:

Raspberry Pi 4 Verkehrszeichenerkennungsroboter - Gunook
Raspberry Pi 4 Verkehrszeichenerkennungsroboter - Gunook

Video: Raspberry Pi 4 Verkehrszeichenerkennungsroboter - Gunook

Video: Raspberry Pi 4 Verkehrszeichenerkennungsroboter - Gunook
Video: bot test for ieee nitk Traffic sign recognition project 2024, November
Anonim
Raspberry Pi 4 Verkehrszeichenerkennungsroboter
Raspberry Pi 4 Verkehrszeichenerkennungsroboter

Dieses instructable basiert auf meinem Universitätsprojekt. Ziel war es, ein System zu entwickeln, bei dem ein neuronales Netzwerk ein Bild analysiert und dann basierend auf der Erkennung einem Arduino-Roboter sagt, dass er sich über Ros bewegen soll.

Wenn zum Beispiel ein Rechtsabbiegezeichen erkannt wird, biegt der Roboter nach rechts ab, wird ein Linksabbiegezeichen erkannt, dann biegt der Roboter nach links ab, wenn keines erkannt wird, fährt der Roboter vorwärts. Der verwendete Datensatz ist die offizielle Verkehrszeichenerkennung des INI (2019) (Institut Fur Neuroinformatik), dieser Datensatz hat 43 Klassen, es werden jedoch nur zwei benötigt; Die Ordner 00033 und 00034 im Datensatz sind Links- und Rechtsabbieger.

Schritt 1: Anforderungen

Anforderungen
Anforderungen
Anforderungen
Anforderungen
Anforderungen
Anforderungen

Die Anforderungen für dieses Projekt sind die folgenden:

Ein Arduino-Roboter. (im Grunde ein Arduino Uno, ein Motortreiber und Motoren) (nicht erforderlich, wenn Sie keinen Roboter verwenden)

Ein Himbeer-Pi 4.

Eine Pi-Kamera.

Erforderliche Software:

Python3.

OpenCV 4.

Tensorfluss.

Arduino IDE (nicht erforderlich, wenn Sie keinen Roboter verwenden)

Ros (nicht erforderlich, wenn Sie keinen Roboter verwenden)

Was auch immer Ihre Lieblingspythonidee ist (Auf dem Himbeer-Pi verwende ich Thonny).

Um OpenCV und Tensorflow einzurichten, befolgen Sie die Anweisungen von Adrian. Link:

Ich empfehle, sich so viele seiner Tutorials wie möglich anzusehen, sie sind wirklich interessant und sowohl für Anfänger als auch für Fortgeschrittene nützlich.

Schritt 2: Datentraining

Das Zugskript soll auf den Datensatz zugreifen, der aus rund 50.000 Bildern aus 43 Klassen besteht. Das Skript ist in Python geschrieben und verwendet eine Vielzahl von Bibliotheken: os – dies dient zum Verknüpfen des Python-Skripts mit dem richtigen Verzeichnis, in dem sich der Datensatz befindet. Matplotlib – dies dient zum Anzeigen der Daten aus dem Trainingsmodell. Tensorflow und Keras – das sind die Bibliotheken, die verwendet werden, um das Modell des künstlichen neuronalen Netzes zu erstellen, sie werden verwendet, um das Modell zu entwerfen. Numpy – Diese Bibliothek dient zum Umwandeln von Bildern in ein Array, das dann durch das Modell geschickt werden kann, um eine Vorhersage abzurufen.

Das angehängte Skript ist der Python-Code zum Erstellen eines Modells aus dem Datensatz. Dies besteht aus Faltungs-2D mit einer (5, 5)-Eingabe und einer Aktivierung von relu und dann Pooling, sobald dies getan ist, durchläuft die Eingabe eine weitere Faltung mit einer (3, 3)-Eingabe mit derselben Aktivierung und Pooling. Dies geschieht ein letztes Mal, bevor es abgeflacht wird, und dann wird die Dichte auf die Anzahl der vorhandenen Klassen angewendet, in diesem Fall 43.

Der nächste Schritt bestand darin, das Modell zu kompilieren. Dies ist der Teil, der den Optimierer festlegt, ein sgd war am passendsten, da dieser dem in Aufgabe 1 verwendeten Optimierer ähnlich war. Sgd steht für Stochastischer Gradientenabstieg. Auch innerhalb des Compilers muss der Verlust festgelegt werden. Die Wahl eines sparse_categorical_crossentropy loss ist die beste Anpassung, da die Kategorien als ganze Zahlen vorliegen und das Modell eine Vorhersage für jede Klasse als Gleitkommazahl zwischen 0 und 1 ausgibt. 1 ist 100% Genauigkeit.

Sobald der Compiler abgeschlossen ist, muss ein Generator angewendet werden, damit das Modell mit der Verarbeitung der Bildeingaben beginnt. Der Generator besteht aus mehreren Teilen: training_set – dies ist der Link zum für das Training verwendeten Datensatz, steps_per_epoch – dies ist die Anzahl der erforderlichen Schritte pro Epoche, Epochen – so oft durchläuft das Programm einen vollständigen Datensatz,validation_data – dies ist der Link zum für die Validierung verwendeten Datensatz,validation_steps – die Anzahl der für die Validierung verwendeten Schritte,die Validierung erfolgt am Ende jeder Epoche.

Im Allgemeinen muss eine vollständige Löschung des gesamten Datensatzes pro Epoche erfolgen. Ein Datensatz von 1024 Bildern erfordert also beispielsweise: Stapelgröße = 32, Schritte pro Epoche = 32, Epochen = 1. Jeder Schritt umfasst die gesamte Stapelgröße, so dass bei einer Stapelgröße von 32 die Schritte 32 sind Andererseits ist es am besten, eine größere Stapelgröße als die Anzahl der Klassen zu verwenden, da bei einer kleineren Stapelgröße nicht jeder Schritt ein Bild aus jeder Klasse enthalten kann.

Sobald das Modell das Training beendet hat, erstellt das Programm mit Matplotlib ein Diagramm der Ausgaben, das den Verlauf des Trainings von Anfang bis Ende zeigt. Der Graph besteht aus Genauigkeit, Validierungsgenauigkeit, Verlust und Validierungsverlust, dies ist nach Epochen aufgeteilt, um den Trainingsfortschritt zu zeigen. Der letzte Schritt besteht darin, das Modell als.h5-Datei zu speichern, auf die später für den Vorhersageprozess zugegriffen werden kann. Das Speichern des Modells bedeutet, dass das Trainingsprogramm nicht jedes Mal, wenn das Vorhersageprogramm ausgeführt wird, erneut ausgeführt werden muss. Das Trainingsprogramm kann auf einem Himbeer-Pi bis zu 10 Minuten pro Epoche dauern.

Anbei das Trainingsskript:

Schritt 3: Implementieren der Pi-Kamera-Vorhersagen

Das nächste Programm ist das Vorhersage- und Herausgeberskript.

Der erste Schritt besteht darin, das Modell mit model.load() zu laden. Die zweite Stufe besteht darin, die Frames von der Pi-Kamera mit opencv zu durchlaufen und dann die Größe des Frames auf die gleiche Größe wie die in der Trainingsphase verwendeten Eingabegrößen zu ändern, 32 x 32 Pixel. Sobald dies erledigt ist, wird der neue Frame mit geänderter Größe mit model.predict () durch das Modell gelegt, was eine Matrix ausgibt. Jedes Element der Matrix ist ein Gleitkommawert von 0 bis 1, der Elementindex ist derselbe wie die Klasse, die er darstellt das erste Element ist Klasse eins und die Zahl ist die Vorhersage der Gewissheit, dass das Bild aus dieser Klasse stammt. Z. B.

HINWEIS: Wenn Sie die Roboterseite nicht verwenden. Entfernen Sie einfach die Zeilen:

"rosig importieren"

def sprecher (Richtung):

Nachricht = String()

pub = rospy. Publisher('robot', String, queue_size=10)

rospy.init_node('talker', anonymous=True)

Nachricht = Richtung

rospy.loginfo(Nachricht)

pub.publish(Nachricht)"

"Sprecher (Richtung)"

Angehängt ist das Pi-Kamera-Skript.

Schritt 4: Arduino-Roboter

Der letzte Schritt ist das Roboterprogrammskript.

Dies ist in C++ geschrieben und ist eine.ino-Datei für das Arduino Uno. Das Programm benötigt die ros-Bibliothek, die Sie im Bibliotheken-Manager in der ide finden. Sobald dies importiert ist, gibt es Beispieldateien. Ich habe mich entschieden, die LED-Blinkdatei zu erweitern, da dies ein ähnliches Ziel wie das von mir benötigte erreichen würde. Das Programm läuft weiter, bis die Stromversorgung unterbrochen wird. Zuerst hört es auf den Topic-Roboter, wenn es einen Befehl von diesem Topic abfängt, hat es eine if-Anweisung, um zu sehen, was der Befehl sagt. Wenn der Befehl links ist, führt das Skript die Methode zum Abbiegen nach links aus, wenn der Befehl rechts ist, führt es die Methode zum Abbiegen nach rechts aus und andernfalls führt es die Vorwärtsmethode aus. Diese drei Methoden sind einander sehr ähnlich, sie sagen den digitalen Pins, dass sie entweder LOW (Masse) oder 100 (PWM) sind, damit der Roboter nicht zu schnell ist, indem er dem Motortreiber sagt, dass er nur ein bisschen loslassen soll Spannung aus. Die Reihenfolge dieser Ausgänge bewirkt, dass der Roboter nach links und rechts dreht oder vorwärts fährt, dies liegt an der Ausrichtung der Spannung, die zu den Motoren geht.

Angehängt ist das.ino-Skript für Arduino.

Schritt 5: Testen

Testen
Testen
Testen
Testen
Testen
Testen

Die angehängten Bilder machen das Projekt von Anfang bis Ende. Das erste Bild zeigt das laufende Training. Sobald dies abgeschlossen ist, wird ein Ausdruck des erstellten Modells angezeigt. Das dritte Bild zeigt eine Vorhersage aus dem Trainingsskript. Dies ist die letzte Stufe des Trainingsskripts. Wenn Sie in den Ordner schauen, in dem sich das Trainingsskript befindet, wurde ein Diagramm und ein Modell erstellt. Die Grafik sollte hier wie in Bild 4 aussehen, dies zeigt den Verlauf des Trainings von Anfang bis Ende.

Das letzte Bild ist während der Ausführung des Pi-Kamera-Skripts ein Live-Stream von der Pi-Kamera. bei jedem Frame wird eine Vorhersage gemacht und die Vorhersage wird im Terminal gedruckt. Der Rahmen zeigt, was die Kamera sieht.

Anbei mein Universitätsbericht zu diesem Projekt. Bitte lesen Sie mehr über das Projekt.

Schritt 6: Alle zusätzlichen Dateien

Alle zusätzlichen Dateien
Alle zusätzlichen Dateien

Einige davon waren Testdateien, die ich unterwegs erstellt habe.

Empfohlen: