- Priekšnoteikumi
- Darbības, kas saistītas ar licences plāksnes atpazīšanu, izmantojot Raspberry Pi
- 1. Valsts numura noteikšana
- 2. Rakstzīmju segmentēšana
- 3. Rakstzīmju atpazīšana
- Neveiksmīgi gadījumi numurzīmju atpazīšanā
- Citi veiksmīgi piemēri
Drošība cilvēcei vienmēr ir bijusi galvenā problēma. Šodien mums ir videonovērošanas kameras skolās, slimnīcās un visās citās sabiedriskās vietās, lai mēs justos droši. Saskaņā ar HIS aptauju tiek lēsts, ka 2014. gadā bija uzstādīti un darbojās aptuveni 245 miljoni drošības kameru, tas ir tāpat, kā uz šīs 30 planētas katrai 30 personām būtu viena drošības kamera. Attīstoties tehnoloģijai, īpaši attēlu apstrādē un mašīnmācībā, ir iespējams padarīt šīs kameras gudrākas, apmācot tās apstrādāt informāciju no video plūsmas.
Šo kameru video plūsmu var izmantot, lai veiktu sejas atpazīšanu, modeļa analīzi, emociju analīzi un daudz ko citu, kas to patiešām tuvinātu tādam kā “Dieva acs”, kas parādīta FF7 filmā. Faktiski uzraudzības uzņēmumi, piemēram, Hikvision un daudzi citi, jau ir sākuši ieviest šīs funkcijas savos produktos. Mēs iepriekš izmantojām MATLAB attēlu apstrādi, lai izlasītu numura zīmi, šodien šajā rakstā mēs uzzināsim, kā atpazīt un izlasīt automašīnu numurus, izmantojot Raspberry Pi un OpenCV. Mēs izmantosim dažus nejaušus transportlīdzekļa attēlus no Google un uzrakstīsim programmu, lai atpazītu numura zīmi, izmantojot OpenCV kontūru noteikšanu, un pēc tam nolasīsim numuru no plāksnes, izmantojot Tesseract OCR. Izklausās interesanti pareizi!, Tāpēc sāksim.
Priekšnoteikumi
Kā teicām iepriekš, seju noteikšanai un atpazīšanai izmantosim OpenCV bibliotēku. Tāpēc noteikti turpiniet instalēt OpenCV bibliotēku Raspberry Pi, pirms turpināt šo apmācību. Arī pievadiet savu Pi ar 2A adapteri un pievienojiet to displeja monitoram, lai vieglāk atkļūdotu.
Šajā apmācībā netiks izskaidrots, kā tieši darbojas OpenCV, ja jūs interesē apgūt attēlu apstrādi, pārbaudiet šo OpenCV pamatinformāciju un uzlabotās attēlu apstrādes apmācības. Šajā Attēlu segmentēšanas apmācībā varat arī uzzināt par kontūrām, Blob Detection uc, izmantojot OpenCV. Mēs darīsim kaut ko līdzīgu tam, lai no attēla noteiktu automašīnas numura zīmi.
Darbības, kas saistītas ar licences plāksnes atpazīšanu, izmantojot Raspberry Pi
Īsāk sakot, Licence Plate Recognition jeb LPR ietver trīs galvenos soļus. Darbības ir šādas
1. Valsts numura noteikšana: pirmais solis ir noteikt automašīnas numura zīmi. Mēs izmantosim OpenCV kontūras opciju, lai noteiktu taisnstūrveida objektus, lai atrastu numurzīmi. Precizitāti var uzlabot, ja mēs zinām precīzu numura zīmes izmēru, krāsu un aptuveno atrašanās vietu. Parasti noteikšanas algoritms tiek apmācīts, pamatojoties uz kameras atrašanās vietu un attiecīgajā valstī izmantoto numura zīmes tipu. Tas kļūst sarežģītāk, ja attēlā nav pat automašīnas, šajā gadījumā mēs veiksim papildu darbību, lai noteiktu automašīnu un pēc tam valsts numuru.
2. Rakstzīmju segmentēšana: Kad esam noteikuši licences plāksni, tā ir jāizgriež un jāsaglabā kā jauns attēls. Atkal to var viegli izdarīt, izmantojot OpenCV.
3. Rakstzīmju atpazīšana: Tagad jaunajā attēlā, kuru ieguvām iepriekšējā solī, noteikti būs rakstītas dažas rakstzīmes (cipari / alfabēti). Tātad, mēs varam veikt OCR (Optical Character Recognition) uz tā, lai noteiktu numuru. Mēs jau izskaidrojām optisko rakstzīmju atpazīšanu (OCR), izmantojot Raspberry Pi.
1. Valsts numura noteikšana
Pirmais solis šajā Raspberry Pi licences plāksnes lasītājā ir licences numura noteikšana. Ņemsim automašīnas parauga paraugu un sāksim ar šīs automašīnas numura zīmes noteikšanu. Pēc tam to pašu attēlu izmantosim arī rakstzīmju segmentēšanai un rakstzīmju atpazīšanai. Ja vēlaties pāriet tieši uz kodu bez paskaidrojumiem, varat ritināt uz leju šīs lapas apakšdaļā, kur ir sniegts viss kods. Testa attēls, kuru izmantoju šai apmācībai, ir parādīts zemāk.
1. darbība: mainiet attēla izmēru līdz vajadzīgajam izmēram un pēc tam to pelēktoņos. Tālāk ir norādīts tā paša kods
img = cv2.resize (img, (620,480)) pelēks = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #konvertēt uz pelēko skalu
Mainot izmērus, mēs palīdzam izvairīties no problēmām ar lielākas izšķirtspējas attēliem. Pārliecinieties, ka numura zīme pēc izmēra maiņas joprojām paliek rāmī. Pelēkā mērogošana ir izplatīta visos attēlu apstrādes posmos. Tas paātrina citu sekojošo procesa sinusu, apstrādājot attēlu, mums vairs nav jārisina krāsu detaļas. Kad šis solis būs paveikts, attēls tiktu pārveidots apmēram šādi
2. solis: Katram attēlam būs noderīga un bezjēdzīga informācija, šajā gadījumā mums noderīga ir tikai numura zīme, bet pārējā mūsu programmai ir diezgan bezjēdzīga. Šo bezjēdzīgo informāciju sauc par troksni. Parasti, izmantojot divpusēju filtru (Bluring), no attēla tiks noņemtas nevēlamās detaļas. Kods tam pašam ir
pelēks = cv2.bilateralFilter (pelēks, 11, 17, 17)
Sintakse ir destination_image = cv2.bilateralFilter (avota attēls, pikseļa diametrs, sigmaColor, sigmaSpace). Jūs varat palielināt sigmas krāsu un sigmas atstarpi no 17 līdz lielākām vērtībām, lai izplūdinātu vairāk fona informācijas, taču esiet piesardzīgs, lai noderīgā daļa netiktu aizmiglota. Izvades attēls ir parādīts zemāk, jo redzat, ka fona detaļas (koks un ēka) šajā attēlā ir izplūdušas. Tādā veidā mēs varam izvairīties no programmas koncentrēšanās uz šiem reģioniem vēlāk.
3. solis: Nākamais solis ir interesants, kur mēs veicam malu noteikšanu. Ir daudz veidu, kā to izdarīt, vienkāršākais un populārākais veids ir izmantot OpenCV canny edge metodi. Līnija, lai izdarītu to pašu, ir parādīta zemāk
mala = cv2.Canny (pelēks, 30, 200) # Veikt malas noteikšanu
Sintakse būs galamērķa_attēls = cv2.Canny (avota_attēls, 1. sliekšņa vērtība, 2. sliekšņa vērtība). 1. sliekšņa slieksnis un 2. sliekšņa vērtība ir minimālās un maksimālās sliekšņa vērtības. Tiks rādītas tikai tās malas, kuru intensitātes gradients pārsniedz minimālo sliekšņa vērtību un ir mazāks par maksimālo sliekšņa vērtību. Iegūtais attēls ir parādīts zemāk
4. solis: Tagad mēs varam sākt meklēt kontūras uz sava attēla, mēs jau esam iemācījušies par to, kā atrast kontūras, izmantojot OpenCV, mūsu iepriekšējā apmācībā, tāpēc mēs vienkārši rīkojamies tāpat.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = sakārtoti (cnts, key = cv2.contourArea, reverse = Trueone) screenCnt
Kad skaitītāji ir atrasti, mēs tos kārtojam no lieliem līdz maziem un ņemam vērā tikai pirmos 10 rezultātus, ignorējot pārējos. Mūsu attēlā skaitītājs varētu būt jebkas, kam ir slēgta virsma, bet no visiem iegūtajiem rezultātiem būs arī numura zīmes numurs, jo tas ir arī slēgts.
Lai filtrētu reģistrācijas numura attēlu starp iegūtajiem rezultātiem, mēs cilposim visus rezultātus un pārbaudīsim, kuram ir taisnstūra formas kontūra ar četrām malām un slēgtu skaitli. Tā kā numura zīme noteikti būtu taisnstūris četrpusējs.
# Cilpa pār mūsu kontūrām un C CNTs: # tuvina kontūru peri = cv2.arcLength (c, True) apm = cv2.approxPolyDP (c, 0.018 * piepilsētu, True) # ja mūsu aptuvens kontūra ir četri punkti, tad # mēs var pieņemt, ka esam atraduši savu ekrānu , ja len (aptuveni) == 4: screenCnt = apm pārtraukums
Vērtība 0,018 ir eksperimentāla vērtība; jūs varat spēlēt apkārt, lai pārbaudītu, kas jums vislabāk darbojas. Vai arī paceliet to nākamajā līmenī, izmantojot mašīnmācīšanos, lai apmācītu, pamatojoties uz automašīnas attēliem, un pēc tam izmantojiet pareizo vērtību tur. Kad esam atraduši pareizo skaitītāju, mēs to saglabājam mainīgajā, ko sauc par screenCnt, un pēc tam ap to uzzīmējam taisnstūra lodziņu, lai pārliecinātos, ka esam pareizi noteikuši numura zīmi.
5. solis: Tagad, kad mēs zinām, kur atrodas numura zīme, atlikusī informācija mums ir diezgan nelietderīga. Tātad mēs varam turpināt maskēt visu attēlu, izņemot vietu, kur atrodas numura zīme. Kods, lai izdarītu to pašu, ir parādīts zemāk
# Daļas, kas nav numura zīmes maska, maskēšana = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maska)
Jaunais maskētais attēls parādīsies apmēram tāpat kā zemāk
2. Rakstzīmju segmentēšana
Nākamais Raspberry Pi numura zīmes atpazīšanas solis ir licences plāksnes segmentēšana no attēla, to apgriežot un saglabājot kā jaunu attēlu. Pēc tam mēs varam izmantot šo attēlu, lai tajā noteiktu rakstzīmi. Kods, lai apgrieztu galvenā attēla roi (interesējošā reģiona) attēlu, ir parādīts zemāk
# Tagad apgrieziet (x, y) = np.where (maska == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Apgriezts = pelēks
Iegūtais attēls ir parādīts zemāk. Parasti pievienojot attēla apgriešanai, mēs to varam arī pelēkā krāsā un, ja nepieciešams, apmalīt. Tas tiek darīts, lai nākamajā solī uzlabotu rakstzīmju atpazīšanu. Tomēr es atklāju, ka tas darbojas labi pat ar oriģinālo attēlu.
3. Rakstzīmju atpazīšana
Šīs Raspberry Pi numura zīmes atpazīšanas pēdējais solis ir faktiski nolasīt informāciju par numura zīmi no segmentētā attēla. Mēs izmantosim paketi pytesseract, lai lasītu rakstzīmes no attēla, tāpat kā mēs to darījām iepriekšējā apmācībā. Tālāk ir norādīts tā paša kods
# Izlasiet numura zīmes tekstu = pytesseract.image_to_string (Apgriezts, config = '- psm 11') izdrukāt ("Noteiktais numurs ir:", teksts)
Mēs jau esam paskaidrojuši, kā konfigurēt Tesseract motoru, tāpēc šeit, ja nepieciešams, mēs varam arī konfigurēt Tesseract OCR, lai vajadzības gadījumā iegūtu labākus rezultātus. Pēc tam uz konsoles tiek izdrukāts atrastais raksturs. Apkopojot, rezultāts tiek parādīts zemāk
Kā redzat, oriģinālajā attēlā bija numurs “HR 25 BR9044”, un mūsu programma ir noteikusi, ka ekrānā tā ir drukājusi to pašu vērtību.
Neveiksmīgi gadījumi numurzīmju atpazīšanā
Pilnu projekta failu, šo Raspberry Pi licences plāksnes atpazīšanu, var lejupielādēt šeit, un tajā ir programma un testa attēli, kurus izmantojām, lai pārbaudītu mūsu programmu. Bez teikšanas jāatceras, ka šīs metodes rezultāti nebūs precīzi . Precizitāte ir atkarīga no attēla skaidrības, orientācijas, gaismas ekspozīcijas utt. Lai iegūtu labākus rezultātus, varat mēģināt ieviest mašīnmācīšanās algoritmus.
Lai iegūtu ideju, apskatīsim citu piemēru, kur automašīna nav vērsta tieši pret kameru.
Kā redzat, mūsu programma spēja pareizi noteikt numura zīmi un to apgriezt. Bet Tesseract bibliotēka nav spējusi pareizi atpazīt rakstzīmes. Faktiskā “TS 08 UE 3396” vietā OCR to ir atzinusi par “1508 jūs 3396”. Šādas problēmas var novērst, izmantojot labākas orientācijas attēlus vai konfigurējot Tesseract dzinēju.
Vēl viens sliktākais scenārijs ir tāds, ka kontūra nespēj pareizi noteikt numura zīmi. Zemāk redzamajā attēlā ir pārāk daudz fona informācijas un slikts apgaismojums, ka programma pat nav identificējusi numura zīmi. Šajā gadījumā mums atkal ir jāpārvietojas uz mašīnmācīšanos vai jāuzlabo attēla kvalitāte.
Citi veiksmīgi piemēri
Lielākoties attēla kvalitāte un orientācija ir pareiza, programma spēja identificēt numura zīmi un no tās nolasīt numuru. Zemāk redzamie momentuzņēmumi parāda dažus no veiksmīgi iegūtajiem rezultātiem. Atkal visi šeit izmantotie testa attēli un kods būs pieejami šeit sniegtajā ZIP failā.
Ceru, ka sapratāt automātisko numura zīmes atpazīšanu, izmantojot Raspberry Pi, un patika patstāvīgi veidot kaut ko foršu. Ko, jūsuprāt, vēl var izdarīt ar OpenCV un Tesseract ?, Ļaujiet man uzzināt savas domas komentāru sadaļā. Ja jums ir kādi jautājumi par šo rakstu, lūdzu, atstājiet tos komentāru sadaļā zemāk vai izmantojiet forumus citiem tehniskiem jautājumiem.