- Išankstiniai reikalavimai
- Veiksmai, susiję su valstybinių numerių atpažinimu naudojant „Raspberry Pi“
- 1. Valstybinio numerio nustatymas
- 2. Simbolių segmentavimas
- 3. Simbolių atpažinimas
- Nepavykusios bylos numerio atpažinimo procese
- Kiti sėkmingi pavyzdžiai
Saugumas visada buvo pagrindinis žmonijos rūpestis. Šiandien mokyklose, ligoninėse ir visose kitose viešose vietose turime vaizdo stebėjimo kameras, kad jaustumėmės saugūs. Remiantis JO atlikta apklausa, manoma, kad dar 2014 m. Buvo įdiegta ir veikė apie 245 milijonai apsaugos kamerų, tai yra tarsi viena apsaugos kamera kiekvienam 30 žmonių šioje planetoje. Tobulėjant technologijoms, ypač vaizdų apdorojimui ir mašininiam mokymuisi, galima padaryti šias kameras protingesnes mokant jas apdoroti informaciją iš vaizdo įrašų.
Šių kamerų vaizdo srautas gali būti naudojamas veido atpažinimui, modelio analizei, emocijų analizei ir daugeliui kitų dalykų, kurie tikrai priartėtų prie panašaus į „Dievo akį“, parodytą FF7 filme. Tiesą sakant, priežiūros įmonės, tokios kaip „Hikvision“ ir daugelis kitų, jau pradėjo diegti šias funkcijas savo produktuose. Anksčiau mes naudojome „MATLAB Image Processing“, norėdami perskaityti numerio lentelę, šiandien šiame straipsnyje mes sužinosime, kaip atpažinti ir perskaityti automobilių numerius naudojant „Raspberry Pi“ ir „OpenCV“. Mes naudosime keletą atsitiktinių transporto priemonių vaizdų iš „Google“ ir parašysime programą, kad atpažintume numerio ženklą naudodami „OpenCV Contour Detection“, tada perskaitysime numerį iš plokštelės naudodami „Tesseract“ OCR. Skamba įdomiai !, todėl pradėkime.
Išankstiniai reikalavimai
Kaip sakyta anksčiau, veidams aptikti ir atpažinti naudosime „OpenCV“ biblioteką. Taigi prieš tęsdami šią mokymo programą būtinai įdiekite „OpenCV“ biblioteką „Raspberry Pi“. Taip pat maitinkite „Pi“ naudodami 2A adapterį ir prijunkite jį prie ekrano monitoriaus, kad būtų lengviau derinti.
Šioje pamokoje nebus paaiškinta, kaip tiksliai veikia „OpenCV“, jei norite sužinoti apie vaizdo apdorojimą, patikrinkite šiuos „OpenCV“ pagrindus ir pažangias vaizdo apdorojimo pamokas. Taip pat galite sužinoti apie kontūrus, „Blob Detection“ ir kt. Šioje Vaizdų segmentavimo mokymo programoje naudodami „OpenCV“. Mes darysime kažką panašaus į tai, kad iš paveikslėlio aptiktume automobilio valstybinį numerį.
Veiksmai, susiję su valstybinių numerių atpažinimu naudojant „Raspberry Pi“
Trumpai tariant, valstybinių numerių atpažinimas arba LPR apima tris pagrindinius žingsnius. Veiksmai yra tokie
1. Valstybinio numerio nustatymas: Pirmasis žingsnis - aptikti valstybinį numerį iš automobilio. Norėdami nustatyti stačiakampius objektus, surasime numerio lentelę naudodami „OpenCV“ kontūro parinktį. Tikslumą galima pagerinti, jei žinome tikslų numerio ženklo dydį, spalvą ir apytikslę vietą. Paprastai aptikimo algoritmas mokomas atsižvelgiant į kameros padėtį ir toje šalyje naudojamo numerio ženklo tipą. Tai tampa sudėtingiau, jei paveikslėlyje net nėra automobilio, šiuo atveju mes atliksime papildomą žingsnį, kad aptiktume automobilį ir tada valstybinį numerį.
2. Simbolių segmentavimas: aptikę licencijos plokštelę, turime ją iškirpti ir išsaugoti kaip naują vaizdą. Vėlgi, tai galima lengvai padaryti naudojant „OpenCV“.
3. Simbolių atpažinimas: Dabar naujame paveikslėlyje, kurį gavome ankstesniame etape, tikrai bus parašyti keli simboliai (skaičiai / abėcėlės). Taigi, mes galime atlikti OCR (Optical Character Recognition), kad aptiktume skaičių. Mes jau paaiškinome optinį simbolių atpažinimą (OCR) naudodami „Raspberry Pi“.
1. Valstybinio numerio nustatymas
Pirmasis žingsnis šiame „ Raspberry Pi“ numerio skaitytuve yra aptikti licencijos plokštelę. Paimkime pavyzdinį automobilio vaizdą ir pradėkime nuo to automobilio identifikavimo numerio aptikimo. Tada tą patį vaizdą naudosime ir simbolių segmentavimui bei simbolių atpažinimui. Jei norite pereiti tiesiai į kodą be paaiškinimų, galite slinkti žemyn į šio puslapio apačią, kur pateikiamas visas kodas. Bandomasis vaizdas, kurį naudoju šiai pamokai, parodytas žemiau.
1 veiksmas: pakeiskite paveikslėlio dydį iki reikiamo dydžio ir tada jį supilkite. To paties kodas pateiktas žemiau
img = cv2.resize (img, (620,480)) pilka = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #konvertuoti į pilką skalę
Keičiant dydį, mes galime išvengti bet kokių problemų, susijusių su didesnės raiškos vaizdais, įsitikinkite, kad po dydžio keitimo numerio lentelė vis tiek lieka rėmelyje. Pilkas mastelis yra įprastas atliekant visus vaizdo apdorojimo veiksmus. Tai pagreitina kitus tolesnius procesus, todėl mums nebereikia susidurti su spalvų detalėmis apdorojant vaizdą. Atlikus šį žingsnį vaizdas būtų pakeistas maždaug taip
2 žingsnis: Kiekviename paveikslėlyje bus naudingos ir nenaudingos informacijos, šiuo atveju mums naudinga tik valstybinio numerio lentelė, likusi mūsų programai yra beveik nenaudinga. Ši nenaudinga informacija vadinama triukšmu. Paprastai naudojant dvišalį filtrą („Bluring“) pašalinamos nepageidaujamos detalės iš vaizdo. To paties kodas yra
pilka = cv2.bilateralFilter (pilka, 11, 17, 17)
Sintaksė yra paskirties_ vaizdas = cv2.bilateralFilter (šaltinio vaizdas, pikselio skersmuo, sigmaColor, sigmaSpace). Jei norite ištrinti daugiau foninės informacijos, galite padidinti sigmos spalvą ir sigmos tarpą nuo 17 iki didesnių, tačiau būkite atsargūs, kad naudinga dalis nebūtų neryški. Išvesties vaizdas rodomas žemiau, nes matote, kad šiame vaizde fono detalės (medis ir pastatas) yra neryškios. Tokiu būdu galime išvengti programos sutelkimo į šiuos regionus vėliau.
3 žingsnis: Kitas žingsnis yra įdomus, kai atliekame kraštų aptikimą. Yra daugybė būdų tai padaryti. Paprasčiausias ir populiariausias būdas yra naudoti „ OpenCV“ metodą „ canny edge“. Eilutė daryti tą patį rodoma žemiau
kraštas = cv2.Canny (pilka, 30, 200) #Perform Edge aptikimas
Sintaksė bus paskirties_vaizdas = cv2.Canny (source_image, thresholdValue 1, thresholdValue 2). 1 slenksčio slenkstis ir 2 slenkstinė vertė yra mažiausios ir didžiausios ribinės vertės. Bus rodomi tik tie kraštai, kurių intensyvumo gradientas viršija minimalią slenkstinę vertę ir yra mažesnis už didžiausią ribinę vertę. Gautas vaizdas parodytas žemiau
4 žingsnis: Dabar mes galime pradėti ieškoti kontūro savo paveikslėlyje, mes jau sužinojome apie tai, kaip rasti kontūrus naudojant „OpenCV“ mūsų ankstesnėje pamokoje, todėl mes tiesiog elgiamės taip pat.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = rūšiuojamas (cnts, key = cv2.contourArea, reverse = Trueone) screenCnt
Aptikę skaitiklius, mes rūšiuojame juos nuo didelių iki mažų ir atsižvelgiame tik į pirmuosius 10 rezultatų, nepaisydami kitų. Mūsų paveikslėlyje skaitiklis gali būti viskas, kas turi uždarą paviršių, tačiau iš visų gautų rezultatų bus ir valstybinio numerio numeris, nes jis taip pat yra uždaras paviršius.
Norėdami filtruoti valstybinio numerio vaizdą tarp gautų rezultatų, mes sukursime visus rezultatus ir patikrinsime, kuris turi stačiakampio formos kontūrą su keturiomis pusėmis ir uždara figūra. Kadangi valstybinis numeris būtų stačiakampis keturių pusių paveikslas.
# kilpa per mūsų kontūrus c cnts: # apytiksliai nustatykite kontūro peri = cv2.arcLength (c, True) apytiksliai = cv2.approxPolyDP (c, 0,018 * peri, True) # jei mūsų apytikslis kontūras turi keturis taškus, tada # mes galime manyti, kad radome savo ekraną, jei len (apytiksliai) == 4: ekranasCnt = apytiksliai pertrauka
Vertė 0,018 yra eksperimentinė vertė; galite žaisti aplink jį ir patikrinti, kas jums labiausiai tinka. Arba perkelkite jį į kitą lygį naudodamiesi mašininiu mokymusi, kad mokytumėtės pagal automobilio vaizdus, ir tada panaudokite tinkamą vertę. Radę tinkamą skaitiklį, mes jį įrašome kintamajame, vadinamame „ screenCnt“, ir aplink jį nupiešiame stačiakampį langelį, kad įsitikintume, jog teisingai aptikome valstybinį numerį.
5 žingsnis: Dabar, kai žinome, kur yra numerio lentelė, likusi informacija mums yra beveik nenaudinga. Taigi galime užmaskuoti visą paveikslėlį, išskyrus vietą, kurioje yra numerio lentelė. Tą patį darantis kodas parodytas žemiau
# Kitos dalies, nei valstybinio numerio ženklo , maskavimas = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (mask, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = kaukė)
Užmaskuotas naujas vaizdas pasirodys panašiai kaip žemiau
2. Simbolių segmentavimas
Kitas „ Raspberry Pi“ numerio ženklo atpažinimo žingsnis yra valstybinio numerio segmentas iš atvaizdo, jį apkarpant ir išsaugant kaip naują vaizdą. Tada galime naudoti šį vaizdą aptikti jame esantį personažą. Kodas, skirtas apkarpyti pagrindinio paveikslėlio roi (dominančio regiono) vaizdą, rodomas žemiau
# Dabar apkarpykite (x, y) = np.where (kaukė == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Apkarpyta = pilka
Gautas vaizdas parodytas žemiau. Įprastai pridedant prie nuotraukos apkarpymo, mes taip pat galime jį papilkinti ir, jei reikia, pakraščius. Tai daroma siekiant pagerinti simbolių atpažinimą kitame etape. Tačiau aš pastebėjau, kad jis puikiai veikia net ir su originaliu vaizdu.
3. Simbolių atpažinimas
Paskutinis šio „ Raspberry Pi “ numerio ženklo atpažinimo žingsnis yra faktiškai perskaityti numerio ženklo informaciją iš segmentuoto vaizdo. Mes naudosime paketą „ pytesseract“, norėdami perskaityti simbolius iš vaizdo, kaip tai darėme ankstesnėje pamokoje. To paties kodas pateiktas žemiau
# Perskaitykite numerio lentelės tekstą = pytesseract.image_to_string (Cropped, config = '- psm 11') print („Aptiktas skaičius yra:“, tekstas)
Mes jau paaiškinome, kaip sukonfigūruoti „Tesseract“ variklį, todėl, jei reikia, dar kartą galime sukonfigūruoti „Tesseract“ OCR, kad gautume geresnius rezultatus. Tada aptiktas simbolis atspausdinamas ant konsolės. Sudarant rezultatas parodytas taip, kaip nurodyta toliau
Kaip matote, originalus vaizdas turėjo skaičių „HR 25 BR9044“, o mūsų programa nustatė, kad ekrane atspausdinta ta pati reikšmė.
Nepavykusios bylos numerio atpažinimo procese
Išsamų projekto failą, kurį rasite „ Raspberry Pi“ licencijos plokštelės atpažinime, galite atsisiųsti iš čia. Jame yra programa ir bandomieji vaizdai, kuriuos naudojome tikrindami savo programą. Be to, reikia prisiminti, kad šio metodo rezultatai nebus tikslūs . Tikslumas priklauso nuo vaizdo aiškumo, orientacijos, šviesos poveikio ir kt. Norėdami gauti geresnių rezultatų, galite pabandyti kartu įdiegti mašininio mokymosi algoritmus.
Norėdami sužinoti, pažiūrėkime į kitą pavyzdį, kai automobilis nėra nukreiptas tiesiai į fotoaparatą.
Kaip matote, mūsų programa sugebėjo teisingai aptikti valstybinį numerį ir jį apkarpyti. Tačiau „ Tesseract“ biblioteka nesugebėjo tinkamai atpažinti simbolių. Vietoj faktinio „TS 08 UE 3396“ OCR pripažino, kad tai yra „1508 jūs 3396“. Tokias problemas galima išspręsti naudojant geresnės padėties vaizdus arba konfigūruojant „ Tesseract“ variklį.
Kitas blogiausias atvejis - kai kontūras neteisingai atpažįsta valstybinį numerį. Žemiau esančiame paveikslėlyje yra per daug foninės informacijos ir blogas apšvietimas, kad programa net nesugebėjo identifikuoti valstybinio numerio iš numerio. Šiuo atveju mes vėl turime perteikti mokymąsi mašinomis arba pagerinti vaizdo kokybę.
Kiti sėkmingi pavyzdžiai
Dažniausiai vaizdo kokybė ir padėtis yra teisingi, programa sugebėjo identifikuoti valstybinį numerį ir iš jo perskaityti numerį. Žemiau pateikti momentiniai kadrai rodo keletą sėkmingų rezultatų. Vėlgi, visi bandomieji vaizdai ir čia naudojamas kodas bus prieinami čia pateiktame ZIP faile.
Tikiuosi, kad supratote automatinį numerio ženklo atpažinimą naudodamiesi „Raspberry Pi“, ir patiko patys kurti ką nors šaunaus. Ką, jūsų manymu, dar galima padaryti naudojant „ OpenCV“ ir „Tesseract“ ? Praneškite man savo mintis komentarų skyriuje. Jei turite klausimų dėl šio straipsnio, nedvejodami palikite juos toliau pateiktame komentarų skyriuje arba naudokite forumus kitoms techninėms užklausoms.