Innehållsförteckning:

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

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

Video: Raspberry Pi 4 Traffic Sign Recognition Robot: 6 steg
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

Detta instruerbara är baserat på mitt universitetsprojekt. Syftet var att skapa ett system där ett neuralt nätverk analyserar en bild och sedan baserat på igenkänningen kommer att berätta för en arduino -robot att flytta via Ros.

Till exempel om en sväng höger tecken känns igen så kommer roboten att svänga höger, om en sväng vänster skylt känns igen så kommer roboten att svänga vänster, om ingen av dem känns igen kommer roboten att fortsätta framåt. Datauppsättningen som kommer att användas är den officiella trafikskyltigenkänningen från INI (2019) (Institut Fur Neuroinformatik), denna datamängd har 43 klasser men endast två behövs; 00033 och 00034 mappar i datamängden är vänster och höger vändskyltar.

Steg 1: Krav

Krav
Krav
Krav
Krav
Krav
Krav

Kraven för detta projekt är följande:

En arduino -robot. (i princip en arduino uno, en motorförare och motorer) (behövs inte om du inte använder en robot)

En hallon pi 4.

En pi -kamera.

Programvara som krävs:

Python 3.

OpenCV 4.

Tensorflöde.

arduino IDE (behövs inte om du inte använder en robot)

Ros (behövs inte om du inte använder en robot)

Oavsett vad din favorit python ide är (På hallon pi använder jag Thonny).

Följ instruktionerna från Adrian för att konfigurera OpenCV och Tensorflow. Länk:

Jag rekommenderar att titta på så många av hans handledning som möjligt, de är riktigt intressanta och är både användbara för nybörjare såväl som för mellanliggande.

Steg 2: Utbildning av data

Tågskriptet är utformat för att komma åt datauppsättningen som sammanställer cirka 50 000 bilder från 43 klasser. Skriptet är skrivet i python, med hjälp av en mängd olika bibliotek: os - detta är för att länka python -skriptet till den korrekta katalogen där datamängden finns. Matplotlib - detta är för att visa data från träningsmodellen. Tensorflow och keras - det här är biblioteken som används för att skapa den artificiella neurala nätverksmodellen, de används för att designa modellen. Numpy - det här biblioteket är för att förvandla bilder till en array som sedan kan sättas igenom modellen för att hämta en förutsägelse.

Skriptet som bifogas är pythonkoden för att skapa en modell från datamängden. Detta består av konvolutionell 2D med en (5, 5) ingång och en aktivering av relu sedan pooling, när detta är gjort går ingången genom en annan konvolvering med en (3, 3) ingång med samma aktivering och sammanslagning. Detta händer en sista gång innan det plattas ut och sedan appliceras densiteten på mängden klasser som finns, i det här fallet 43.

Nästa steg var att sammanställa modellen. Det här är den del som ställer in optimeraren, en sgd var den mest passande eftersom den liknade den som användes i uppgift 1. Sgd står för Stokastisk gradientnedstigning. Även inom kompilatorn måste förlusten ställas in, att välja en sparse_categorical_crossentropy -förlust är den bästa passningen eftersom kategorierna är som heltal och modellen kommer ut en förutsägelse för varje klass som en float mellan 0 och 1. 1 är 100% noggrannhet.

När kompilatorn är klar måste en generator appliceras för att modellen ska kunna bearbeta bildinmatningarna. Generatorn består av flera delar: training_set - detta är länken till datauppsättningen som används för utbildning, steps_per_epoch - detta är antalet steg per epok som krävs, epoker - det här är hur många gånger programmet kommer att iterera genom en fullständig uppsättning data, validation_data - detta är länken till datasetet som används för validering, validation_steps - antalet steg som används för validering, validering sker i slutet av varje epok.

Generellt måste en fullständig rensning av hela datamängden vara komplett per epok. Därför kräver till exempel en datamängd med 1024 bilder: Batchstorlek = 32, steg per epok = 32, epoker = 1. Varje steg innehåller hela batchstorleken, så med en batchstorlek på 32 kommer stegen att vara 32. På den andra Det är bäst att ha en större batchstorlek än antalet klasser, detta beror på att om batchstorleken är mindre kan varje steg inte innehålla en bild från varje klass.

När modellen har avslutat träningen, med hjälp av matplotlib kommer programmet att göra en graf över utgångarna, detta visar träningens historia från början till slut. Diagrammet består av noggrannhet, valideringsnoggrannhet, förlust och valideringsförlust, detta delas upp per epok för att visa hur utbildningen fortskred. Det sista steget är att spara modellen som en.h5 -fil som kan nås senare för förutsägelseprocessen. Att spara modellen innebär att varje gång prediktionsprogrammet körs behöver träningsprogrammet inte köras igen. Träningsprogrammet kan ta upp till 10 minuter per epok på en hallon pi.

Bifogat är träningsmanuset:

Steg 3: Implementera Pi -kameraprognoserna

Nästa program är förutsägelse och utgivarskript.

Det första steget är att ladda modellen med modell.load (). Det andra steget är att iterera genom ramarna från pi -kameran med hjälp av opencv och sedan ändra storlek på ramen till samma storlek som inmatningsstorlekarna som används i träningssteget, 32 x 32 pixlar. När detta är gjort sätts den nya storlek på ramen igenom modellen med hjälp av model.predict () som matar ut en matris, varje element i matrisen är en float från 0 till 1, elementindexet är samma som klassen det representerar, därför det första elementet är klass ett och talet är förutsägelsen om säkerhet för att bilden kommer från den klassen. T.ex.

OBS: Om du inte använder robotsidan. Ta bara bort raderna:

"importera rospy"

def talker (riktning):

meddelande = String ()

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

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

meddelande = riktning

rospy.loginfo (meddelande)

pub.publish (meddelande)"

"pratare (riktning)"

Bifogat är Pi -kameraskriptet.

Steg 4: Arduino Robot

Det sista steget är robotprogramskriptet.

Detta är skrivet i C ++ och är en.ino -fil för arduino uno. Programmet kräver ros -biblioteket som finns i bibliotekets chef inom ideen. När detta är importerat finns det exempelfiler, jag valde att expandera på LED -blinkfilen eftersom detta skulle göra ett liknande mål som jag behövde. Programmet fortsätter att loopa tills strömmen kopplas bort, först lyssnar det på ämnesroboten, när det får ett kommando från det ämnet kommer det att ha en if -sats för att se vad kommandot säger. Om kommandot är kvar kör skriptet sväng vänster -metoden, om kommandot är rätt kör det sväng höger metod och annars kör det framåt metoden. Dessa tre metoder är väldigt lika varandra, de säger till de digitala stiften att antingen vara LÅG (mark) eller 100 (PWM) detta är för så att roboten inte är för snabb genom att säga till motorföraren att bara låta lite spänning ut. Ordningen på dessa utgångar är det som får roboten att svänga åt vänster och höger eller gå framåt, detta beror på orienteringen av spänningen som går till motorerna.

Bifogat är.ino -manuset för arduino.

Steg 5: Testning

Testning
Testning
Testning
Testning
Testning
Testning

Bilderna bifogade så projektet från början till slut. Den första bilden visar hur utbildningen pågår. När det är klart visas en utskrift av den tillverkade modellen. Den tredje bilden visar en förutsägelse från träningsmanuset. detta är det sista steget i träningsmanuset. Om du tittar i mappen som träningsskriptet finns i har en graf och en modell gjorts. Diagrammet ska se ut som bild 4 här, detta visar träningens historia från början till slut.

Den sista bilden är medan du kör pi -kameraskriptet, det är en livestream från pi -kameran. en förutsägelse görs på varje ram och förutsägelsen skrivs ut i terminalen. Ramen visar vad kameran ser.

Bifogad är min universitetsrapport för detta projekt. Läs mer om projektet.

Steg 6: Alla ytterligare filer

Alla ytterligare filer
Alla ytterligare filer

Några av dessa testade filer som jag gjorde längs vägen.

Rekommenderad: