- Edellytykset
- Rekisterikilven tunnistamiseen liittyvät vaiheet Raspberry Pi: n avulla
- 1. Rekisterikilven tunnistus
- 2. Merkkien segmentointi
- 3. Merkkien tunnistaminen
- Epäonnistuneet tapaukset rekisterikilpien tunnistuksessa
- Muita onnistuneita esimerkkejä
Turvallisuus on aina ollut ihmiskunnan suuri huolenaihe. Tänään meillä on videovalvontakamerat kouluissa, sairaaloissa ja kaikissa muissa julkisissa paikoissa, jotta voimme tuntea olonsa turvalliseksi. Hänen HIS-tutkimuksensa mukaan arviolta noin 245 miljoonaa valvontakameraa oli asennettu ja toiminut jo vuonna 2014, mikä on kuin yksi turvakamera jokaista 30 ihmistä kohden tällä planeetalla. Erityisesti kuvankäsittelyn ja koneoppimisen tekniikan kehittyessä on mahdollista tehdä näistä kameroista älykkäämpiä kouluttamalla niitä käsittelemään tietoja videosyötteestä.
Näiden kameroiden videosyötettä voidaan käyttää kasvojentunnistukseen, kuvioanalyysiin, tunneanalyysiin ja paljon muuhun, mikä todella saisi sen lähelle jotain FF7-elokuvassa näytettyä ”Jumalan silmää”. Itse asiassa Hikvisionin kaltaiset valvontayritykset ja monet muut ovat jo aloittaneet näiden ominaisuuksien toteuttamisen tuotteissaan. Aikaisemmin käytimme MATLAB-kuvankäsittelyä rekisterikilven lukemiseen, tänään opimme tässä artikkelissa, kuinka tunnistaa ja lukea rekisterikilven numero autoista Raspberry Pi: n ja OpenCV: n avulla. Käytämme joitain Googlen satunnaisia ajoneuvokuvia ja kirjoitamme ohjelman tunnistamaan rekisterikilpi OpenCV Contour Detection -toiminnolla ja luemme sitten numeron numerosta Tesseract OCR -tekniikalla. Kuulostaa mielenkiintoiselta !, joten aloitetaan.
Edellytykset
Kuten aiemmin kerrottiin, käytämme OpenCV-kirjastoa kasvojen havaitsemiseen ja tunnistamiseen. Joten varmista, että asennat OpenCV-kirjaston Raspberry Pi -laitteeseen ennen tämän opetusohjelman jatkamista. Virroita Pi myös 2A-sovittimella ja liitä se näytön näyttöön virheenkorjauksen helpottamiseksi.
Tämä opetusohjelma ei selitä kuinka OpenCV toimii tarkasti, jos olet kiinnostunut kuvankäsittelyn oppimisesta, tutustu tämän OpenCV: n perusteisiin ja edistyneisiin kuvankäsittelyoppaisiin. Voit myös oppia ääriviivoista, Blob Detectionista jne. Tässä Image Segmentation -opetusohjelmassa OpenCV: n avulla. Teemme jotain vastaavaa havaitaksemme kuvan rekisterikilven.
Rekisterikilven tunnistamiseen liittyvät vaiheet Raspberry Pi: n avulla
Rekisterikilven tunnistus eli LPR, sisältää kolme päävaihetta. Vaiheet ovat seuraavat
1. Rekisterikilven tunnistus: Ensimmäinen vaihe on tunnistaa rekisterikilpi autosta. Käytämme OpenCV: n ääriviivavaihtoehtoa suorakulmaisten esineiden havaitsemiseksi rekisterikilven löytämiseksi. Tarkkuutta voidaan parantaa, jos tiedämme rekisterikilven tarkan koon, värin ja likimääräisen sijainnin. Normaalisti tunnistusalgoritmi koulutetaan kameran sijainnin ja kyseisessä maassa käytetyn rekisterikilven tyypin perusteella. Tämä muuttuu hankalammaksi, jos kuvassa ei ole edes autoa, tässä tapauksessa aiomme suorittaa uuden askeleen auton ja sitten rekisterikilven havaitsemiseksi.
2. Merkkien segmentointi: Kun olemme tunnistaneet rekisterikilven, meidän on rajattava se ja tallennettava se uutena kuvana. Jälleen tämä voidaan tehdä helposti OpenCV: llä.
3. Merkkien tunnistus: Nyt edellisessä vaiheessa saamassamme uudessa kuvassa on varmasti joitain merkkejä (numerot / aakkoset). Joten voimme suorittaa sen OCR (Optical Character Recognition) siinä numeron havaitsemiseksi. Olemme jo selittäneet optisen merkintunnistuksen (OCR) käyttämällä Raspberry Pi -ohjelmaa.
1. Rekisterikilven tunnistus
Ensimmäinen askel tässä Raspberry Pi -lisäkilventunnistimessa on tunnistaa rekisterikilpi. Otetaan esimerkkikuva autosta ja aloitetaan tunnistamalla kyseisen auton rekisterikilpi. Sitten käytämme samaa kuvaa myös merkkien segmentointiin ja merkkien tunnistamiseen. Jos haluat siirtyä suoraan koodiin selittämättä, voit selata tämän sivun alaosaan, jossa on täydellinen koodi. Testikuva, jota käytän tässä opetusohjelmassa, näkyy alla.
Vaihe 1: Muuta kuvan koko haluttuun kokoon ja harmaasävy. Saman koodi annetaan alla
img = cv2.resize (img, (620,480)) harmaa = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) # muunna harmaasävyksi
Koon muuttaminen auttaa meitä välttämään ongelmia suurempien resoluutioisten kuvien kanssa. Varmista, että rekisterikilpi on edelleen kehyksessä koon muuttamisen jälkeen. Harmaa skaalaus on yleistä kaikissa kuvankäsittelyvaiheissa. Tämä nopeuttaa muuta seuraavaa prosessin sinia, eikä meidän tarvitse enää käsitellä värejä yksityiskohtia käsiteltäessä kuvaa. Kuva muuttuu jotain tällaista, kun tämä vaihe on tehty
Vaihe 2: Jokaisella kuvalla on hyödyllistä ja hyödytöntä tietoa, tässä tapauksessa meille vain rekisterikilpi on hyödyllistä tietoa, loput ovat melko hyödyttömiä ohjelmallemme. Tätä hyödytöntä tietoa kutsutaan meluksi. Normaalisti kahdenvälisen suodattimen (Bluring) käyttäminen poistaa ei-toivotut yksityiskohdat kuvasta. Saman koodi on
harmaa = cv2.bilateralFilter (harmaa, 11, 17, 17)
Syntaksi on määränpää_kuva = cv2.bilateralFilter (lähteen kuva, pikselin halkaisija, sigmaColor, sigmaSpace). Voit kasvattaa sigman väriä ja sigmatilaa 17: stä suurempiin arvoihin hämärtääksesi enemmän taustatietoja, mutta ole varovainen, ettei hyödyllinen osa hämärty. Lähtökuva näkyy alla, koska näet, että taustan yksityiskohdat (puu ja rakennus) ovat epätarkkoja tässä kuvassa. Näin voimme välttää ohjelman keskittymisen näille alueille myöhemmin.
Vaihe 3: Seuraava vaihe on mielenkiintoinen, missä suoritamme reunan tunnistuksen. On monia tapoja tehdä se, helpoin ja suosituin tapa on käyttää OpenCV: n canny edge -menetelmää. Rivi tekemään sama näkyy alla
reuna = cv2.Canny (harmaa, 30, 200) #Perform Edge -tunnistus
Syntaksi on määränpää_kuva = cv2.Canny (lähteen kuva, kynnysarvo 1, kynnysarvo 2). Kynnysarvo 1 ja kynnysarvo 2 ovat pienin ja suurin kynnysarvo. Näytetään vain ne reunat, joiden intensiteettigradientti on suurempi kuin pienin kynnysarvo ja pienempi kuin suurin kynnysarvo. Tuloksena oleva kuva näkyy alla
Vaihe 4: Nyt voimme alkaa etsiä ääriviivoja kuvastamme, olemme jo oppineet, miten muodot löydetään OpenCV: n avulla edellisessä opetusohjelmassa, joten jatkamme vain samalla tavalla.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = lajiteltu (cnts, key = cv2.contourArea, reverse = Trueone) screenCnt
Kun laskurit on havaittu, lajittelemme ne suurista pieniin ja otamme huomioon vain 10 ensimmäistä tulosta jättämällä muut huomiotta. Kuvassamme laskuri voi olla mikä tahansa, jolla on suljettu pinta, mutta kaikista saaduista tuloksista löytyy myös rekisterikilven numero, koska se on myös suljettu pinta.
Suodataksesi rekisterikilven kuvan saatujen tulosten joukosta, silmukkaamme kaikki tulokset ja tarkistamme, mikä on suorakulmion muotoinen muoto, jossa on neljä sivua ja suljettu kuva. Koska rekisterikilpi olisi ehdottomasti suorakulmio, neljäpuolinen kuva.
# silmukka c: n ääriviivojemme yli cnts: ssä: # arvioi ääriviivan peri = cv2.arcPituus (c, True) noin = cv2.approxPolyDP (c, 0,018 * peri, True) # jos likimääräisessä ääriviivassamme on neljä pistettä, niin # me voi olettaa, että olemme löytäneet näytön, jos len (noin) == 4: screenCnt = noin tauko
Arvo 0,018 on kokeellinen arvo; voit pelata sen ympärillä tarkistaaksesi, mikä sopii sinulle parhaiten. Tai vie se seuraavalle tasolle käyttämällä koneoppimista kouluttaaksesi autokuvien perusteella ja käytä sitten oikeaa arvoa siellä. Kun olemme löytäneet oikean laskurin, tallennamme sen muuttujaan nimeltä screenCnt ja piirrämme sen ympärille suorakulmion laatikon varmistaaksemme, että rekisterikilpi on havaittu oikein.
Vaihe 5: Nyt kun tiedämme missä rekisterikilpi on, jäljellä olevat tiedot ovat meille melko hyödyttömiä. Joten voimme jatkaa koko kuvan peittämistä lukuun ottamatta paikkaa, jossa rekisterikilpi on. Sama tekevä koodi näkyy alla
# Muiden osien kuin rekisterikilven peittäminen = np.zeros (harmaa.muoto, np.uint8) new_image = cv2.drawContours (naamio,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = naamio)
Naamioitu uusi kuva näkyy alla olevan kaltaisena
2. Merkkien segmentointi
Seuraava vaihe Raspberry Pi -numerokilventunnistuksessa on segmentoida rekisterikilpi kuvasta rajaamalla se ja tallentamalla se uutena kuvana. Voimme sitten käyttää tätä kuvaa havaita siinä oleva merkki. Koodi, jolla rajataan pääkuvan roi-kuva (mielenkiintoinen alue), näkyy alla
# Nyt rajaa (x, y) = np.where (maski == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Rajattu = harmaa
Tuloksena oleva kuva näkyy alla. Tavallisesti lisätään kuvan rajaamiseen, voimme myös harmaata sen ja reunoittaa sen tarvittaessa. Tämä tehdään merkkien tunnistamisen parantamiseksi seuraavassa vaiheessa. Huomasin kuitenkin, että se toimii hyvin myös alkuperäisen kuvan kanssa.
3. Merkkien tunnistaminen
Viimeinen vaihe tässä Vadelma Pi -numerokilventunnistuksessa on lukea rekisterikilvetiedot segmentoidusta kuvasta. Käytämme pytesseract- pakettia lukemaan merkkejä kuvasta, kuten teimme edellisessä opetusohjelmassa. Saman koodi annetaan alla
#Lue rekisterikilven teksti = pytesseract.image_to_string (rajattu, config = '- psm 11') tulosta ("Havaittu numero on:", teksti)
Olemme jo selittäneet, miten Tesseract-moottori määritetään, joten tässä voidaan tarvittaessa tarvittaessa konfiguroida Tesseract OCR myös parempien tulosten saavuttamiseksi. Havaittu merkki tulostetaan sitten konsolille. Koottaessa tulos näytetään alla
Kuten voit nähdä, alkuperäisessä kuvassa oli numero “HR 25 BR9044”, ja ohjelmamme on havainnut, että se on tulostanut saman arvon näytölle.
Epäonnistuneet tapaukset rekisterikilpien tunnistuksessa
Koko projektitiedosto, tämä Raspberry Pi -lisenssikilven tunnistus, voidaan ladata täältä, se sisältää ohjelman ja testikuvat, joita käytimme tarkistamaan ohjelmaa. Sanomatta on muistettava, että tämän menetelmän tulokset eivät ole tarkkoja . Tarkkuus riippuu kuvan selkeydestä, suunnasta, valotuksesta jne. Parempien tulosten saavuttamiseksi voit kokeilla koneoppimisalgoritmien käyttöönottoa yhdessä tämän kanssa.
Saadaksesi idean, katsotaanpa toinen esimerkki, jossa auto ei ole suoraan kameraa kohti.
Kuten näette, ohjelmamme pystyi tunnistamaan rekisterikilven oikein ja rajaamaan sen. Mutta Tesseract- kirjasto ei ole tunnistanut merkkejä kunnolla. Todellisen "TS 08 UE 3396" -kohdan sijaan OCR on tunnistanut sen olevan "1508 te 3396". Tämänkaltaiset ongelmat voidaan korjata joko käyttämällä parempia suuntauskuvia tai määrittämällä Tesseract- moottori.
Toinen pahimmassa tapauksessa skenaario ei tunnista rekisterikilpeä oikein. Alla olevassa kuvassa on liikaa taustatietoja ja huono valaistus, että ohjelma ei ole edes tunnistanut rekisterikilpeä numerosta. Tässä tapauksessa meidän on jälleen välitettävä koneoppimista tai parannettava kuvan laatua.
Muita onnistuneita esimerkkejä
Suurin osa kuvanlaadusta ja suunnasta on oikein, ohjelma pystyi tunnistamaan rekisterikilven ja lukemaan numeron siitä. Alla olevat pikakuvat osoittavat muutaman onnistuneista tuloksista. Jälleen kaikki tässä käytetyt testikuvat ja koodi ovat saatavilla täällä annetussa ZIP-tiedostossa.
Toivottavasti ymmärrät automaattisen rekisterikilven tunnistamisen Raspberry Pi: n avulla ja nautit itse rakentamaan jotain hienoa. Mitä muuta luulet voivamme tehdä OpenCV: llä ja Tesseractilla ?, Kerro minulle ajatuksesi kommenttiosassa. Jos sinulla on kysyttävää tästä artikkelista, jätä ne vapaasti alla olevaan kommenttiosioon tai käytä foorumeita muihin teknisiin kysymyksiin.