Inhoudsopgave:

Raspberry Pi 4 verkeersbordherkenningsrobot - Ajarnpa
Raspberry Pi 4 verkeersbordherkenningsrobot - Ajarnpa

Video: Raspberry Pi 4 verkeersbordherkenningsrobot - Ajarnpa

Video: Raspberry Pi 4 verkeersbordherkenningsrobot - Ajarnpa
Video: Компиляция и декомпиляция скриптов Python 2024, November
Anonim
Raspberry Pi 4 verkeersbordherkenningsrobot
Raspberry Pi 4 verkeersbordherkenningsrobot

Deze instructable is gebaseerd op mijn universitaire project. Het doel was om een systeem te creëren waarbij een neuraal netwerk een afbeelding analyseert en vervolgens op basis van de herkenning een arduino-robot vertelt om via Ros te bewegen.

Als bijvoorbeeld een bord rechtsaf wordt herkend, gaat de robot naar rechts, als een bord voor linksaf wordt herkend, draait de robot naar links, als geen van beide wordt herkend, gaat de robot vooruit. De dataset die zal worden gebruikt is de officiële verkeersbordherkenning van de INI (2019) (Institut Fur Neuroinformatik), deze dataset heeft 43 klassen, maar er zijn er maar twee nodig; De mappen 00033 en 00034 in de dataset zijn links en rechts afslaande borden.

Stap 1: Vereisten

Vereisten
Vereisten
Vereisten
Vereisten
Vereisten
Vereisten

De vereisten voor dit project zijn de volgende:

Een arduino-robot. (eigenlijk een arduino uno, een motordriver en motoren) (niet nodig als je geen robot gebruikt)

Een framboos pi 4.

Een pi-camera.

Benodigde software:

Python3.

Open CV 4.

tensorstroom.

arduino IDE (niet nodig als je geen robot gebruikt)

Ros (niet nodig als je geen robot gebruikt)

Wat je favoriete python-idee ook is (op de Raspberry Pi gebruik ik Thonny).

Volg de instructies van Adrian om OpenCV en Tensorflow in te stellen. Link:

Ik raad aan om zoveel mogelijk van zijn tutorials te bekijken, ze zijn erg interessant en zijn zowel nuttig voor beginners als voor gevorderden.

Stap 2: Training van gegevens

Het treinscript is ontworpen om toegang te krijgen tot de dataset die bestaat uit ongeveer 50.000 afbeeldingen uit 43 klassen. Het script is geschreven in python, met behulp van verschillende bibliotheken: os – dit is om het python-script te koppelen aan de juiste map waar de dataset zich bevindt. Matplotlib – dit is voor het weergeven van de gegevens uit het trainingsmodel. Tensorflow en keras - dit zijn de bibliotheken die worden gebruikt om het kunstmatige neurale netwerkmodel te maken, ze worden gebruikt om het model te ontwerpen. Numpy - deze bibliotheek is bedoeld om afbeeldingen om te zetten in een array die vervolgens door het model kan worden gehaald om een voorspelling op te halen.

Het bijgevoegde script is de python-code voor het maken van een model uit de dataset. Dit bestaat uit convolutionele 2D met een (5, 5) input en een activatie van relu dan pooling, zodra dit gedaan is gaat de input door een andere convolutie met een (3, 3) input met dezelfde activatie en pooling. Dit gebeurt nog een laatste keer voordat het wordt afgevlakt en dan wordt de dichtheid toegepast op het aantal klassen dat er is, in dit geval 43.

De volgende stap was het samenstellen van het model. Dit is het deel dat de optimiser instelt, een sgd was het meest passend omdat deze vergelijkbaar was met de optimiser die in opdracht 1 werd gebruikt. Sgd staat voor Stochastische gradiëntafdaling. Ook binnen de compiler moet het verlies worden ingesteld, het kiezen van een sparse_categorical_crossentropy-verlies is het beste omdat de categorieën als gehele getallen zijn en het model een voorspelling voor elke klasse zal uitvoeren als een float tussen 0 en 1. 1 is 100% nauwkeurigheid.

Zodra de compiler is voltooid, moet een generator worden toegepast om het model de beeldinvoer te laten verwerken. De generator bestaat uit meerdere delen: training_set – dit is de link naar de dataset die wordt gebruikt voor training, steps_per_epoch – dit is het aantal stappen per epoch dat nodig is, epochs – dit is hoe vaak het programma een volledige set gegevens zal doorlopen, validation_data - dit is de link naar de dataset die wordt gebruikt voor validatie, validation_steps - het aantal stappen dat wordt gebruikt voor validatie, validatie vindt plaats aan het einde van elk tijdperk.

Over het algemeen moet per tijdperk een volledige wipe van de hele dataset zijn voltooid. Daarom vereist een dataset van 1024 afbeeldingen bijvoorbeeld: Batchgrootte = 32, Stappen per epoch = 32, epochs = 1. Elke stap omvat de hele batchgrootte, dus bij een batchgrootte van 32 zijn de stappen 32. Aan de andere kant hand, het is het beste om een grotere batchgrootte te hebben dan het aantal klassen, dit komt omdat als de batchgrootte kleiner is, elke stap geen afbeelding van elke klasse kan bevatten.

Zodra het model klaar is met trainen, maakt het programma met behulp van matplotlib een grafiek van de output, dit toont de geschiedenis van de training van begin tot eind. De grafiek bestaat uit nauwkeurigheid, validatienauwkeurigheid, verlies en validatieverlies, dit is opgesplitst per tijdperk om te laten zien hoe de training vorderde. De laatste fase is om het model op te slaan als een.h5-bestand dat later kan worden geopend voor het voorspellingsproces. Het model opslaan betekent dat elke keer dat het voorspellingsprogramma wordt uitgevoerd, het trainingsprogramma niet opnieuw hoeft te worden uitgevoerd. Het trainingsprogramma kan tot 10 minuten per tijdperk duren op een Raspberry Pi.

Bijgevoegd is het trainingsscript:

Stap 3: De voorspellingen van de Pi-camera implementeren

Het volgende programma is het voorspellings- en uitgeversscript.

De eerste stap is om het model te laden met model.load(). De tweede fase is om de frames van de pi-camera te doorlopen met behulp van opencv en vervolgens het formaat van het frame te wijzigen in dezelfde grootte als de invoerformaten die in de trainingsfase worden gebruikt, 32 x 32 pixels. Zodra dit is gebeurd, wordt het nieuwe formaat van het frame door het model geplaatst met behulp van model.predict () dat een matrix uitvoert, elk element van de matrix is een float van 0 tot 1, de elementindex is hetzelfde als de klasse die het vertegenwoordigt, vandaar het eerste element is klasse één en het getal is de voorspelling van de zekerheid dat het beeld uit die klasse komt. bijv.

OPMERKING: Als u de robotzijde niet gebruikt. Verwijder gewoon de regels:

"Rospy importeren"

def prater(richting):

bericht = String()

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

rospy.init_node('prater', anoniem=True)

bericht = richting

rospy.loginfo(bericht)

pub.publish(bericht)"

"prater (richting)"

Bijgevoegd is het Pi-camerascript.

Stap 4: Arduino-robot

De laatste stap is het script van het robotprogramma.

Dit is geschreven in C++ en is een.ino-bestand voor de arduino uno. Het programma vereist de ros-bibliotheek die te vinden is in de bibliothekenmanager binnen de ide. Zodra dit is geïmporteerd, zijn er voorbeeldbestanden, ik heb ervoor gekozen om het led-knipperbestand uit te breiden, omdat dit een vergelijkbaar doel zou hebben als wat ik nodig had. Het programma blijft in een lus lopen totdat de stroom wordt losgekoppeld, eerst luistert het naar de onderwerprobot, wanneer het een commando van dat onderwerp opvangt, zal het een if-statement hebben om te zien wat het commando zegt. Als de opdracht links is, voert het script de methode linksaf uit, als de opdracht goed is, wordt de methode rechtsom uitgevoerd en anders wordt de methode vooruit uitgevoerd. Deze drie methoden lijken erg op elkaar, ze vertellen de digitale pinnen of ze LAAG (aarde) of 100 (PWM) zijn, dit is voor zodat de robot niet te snel is door de motorbestuurder te vertellen dat hij slechts een beetje van spanning uit. De volgorde van deze uitgangen zorgt ervoor dat de robot naar links en rechts draait of vooruit gaat, dit komt door de oriëntatie van de spanning die naar de motoren gaat.

Bijgevoegd is het.ino-script voor arduino.

Stap 5: Testen

Testen
Testen
Testen
Testen
Testen
Testen

De afbeeldingen bijgevoegd, zodat het project van begin tot eind is. De eerste afbeelding toont de training in uitvoering. Zodra dat is voltooid, wordt een afdruk van het gemaakte model getoond. De derde afbeelding toont een voorspelling uit het trainingsscript. dit is de laatste fase van het trainingsscript. Als je in de map kijkt waar het trainingsscript in staat, is er een grafiek en een model gemaakt. De grafiek zou hier moeten lijken op afbeelding 4, dit toont de geschiedenis van de training van begin tot eind.

De uiteindelijke afbeelding is tijdens het uitvoeren van het pi-camerascript, het is een livestream van de pi-camera. op elk frame wordt een voorspelling gemaakt en de voorspelling wordt afgedrukt in de terminal. Het frame laat zien wat de camera ziet.

Bijgevoegd is mijn universiteitsrapport voor dit project. Lees voor meer informatie over het project.

Stap 6: Alle extra bestanden

Alle extra bestanden
Alle extra bestanden

Sommige hiervan waren testbestanden die ik onderweg maakte.

Aanbevolen: