- Paunang mga kinakailangan
- Mga hakbang na kasangkot sa Pagkilala sa Plate ng Lisensya gamit ang Raspberry Pi
- 1. Pagtuklas ng Plato ng Lisensya
- 2. Paghahati ng Character
- 3. Pagkilala sa Character
- Mga Kaso na Nabigo sa Pagkilala sa Plato ng Numero
- Iba Pang Mga Matagumpay na Halimbawa
Ang seguridad ay palaging isang pangunahing pag-aalala para sa sangkatauhan. Ngayon ay mayroon kaming mga camera ng surveillance ng video sa mga paaralan, ospital at bawat iba pang pampublikong lugar upang makaramdam kami ng seguridad. Ayon sa isang survey ng HIS tinatayang may humigit-kumulang na 245 milyong security camera na na-install at gumagana pabalik noong 2014, na tulad ng pagkakaroon ng isang security camera para sa bawat 30 katao sa mundong ito. Sa pagsulong ng teknolohiya lalo na sa pagproseso ng Imahe at Pag-aaral ng Machine, posible na gawing mas matalino ang mga camera sa pamamagitan ng pagsasanay sa kanila upang maproseso ang impormasyon mula sa Video feed.
Ang feed ng video mula sa mga camera na ito ay maaaring magamit upang maisagawa ang pagkilala sa mukha, pag-aaral ng pattern, pagsusuri ng emosyon at marami pa na makakalapit sa isang bagay tulad ng "Eye ng Diyos" na ipinakita sa pelikulang FF7. Sa katunayan, ang mga kumpanya ng surveillance tulad ng Hikvision at marami pang iba ay nagsimula nang ipatupad ang mga tampok na ito sa kanilang mga produkto. Ginamit namin dati ang pagproseso ng MATLAB Image upang mabasa ang plate number, ngayon sa artikulong ito matututunan natin kung paano makilala at mabasa ang Numero ng Plate ng Lisensya mula sa Mga Kotse gamit ang Raspberry Pi at OpenCV. Gumagamit kami ng ilang mga random na imahe ng sasakyan mula sa Google at magsusulat ng isang programa upang makilala ang plate number gamit ang OpenCV Contour Detection at pagkatapos ay basahin ang numero mula sa plato gamit ang Tesseract OCR. Tunog kagiliw-giliw na tama !, kaya't magsimula tayo.
Paunang mga kinakailangan
Tulad ng sinabi kanina, gagamitin namin ang OpenCV Library upang makita at kilalanin ang mga mukha. Kaya tiyaking i-install ang OpenCV Library sa Raspberry Pi bago magpatuloy sa tutorial na ito. Lakasin din ang iyong Pi gamit ang isang 2A adapter at ikonekta ito sa isang monitor ng display para sa mas madaling pag-debug.
Ang tutorial na ito ay hindi magpapaliwanag kung paano eksaktong gumagana ang OpenCV, kung interesado kang matuto ng Pagproseso ng imahe pagkatapos suriin ang mga pangunahing kaalaman sa OpenCV na ito at mga advanced na tutorial sa pagproseso ng Imahe. Maaari mo ring malaman ang tungkol sa mga contour, Blob Detection atbp sa tutorial na ito ng Segmentation ng Imahe gamit ang OpenCV. Gumagawa kami ng isang bagay na katulad nito upang makita ang plaka ng kotse mula sa imahe.
Mga hakbang na kasangkot sa Pagkilala sa Plate ng Lisensya gamit ang Raspberry Pi
Ang Pagkilala sa Plate ng Lisensya o LPR para sa maikli, ay nagsasangkot ng tatlong pangunahing mga hakbang. Ang mga hakbang ay ang mga sumusunod
1. Pagtuklas ng Plato ng Lisensya: Ang unang hakbang ay upang makita ang plate ng Lisensya mula sa kotse. Gagamitin namin ang pagpipilian ng tabas sa OpenCV upang matukoy para sa mga parihaba na bagay upang makita ang plate ng numero. Maaaring mapabuti ang kawastuhan kung alam natin ang eksaktong laki, kulay at tinatayang lokasyon ng plate ng numero. Karaniwan ang algorithm ng pagtuklas ay sinanay batay sa posisyon ng kamera at uri ng plate ng numero na ginamit sa partikular na bansa. Nagiging mas mahirap ito kung ang imahe ay wala ring kotse, sa kasong ito ay magkakaroon kami ng karagdagang hakbang upang matukoy ang kotse at pagkatapos ang plaka.
2. Paghahati ng Character: Kapag nakita namin ang Plate ng Lisensya kailangan namin itong i-crop at i-save ito bilang isang bagong imahe. Muli madali itong magagawa gamit ang OpenCV.
3. Pagkilala sa Character: Ngayon, ang bagong imahe na nakuha namin sa nakaraang hakbang ay sigurado na mayroong ilang mga character (Mga Numero / Alphabet) na nakasulat dito. Kaya, maaari nating maisagawa dito ang OCR (Optical Character Recognition) upang matukoy ang numero. Ipinaliwanag na namin ang Optical Character Recognition (OCR) gamit ang Raspberry Pi.
1. Pagtuklas ng Plato ng Lisensya
Ang unang hakbang sa Raspberry Pi License Plate Reader na ito ay upang makita ang Plate ng Lisensya. Kumuha tayo ng isang sample na imahe ng isang kotse at magsimula sa pagtuklas ng Plate ng Lisensya sa kotseng iyon. Gagamitin namin pagkatapos ang parehong imahe para sa Pag-segment ng Character at Pagkilala ng Character din. Kung nais mong tumalon nang diretso sa code nang walang paliwanag pagkatapos ay maaari kang mag-scroll pababa sa ilalim ng pahinang ito, kung saan ibinigay ang kumpletong code. Ang imahe ng pagsubok na ginagamit ko para sa tutorial na ito ay ipinapakita sa ibaba.
Hakbang 1: Baguhin ang laki ng imahe sa kinakailangang sukat at pagkatapos ay grayscale ito. Ang code para sa pareho ay ibinibigay sa ibaba
img = cv2.resize (img, (620,480)) grey = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #convert to grey scale
Tinutulungan kaming baguhin ang laki ng laki upang maiwasan ang anumang mga problema sa mas malaking mga imahe ng resolusyon, siguraduhin na ang plate ng numero ay mananatili pa rin sa frame pagkatapos baguhin ang laki. Karaniwan ang grey scaling sa lahat ng mga hakbang sa pagproseso ng imahe. Pinapabilis nito ang iba pang sumusunod na proseso ng sine na hindi na namin kailangang harapin ang mga detalye ng kulay kapag nagpoproseso ng isang imahe. Ang imahe ay mababago sa isang bagay tulad nito kapag tapos na ang hakbang na ito
Hakbang 2: Ang bawat imahe ay magkakaroon ng kapaki-pakinabang at walang silbi na impormasyon, sa kasong ito para sa amin lamang ang plaka ng lisensya ay ang kapaki-pakinabang na impormasyon ang natitira ay medyo walang silbi para sa aming programa. Ang walang kwentang impormasyon na ito ay tinatawag na ingay. Karaniwan na ang paggamit ng isang pansamantalang filter (Bluring) ay aalisin ang mga hindi ginustong mga detalye mula sa isang imahe. Ang code para sa pareho ay
grey = cv2.bilateralFilter (kulay abong, 11, 17, 17)
Ang Syntax ay patutunguhan_image = cv2.bilateralFilter (source_image, diameter ng pixel, sigmaColor, sigmaSpace). Maaari mong taasan ang kulay ng sigma at puwang ng sigma mula 17 hanggang sa mas mataas na mga halaga upang lumabo ang karagdagang impormasyon sa background, ngunit mag-ingat na ang kapaki-pakinabang na bahagi ay hindi malabo. Ang imahe ng output ay ipinapakita sa ibaba, dahil nakikita mo ang mga detalye sa background (puno at gusali) na malabo sa imaheng ito. Sa ganitong paraan maiiwasan natin ang programa mula sa pagtuon sa mga rehiyon na ito sa paglaon.
Hakbang 3: Ang susunod na hakbang ay kawili-wili kung saan nagsasagawa kami ng detection sa gilid. Maraming mga paraan upang gawin ito, ang pinakamadali at tanyag na paraan ay ang paggamit ng canny edge na pamamaraan mula sa OpenCV. Ang linya upang gawin ang pareho ay ipinapakita sa ibaba
talim = cv2.Canny (grey, 30, 200) # Pagtuklas ng Edge ng Detalye
Ang syntax ay magiging patutunguhan_image = cv2.Canny (source_image, thresholdValue 1, thresholdValue 2). Ang Threshold Vale 1 at Halaga ng Threshold 2 ay ang minimum at maximum na mga halaga ng threshold. Ang mga gilid lamang na may isang gradient ng intensidad na higit sa minimum na halaga ng threshold at mas mababa sa maximum na halaga ng threshold ang ipapakita. Ang nagresultang imahe ay ipinapakita sa ibaba
Hakbang 4: Ngayon ay maaari na tayong magsimulang maghanap ng mga contour sa aming imahe, natutunan na namin ang tungkol sa kung paano makahanap ng mga contour gamit ang OpenCV sa aming nakaraang tutorial kaya nagpatuloy lamang kami sa pareho.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = pinagsunod-sunod (cnts, key = cv2.contourArea, reverse = True) screenCnt = Wala
Kapag napansin ang mga counter binubukod namin ang mga ito mula malaki hanggang maliit at isinasaalang-alang lamang ang unang 10 mga resulta na hindi pinapansin ang iba. Sa aming imahe ang counter ay maaaring maging anumang bagay na may saradong ibabaw ngunit sa lahat ng mga nakuha na mga resulta ang numero ng plaka ay naroroon din dahil ito ay isang saradong ibabaw din.
Upang ma-filter ang imahe ng plate plate kasama ang mga nakuha na resulta, mag-loop kami kahit na ang lahat ng mga resulta at suriin kung saan mayroong isang hugis-parihaba na contour na may apat na panig at saradong pigura. Dahil ang isang plaka ay tiyak na isang rektanggulo na apat na panig na pigura.
# loop over our contours for c in cnts: # approximate the contour peri = cv2.arcLength (c, True) approx = cv2.approxPolyDP (c, 0.018 * peri, True) # kung ang aming tinatayang contour ay may apat na puntos, pagkatapos ay # kami maaaring ipalagay na natagpuan namin ang aming screen kung len (tinatayang) == 4: screenCnt = approx break
Ang halagang 0.018 ay isang pang-eksperimentong halaga; maaari mong i-play sa paligid nito upang suriin kung aling pinakamahusay na gumagana para sa iyo. O dalhin ito sa susunod na antas sa pamamagitan ng paggamit ng pag-aaral ng makina upang sanayin batay sa mga imahe ng kotse at pagkatapos ay gamitin ang tamang halaga doon. Kapag natagpuan na namin ang tamang counter ay nai-save namin ito sa isang variable na tinatawag na screenCnt at pagkatapos ay gumuhit ng isang kahon na rektanggulo sa paligid nito upang matiyak na nakita namin nang tama ang plaka ng lisensya.
Hakbang 5: Ngayon alam na natin kung nasaan ang plate ng numero, ang natitirang impormasyon ay medyo walang silbi para sa amin. Kaya't maaari naming magpatuloy sa masking buong larawan maliban sa lugar kung saan naroon ang plate number. Ang code na gawin ang pareho ay ipinapakita sa ibaba
# Masking ang bahagi maliban sa number plate mask = np.zeros (grey.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maskara)
Ang masked na bagong imahe ay lilitaw ng isang bagay tulad sa ibaba
2. Paghahati ng Character
Ang susunod na hakbang sa Pagkilala sa Numero ng plate ng Raspberry Pi ay i-segment ang plate ng lisensya mula sa imahe sa pamamagitan ng pag- crop nito at i-save ito bilang isang bagong imahe. Maaari naming magamit ang imaheng ito upang makita ang tauhang nandito. Ang code upang i-crop ang imahe ng roi (Rehiyon ng interes) na form na pangunahing imahe ay ipinapakita sa ibaba
# Ngayon i-crop (x, y) = np. saan (mask == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) I- crop = kulay-abo
Ang nagresultang imahe ay ipinapakita sa ibaba. Karaniwan na idinagdag sa pag-crop ng imahe, maaari din natin itong kulay-abo at gilid ito kung kinakailangan. Ginagawa ito upang mapabuti ang pagkilala ng character sa susunod na hakbang. Gayunpaman nalaman ko na gumagana ito ng maayos kahit na may orihinal na imahe.
3. Pagkilala sa Character
Ang Pangwakas na hakbang sa Pagkilala sa Bilang ng Platong Raspberry Pi na ito ay upang talagang basahin ang impormasyon ng plate number mula sa naka-segment na imahe. Gagamitin namin ang pytesseract package upang basahin ang mga character mula sa imahe, tulad ng ginawa namin sa nakaraang tutorial. Ang code para sa pareho ay ibinibigay sa ibaba
# Basahin ang teksto ng plate plate = pytesseract.image_to_string (Na-crop, config = '- psm 11') i- print ("Ang Detected Number ay:", teksto)
Naipaliwanag na namin kung paano i-configure ang isang Tesseract engine, kaya dito muli kung kinakailangan maaari naming mai-configure ang Tesseract OCR upang makakuha ng mas mahusay na mga resulta kung kinakailangan. Ang natukoy na character pagkatapos ay naka-print sa console. Kapag naipon ang resulta ay ipinapakita tulad ng sa ibaba
Tulad ng nakikita mo ang orihinal na imahe ay mayroong numero na "HR 25 BR9044" dito at nakita ng aming programa na nai-print ang parehong halaga sa screen.
Mga Kaso na Nabigo sa Pagkilala sa Plato ng Numero
Ang kumpletong file ng proyekto na ito Ang Pagkilala sa Plate ng Lisensya ng Raspberry Pi ay maaaring ma-download mula dito, naglalaman ito ng programa at mga imahe ng pagsubok na ginamit namin upang suriin ang aming programa. Nang hindi sinabi, dapat tandaan na ang mga resulta mula sa pamamaraang ito ay hindi magiging tumpak . Ang kawastuhan ay nakasalalay sa kalinawan ng imahe, oryentasyon, pagkakalantad ng ilaw atbp. Upang makakuha ng mas mahusay na mga resulta maaari mong subukang ipatupad ang mga algorithm sa pag-aaral ng Machine kasama nito.
Upang makakuha ng isang ideya, tingnan natin ang isa pang halimbawa kung saan ang kotse ay hindi direktang nakaharap sa camera.
Tulad ng nakikita mo, nakita ng aming programa ang plate ng lisensya nang tama at i-crop ito. Ngunit ang Tesseract library ay nabigong kilalanin nang maayos ang mga character. Sa halip na ang aktwal na "TS 08 UE 3396" kinilala ito ng OCR na "1508 ye 3396". Ang mga problemang tulad nito ay maaaring maitama sa pamamagitan ng paggamit ng mas mahusay na mga imahe ng oryentasyon o sa pamamagitan ng pag-configure ng makina ng Tesseract .
Ang isa pang pinakamasamang pangyayari sa kaso ay kung saan nabigo ang contour upang makita ang plaka ng lisensya nang tama. Ang imahe sa ibaba ay may labis na impormasyon sa background at hindi magandang pag-iilaw na nabigo pa rin ang programa na makilala ang plaka ng lisensya mula sa numero. Sa kasong ito kailangan nating muling i-relay ang pag-aaral ng Machine o pagbutihin ang kalidad ng larawan.
Iba Pang Mga Matagumpay na Halimbawa
Karamihan sa mga oras ng kalidad ng imahe at oryentasyon ay tama, nakilala ng programa ang plaka ng lisensya at binasa ang numero mula rito. Ang mga snap shot sa ibaba ay nagpapakita ng iilan sa matagumpay na nakuha na mga resulta. Muli ang lahat ng mga imahe ng pagsubok at ang code na ginamit dito ay magagamit sa ZIP file na ibinigay dito.
Inaasahan kong naintindihan mo ang Awtomatikong Numero ng Plate Recognition gamit ang Raspberry Pi at nasiyahan sa pagbuo ng isang bagay na cool sa iyong sarili. Ano pa sa palagay mo ang maaaring gawin sa OpenCV at Tesseract ?, Ipaalam sa akin ang iyong mga saloobin sa seksyon ng komento. Kung mayroon kang anumang mga katanungan tungkol sa artikulong ito mangyaring huwag mag-atubiling iwanan ang mga ito sa seksyon ng komento sa ibaba o gamitin ang mga forum para sa iba pang mga teknikal na query.