Indholdsfortegnelse:

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

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

Video: Raspberry Pi 4 Traffic Sign Recognition Robot: 6 trin
Video: OpenCV+Raspberry Pi computer vision autonomous mobile robot traffic sign recognition 2024, November
Anonim
Raspberry Pi 4 Traffic Sign Recognition Robot
Raspberry Pi 4 Traffic Sign Recognition Robot

Dette instruerbare er baseret på mit universitetsprojekt. Målet var at skabe et system, hvor et neuralt netværk analyserer et billede og derefter baseret på genkendelsen vil fortælle en arduino -robot at flytte via Ros.

For eksempel hvis et sving til højre genkendes, så vil robotten dreje til højre, hvis et sving til venstre genkendes, så vil robotten dreje til venstre, hvis ingen genkendes, vil robotten fortsætte fremad. Datasættet, der skal bruges, er den officielle trafikskiltegenkendelse fra INI (2019) (Institut Fur Neuroinformatik), dette datasæt har 43 klasser, men kun to er nødvendige; 00033 og 00034 mapper i datasættet er venstre og højre drejeskilt.

Trin 1: Krav

Krav
Krav
Krav
Krav
Krav
Krav

Kravene til dette projekt er følgende:

En arduino robot. (dybest set en arduino uno, en motordriver og motorer) (ikke nødvendigt, hvis du ikke bruger en robot)

En hindbær pi 4.

Et pi kamera.

Software påkrævet:

Python 3.

OpenCV 4.

Tensorflow.

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

Ros (ikke nødvendig, hvis du ikke bruger en robot)

Uanset hvad din yndlingspython -ide er (På hindbærpi bruger jeg Thonny).

Følg instruktionerne fra Adrian for at konfigurere OpenCV og Tensorflow. Link:

Jeg anbefaler at se på så mange af hans tutorials som muligt, de er virkelig interessante og er både nyttige for begyndere såvel som mellemliggende.

Trin 2: Træning af data

Togskriptet er designet til at få adgang til datasættet, der samler omkring 50.000 billeder fra 43 klasser. Scriptet er skrevet i python ved hjælp af en række forskellige biblioteker: os - dette er til at linke python -scriptet til det korrekte bibliotek, hvor datasættet er placeret. Matplotlib - dette er til visning af data fra træningsmodellen. Tensorflow og keras - det er de biblioteker, der bruges til at oprette den kunstige neurale netværksmodel, de bruges til at designe modellen. Numpy - dette bibliotek er til at omdanne billeder til et array, som derefter kan sættes gennem modellen for at hente en forudsigelse.

Det vedhæftede script er python -koden til at lave en model fra datasættet. Dette består af konvolutions 2D med en (5, 5) input og en aktivering af relu derefter pooling, når dette er gjort, går input gennem en anden konvolvering med en (3, 3) input med samme aktivering og pooling. Dette sker en sidste gang, før det bliver fladtrykt, og derefter anvendes densiteten på mængden af klasser, der er, i dette tilfælde 43.

Næste trin var at kompilere modellen. Dette er den del, der sætter optimeren, en sgd var den mest passende, da denne lignede den optimer, der blev brugt i opgave 1. Sgd står for Stokastisk gradientnedstigning. Også inden for kompilatoren skal tabet indstilles, det er bedst at vælge et sparse_categorical_crossentropy -tab, da kategorierne er som heltal, og modellen udsender en forudsigelse for hver klasse som en float mellem 0 og 1. 1 er 100% nøjagtighed.

Når kompilatoren er færdig, skal der anvendes en generator for at modellen kan begynde at behandle billedinput. Generatoren består af flere dele: training_set - dette er linket til datasættet, der bruges til træning, steps_per_epoch - dette er antallet af trin pr. Epoke, der er påkrævet, epoker - dette er hvor mange gange programmet vil gentage gennem et komplet sæt data, validation_data - dette er linket til datasættet, der bruges til validering, validation_steps - antallet af trin, der bruges til validering, validering sker i slutningen af hver epoke.

Generelt skal en komplet sletning af hele datasættet være fuldstændig pr. Epoke. Derfor vil f.eks. Et datasæt med 1024 billeder kræve: Batchstørrelse = 32, trin pr. Epoke = 32, epoker = 1. Hvert trin omfatter hele batchstørrelsen, så med en batchstørrelse på 32 vil trinene være 32. På den anden side Det er bedst at have en større batchstørrelse end antallet af klasser, fordi hvis batchstørrelsen er mindre, kan hvert trin ikke indeholde et billede fra hver klasse.

Når modellen er færdig med at træne, vil programmet ved hjælp af matplotlib lave en graf over output, dette viser træningens historie fra start til slut. Grafen består af nøjagtighed, valideringsnøjagtighed, tab og valideringstab, dette opdeles pr. Epoke for at vise, hvordan træningen skred frem. Det sidste trin er at gemme modellen som en.h5 -fil, som senere kan tilgås til forudsigelsesprocessen. At gemme modellen betyder, at hver gang forudsigelsesprogrammet køres, behøver træningsprogrammet ikke at blive kørt igen. Træningsprogrammet kan tage op til 10 minutter pr. Epoke på en hindbærpi.

Vedhæftet er Training script:

Trin 3: Implementering af Pi -kameraets forudsigelser

Det næste program er forudsigelse og udgiver script.

Det første trin er at indlæse modellen ved hjælp af model.load (). Den anden fase er at iterere gennem rammerne fra pi -kameraet ved hjælp af opencv og derefter ændre størrelsen på rammen til den samme størrelse som de inputstørrelser, der blev brugt i træningstrinnet, 32 x 32 pixels. Når dette er gjort, sættes den nye størrelse i rammen gennem modellen ved hjælp af model.predict (), der udsender en matrix, hvert element i matrixen er en float fra 0 til 1, elementindekset er det samme som den klasse, det repræsenterer, derfor det første element er klasse et, og tallet er forudsigelse af sikkerhed for, at billedet er fra den klasse. F.eks.

BEMÆRK: Hvis du ikke bruger robotsiden. Bare fjern linjerne:

"import rospy"

def talker (retning):

besked = String ()

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

rospy.init_node ('talker', anonym = sand)

besked = retning

rospy.loginfo (besked)

pub.publish (meddelelse)"

"taler (retning)"

Vedhæftet er Pi -kameraskriptet.

Trin 4: Arduino Robot

Det sidste trin er robotprogrammets script.

Dette er skrevet i C ++ og er en.ino -fil til arduino uno. Programmet kræver ros -biblioteket, som findes i bibliotekschefen inden for ideen. Når dette er importeret, er der eksempelfiler, jeg valgte at udvide led -blink -filen, da dette ville gøre et lignende formål som det, jeg havde brug for. Programmet fortsætter med at løkke, indtil strømmen er afbrudt, først lytter det til emnerobotten, når det fanger en kommando fra det emne, vil det have en if -sætning for at se, hvad kommandoen siger. Hvis kommandoen er tilbage, kører scriptet drej til venstre -metoden, hvis kommandoen er højre, vil den køre metoden til højre til højre, og ellers vil den køre fremad -metoden. Disse tre metoder ligner hinanden meget, de fortæller de digitale stifter enten at være LAVE (jorden) eller 100 (PWM), dette er til, så robotten ikke er for hurtig ved at fortælle motorføreren kun at lade en smule spænding ud. Rækkefølgen af disse udgange er det, der får robotten til at dreje til venstre og højre eller gå fremad, dette skyldes orienteringen af spændingen, der går til motorerne.

Vedhæftet er.ino script til arduino.

Trin 5: Test

Test
Test
Test
Test
Test
Test

Billederne vedhæftet, så projektet fra start til slut. Det første billede viser uddannelsen i gang. Når det er fuldført, vises der en udskrift af den fremstillede model. Det tredje billede viser en forudsigelse fra træningsmanuskriptet. dette er den sidste fase af træningsmanuskriptet. Hvis du kigger i den mappe, træningsscriptet er i, er der lavet en graf og en model. Grafen skal ligne billede 4 her, dette viser træningens historie fra start til slut.

Det sidste billede er, mens du kører pi -kamerascriptet, det er en livestream fra pi -kameraet. der foretages en forudsigelse på hver ramme, og forudsigelsen udskrives i terminalen. Rammen viser, hvad kameraet ser.

Vedhæftet er min universitetsrapport for dette projekt. Læs venligst flere detaljer om projektet.

Trin 6: Alle yderligere filer

Alle yderligere filer
Alle yderligere filer

Nogle af disse testede filer, jeg lavede undervejs.

Anbefalede: