- Predpogoji
- Koraki pri prepoznavanju registrske tablice z uporabo Raspberry Pi
- 1. Odkrivanje registrske tablice
- 2. Segmentacija znakov
- 3. Prepoznavanje znakov
- Primeri napak pri prepoznavanju registrske tablice
- Drugi uspešni primeri
Varnost je bila vedno glavna skrb človeštva. Danes imamo v šolah, bolnišnicah in na vseh drugih javnih mestih kamere za video nadzor, da se počutimo zaščitene. Glede na raziskavo, ki jo je opravil HIS, je bilo ocenjenih, da je bilo leta 2014 nameščenih in delujočih približno 245 milijonov varnostnih kamer, kar pomeni, da bi imeli na vsakih 30 ljudi na tem planetu eno varnostno kamero. Z napredkom tehnologije, zlasti pri obdelavi slik in strojnem učenju, je mogoče te kamere narediti pametnejše, tako da jih usposobite za obdelavo informacij iz video vira.
Video vir teh kamer lahko uporabimo za prepoznavanje obrazov, analizo vzorcev, analizo čustev in še veliko več, kar bi ga resnično približalo nečemu, kot je "Božje oko", prikazano v filmu FF7. Dejansko so nadzorna podjetja, kot je Hikvision, in številna druga že začela te funkcije uporabljati v svojih izdelkih. Pred tem smo za branje registrske tablice uporabljali obdelavo slik MATLAB, danes v tem članku se bomo naučili, kako prepoznati in prebrati številko registrske tablice iz avtomobilov z uporabo Raspberry Pi in OpenCV. Uporabili bomo nekaj naključnih Googlovih slik vozil in napisali program za prepoznavanje registrske tablice z OpenCV Contour Detection in nato s pomočjo Tesseract OCR prebrali številko s tablice. Sliši se zanimivo !, zato začnimo.
Predpogoji
Kot smo že povedali, bomo za odkrivanje in prepoznavanje obrazov uporabljali knjižnico OpenCV. Preden nadaljujete s to vadnico, torej namestite knjižnico OpenCV na Raspberry Pi. Napajajte Pi tudi z adapterjem 2A in ga za lažje odpravljanje napak priključite na monitor zaslona.
Ta vadnica ne bo pojasnila, kako natančno deluje OpenCV, če vas zanima učenje obdelave slik, si oglejte te osnove OpenCV in napredne vadnice za obdelavo slik. V tej vadnici za segmentacijo slik lahko z OpenCV izveste tudi o konturah, zaznavanju blob ipd. Nekaj podobnega bomo storili, da bomo s slike zaznali registrsko tablico avtomobila.
Koraki pri prepoznavanju registrske tablice z uporabo Raspberry Pi
Prepoznavanje registrske tablice ali na kratko LPR vključuje tri glavne korake. Koraki so naslednji
1. Zaznavanje registrske tablice: Prvi korak je zaznavanje registrske tablice iz avtomobila. Možnost konture v OpenCV bomo uporabili za zaznavanje pravokotnih predmetov, da bi našli številčno ploščico. Natančnost lahko izboljšamo, če poznamo natančno velikost, barvo in približno lokacijo registrske tablice. Običajno se algoritem zaznavanja usposobi glede na položaj kamere in vrsto registrske tablice, ki se uporablja v tej državi. To postane bolj zapleteno, če slika nima niti avtomobila, v tem primeru bomo naredili dodaten korak za odkrivanje avtomobila in nato registrske tablice.
2. Segmentacija znakov: Ko zaznamo registrsko tablico, jo moramo izrezati in shraniti kot novo sliko. Tudi to lahko enostavno naredimo z uporabo OpenCV.
3. Prepoznavanje znakov: Na novi sliki, ki smo jo dobili v prejšnjem koraku, bodo zagotovo zapisani nekateri znaki (številke / abecede). Torej lahko na njem izvedemo OCR (optično prepoznavanje znakov), da zaznamo številko. Z uporabo Raspberry Pi smo že razložili optično prepoznavanje znakov (OCR).
1. Odkrivanje registrske tablice
Prvi korak v tem bralniku registrskih tablic Raspberry Pi je zaznavanje registrske tablice. Vzemimo vzorčno sliko avtomobila in začnimo z zaznavanjem registrske tablice na tem avtomobilu. Nato bomo isto sliko uporabili tudi za segmentacijo znakov in prepoznavanje znakov. Če želite skočiti naravnost v kodo brez obrazložitve, se lahko pomaknete navzdol do dna te strani, kjer je navedena celotna koda. Testna slika, ki jo uporabljam za to vadnico, je prikazana spodaj.
1. korak: Sliko prilagodite na želeno velikost in jo nato prilagodite v sivinah. Koda za isto je navedena spodaj
img = cv2.resize (img, (620,480)) grey = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) # pretvori v sivo lestvico
Pri spreminjanju velikosti se izognemo težavam s slikami večje ločljivosti, poskrbite, da bo tablica po spremembi velikosti še vedno v okvirju. Prilagoditev sive barve je pogosta v vseh korakih obdelave slik. To pospeši druge naslednje sinusne postopke, pri obdelavi slike nam ni več treba obravnavati barvnih podrobnosti. Ko se ta korak konča, bi se slika preoblikovala nekako tako
2. korak: Vsaka slika bo imela koristne in neuporabne informacije, v tem primeru so za nas le registrske tablice koristne informacije, ostale pa so za naš program precej neuporabne. Te neuporabne informacije imenujemo hrup. Običajno uporaba dvostranskega filtra (zameglitev) odstrani neželene podrobnosti s slike. Koda istega je
siva = cv2.bilateralFilter (siva, 11, 17, 17)
Sintaksa je destination_image = cv2.bilateralFilter (source_image, premer slikovne pike, sigmaColor, sigmaSpace). Barvo sigme in prostor sigme lahko povečate s 17 na višje vrednosti, da zameglite več informacij o ozadju, vendar pazite, da se uporabni del ne zamegli. Izhodna slika je prikazana spodaj, saj lahko vidite, da so podrobnosti ozadja (drevo in zgradba) na tej sliki zamegljene. Tako se lahko izognemo, da bi se program kasneje osredotočil na te regije.
3. korak: Naslednji korak je zanimiv, kjer izvajamo zaznavanje robov. Obstaja veliko načinov, najbolj enostaven in priljubljen način je uporaba metode canny edge iz OpenCV. Vrstica, ki naredi enako, je prikazana spodaj
edged = cv2.Canny (siva, 30, 200) # Izvedite zaznavanje robov
Sintaksa bo ciljna_slika = cv2.Canny (izvorna_slika, pragVrednost 1, pragVrednost 2). Prag vrednosti 1 in prag vrednosti 2 sta najnižji in največji vrednosti praga. Prikazani bodo samo robovi, ki imajo gradient intenzivnosti večji od najmanjše vrednosti praga in manjši od največje vrednosti praga. Nastala slika je prikazana spodaj
4. korak: Zdaj lahko začnemo iskati konture na naši sliki, v prejšnji vadnici smo že izvedeli, kako najti konture z uporabo OpenCV, zato nadaljujemo enako.
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
Ko števce zaznamo, jih razvrstimo od velikih do majhnih in upoštevamo le prvih 10 rezultatov, pri čemer ostale ne upoštevamo. Na naši sliki je lahko števec vse, kar ima zaprto površino, a od vseh dobljenih rezultatov bo tam tudi številka registrske tablice, saj je tudi zaprta površina.
Za filtriranje slike registrske tablice med pridobljenimi rezultati bomo vse rezultate pregledali in preverili, katera ima konturo pravokotne oblike s štirimi stranicami in zaprto sliko. Ker bi bila registrska tablica vsekakor pravokotna štiristranska slika.
# zanko nad našimi konturami za c v cnts: # približno konturo peri = cv2.arcLength (c, True) približno = cv2.approxPolyDP (c, 0,018 * peri, True) # če ima naša približna kontura štiri točke, potem # mi lahko domnevamo, da smo naš zaslon našli, če je len (približno) == 4: screenCnt = približno prekinil
Vrednost 0,018 je eksperimentalna vrednost; lahko se poigrate in preverite, katera vam najbolj ustreza. Ali pa ga dvignite na naslednjo raven s pomočjo strojnega učenja za trening na podlagi avtomobilskih slik in nato tam uporabite pravo vrednost. Ko smo našli pravi števec, ga shranimo v spremenljivko, imenovano screenCnt, nato pa okrog njega narišemo pravokotno polje, da se prepričamo, da smo pravilno zaznali registrsko tablico.
5. korak: Zdaj, ko vemo, kje je registrska tablica, so preostale informacije za nas precej neuporabne. Tako lahko nadaljujemo s prikrivanjem celotne slike, razen kraja, kjer je registrska tablica. Koda, ki stori enako, je prikazana spodaj
# Maskiranje dela, ki ni maska registrske tablice = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maska)
Maskirana nova slika se bo pojavila približno tako kot spodaj
2. Segmentacija znakov
Naslednji korak pri prepoznavanju registrske tablice Raspberry Pi je segmentacija registrske tablice iz slike tako, da jo obrežete in shranite kot novo sliko. Nato lahko s to sliko zaznamo lik v njej. Koda za obrezovanje slike roi (Območje interesa) iz glavne slike je prikazana spodaj
# Zdaj je obrezovanje (x, y) = np. kjer (maska == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Obrezano = sivo
Nastala slika je prikazana spodaj. Običajno je dodana obrezovanju slike, po potrebi pa jo lahko tudi obarvamo s sivo in jo obrobimo. To se naredi za izboljšanje prepoznavanja znakov v naslednjem koraku. Vendar sem ugotovil, da deluje dobro tudi z izvirno sliko.
3. Prepoznavanje znakov
Zadnji korak pri prepoznavanju tablice Raspberry Pi je dejansko branje informacij o registrski tablici s segmentirane slike. Paket pytesseract bomo uporabili za branje znakov s slike, tako kot smo to storili v prejšnji vadnici. Koda za isto je navedena spodaj
# Preberite številko tablice text = pytesseract.image_to_string (Obrezano, config = '- psm 11') print ("Zaznana številka je:", besedilo)
Že smo razložili, kako konfigurirati motor Tesseract, zato lahko po potrebi spet nastavimo Tesseract OCR, da po potrebi dobimo boljše rezultate. Zaznani znak se nato natisne na konzolo. Ko je sestavljen, je rezultat prikazan spodaj
Kot lahko vidite, je bila na izvirni sliki številka »HR 25 BR9044«, naš program pa je zaznal, da je na zaslon natisnila enako vrednost.
Primeri napak pri prepoznavanju registrske tablice
Celotno projektno datoteko, ki jo lahko prepoznate s tablico Raspberry Pi, lahko prenesete od tukaj, vsebuje program in testne slike, s katerimi smo preverjali program. Ne glede na to je treba vedeti, da rezultati te metode ne bodo točni . Natančnost je odvisna od jasnosti slike, usmerjenosti, osvetljenosti itd. Za boljše rezultate lahko skupaj s tem poskusite implementirati algoritme strojnega učenja.
Če si želite zamisliti, poglejmo še en primer, ko avto ni obrnjen neposredno proti kameri.
Kot lahko vidite, je naš program lahko pravilno zaznal registrsko tablico in jo obrezal. Toda knjižnica Tesseract ni pravilno prepoznala znakov. Namesto dejanske "TS 08 UE 3396" je OCR priznal, da je "1508 ye 3396". Takšne težave je mogoče odpraviti z uporabo boljše usmerjevalne slike ali s konfiguracijo motorja Tesseract .
Še en najslabši možen primer je, da kontura ne zazna pravilno registrske tablice. Spodnja slika ima preveč informacij o ozadju in slabo osvetlitev, zato program ni uspel prepoznati registrske tablice s številke. V tem primeru se moramo ponovno opreti na strojno učenje ali izboljšati kakovost slike.
Drugi uspešni primeri
Večina časa kakovosti slike in usmerjenosti slike je pravilna, program je lahko identificiral registrsko tablico in z nje prebral številko. Spodnji posnetki kažejo nekaj uspešnih rezultatov. Vse preizkusne slike in koda, ki se tukaj uporabljajo, bodo na voljo v datoteki ZIP, ki je navedena tukaj.
Upam, da ste razumeli samodejno prepoznavanje registrske tablice z uporabo Raspberry Pi in uživali, ko ste sami ustvarili kaj kul. Kaj še mislite, da je mogoče storiti z OpenCV in Tesseractom ? Sporočite mi svoje misli v oddelku za komentarje. Če imate kakršna koli vprašanja v zvezi s tem člankom, jih prosimo pustite v spodnjem oddelku za komentarje ali uporabite forume za druga tehnična vprašanja.