- Forudsætninger
- Trin involveret i anerkendelse af nummerplade ved hjælp af Raspberry Pi
- 1. Registrering af nummerplade
- 2. Karakter segmentering
- 3. Karaktergenkendelse
- Mislykkede sager i genkendelse af nummerplade
- Andre vellykkede eksempler
Sikkerhed har altid været en stor bekymring for menneskeheden. I dag har vi videoovervågningskameraer på skoler, hospitaler og alle andre offentlige steder for at få os til at føle os sikre. Ifølge en undersøgelse foretaget af HIS anslås det, at der var omkring 245 millioner sikkerhedskameraer installeret og fungerede tilbage i 2014, hvilket er som at have et sikkerhedskamera til hver 30 mennesker på denne planet. Med fremskridt inden for teknologi, især inden for billedbehandling og maskinindlæring, er det muligt at gøre disse kameraer smartere ved at træne dem i at behandle information fra videofeed.
Video-feedet fra disse kameraer kan bruges til at udføre ansigtsgenkendelse, mønsteranalyse, følelsesanalyse og meget mere, som virkelig ville få det tæt på noget som “Guds øje” vist i FF7-filmen. Faktisk er overvågningsfirmaer som Hikvision og mange andre allerede begyndt at implementere disse funktioner i deres produkter. Vi har tidligere brugt MATLAB Billedbehandling til at læse nummerpladen, i dag i denne artikel vil vi lære at genkende og læse nummerplade nummer fra biler ved hjælp af Raspberry Pi og OpenCV. Vi bruger nogle tilfældige køretøjsbilleder fra Google og skriver et program til at genkende nummerpladen ved hjælp af OpenCV Contour Detection og læser derefter nummeret fra pladen ved hjælp af Tesseract OCR. Det lyder interessant !, så lad os komme i gang.
Forudsætninger
Som tidligere fortalt bruger vi OpenCV-biblioteket til at opdage og genkende ansigter. Så sørg for at installere OpenCV-biblioteket på Raspberry Pi, før du fortsætter med denne vejledning. Tænd også for din Pi med en 2A-adapter og tilslut den til en skærmskærm for lettere fejlfinding.
Denne vejledning forklarer ikke, hvordan OpenCV fungerer nøjagtigt, hvis du er interesseret i at lære billedbehandling, så tjek denne OpenCV-basics og avancerede tutorials til billedbehandling. Du kan også lære om konturer, Blob Detection osv. I denne billedsegmenteringsvejledning ved hjælp af OpenCV. Vi gør noget lignende til at opdage bilens nummerplade fra billedet.
Trin involveret i anerkendelse af nummerplade ved hjælp af Raspberry Pi
Licenspladegenkendelse eller forkortet LPR involverer tre hovedtrin. Trinene er som følger
1. Registrering af nummerplade: Det første trin er at registrere nummerpladen fra bilen. Vi bruger konturindstillingen i OpenCV til at registrere for rektangulære objekter for at finde nummerpladen. Nøjagtigheden kan forbedres, hvis vi ved den nøjagtige størrelse, farve og omtrentlige placering af nummerpladen. Normalt trænes detekteringsalgoritmen baseret på kameraets position og typen af nummerplade, der bruges i det pågældende land. Dette bliver sværere, hvis billedet ikke engang har en bil, i dette tilfælde vil vi et yderligere trin til at opdage bilen og derefter nummerpladen.
2. Karakteropdeling: Når vi først har registreret nummerpladen, skal vi beskære den og gemme den som et nyt billede. Igen kan dette gøres let ved hjælp af OpenCV.
3. Karaktergenkendelse: Nu er det nye billede, som vi opnåede i det forrige trin, helt sikkert med nogle tegn (tal / alfabeter) skrevet på det. Så vi kan udføre OCR (Optical Character Recognition) på den for at registrere nummeret. Vi har allerede forklaret Optical Character Recognition (OCR) ved hjælp af Raspberry Pi.
1. Registrering af nummerplade
Det første trin i denne Raspberry Pi License Plate Reader er at opdage nummerpladen. Lad os tage et prøvebillede af en bil og starte med at opdage nummerpladen på den bil. Vi bruger derefter det samme billede til tegnsegmentering og karaktergenkendelse også. Hvis du vil springe direkte ind i koden uden forklaring, kan du rulle ned til bunden af denne side, hvor den komplette kode er angivet. Testbilledet, som jeg bruger til denne vejledning, vises nedenfor.
Trin 1: Tilpas billedet til den ønskede størrelse, og gråtoner det derefter. Koden for det samme er angivet nedenfor
img = cv2.resize (img, (620.480)) grå = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #konverter til grå skala
Ændring af størrelse, vi hjælper os med at undgå problemer med billeder med større opløsning, og sørg for, at nummerpladen stadig er i rammen efter ændring af størrelsen. Grå skalering er almindelig i alle billedbehandlingstrin. Dette fremskynder andre følgende processinus, vi behøver ikke længere at behandle farvedetaljerne, når vi behandler et billede. Billedet ville blive transformeret sådan noget, når dette trin er udført
Trin 2: Hvert billede har nyttige og ubrugelige oplysninger, i dette tilfælde er kun nummerpladen den nyttige information for os, resten er stort set ubrugelige til vores program. Denne ubrugelige information kaldes støj. Normalt fjerner de uønskede detaljer fra et billede ved hjælp af et bilateralt filter (Bluring). Koden for det samme er
grå = cv2.bilateralFilter (grå, 11, 17, 17)
Syntaks er destination_billede = cv2.bilateralFilter (kilde_billede, pixeldiameter, sigmaColor, sigmaSpace). Du kan øge sigma-farve og sigma-plads fra 17 til højere værdier for at sløre mere baggrundsinformation, men pas på, at den nyttige del ikke bliver sløret. Outputbilledet vises nedenfor, da du kan se baggrundsdetaljerne (træ og bygning) er slørede i dette billede. På denne måde kan vi undgå, at programmet senere koncentreres om disse regioner.
Trin 3: Det næste trin er interessant, hvor vi udfører kantdetektion. Der er mange måder at gøre det på, den mest nemme og populære måde er at bruge canny edge-metoden fra OpenCV. Linjen for at gøre det samme er vist nedenfor
kantet = cv2.Canny (grå, 30, 200) # Udfør Edge-detektion
Syntaksen vil være destination_billede = cv2.Canny (kilde_billede, tærskelværdi 1, tærskelværdi 2). Tærskelværdi 1 og tærskelværdi 2 er minimum og maksimum tærskelværdier. Kun de kanter, der har en intensitetsgradient, der er mere end minimumstærskelværdien og mindre end den maksimale tærskelværdi, vises. Det resulterende billede vises nedenfor
Trin 4: Nu kan vi begynde at kigge efter konturer på vores billede, vi har allerede lært om, hvordan man finder konturer ved hjælp af OpenCV i vores tidligere tutorial, så vi fortsætter bare som det samme.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = sorteret (cnts, key = cv2.contourArea, reverse = True) screenCnt = Ingen
Når tællerne er fundet, sorterer vi dem fra store til små og overvejer kun de første 10 resultater, der ignorerer de andre. I vores billede kan tælleren være alt, hvad der har en lukket overflade, men af alle de opnåede resultater vil nummerpladens nummer også være der, da det også er en lukket overflade.
For at filtrere nummerpladebilledet blandt de opnåede resultater, løber vi gennem alle resultaterne og kontrollerer, hvilke der har en rektangelformskontur med fire sider og lukket figur. Da en nummerplade helt sikkert ville være et firkantet firkantet figur.
# loop over vores konturer for c i cnts: # tilnærmelsesvis konturen peri = cv2.arcLength (c, True) approx = cv2.approxPolyDP (c, 0,018 * peri, True) # hvis vores tilnærmede kontur har fire punkter, så # vi kan antage, at vi har fundet vores skærm, hvis len (approx) == 4: screenCnt = approx break
Værdien 0,018 er en eksperimentel værdi; du kan lege rundt for at kontrollere, hvad der fungerer bedst for dig. Eller tag det til næste niveau ved at bruge maskinlæring til at træne baseret på bilbilleder og derefter bruge den rigtige værdi der. Når vi har fundet den rigtige tæller, gemmer vi den i en variabel kaldet screenCnt og tegner derefter en rektangelboks omkring den for at sikre, at vi har registreret nummerpladen korrekt.
Trin 5: Nu hvor vi ved, hvor nummerpladen er, er de resterende oplysninger stort set ubrugelige for os. Så vi kan fortsætte med at maskere hele billedet undtagen det sted, hvor nummerpladen er. Koden til at gøre det samme vises nedenfor
# Maskering af den anden del end nummerplademasken = np.zeros (grå.form, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maske)
Det maskerede nye billede vises som nedenunder
2. Karakter segmentering
Det næste trin i Raspberry Pi Number Plate Recognition er at segmentere nummerpladen ud af billedet ved at beskære det og gemme det som et nyt billede. Vi kan derefter bruge dette billede til at registrere tegnet i det. Koden til beskæring af roi (Region of interest) -billede fra hovedbilledet vises nedenfor
# Beskær nu (x, y) = np.where (mask == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Beskåret = grå
Det resulterende billede vises nedenfor. Normalt tilføjet til beskæring af billedet, kan vi også gråne det og kant det om nødvendigt. Dette gøres for at forbedre karaktergenkendelsen i næste trin. Men jeg fandt ud af, at det fungerer fint, selv med det originale billede.
3. Karaktergenkendelse
Det sidste trin i denne Raspberry Pi nummerpladegenkendelse er faktisk at læse nummerpladens information fra det segmenterede billede. Vi bruger pytesseract- pakken til at læse tegn fra billedet, ligesom vi gjorde i forrige tutorial. Koden for det samme er angivet nedenfor
#Læs nummerpladeteksten = pytesseract.image_to_string (Beskåret, config = '- psm 11') print ("Detekteret nummer er:", tekst)
Vi har allerede forklaret, hvordan man konfigurerer en Tesseract-motor, så her igen, hvis det er nødvendigt, kan vi konfigurere Tesseract OCR for at opnå bedre resultater, hvis det kræves. Det registrerede tegn udskrives derefter på konsollen. Når det er kompileret, vises resultatet som nedenfor
Som du kan se, havde det originale billede nummeret “HR 25 BR9044” på, og vores program har registreret, at det udskrev den samme værdi på skærmen.
Mislykkede sager i genkendelse af nummerplade
Den komplette projektfil, denne Raspberry Pi License Plate Recognition kan downloades herfra, den indeholder programmet og testbillederne, som vi brugte til at kontrollere vores program. Uden at være sagt skal man huske, at resultaterne fra denne metode ikke vil være korrekte . Nøjagtigheden afhænger af billedets klarhed, orientering, lyseksponering osv. For at få bedre resultater kan du prøve at implementere maskinindlæringsalgoritmer sammen med dette.
For at få en idé, lad os se på et andet eksempel, hvor bilen ikke vender direkte mod kameraet.
Som du kan se, kunne vores program registrere nummerpladen korrekt og beskære den. Men Tesseract- biblioteket har ikke kunnet genkende tegnene korrekt. I stedet for den faktiske "TS 08 UE 3396" har OCR anerkendt det som "1508 ye 3396". Problemer som dette kan rettes ved enten at bruge bedre orienteringsbilleder eller ved at konfigurere Tesseract- motoren.
Et andet worst case-scenario er, hvor konturen ikke registrerer nummerpladen korrekt. Nedenstående billede har for meget baggrundsinformation og dårlig belysning til, at programmet endda ikke har identificeret nummerpladen fra nummeret. I dette tilfælde er vi nødt til at fortsætte med maskinindlæring eller forbedre billedkvaliteten.
Andre vellykkede eksempler
De fleste gange med billedkvaliteten og orienteringen er korrekt, var programmet i stand til at identificere nummerpladen og læse nummeret fra den. Nedenstående snapshots viser få af de opnåede succesrige resultater. Igen vil alle testbillederne og den anvendte kode være tilgængelig i den ZIP-fil, der er angivet her.
Håber du forstod automatisk nummerpladegenkendelse ved hjælp af Raspberry Pi og nød at bygge noget cool på egen hånd. Hvad synes du ellers kan gøres med OpenCV og Tesseract ? Lad mig vide dine tanker i kommentarsektionen. Hvis du har spørgsmål vedrørende denne artikel, er du velkommen til at efterlade dem i kommentarfeltet nedenfor eller bruge fora til andre tekniske forespørgsler.