- Forutsetninger
- Trinn involvert i lisensgjenkjenning ved hjelp av Raspberry Pi
- 1. Deteksjon av lisens
- 2. Karakter segmentering
- 3. Karaktergjenkjenning
- Mislykkede saker i registreringsnummergjenkjenning
- Andre vellykkede eksempler
Sikkerhet har alltid vært en stor bekymring for menneskeheten. I dag har vi videoovervåkningskameraer på skoler, sykehus og andre offentlige steder for å føle oss trygge. Ifølge en undersøkelse fra HIS anslås det at det var rundt 245 millioner sikkerhetskameraer installert og fungerte tilbake i 2014, som er som å ha ett sikkerhetskamera for hver 30 personer på denne planeten. Med fremgangen innen teknologi, spesielt innen bildebehandling og maskinlæring, er det mulig å gjøre disse kameraene smartere ved å trene dem i å behandle informasjon fra videofeeden.
Videofeeden fra disse kameraene kan brukes til å utføre ansiktsgjenkjenning, mønsteranalyse, følelsesanalyse og mye mer som virkelig vil få det nær noe som "Guds øye" vist i FF7-filmen. Faktisk har overvåkingsselskaper som Hikvision og mange andre allerede begynt å implementere disse funksjonene i produktene sine. Vi brukte tidligere MATLAB Bildebehandling for å lese nummerplaten. I dag vil vi i denne artikkelen lære å gjenkjenne og lese nummerplatenummer fra biler som bruker Raspberry Pi og OpenCV. Vi bruker noen tilfeldige bilbilder fra Google og skriver et program for å gjenkjenne nummerplaten ved hjelp av OpenCV Contour Detection, og deretter lese nummeret fra platen ved hjelp av Tesseract OCR. Høres interessant ut !, så la oss komme i gang.
Forutsetninger
Som tidligere fortalt vil vi bruke OpenCV-biblioteket til å oppdage og gjenkjenne ansikter. Så sørg for å installere OpenCV-biblioteket på Raspberry Pi før du fortsetter med denne opplæringen. Strøm også Pi med en 2A-adapter og koble den til en skjerm for enklere feilsøking.
Denne opplæringen vil ikke forklare hvordan akkurat OpenCV fungerer, hvis du er interessert i å lære bildebehandling, så sjekk ut dette grunnleggende om OpenCV og avanserte opplæringsprogrammer for bildebehandling. Du kan også lære om konturer, Blob Detection osv. I denne bildesegmenteringsveiledningen ved hjelp av OpenCV. Vi vil gjøre noe lignende dette for å oppdage bilens lisensplate fra bildet.
Trinn involvert i lisensgjenkjenning ved hjelp av Raspberry Pi
License Plate Recognition eller LPR for kort, innebærer tre hovedtrinn. Trinnene er som følger
1. Registrering av registreringsskilt: Det første trinnet er å oppdage bilskiltet. Vi vil bruke konturalternativet i OpenCV for å oppdage for rektangulære objekter for å finne nummerplaten. Nøyaktigheten kan forbedres hvis vi vet nøyaktig størrelse, farge og omtrentlig plassering av nummerplaten. Normalt trenes deteksjonsalgoritmen basert på posisjonen til kameraet og typen typeskilt som brukes i det aktuelle landet. Dette blir vanskeligere hvis bildet ikke en gang har bil, i dette tilfellet vil vi ta et ekstra trinn for å oppdage bilen og deretter bilskiltet.
2. Karaktersegmentering: Når vi har oppdaget lisensplaten, må vi beskjære den og lagre den som et nytt bilde. Igjen kan dette gjøres enkelt ved hjelp av OpenCV.
3. Tegngjenkjenning: Det nye bildet som vi fikk i forrige trinn, har sikkert noen tegn (tall / alfabet) skrevet på det. Så vi kan utføre OCR (Optical Character Recognition) på den for å oppdage nummeret. Vi har allerede forklart Optical Character Recognition (OCR) ved hjelp av Raspberry Pi.
1. Deteksjon av lisens
Det første trinnet i denne Raspberry Pi License Plate Reader er å oppdage lisensplaten. La oss ta et eksempel på en bil og begynne med å oppdage lisensplaten på den bilen. Vi vil da bruke det samme bildet for tegnsegmentering og karaktergjenkjenning også. Hvis du vil hoppe rett inn i koden uten forklaring, kan du bla ned til bunnen av denne siden, der hele koden er gitt. Testbildet jeg bruker for denne opplæringen, vises nedenfor.
Trinn 1: Endre størrelsen på bildet til ønsket størrelse og gråtoner det deretter. Koden for det samme er gitt nedenfor
img = cv2.resize (img, (620,480)) grå = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #konverter til gråskala
Ved å endre størrelse hjelper vi oss med å unngå problemer med bilder med større oppløsning, og sørg for at nummerplaten fortsatt er i rammen etter endring av størrelse. Grå skalering er vanlig i alle trinn for bildebehandling. Dette fremskynder andre prosesser som følger, vi trenger ikke lenger å håndtere fargedetaljene når vi behandler et bilde. Bildet vil bli transformert noe slikt når dette trinnet er gjort
Trinn 2: Hvert bilde vil ha nyttig og ubrukelig informasjon, i dette tilfellet er bare lisensplaten nyttig informasjon resten er ganske ubrukelig for vårt program. Denne ubrukelige informasjonen kalles støy. Ved å bruke et bilateralt filter (Bluring) fjernes vanligvis uønskede detaljer fra et bilde. Koden for det samme er
grå = cv2.bilateralFilter (grå, 11, 17, 17)
Syntaks er destination_bilde = cv2.bilateralFilter (kilde_bilde, pikselens diameter, sigmaColor, sigmaSpace). Du kan øke sigma-fargen og sigma-plassen fra 17 til høyere verdier for å sløre mer bakgrunnsinformasjon, men vær forsiktig så den nyttige delen ikke blir uskarp. Utgangsbildet vises nedenfor, da du kan se bakgrunnsdetaljene (tre og bygning) er uskarpe i dette bildet. På denne måten kan vi unngå at programmet senere konsentrerer seg om disse regionene.
Trinn 3: Det neste trinnet er interessant der vi utfører kantdeteksjon. Det er mange måter å gjøre det på, den mest enkle og populære måten er å bruke canny edge-metoden fra OpenCV. Linjen for å gjøre det samme er vist nedenfor
kantet = cv2.Canny (grå, 30, 200) #Perform Edge deteksjon
Syntaksen vil være destinasjonsbilde = cv2.Canny (kilde_bilde, terskelverdi 1, terskelverdi 2). Terskelverdien 1 og terskelverdien 2 er minimums- og maksimumsverdiene. Bare kantene som har en intensitetsgradient mer enn minimum terskelverdi og mindre enn maksimum terskelverdi vises. Det resulterende bildet vises nedenfor
Trinn 4: Nå kan vi begynne å lete etter konturer på bildet vårt, vi har allerede lært om hvordan du finner konturer ved hjelp av OpenCV i vår forrige opplæring, så vi fortsetter bare som det samme.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = sorted (cnts, key = cv2.contourArea, reverse = True) screenCnt = None
Når tellerne er oppdaget sorterer vi dem fra store til små og vurderer bare de 10 første resultatene som ignorerer de andre. I vårt bilde kan telleren være alt som har en lukket overflate, men av alle oppnådde resultater vil lisensnummeret også være der siden det også er en lukket overflate.
For å filtrere bilskiltbildet blant de oppnådde resultatene, vil vi løkke gjennom alle resultatene og sjekke hvilke som har en rektangelformkontur med fire sider og lukket figur. Siden et lisensskilt definitivt ville være et firkantet rektangel.
# løkke over konturene våre for c i cnts: # tilnærmet konturen peri = cv2.arcLength (c, True) approx = cv2.approxPolyDP (c, 0,018 * peri, True) # hvis den tilnærmede konturen vår har fire poeng, så # vi kan anta at vi har funnet skjermen vår hvis len (approx) == 4: screenCnt = approx break
Verdien 0,018 er en eksperimentell verdi; du kan leke rundt den for å sjekke hvilken som passer best for deg. Eller ta det til neste nivå ved å bruke maskinlæring til å trene basert på bilbilder og deretter bruke riktig verdi der. Når vi har funnet riktig teller, lagrer vi den i en variabel som heter screenCnt og tegner deretter en rektangelboks rundt den for å sikre at vi har oppdaget lisensplaten riktig.
Trinn 5: Nå som vi vet hvor nummerplaten er, er den gjenværende informasjonen ganske ubrukelig for oss. Så vi kan fortsette med å maskere hele bildet, bortsett fra stedet der nummerplaten er. Koden for å gjøre det samme er vist nedenfor
# Maskerer den delen som ikke er nummerplaten masken = np. nuller (grå. Form, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maske)
Det maskerte nye bildet vises omtrent som nedenfor
2. Karakter segmentering
Det neste trinnet i Raspberry Pi Number Plate Recognition er å segmentere lisensplaten ut av bildet ved å beskjære den og lagre den som et nytt bilde. Vi kan da bruke dette bildet til å oppdage tegnet i det. Koden for å beskjære roi (Region of interest) -bildet fra hovedbildet vises nedenfor
# Nå beskjæres (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 bildet vises nedenfor. Normalt lagt til beskjæring av bildet, kan vi også gråne det og kant det hvis nødvendig. Dette gjøres for å forbedre karaktergjenkjenningen i neste trinn. Imidlertid fant jeg ut at det fungerer bra selv med originalbildet.
3. Karaktergjenkjenning
Det siste trinnet i denne Raspberry Pi Number Plate Recognition er å lese informasjonen om nummerplaten fra det segmenterte bildet. Vi bruker pytesseract- pakken til å lese tegn fra bildet, akkurat som vi gjorde i forrige opplæring. Koden for det samme er gitt nedenfor
#Les nummerplaten tekst = pytesseract.image_to_string (Cropped, config = '- psm 11') print ("Detected Number is:", text)
Vi har allerede forklart hvordan du konfigurerer en Tesseract-motor, så her kan vi om nødvendig konfigurere Tesseract OCR for å oppnå bedre resultater om nødvendig. Det oppdagede tegnet skrives deretter ut på konsollen. Når det er samlet, vises resultatet som nedenfor
Som du ser hadde originalbildet nummeret “HR 25 BR9044” på seg, og programmet vårt har oppdaget at det har skrevet ut samme verdi på skjermen.
Mislykkede saker i registreringsnummergjenkjenning
Den komplette prosjektfilen til denne Raspberry Pi License Plate Recognition kan lastes ned herfra, den inneholder programmet og testbildene vi brukte til å sjekke programmet vårt. Uten å bli sagt, er det å huske at resultatene fra denne metoden ikke vil være nøyaktige . Nøyaktigheten avhenger av klarheten i bildet, orientering, lyseksponering osv. For å få bedre resultater kan du prøve å implementere maskinlæringsalgoritmer sammen med dette.
For å få en ide, la oss se på et annet eksempel der bilen ikke vender direkte mot kameraet.
Som du kan se, kunne programmet vårt oppdage lisensplaten riktig og beskjære den. Men Tesseract- biblioteket har ikke klart å gjenkjenne tegnene riktig. I stedet for den faktiske “TS 08 UE 3396” har OCR anerkjent at den er “1508 ye 3396”. Problemer som dette kan korrigeres ved å bruke bilder med bedre orientering eller ved å konfigurere Tesseract- motoren.
Et annet worst case-scenario er hvor konturen ikke oppdager lisensplaten riktig. Bildet nedenfor har for mye bakgrunnsinformasjon og dårlig belysning til at programmet til og med ikke har identifisert lisensplaten fra nummeret. I dette tilfellet må vi igjen stole på maskinlæring eller forbedre kvaliteten på bildet.
Andre vellykkede eksempler
De fleste ganger med bildekvalitet og orientering er riktig, var programmet i stand til å identifisere lisensplaten og lese nummeret fra den. Nedenstående snapshot viser få av de vellykkede resultatene som er oppnådd. Igjen vil alle testbildene og koden som brukes her være tilgjengelig i ZIP-filen som er gitt her.
Håper du forsto Automatic Number Plate Recognition ved hjelp av Raspberry Pi og likte å bygge noe kult på egenhånd. Hva mer tror du kan gjøres med OpenCV og Tesseract ?, Gi meg beskjed om tankene dine i kommentarfeltet. Hvis du har spørsmål angående denne artikkelen, kan du gjerne legge dem igjen i kommentarfeltet nedenfor eller bruke forumene til andre tekniske spørsmål.