- Condiții prealabile
- Pași implicați în recunoașterea plăcuțelor de înmatriculare utilizând Raspberry Pi
- 1. Detectarea plăcuțelor de înmatriculare
- 2. Segmentarea caracterului
- 3. Recunoașterea personajelor
- Cazuri de eșec în recunoașterea plăcilor de înmatriculare
- Alte exemple de succes
Securitatea a fost întotdeauna o preocupare majoră pentru omenire. Astăzi avem camere de supraveghere video în școli, spitale și în orice alt loc public pentru a ne face să ne simțim în siguranță. Potrivit unui sondaj efectuat de HIS, se estimează că au existat aproximativ 245 de milioane de camere de securitate instalate și care funcționau în 2014, ceea ce înseamnă că ar fi o cameră de securitate pentru fiecare 30 de oameni de pe această planetă. Odată cu progresul în tehnologie, în special în procesarea imaginilor și învățarea automată, este posibil ca aceste camere să fie mai inteligente, instruindu-le să proceseze informații din fluxul video.
Feed-ul video de la aceste camere poate fi folosit pentru a efectua recunoașterea feței, analiza modelelor, analiza emoțiilor și multe altele, care l-ar apropia cu adevărat de ceva de genul „Ochiului lui Dumnezeu” prezentat în filmul FF7. De fapt, companii de supraveghere precum Hikvision și multe altele au început deja să implementeze aceste caracteristici în produsele lor. Am folosit anterior procesarea de imagini MATLAB pentru a citi plăcuța de înmatriculare, astăzi în acest articol vom învăța cum să recunoaștem și să citim numărul plăcuței de înmatriculare de la automobile folosind Raspberry Pi și OpenCV. Vom folosi câteva imagini aleatorii ale vehiculelor de la Google și vom scrie un program pentru a recunoaște numărul de înmatriculare folosind OpenCV Contour Detection și apoi vom citi numărul de pe placă folosind Tesseract OCR. Sună interesant nu, așa că să începem.
Condiții prealabile
După cum am spus mai devreme, vom folosi biblioteca OpenCV pentru a detecta și recunoaște fețele. Deci, asigurați-vă că instalați OpenCV Library pe Raspberry Pi înainte de a continua cu acest tutorial. De asemenea, alimentați Pi-ul cu un adaptor 2A și conectați-l la un monitor de afișaj pentru depanare mai ușoară.
Acest tutorial nu va explica cum funcționează exact OpenCV, dacă sunteți interesat să învățați procesarea imaginilor, consultați aceste elemente de bază OpenCV și tutoriale avansate de procesare a imaginilor. Puteți afla, de asemenea, despre contururi, Blob Detection etc. în acest tutorial de segmentare a imaginii folosind OpenCV. Vom face ceva similar cu acest lucru pentru a detecta plăcuța de înmatriculare a mașinii din imagine.
Pași implicați în recunoașterea plăcuțelor de înmatriculare utilizând Raspberry Pi
Recunoașterea plăcuțelor de licență sau LPR pe scurt, implică trei pași majori. Pașii sunt după cum urmează
1. Detectarea plăcuțelor de înmatriculare: Primul pas este detectarea plăcuței de înmatriculare din mașină. Vom folosi opțiunea contur în OpenCV pentru a detecta obiecte dreptunghiulare pentru a găsi plăcuța de înmatriculare. Precizia poate fi îmbunătățită dacă cunoaștem dimensiunea exactă, culoarea și locația aproximativă a plăcuței de înmatriculare. În mod normal, algoritmul de detecție este instruit pe baza poziției camerei și a tipului de plăcuță de înmatriculare utilizat în acea țară. Acest lucru devine mai complicat dacă imaginea nu are nici măcar o mașină, în acest caz vom face un pas suplimentar pentru a detecta mașina și apoi placa de înmatriculare.
2. Segmentarea caracterelor: Odată ce am detectat placa de licență, trebuie să o decupăm și să o salvăm ca o nouă imagine. Din nou, acest lucru se poate face cu ușurință folosind OpenCV.
3. Recunoașterea caracterelor: Acum, noua imagine pe care am obținut-o în pasul anterior este sigur că va avea scrise câteva caractere (numere / alfabete). Deci, putem efectua OCR (Recunoaștere Optică a Caracterelor) pe acesta pentru a detecta numărul. Am explicat deja recunoașterea optică a caracterelor (OCR) folosind Raspberry Pi.
1. Detectarea plăcuțelor de înmatriculare
Primul pas al acestui cititor de plăcuțe de înmatriculare Raspberry Pi este detectarea plăcuței de înmatriculare. Să luăm o mostră de imagine a unei mașini și să începem cu detectarea plăcuței de înmatriculare pe mașina respectivă. Apoi vom folosi aceeași imagine și pentru segmentarea caracterelor și recunoașterea caracterelor. Dacă doriți să treceți direct în cod fără explicații, puteți derula până în partea de jos a acestei pagini, unde este furnizat codul complet. Imaginea de test pe care o folosesc pentru acest tutorial este prezentată mai jos.
Pasul 1: Redimensionați imaginea la dimensiunea dorită și apoi scalați-o în gri. Codul pentru același lucru este dat mai jos
img = cv2.resize (img, (620,480)) gri = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #convert la scara de gri
Redimensionarea ne ajută să evităm orice problemă cu imaginile cu rezoluție mai mare, asigurați-vă că numărul de înmatriculare rămâne în cadru după redimensionare. Redimensionarea gri este comună în toate etapele de procesare a imaginilor. Acest lucru accelerează alte procese următoare, în care nu mai trebuie să ne ocupăm de detaliile culorii atunci când procesăm o imagine. Imaginea s-ar transforma cam așa când se va face acest pas
Pasul 2: Fiecare imagine va avea informații utile și inutile, în acest caz pentru noi doar placa de înmatriculare este informația utilă, restul sunt aproape inutile pentru programul nostru. Aceste informații inutile se numesc zgomot. În mod normal, utilizarea unui filtru bilateral (Bluring) va elimina detaliile nedorite dintr-o imagine. Codul pentru același lucru este
gri = cv2.bilateralFilter (gri, 11, 17, 17)
Sintaxa este destinație_imagine = cv2.bilateralFilter (sursă_imagine, diametrul pixelului, sigmaColor, sigmaSpace). Puteți crește culoarea sigma și spațiul sigma de la 17 la valori mai mari pentru a estompa mai multe informații de fundal, dar aveți grijă ca partea utilă să nu se estompeze. Imaginea de ieșire este prezentată mai jos, deoarece puteți vedea detaliile fundalului (copac și clădire) sunt neclare în această imagine. Astfel putem evita ca programul să se concentreze asupra acestor regiuni mai târziu.
Pasul 3: Pasul următor este interesant în cazul în care efectuăm detectarea muchiilor. Există mai multe moduri de a face acest lucru, cea mai ușoară și populară modalitate este de a utiliza metoda cany edge de la OpenCV. Linia pentru a face același lucru este prezentată mai jos
edged = cv2.Canny (gri, 30, 200) # Efectuați detectarea marginii
Sintaxa va fi destinație_imagine = cv2.Canny (sursă_imagine, pragValue 1, pragValor 2). Valoarea prag 1 și valoarea prag 2 sunt valorile pragului minim și maxim. Se vor afișa numai marginile care au un gradient de intensitate mai mare decât valoarea pragului minim și mai mică decât valoarea pragului maxim. Imaginea rezultată este prezentată mai jos
Pasul 4: Acum putem începe să căutăm contururi pe imaginea noastră, am aflat deja despre cum să găsim contururi folosind OpenCV în tutorialul nostru anterior, așa că continuăm la fel.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = sortate (cnts, key = cv2.contourArea, reverse = True) screenCnt = None
Odată detectate contoare, le sortăm de la mari la mici și luăm în considerare doar primele 10 rezultate ignorându-le pe celelalte. În imaginea noastră, contorul ar putea fi orice are o suprafață închisă, dar din toate rezultatele obținute, numărul plăcuței de înmatriculare va fi, de asemenea, acolo, deoarece este și o suprafață închisă.
Pentru a filtra imaginea plăcuței de înmatriculare printre rezultatele obținute, vom face bucle de toate rezultatele și vom verifica care are un contur de formă dreptunghiulară cu patru laturi și o figură închisă. Deoarece o plăcuță de înmatriculare ar fi cu siguranță o figură dreptunghiulară pe patru fețe.
# buclă peste contururile noastre pentru c în cnts: # aproximați conturul peri = cv2.arcLength (c, Adevărat) aprox = cv2.approxPolyDP (c, 0,018 * peri, Adevărat) # dacă conturul nostru aproximat are patru puncte, atunci # noi putem presupune că ne-am găsit ecranul dacă len (aprox) == 4: screenCnt = aprox pauză
Valoarea 0,018 este o valoare experimentală; poți juca în jurul lui pentru a verifica care funcționează cel mai bine pentru tine. Sau treceți la nivelul următor folosind învățarea automată pentru a vă antrena pe baza imaginilor mașinii și apoi utilizați valoarea corectă acolo. Odată ce am găsit contorul potrivit, îl salvăm într-o variabilă numită screenCnt și apoi desenăm o cutie dreptunghiulară în jurul său pentru a ne asigura că am detectat corect placa de înmatriculare.
Pasul 5: Acum că știm unde este numărul de înmatriculare, informațiile rămase sunt aproape inutile pentru noi. Deci, putem continua cu mascarea întregii imagini, cu excepția locului în care se află numărul de înmatriculare. Codul pentru a face același lucru este prezentat mai jos
# Mascarea piesei, altul decât masca de înmatriculare = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = masca)
Noua imagine mascată va apărea ca mai jos
2. Segmentarea caracterului
Următorul pas în Raspberry Pi Number Plate Recognition este să segmentați placa de înmatriculare din imagine decupând-o și salvând-o ca o imagine nouă. Putem apoi folosi această imagine pentru a detecta caracterul din ea. Codul pentru decuparea imaginii roi (Regiunea de interes) din imaginea principală este prezentat mai jos
# Acum decupați (x, y) = np.where (mask == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Cropped = gri
Imaginea rezultată este prezentată mai jos. În mod normal, adăugată la decuparea imaginii, o putem, de asemenea, gri și margine, dacă este necesar. Acest lucru se face pentru a îmbunătăți recunoașterea personajelor în pasul următor. Cu toate acestea, am constatat că funcționează bine chiar și cu imaginea originală.
3. Recunoașterea personajelor
Etapa finală în această recunoaștere a plăcilor numerice Raspberry Pi este de a citi de fapt informațiile plăcuței de înmatriculare din imaginea segmentată. Vom folosi pachetul pytesseract pentru a citi caractere din imagine, la fel cum am făcut în tutorialul anterior. Codul pentru același lucru este dat mai jos
#Citiți textul plăcuței de înmatriculare = pytesseract.image_to_string (Cropped, config = '- psm 11') print ("Numărul detectat este:", text)
Am explicat deja cum să configurăm un motor Tesseract, așa că din nou aici, dacă este necesar, putem configura Tesseract OCR pentru a obține rezultate mai bune, dacă este necesar. Caracterul detectat este apoi tipărit pe consolă. Când este compilat, rezultatul este prezentat mai jos
După cum puteți vedea, imaginea originală avea numărul „HR 25 BR9044” și programul nostru a detectat că a imprimat aceeași valoare pe ecran.
Cazuri de eșec în recunoașterea plăcilor de înmatriculare
Fișierul complet al proiectului această recunoaștere a plăcii de înmatriculare Raspberry Pi poate fi descărcat de aici, conține programul și imaginile de testare pe care le-am folosit pentru a verifica programul nostru. Fără a fi spus, trebuie amintit că rezultatele acestei metode nu vor fi exacte . Precizia depinde de claritatea imaginii, orientarea, expunerea la lumină, etc. Pentru a obține rezultate mai bune, puteți încerca să implementați algoritmi de învățare automată împreună cu aceasta.
Pentru a ne face o idee, să ne uităm la un alt exemplu în care mașina nu este orientată direct către cameră.
După cum puteți vedea, programul nostru a reușit să detecteze corect placa de înmatriculare și să o decupeze. Dar biblioteca Tesseract nu a reușit să recunoască corect personajele. În loc de „TS 08 UE 3396” actual, OCR a recunoscut că este „1508 ye 3396”. Probleme de acest fel pot fi corectate fie folosind imagini de orientare mai bune, fie configurând motorul Tesseract .
Un alt scenariu cel mai rău este cel în care conturul nu reușește să detecteze corect placa de înmatriculare. Imaginea de mai jos are prea multe informații de fundal și o iluminare deficitară, încât programul nu a reușit chiar să identifice placa de înmatriculare din număr. În acest caz, trebuie să reluăm din nou învățarea automată sau să îmbunătățim calitatea imaginii.
Alte exemple de succes
De cele mai multe ori calitatea și orientarea imaginii sunt corecte, programul a reușit să identifice plăcuța de înmatriculare și să citească numărul de pe aceasta. Fotografiile instantanee de mai jos arată câteva dintre rezultatele obținute cu succes. Din nou, toate imaginile de testare și codul utilizat aici vor fi disponibile în fișierul ZIP furnizat aici.
Sper că ați înțeles Recunoașterea automată a plăcilor numerice folosind Raspberry Pi și v-a plăcut să creați ceva cool pe cont propriu. Ce altceva crezi că se poate face cu OpenCV și Tesseract ?, Anunță -mă gândurile tale în secțiunea de comentarii. Dacă aveți întrebări cu privire la acest articol, nu ezitați să le lăsați în secțiunea de comentarii de mai jos sau să utilizați forumurile pentru alte întrebări tehnice.