Innholdsfortegnelse:

Raspberry Pi 4 Traffic Sign Recognition Robot: 6 trinn
Raspberry Pi 4 Traffic Sign Recognition Robot: 6 trinn

Video: Raspberry Pi 4 Traffic Sign Recognition Robot: 6 trinn

Video: Raspberry Pi 4 Traffic Sign Recognition Robot: 6 trinn
Video: 125 Innovative Electric Vehicles and Personal Transports 2024, November
Anonim
Raspberry Pi 4 Robot for gjenkjenning av trafikkskilt
Raspberry Pi 4 Robot for gjenkjenning av trafikkskilt

Dette instruerbare er basert på mitt universitetsprosjekt. Målet var å lage et system hvor et nevralnettverk analyserer et bilde og deretter basert på gjenkjenningen vil fortelle en arduino -robot å bevege seg via Ros.

For eksempel hvis et sving til høyre blir gjenkjent, vil roboten svinge til høyre, hvis et sving til venstre blir gjenkjent, vil roboten svinge til venstre, hvis ingen av dem blir gjenkjent, vil roboten fortsette fremover. Datasettet som skal brukes er den offisielle trafikkskiltgjenkjenningen fra INI (2019) (Institut Fur Neuroinformatik), dette datasettet har 43 klasser, men bare to er nødvendig; 00033 og 00034 mapper i datasettet er venstre og høyre svingskilt.

Trinn 1: Krav

Krav
Krav
Krav
Krav
Krav
Krav

Kravene til dette prosjektet er følgende:

En arduino -robot. (i utgangspunktet en arduino uno, en motordriver og motorer) (ikke nødvendig hvis du ikke bruker en robot)

En bringebær pi 4.

Et pi -kamera.

Programvare som kreves:

Python 3.

OpenCV 4.

Tensorflyt.

arduino IDE (ikke nødvendig hvis du ikke bruker en robot)

Ros (ikke nødvendig hvis du ikke bruker en robot)

Uansett hva din favoritt python ide er (På bringebær pi bruker jeg Thonny).

Følg instruksjonene fra Adrian for å konfigurere OpenCV og Tensorflow. Lenke:

Jeg anbefaler å se på så mange av opplæringene hans som mulig, de er veldig interessante og er både nyttige for nybegynnere så vel som middels.

Trinn 2: Trening av data

Togskriptet er designet for å få tilgang til datasettet som samler rundt 50 000 bilder fra 43 klasser. Skriptet er skrevet i python, ved hjelp av en rekke biblioteker: os - dette er for å koble python -skriptet til den riktige katalogen der datasettet er plassert. Matplotlib - dette er for å vise dataene fra treningsmodellen. Tensorflow og keras - dette er bibliotekene som brukes til å lage den kunstige nevrale nettverksmodellen, de brukes til å designe modellen. Numpy - dette biblioteket er for å gjøre bilder til en matrise som deretter kan settes gjennom modellen for å hente en prediksjon.

Skriptet som er vedlagt er pythonkoden for å lage en modell fra datasettet. Dette består av konvolusjonell 2D med en (5, 5) inngang og en aktivering av relu deretter pooling, når dette er gjort går inngangen gjennom en annen konvolusjon med en (3, 3) inngang med samme aktivering og pooling. Dette skjer en siste gang før det blir flatet, og deretter brukes tettheten på mengden klasser det er, i dette tilfellet 43.

Det neste trinnet var å kompilere modellen. Dette er delen som setter optimeren, en sgd var den mest passende siden denne var lik optimalisereren som ble brukt i oppgave 1. Sgd står for Stokastisk gradient nedstigning. Også i kompilatoren må tapet stilles inn, det er best å velge et sparse_categorical_crossentropy -tap siden kategoriene er som heltall, og modellen vil gi en prediksjon for hver klasse som en flyt mellom 0 og 1. 1 er 100% nøyaktighet.

Når kompilatoren er fullført, må det brukes en generator for at modellen skal begynne å behandle bildeinngangene. Generatoren består av flere deler: training_set - dette er lenken til datasettet som brukes til trening, steps_per_epoch - dette er antall trinn per epoke som kreves, epoker - dette er hvor mange ganger programmet vil iterere gjennom et komplett sett med data, validation_data - dette er lenken til datasettet som brukes til validering, validation_steps - antall trinn som brukes for validering, validering skjer på slutten av hver epoke.

Generelt må en fullstendig sletting av hele datasettet være fullført per epoke. Derfor vil for eksempel et datasett med 1024 bilder kreve: Batchstørrelse = 32, trinn per epoke = 32, epoker = 1. Hvert trinn inkluderer hele batchstørrelsen, så med en batchstørrelse på 32 vil trinnene være 32. På den andre siden Det er best å ha en større batchstørrelse enn antall klasser, dette er fordi hvis batchstørrelsen er mindre, kan hvert trinn ikke inneholde et bilde fra hver klasse.

Når modellen er ferdig trent, vil programmet ved hjelp av matplotlib lage en graf over resultatene, dette viser treningens historie fra start til slutt. Grafen består av nøyaktighet, valideringsnøyaktighet, tap og valideringstap, dette deles opp per epoke for å vise hvordan treningen utviklet seg. Den siste fasen er å lagre modellen som en.h5 -fil som du kan få tilgang til senere for forutsigelsesprosessen. Lagring av modellen betyr at hver gang forutsigelsesprogrammet kjøres, trenger ikke treningsprogrammet å kjøres igjen. Treningsprogrammet kan ta opptil 10 minutter per epoke på en bringebærpi.

Vedlagt er opplæringsmanuset:

Trinn 3: Implementere Pi -kameraets spådommer

Det neste programmet er prediksjon og utgivermanus.

Det første trinnet er å laste inn modellen ved hjelp av model.load (). Den andre fasen er å iterere gjennom bildene fra pi -kameraet ved hjelp av opencv og deretter endre størrelsen på rammen til samme størrelse som inngangsstørrelsene som ble brukt i treningstrinnet, 32 x 32 piksler. Når dette er gjort, blir den nye størrelsen på rammen satt gjennom modellen ved hjelp av model.predict () som sender ut en matrise, hvert element i matrisen er en flyter fra 0 til 1, elementindeksen er den samme som klassen den representerer, derfor det første elementet er klasse ett, og tallet er forutsigelsen om at bildet er fra den klassen. F.eks.

MERK: Hvis du ikke bruker robotsiden. Bare fjern linjene:

"importer rospy"

def talker (retning):

melding = String ()

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

rospy.init_node ('snakker', anonym = sant)

melding = retning

rospy.loginfo (melding)

pub.publish (melding)"

"snakker (retning)"

Vedlagt er Pi -kameraskriptet.

Trinn 4: Arduino Robot

Det siste trinnet er robotprogramskriptet.

Dette er skrevet i C ++ og er en.ino -fil for arduino uno. Programmet krever ros -biblioteket som finnes i biblioteksjefen i ideen. Når dette er importert, er det eksempelfiler, jeg valgte å utvide led -blink -filen siden dette ville gjøre et lignende mål som det jeg trengte. Programmet fortsetter å løkke til strømmen er frakoblet, først lytter det til emneroboten, når det fanger en kommando fra det emnet, vil det ha en if -setning for å se hva kommandoen sier. Hvis kommandoen er igjen, kjører skriptet sving til venstre -metoden, hvis kommandoen er høyre, kjører den sving til høyre -metoden, og ellers kjører den fremover -metoden. Disse tre metodene er veldig like hverandre, de sier at de digitale pinnene enten er LAVE (bakken) eller 100 (PWM) dette er for, slik at roboten ikke er for rask ved å fortelle motorføreren å bare la litt av spenning ut. Rekkefølgen på disse utgangene er det som får roboten til å svinge til venstre og høyre eller gå fremover, dette skyldes orienteringen til spenningen som går til motorene.

Vedlagt er.ino -skriptet for arduino.

Trinn 5: Testing

Testing
Testing
Testing
Testing
Testing
Testing

Bildene vedlagt slik at prosjektet fra start til slutt. Det første bildet viser opplæringen som er i gang. Når det er fullført, vises en utskrift av modellen som er laget. Det tredje bildet viser en prediksjon fra treningsmanuset. dette er den siste fasen av opplæringsmanuset. Hvis du ser i mappen som treningsskriptet er i, er det laget en graf og en modell. Grafen skal se ut som bilde 4 her, dette viser historien til treningen fra start til slutt.

Det siste bildet er mens du kjører pi -kameraskriptet, det er en direktesending fra pi -kameraet. det gjøres en prediksjon på hver ramme og prediksjonen skrives ut i terminalen. Rammen viser hva kameraet ser.

Vedlagt er min universitetsrapport for dette prosjektet. Les mer om prosjektet.

Trinn 6: Alle tilleggsfiler

Alle tilleggsfiler
Alle tilleggsfiler

Noen av disse testet filer jeg laget underveis.

Anbefalt: