- Podmienky
- Kroky zapojené do rozpoznávania ŠPZ pomocou Raspberry Pi
- 1. Detekcia ŠPZ
- 2. Segmentácia znakov
- 3. Rozpoznávanie znakov
- Prípady zlyhania pri rozpoznávaní ŠPZ
- Ďalšie úspešné príklady
Bezpečnosť bola pre ľudstvo vždy hlavným záujmom. Dnes máme videokamery v školách, nemocniciach a na akomkoľvek inom verejnom mieste, aby sme sa cítili bezpečne. Podľa prieskumu HIS sa odhaduje, že v roku 2014 bolo nainštalovaných a funkčných okolo 245 miliónov bezpečnostných kamier, čo je ako mať jednu bezpečnostnú kameru pre každých 30 ľudí na tejto planéte. S pokrokom v technológii, najmä v oblasti spracovania obrazu a strojového učenia, je možné tieto fotoaparáty urobiť inteligentnejšími tým, že ich zaškolíme na spracovanie informácií z videa.
Prenos videa z týchto kamier možno použiť na rozpoznávanie tváre, analýzu vzorov, analýzu emócií a oveľa viac, čím by sa skutočne priblížilo k niečomu, ako je „Božie oko“ zobrazené vo filme FF7. V skutočnosti dozorné spoločnosti ako Hikvision a mnoho ďalších už začali implementovať tieto funkcie do svojich produktov. Na čítanie tabuľky s evidenčným číslom sme predtým používali spracovanie obrazu MATLAB, dnes sa v tomto článku dozvieme, ako rozpoznávať a čítať poznávaciu značku z automobilov pomocou Raspberry Pi a OpenCV. Použijeme niekoľko náhodných obrázkov vozidiel od spoločnosti Google a napíšeme program na rozpoznanie poznávacej značky pomocou OpenCV Contour Detection a potom prečítame číslo z tabuľky pomocou Tesseract OCR. Znie to zaujímavo, dobre !, tak poďme na to.
Podmienky
Ako už bolo povedané, na zisťovanie a rozpoznávanie tvárí budeme používať knižnicu OpenCV. Pred pokračovaním v tomto návode si preto nezabudnite nainštalovať OpenCV Library na Raspberry Pi. Napájajte svoje Pi aj pomocou adaptéra 2A a pripojte ho k monitoru displeja pre jednoduchšie ladenie.
Tento tutoriál nebude vysvetľovať, ako presne OpenCV funguje. Ak sa chcete naučiť spracovanie obrazu, pozrite si tieto základné informácie o OpenCV a pokročilé návody na spracovanie obrazu. Môžete sa tiež dozvedieť viac o kontúrach, detekcii blobov atď. V tomto výučbe segmentácie obrázkov pomocou OpenCV. Urobíme niečo podobné, aby sme z obrázka zistili ŠPZ automobilu.
Kroky zapojené do rozpoznávania ŠPZ pomocou Raspberry Pi
Rozpoznávanie ŠPZ alebo skrátene LPR, zahŕňa tri hlavné kroky. Kroky sú nasledovné
1. Detekcia ŠPZ : Prvým krokom je detekcia ŠPZ z automobilu. Použijeme možnosť kontúry v OpenCV na detekciu obdĺžnikových objektov a nájdenie poznávacej značky. Presnosť je možné zvýšiť, ak poznáme presnú veľkosť, farbu a približné umiestnenie ŠPZ. Detekčný algoritmus sa zvyčajne trénuje na základe polohy kamery a typu ŠPZ použitého v konkrétnej krajine. Toto bude komplikovanejšie, ak obrázok nemá ani auto, v takom prípade urobíme ďalší krok k detekcii automobilu a potom ŠPZ.
2. Segmentácia znakov: Keď zistíme ŠPZ, musíme ju orezať a uložiť ako nový obrázok. Toto je opäť možné ľahko vykonať pomocou OpenCV.
3. Rozpoznávanie znakov: Teraz je na novom obrázku, ktorý sme získali v predchádzajúcom kroku, určite napísané niektoré znaky (čísla / abecedy). Môžeme na ňom teda vykonať OCR (optické rozpoznávanie znakov), aby sme zistili počet. Optické rozpoznávanie znakov (OCR) sme si už vysvetlili pomocou Raspberry Pi.
1. Detekcia ŠPZ
Prvým krokom v tejto čítačke ŠPZ Raspberry Pi je detekcia ŠPZ. Zoberme si ukážku automobilu a začnime detekciou ŠPZ na tomto automobile. Rovnaký obrázok potom použijeme aj na segmentáciu znakov a rozpoznávanie znakov. Ak chcete skočiť priamo do kódu bez vysvetlenia, môžete prejsť nadol do dolnej časti tejto stránky, kde je uvedený celý kód. Skúšobný obrázok, ktorý používam pre tento tutoriál, je uvedený nižšie.
Krok 1: Zmeňte veľkosť obrázka na požadovanú veľkosť a potom ho upravte v odtieňoch sivej. Jeho kód je uvedený nižšie
img = cv2.resize (img, (620 480)) šedá = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) # previesť na stupnicu šedej
Zmena veľkosti Pomôžeme nám vyhnúť sa problémom s obrázkami s väčším rozlíšením. Uistite sa, že ŠPZ po zmene veľkosti stále zostáva v ráme. Šedé škálovanie je bežné vo všetkých krokoch spracovania obrazu. To urýchľuje ďalšie nasledujúce procesy, pretože pri spracovaní obrázka už nemusíme narábať s farebnými detailmi. Po vykonaní tohto kroku by sa obrázok zmenil asi takto
Krok 2: Každý obrázok bude obsahovať užitočné a zbytočné informácie, v tomto prípade je pre nás užitočná informácia iba ŠPZ, ostatné sú pre náš program v podstate zbytočné. Táto zbytočná informácia sa nazýva šum. Za normálnych okolností použitie bilaterálneho filtra (Bluring) odstráni nežiaduce detaily z obrázka. Kód pre rovnaké je
šedá = cv2.bilateralFilter (šedá, 11, 17, 17)
Syntax je destination_image = cv2.bilateralFilter (source_image, priemer pixelu, sigmaColor, sigmaSpace). Môžete zväčšiť farbu sigmy a priestor sigmy zo 17 na vyššie hodnoty, aby ste rozmazali viac informácií na pozadí, ale buďte opatrní, aby sa užitočná časť nerozmazala. Výstupný obrázok je uvedený nižšie, pretože vidíte, že podrobnosti pozadia (strom a budova) sú na tomto obrázku rozmazané. Takto sa môžeme vyhnúť tomu, aby sa program neskôr sústredil na tieto regióny.
Krok 3: Ďalším krokom je zaujímavé miesto, kde vykonávame detekciu hrán. Existuje mnoho spôsobov, ako to urobiť, najjednoduchším a najpopulárnejším spôsobom je použitie metódy canny edge z OpenCV. Riadok, ktorý robí to isté, je uvedený nižšie
edged = cv2.Canny (sivý, 30, 200) # detekcia okraja
Syntax bude destination_image = cv2.Canny (source_image, prahová hodnota 1, prahová hodnota 2). Prahová hodnota v údolí 1 a prahová hodnota 2 sú minimálne a maximálne prahové hodnoty. Zobrazia sa iba okraje, ktoré majú gradient intenzity väčší ako minimálna prahová hodnota a menší ako maximálna prahová hodnota. Výsledný obrázok je uvedený nižšie
Krok 4: Teraz môžeme začať hľadať kontúry na našom obrázku, o tom, ako nájsť kontúry pomocou OpenCV, sme sa už dozvedeli v našom predchádzajúcom tutoriáli, takže postupujeme rovnako.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = triedené (cnts, key = cv2.contourArea, reverse = True) screenCnt = žiadny
Po zistení počítadiel ich zoraďujeme od veľkých po malé a berieme do úvahy iba prvých 10 výsledkov ignorujúcich ostatné. Na našom obrázku môže byť počítadlom čokoľvek, čo má uzavretý povrch, ale zo všetkých získaných výsledkov tu bude aj ŠPZ, pretože je to tiež uzavretý povrch.
Aby sme medzi výslednými výsledkami vyfiltrovali obrázok ŠPZ, vykonáme slučku všetkých výsledkov a skontrolujeme, či má obrys obdĺžnikového tvaru so štyrmi stranami a uzavretým obrázkom. Keďže ŠPZ by určite bola štvorstranná figúrka obdĺžnika.
# slučka cez naše obrysy pre c v cnts: # aproximácia kontúry peri = cv2.arcLength (c, True) cca = cv2.aptxPolyDP (c, 0,018 * peri, True) # ak má naša aproximovaná kontúra štyri body, potom # my môžeme predpokladať, že sme našu obrazovku našli, ak len (cca) == 4: screenCnt = cca zlom
Hodnota 0,018 je experimentálna hodnota; môžete sa okolo neho zahrať a skontrolovať, ktorá z nich vám najlepšie vyhovuje. Alebo ho posuňte na ďalšiu úroveň pomocou strojového učenia, aby ste sa cvičili na základe obrázkov automobilov, a potom tam použite správnu hodnotu. Keď nájdeme správne počítadlo, uložíme ho do premennej s názvom screenCnt a potom okolo neho nakreslíme obdĺžnikové políčko, aby sme sa uistili, že sme správne poznali ŠPZ.
Krok 5: Teraz, keď vieme, kde je poznávacia značka, sú pre nás zvyšné informácie v podstate zbytočné. Môžeme teda pokračovať maskovaním celého obrázka okrem miesta, kde je ŠPZ. Kód, ktorý urobí to isté, je uvedený nižšie
# Maskovanie časti inej ako maska ŠPZ = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maska)
Maskovaný nový obrázok sa zobrazí asi ako nižšie
2. Segmentácia znakov
Ďalším krokom v rozpoznávaní ŠPZ Raspberry Pi je segmentácia ŠPZ z obrázka orezaním a uložením ako nový obrázok. Tento obrázok potom môžeme použiť na detekciu znaku v ňom. Kód na orezanie obrázka roi (Oblasť záujmu) z hlavného obrázka je zobrazený nižšie
# Teraz crop (x, y) = np.where (mask == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Orezané = sivé
Výsledný obrázok je uvedený nižšie. Za normálnych okolností sa obrázok pridáva k orezávaniu, v prípade potreby ho tiež môžeme sivieť a podľa potreby olemovať. To sa deje kvôli zlepšeniu rozpoznávania znakov v ďalšom kroku. Zistil som však, že to funguje dobre aj s pôvodným obrázkom.
3. Rozpoznávanie znakov
Posledným krokom v tomto rozpoznávaní ŠPZ Raspberry Pi je skutočne prečítať informácie o ŠPZ zo segmentovaného obrázka. Budeme používať pytesseract balíček čítať znaky z obrázku, rovnako ako sme to urobili v predchádzajúcom cvičení. Jeho kód je uvedený nižšie
# Prečítajte si ŠPZ text = pytesseract.image_to_string (Orezané, config = '- psm 11') print ("Zistené číslo je:", text)
Už sme vysvetlili, ako nakonfigurovať modul Tesseract, takže tu v prípade potreby môžeme znova nakonfigurovať OCR Tesseract, aby sme v prípade potreby dosiahli lepšie výsledky. Zistený znak sa potom vytlačí na konzolu. Po zostavení je výsledok uvedený nižšie
Ako vidíte, pôvodný obrázok mal číslo „HR 25 BR9044“ a náš program zistil, že na obrazovke vytlačil rovnakú hodnotu.
Prípady zlyhania pri rozpoznávaní ŠPZ
Kompletný súbor projektu, ktorý je súčasťou programu Raspberry Pi License Plate Recognition, si môžete stiahnuť odtiaľto, obsahuje program a testovacie obrázky, ktoré sme použili na kontrolu nášho programu. Bez toho, aby bolo povedané, treba mať na pamäti, že výsledky tejto metódy nebudú presné . Presnosť závisí od jasnosti obrazu, orientácie, expozície svetla atď. Ak chcete dosiahnuť lepšie výsledky, môžete vyskúšať implementáciu algoritmov strojového učenia.
Pre predstavu sa pozrime na ďalší príklad, keď auto nie je priamo obrátené k fotoaparátu.
Ako vidíte, náš program dokázal správne rozpoznať ŠPZ a orezať ju. Ale Tesseract knižnice sa nepodarilo správne rozpoznať znaky. Namiesto skutočného „TS 08 UE 3396“ OCR rozpoznalo, že je to „1508 ye 3396“. Problémy ako je tento je možné napraviť použitím lepšej orientácie obrázkov alebo konfiguráciou motora Tesseract .
Ďalším najhorším scenárom je situácia, keď obrys nedokáže správne rozpoznať ŠPZ. Na nasledujúcom obrázku je príliš veľa informácií o pozadí a slabom osvetlení, takže programu sa nepodarilo identifikovať ŠPZ podľa čísla. V tomto prípade sa musíme opäť spoľahnúť na strojové učenie alebo vylepšiť kvalitu obrazu.
Ďalšie úspešné príklady
Kvalita a orientácia obrazu sú väčšinou správne, program dokázal identifikovať ŠPZ a prečítať z nej číslo. Nasledujúce rýchle snímky ukazujú niekoľko úspešných získaných výsledkov. Všetky testovacie obrázky a tu použitý kód budú opäť k dispozícii v tu uvedenom súbore ZIP.
Dúfam, že ste pochopili automatické rozpoznávanie ŠPZ pomocou Raspberry Pi a užili ste si stavanie niečoho skvelého sami. Čo si myslíte, že sa dá ešte urobiť s OpenCV a Tesseract ?, Dajte mi vedieť svoje myšlienky v sekcii komentárov. Ak máte akékoľvek otázky týkajúce sa tohto článku, neváhajte ich zanechať v sekcii komentárov nižšie alebo použite fóra na ďalšie technické otázky.