- Předpoklady
- Kroky zapojené do rozpoznávání SPZ pomocí Raspberry Pi
- 1. Detekce SPZ
- 2. Segmentace znaků
- 3. Rozpoznávání znaků
- Případy selhání při rozpoznávání SPZ
- Další úspěšné příklady
Bezpečnost byla pro lidstvo vždy velkým problémem. Dnes máme videokamery ve školách, nemocnicích a na jakémkoli jiném veřejném místě, abychom se cítili bezpečně. Podle průzkumu HIS se odhaduje, že v roce 2014 bylo nainstalováno a fungovalo přibližně 245 milionů bezpečnostních kamer, což je jako mít jednu bezpečnostní kameru pro každých 30 lidí na této planetě. S pokrokem v technologii, zejména ve zpracování obrazu a strojovém učení, je možné tyto kamery chytřejší tím, že je naučíte zpracovávat informace z video kanálu.
Přenos videa z těchto kamer lze použít k rozpoznávání tváří, analýze vzorů, analýze emocí a mnohem více, což by ji opravdu přiblížilo něčemu, jako je „Boží oko“ zobrazené ve filmu FF7. Ve skutečnosti sledovací společnosti jako Hikvision a mnoho dalších již začaly tyto funkce implementovat do svých produktů. Ke čtení poznávací značky jsme dříve používali zpracování obrazu MATLAB, dnes se v tomto článku naučíme rozpoznávat a číst poznávací značku z automobilů pomocí Raspberry Pi a OpenCV. Použijeme některé náhodné obrázky vozidel z Googlu a napíšeme program pro rozpoznání poznávací značky pomocí OpenCV Contour Detection a poté načteme číslo z poznávací značky pomocí Tesseract OCR. Zní to zajímavě správně, takže pojďme začít.
Předpoklady
Jak již bylo řečeno, budeme k detekci a rozpoznávání tváří používat knihovnu OpenCV. Než budete pokračovat v tomto kurzu, nezapomeňte nainstalovat knihovnu OpenCV na Raspberry Pi. Napájejte také své Pi pomocí adaptéru 2A a připojte jej k monitoru displeje pro snazší ladění.
Tento výukový program nebude vysvětlovat, jak přesně OpenCV funguje, pokud máte zájem naučit se zpracování obrazu, podívejte se na tyto základy OpenCV a pokročilé výukové programy pro zpracování obrázků. Můžete se také dozvědět více o konturách, detekci blobů atd. V tomto výukovém programu Segmentace obrázků pomocí OpenCV. Uděláme něco podobného, abychom z obrázku zjistili poznávací značku automobilu.
Kroky zapojené do rozpoznávání SPZ pomocí Raspberry Pi
Rozpoznávání SPZ nebo zkráceně LPR, zahrnuje tři hlavní kroky. Kroky jsou následující
1. Detekce SPZ: Prvním krokem je detekce SPZ z automobilu. Volbu kontury v OpenCV použijeme k detekci obdélníkových objektů k nalezení poznávací značky. Přesnost lze zlepšit, pokud známe přesnou velikost, barvu a přibližné umístění poznávací značky. Detekční algoritmus je obvykle trénován na základě polohy kamery a typu poznávací značky používané v dané zemi. To bude komplikovanější, pokud obrázek nemá ani auto, v tomto případě provedeme další krok k detekci automobilu a poté poznávací značky.
2. Segmentace znaků: Jakmile zjistíme poznávací značku, musíme ji oříznout a uložit jako nový obrázek. To lze opět snadno provést pomocí OpenCV.
3. Rozpoznávání znaků: Nyní je na novém obrázku, který jsme získali v předchozím kroku, určitě napsány některé znaky (čísla / abecedy). Můžeme tedy na něm provést OCR (optické rozpoznávání znaků), abychom zjistili číslo. Již jsme vysvětlili optické rozpoznávání znaků (OCR) pomocí Raspberry Pi.
1. Detekce SPZ
Prvním krokem v této čtečce SPZ Raspberry Pi je detekce SPZ. Vezmeme si ukázkový obrázek automobilu a začneme detekcí SPZ na tomto autě. Stejný obrázek poté použijeme také pro segmentaci znaků a rozpoznávání znaků. Pokud chcete přeskočit přímo do kódu bez vysvětlení, můžete přejít dolů do dolní části této stránky, kde je uveden kompletní kód. Níže je uveden testovací obrázek, který pro tento kurz používám.
Krok 1: Změňte velikost obrázku na požadovanou velikost a poté jej ve stupních šedi. Kód pro stejný je uveden níže
img = cv2.resize (img, (620 480)) šedá = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #convert to grey scale
Změnou velikosti pomáháme vyhnout se problémům s obrázky s větším rozlišením, ujistěte se, že poznávací značka po změně velikosti stále zůstává v rámečku. Šedé měřítko je běžné ve všech krocích zpracování obrazu. To zrychluje další následující proces, protože již nemusíme při zpracování obrazu řešit barevné detaily. Když bude tento krok proveden, obraz by se něco takového transformoval
Krok 2: Každý obrázek bude mít užitečné a zbytečné informace, v tomto případě je pro nás užitečná informace pouze poznávací značka, zbytek je pro náš program docela zbytečný. Tato zbytečná informace se nazývá hluk. Normálně použití bilaterálního filtru (Bluring) odstraní nežádoucí detaily z obrázku. Kód pro stejný je
šedá = cv2.bilateralFilter (šedá, 11, 17, 17)
Syntaxe je destination_image = cv2.bilateralFilter (source_image, průměr pixelu, sigmaColor, sigmaSpace). Můžete zvýšit barvu sigma a prostor sigma ze 17 na vyšší hodnoty, abyste rozmazali více informací na pozadí, ale buďte opatrní, aby se užitečná část nerozmazala. Výstupní obrázek je zobrazen níže, protože můžete vidět, že podrobnosti pozadí (strom a budova) jsou na tomto obrázku rozmazané. Tímto způsobem se můžeme vyhnout tomu, aby se program později soustředil na tyto regiony.
Krok 3: Další krok je zajímavý tam, kde provádíme detekci hran. Existuje mnoho způsobů, jak to udělat, nejsnadnějším a nejoblíbenějším způsobem je použití metody canny edge z OpenCV. Řádek, který dělá totéž, je uveden níže
edged = cv2.Canny (šedá, 30, 200) #Perform Edge detekce
Syntaxe bude destination_image = cv2.Canny (source_image, prahová hodnota 1, prahová hodnota 2). Mezní hodnota 1 a mezní hodnota 2 jsou minimální a maximální mezní hodnoty. Budou zobrazeny pouze hrany, které mají gradient intenzity větší než minimální prahová hodnota a menší než maximální prahová hodnota. Výsledný obrázek je uveden níže
Krok 4: Nyní můžeme začít hledat kontury na našem obrázku, o tom, jak najít kontury pomocí OpenCV, jsme se již naučili v našem předchozím tutoriálu, takže postupujeme stejně.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours ( cnts) cnts = seřazeno (cnts, key = cv2.contourArea, reverse = True) screenCnt = žádný
Jakmile jsou čítače detekovány, roztřídíme je od velkých po malé a vezmeme v úvahu pouze prvních 10 výsledků ignorujících ostatní. Na našem obrázku může být počitadlo cokoli, co má uzavřený povrch, ale ze všech získaných výsledků tam bude také SPZ, protože je to také uzavřený povrch.
Chcete-li mezi získanými výsledky filtrovat obrázek SPZ, provedeme smyčku všech výsledků a zkontrolujeme, který má obrysový tvar obdélníku se čtyřmi stranami a uzavřeným obrázkem. Protože poznávací značka by rozhodně byla obdélníková čtyřstranná postava.
# smyčka přes naše obrysy pro c v cnts: # přibližný obrys peri = cv2.arcLength (c, True) přibližně = cv2. okoloxPolyDP (c, 0,018 * peri, True) # pokud má náš přibližný obrys čtyři body, pak # my můžeme předpokládat, že jsme našli naši obrazovku, pokud len (cca) == 4: screenCnt = přibližná přestávka
Hodnota 0,018 je experimentální hodnota; můžete si to zahrát a zkontrolovat, která vám nejlépe vyhovuje. Nebo ji posuňte na další úroveň pomocí strojového učení k trénování na základě obrázků automobilů a poté použijte tu správnou hodnotu. Jakmile jsme našli správné počítadlo, uložíme ho do proměnné s názvem screenCnt a poté kolem něj nakreslíme obdélníkový rámeček, abychom se ujistili, že jsme registrační značku správně detekovali.
Krok 5: Nyní, když víme, kde je poznávací značka, jsou pro nás zbývající informace do značné míry zbytečné. Můžeme tedy pokračovat maskováním celého obrázku kromě místa, kde je poznávací značka. Níže uvedený kód je stejný
# Maskování části jiné než SPZ maska = np.zeros (grey.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maska)
Maskovaný nový obrázek se objeví něco jako níže
2. Segmentace znaků
Dalším krokem v rozpoznávání SPZ Raspberry Pi je segmentace SPZ z obrázku oříznutím a uložením jako nového obrázku. Tento obrázek pak můžeme použít k detekci postavy v něm. Níže je uveden kód pro oříznutí obrázku roi (Region of interest) z hlavního obrázku
# Nyní oříznutí (x, y) = np.where (mask == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Oříznuto = šedé
Výsledný obrázek je uveden níže. Obvykle se přidává k oříznutí obrázku, můžeme jej také šedět a v případě potřeby olemovat. To se provádí za účelem zlepšení rozpoznávání znaků v dalším kroku. Zjistil jsem však, že to funguje dobře i s původním obrázkem.
3. Rozpoznávání znaků
Posledním krokem v tomto rozpoznávání SPZ Raspberry Pi je skutečně načíst informace o SPZ ze segmentovaného obrázku. Budeme používat pytesseract balíček číst znaky z obrázku, stejně jako jsme to udělali v předchozím cvičení. Kód pro stejný je uveden níže
# Přečtěte si poznávací značku text = pytesseract.image_to_string (Oříznuto, config = '- psm 11') print ("Zjištěné číslo je:", text)
Již jsme vysvětlili, jak konfigurovat stroj Tesseract, takže zde v případě potřeby můžeme znovu nakonfigurovat OCR Tesseract, abychom v případě potřeby získali lepší výsledky. Zjištěný znak se poté vytiskne na konzolu. Při kompilaci je výsledek zobrazen níže
Jak vidíte, původní obrázek měl číslo „HR 25 BR9044“ a náš program zjistil, že na obrazovce vytiskl stejnou hodnotu.
Případy selhání při rozpoznávání SPZ
Kompletní soubor projektu, který je k dispozici pro rozpoznávání registrační značky Raspberry Pi, lze stáhnout odtud, obsahuje program a testovací obrázky, které jsme použili ke kontrole našeho programu. Aniž by bylo řečeno, je třeba si uvědomit, že výsledky této metody nebudou přesné . Přesnost závisí na jasnosti obrazu, orientaci, světelné expozici atd. Chcete-li dosáhnout lepších výsledků, můžete spolu s tím zkusit implementovat algoritmy strojového učení.
Abychom získali představu, podívejme se na další příklad, kdy auto není obráceno přímo k fotoaparátu.
Jak vidíte, náš program dokázal správně detekovat registrační značku a oříznout ji. Ale knihovna Tesseract nedokázala správně rozpoznat znaky. Místo skutečného „TS 08 UE 3396“ OCR rozpoznal, že je „1508 ye 3396“. Problémy tohoto typu mohou být opraveny buď pomocí lepší orientaci snímků nebo konfigurace Tesseract motor.
Další nejhorší scénář je situace, kdy obrys nedokáže správně rozpoznat registrační značku. Níže uvedený obrázek obsahuje příliš mnoho informací o pozadí a špatném osvětlení, takže se programu nepodařilo identifikovat SPZ podle čísla. V tomto případě musíme znovu předat strojové učení nebo zlepšit kvalitu obrazu.
Další úspěšné příklady
Kvalita a orientace obrazu je většinou správná, program byl schopen identifikovat registrační značku a číst z ní číslo. Níže uvedené snímky ukazují několik úspěšných získaných výsledků. Všechny testovací obrázky a zde použitý kód budou opět k dispozici v zde uvedeném souboru ZIP.
Doufám, že jste pochopili automatické rozpoznávání poznávacích značek pomocí Raspberry Pi a užili jste si budování něčeho skvělého sami. Co jiného si myslíte, že lze udělat s OpenCV a Tesseract ?, Dejte mi vědět své myšlenky v sekci komentářů. Máte-li jakékoli dotazy týkající se tohoto článku, můžete je zanechat v sekci komentářů níže nebo použít fóra pro další technické dotazy.