- Előfeltételek
- A rendszámfelismerés lépései a Raspberry Pi használatával
- 1. Rendszámtábla észlelése
- 2. Karakter szegmentálás
- 3. Karakterfelismerés
- Sikertelen esetek a rendszámfelismerésben
- Egyéb sikeres példák
A biztonság mindig is az emberiség fő gondja volt. Ma van videomegfigyelő kameránk az iskolákban, kórházakban és minden más nyilvános helyen, hogy biztonságban érezhessük magunkat. A HIS felmérése szerint becslések szerint körülbelül 245 millió biztonsági kamera volt telepítve és működőképes 2014-ben, ami olyan, mintha ezen a bolygón minden 30 emberre egy biztonsági kamera települne. A technológia, különösen a képfeldolgozás és a gépi tanulás terén elért fejlõdéssel lehetõvé teszi, hogy ezeket a kamerákat intelligensebbé tegye, kiképezve őket a Video hírcsatornából származó információk feldolgozására.
Az ezekből a kamerákból származó videofelvétel felhasználható arcfelismerésre, mintaelemzésre, érzelemelemzésre és még sok másra, amelyek valóban közel kerülnének ahhoz, mint az FF7 filmben bemutatott „Isten szeme”. Valójában az olyan felügyeleti társaságok, mint a Hikvision és még sokan mások, már megkezdték ezeknek a funkcióknak a bevezetését termékeikben. Korábban a MATLAB képfeldolgozást használtuk a rendszám elolvasására, ma ebben a cikkben megtanuljuk, hogyan lehet felismerni és kiolvasni a rendszámtáblát az Automobiles-ból a Raspberry Pi és az OpenCV használatával. Néhány véletlenszerű járműképet használunk a Google-tól, és írunk egy programot a rendszám felismerésére az OpenCV Contour Detection segítségével, majd leolvassuk a számot a tábláról a Tesseract OCR segítségével. Érdekesen hangzik !, tehát kezdjük.
Előfeltételek
Mint korábban elmondtuk, az OpenCV könyvtárat fogjuk használni az arcok felderítésére és felismerésére. Ezért az oktatóanyag folytatása előtt feltétlenül telepítse az OpenCV könyvtárat a Raspberry Pi-re. A Pi-t 2A adapterrel is táplálja, és a könnyebb hibakeresés érdekében csatlakoztassa a kijelzőhöz.
Ez az oktatóanyag nem magyarázza el az OpenCV működését, ha érdekli a képfeldolgozás elsajátítása, akkor nézze meg ezeket az OpenCV alapokat és a fejlett képfeldolgozó oktatóanyagokat. A kontúrokról, a Blob-észlelésről stb. Ebben a Képszegmentálás oktatóanyagban is megismerkedhet az OpenCV használatával. Ehhez hasonlót fogunk tenni, hogy a képről felismerjük az autó rendszámát.
A rendszámfelismerés lépései a Raspberry Pi használatával
Röviden a rendszámfelismerés vagy az LPR három fő lépést tartalmaz. A lépések a következők
1. Rendszámfelismerés: Az első lépés a rendszám felismerése az autóból. Az OpenCV kontúr opciójával téglalap alakú objektumokat észlelünk a rendszám megtalálásához. A pontosság javítható, ha tudjuk a rendszám pontos méretét, színét és hozzávetőleges helyét. Az észlelési algoritmust általában a kamera helyzete és az adott országban használt rendszám típusa alapján képzik ki. Ez még bonyolultabb lesz, ha a képnek még autója sincs, ebben az esetben további lépéseket fogunk tenni az autó, majd a rendszám felismerésére.
2. Karakter szegmentálás: Miután észleltük a rendszámtáblát, ki kell vágnunk, és új képként kell mentenünk. Ez megint könnyen elvégezhető az OpenCV használatával.
3. Karakterfelismerés: Most az új lépésben, amelyet az előző lépésben kaptunk, biztosan néhány karakter (szám / ábécé) van felírva. Tehát az OCR-t (Optical Character Recognition) végre tudjuk hajtani rajta a szám észlelésére. A Raspberry Pi segítségével már elmagyaráztuk az optikai karakterfelismerést (OCR).
1. Rendszámtábla észlelése
A Raspberry Pi rendszámtábla-olvasó első lépése a rendszámfelismerés. Vegyünk egy minta képet egy autóról, és kezdjük azzal, hogy észleljük az autó rendszámát. Ezután ugyanazt a képet fogjuk használni a Karakterszegmentáláshoz és a Karakterfelismeréshez is. Ha magyarázat nélkül egyenesen be akar ugrani a kódba, akkor görgessen lefelé az oldal aljára, ahol a teljes kódot megadja. Az oktatóanyag, amelyet az oktatóanyaghoz használok, alább látható.
1. lépés: Átméretezze a képet a kívánt méretre, majd szürkeárnyalatosra. Az alábbiakban a kódot adjuk meg
img = cv2.resize (img, (620,480)) szürke = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #konvertálás szürkeárnyalatosra
Az átméretezés segít elkerülni a nagyobb felbontású képekkel kapcsolatos problémákat, ügyeljen arra, hogy az átméretezés után a rendszám továbbra is a keretben maradjon. A szürke skálázás minden képfeldolgozási lépésben általános. Ez felgyorsítja a folyamat további követését, így a kép feldolgozása során már nem kell foglalkoznunk a szín részleteivel. A kép ily módon alakul át, amikor ez a lépés megtörtént
2. lépés: Minden képnek hasznos és haszontalan információi lesznek, ebben az esetben számunkra csak a rendszám a hasznos információ, a többi jóformán haszontalan a programunk számára. Ezt a haszontalan információt zajnak nevezzük. Normál esetben kétoldalú szűrő (Bluring) használatával a kép nem kívánt részleteit eltávolítja. A kód ugyanaz
szürke = cv2.bilateralFilter (szürke, 11, 17, 17)
A szintaxis a destination_image = cv2.bilateralFilter (forrás_kép, pixel átmérője, sigmaColor, sigmaSpace). Növelheti a szigma színét és a szigma teret 17-ről magasabbra, hogy elmosódjon a több háttérinformáció, de vigyázzon, hogy a hasznos rész ne legyen elmosódott. A kimeneti kép lent látható, mivel láthatja, hogy a háttér részletei (fa és épület) elmosódtak ebben a képben. Így elkerülhetjük, hogy a program később ezekre a régiókra koncentráljon.
3. lépés: A következő lépés érdekes, ahol éldetektálást hajtunk végre. Számos módszer létezik rá, a legkönnyebb és legnépszerűbb módszer az OpenCV canny edge módszerének használata . Az ehhez hasonló sor az alábbiakban látható
él = cv2.Canny (szürke, 30, 200) # Végezze el az él érzékelését
A szintaxis célja_image = cv2.Canny lesz (forrás_kép, 1. küszöbérték, 2. küszöbérték). Az 1. küszöbérték és a 2. küszöbérték a minimális és a maximális küszöbérték. Csak azok az élek jelennek meg, amelyek intenzitási gradiense meghaladja a minimális küszöbértéket és kisebb, mint a maximális küszöbérték. A kapott képet az alábbiakban mutatjuk be
4. lépés: Most elkezdhetjük keresni a kontúrokat a képünkön, korábbi oktatóanyagunkban már megtanultuk, hogyan találhatunk kontúrokat az OpenCV segítségével, így ugyanúgy járunk el.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = rendezve (cnts, kulcs = cv2.contourArea, fordított = Trueone) screenCnt
A számlálók észlelése után nagytól kicsiig válogatjuk őket, és csak az első 10 eredményt vesszük figyelembe, a többit figyelmen kívül hagyva. Képünkön a számláló bármi lehet, amelynek zárt felülete van, de az összes elért eredmény közül a rendszám is ott lesz, mivel ez is zárt felület.
A rendszámtábla képének szűrése a kapott eredmények között, az összes eredményt körbezárva ellenőrizzük, hogy melyik négyszög alakú kontúrja van négy oldalával és zárt ábrájával. Mivel a rendszám minden bizonnyal négyszögletes négyszög lenne.
# hurok c kontúrjaink felett cn-ben: # közelítse meg a kontúr perit = cv2.arcLength (c, True) kb = cv2.approxPolyDP (c, 0.018 * peri, True) # ha a hozzávetőleges kontúrunk négy pontot tartalmaz, akkor # mi feltételezhetjük, hogy megtaláltuk a képernyőn , ha len (kb) == 4: screenCnt = kb megtörni
A 0,018 érték kísérleti érték; játszhatsz körül, hogy ellenőrizhesd, melyik működik a legjobban. Vagy vigye fel a következő szintre úgy, hogy gépi tanulással autóképek alapján edz, majd ott használja a megfelelő értéket. Miután megtaláltuk a megfelelő számlálót, elmentjük a screenCnt nevű változóba , majd körbe rajzolunk egy téglalap alakú dobozt, hogy megbizonyosodhassunk arról, hogy a rendszámot helyesen észleltük.
5. lépés: Most, hogy tudjuk, hol van a rendszám, a fennmaradó információ nagyjából haszontalan számunkra. Tehát folytathatjuk a teljes kép eltakarását, kivéve azt a helyet, ahol a rendszám található. Az ehhez hasonló kód az alábbiakban látható
# A rendszámtáblán kívüli rész maszkolása = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (mask, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maszk)
A maszkos új kép az alábbihoz hasonló jelenik meg
2. Karakter szegmentálás
A Raspberry Pi rendszámtábla-felismerés következő lépése az, hogy a rendszámtáblát szegmentálja a képből azáltal, hogy levágja és új képként menti. Ezután felhasználhatjuk ezt a képet a benne lévő karakter felismerésére. A fő kép roi (érdeklődési körzet) képének kivágására szolgáló kód az alábbiakban látható
# Most vágjon le (x, y) = np.where (maszk == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Levágva = szürke
A kapott képet az alábbiakban mutatjuk be. Általában hozzáadva a kép kivágásához, szürkíthetjük is, és szükség esetén szegélyezhetjük is. Ez a következő lépésben a karakterfelismerés javítása érdekében történik. Azt tapasztaltam azonban, hogy az eredeti képpel is jól működik.
3. Karakterfelismerés
A Raspberry Pi rendszámtábla-felismerés utolsó lépése az, hogy a szegmentált képről leolvassa a rendszámtábla-információkat. A pytesseract csomag segítségével karaktereket olvashatunk le a képről, akárcsak az előző bemutatón. Az alábbiakban a kódot adjuk meg
# Olvassa el a rendszámtáblát text = pytesseract.image_to_string (Cropped, config = '- psm 11') print ("Az észlelt szám:", szöveg)
Már elmagyaráztuk a Tesseract motor konfigurálásának módját, ezért szükség esetén itt is újra beállíthatjuk a Tesseract OCR-t, hogy szükség esetén jobb eredményeket érjünk el. Az észlelt karaktert ezután kinyomtatja a konzolra. Összeállításakor az eredmény az alábbiak szerint jelenik meg
Mint látható, az eredeti képen a „HR 25 BR9044” szám volt látható, és programunk azt észlelte, hogy ugyanazt az értéket nyomtatta a képernyőn.
Sikertelen esetek a rendszámfelismerésben
A Raspberry Pi rendszámtábla-felismerés teljes projektfájlja innen letölthető, tartalmazza a programot és a tesztképeket, amelyekkel a programunkat ellenőriztük. Anélkül, hogy azt mondanánk, emlékeztetni kell arra, hogy a módszer eredményei nem lesznek pontosak . A pontosság a kép tisztaságától, tájolásától, a fény megvilágításától stb. A jobb eredmények érdekében megpróbálhatja megvalósítani a gépi tanulási algoritmusokat.
Hogy ötletet kapjunk, nézzünk meg egy másik példát, ahol az autó nem közvetlenül a kamerával néz.
Mint látható, programunk képes volt a rendszámtábla megfelelő felismerésére és kivágására. De a Tesseract könyvtár nem ismerte fel megfelelően a karaktereket. A tényleges „TS 08 UE 3396” helyett az OCR felismerte, hogy „1508 ti 3396”. Az ehhez hasonló problémákat jobb tájolású képek vagy a Tesseract motor konfigurálásával lehet orvosolni .
Egy másik legrosszabb eset az, amikor a kontúr nem érzékeli helyesen a rendszámtáblát. Az alábbi kép túl sok háttérinformációval és rossz megvilágítással rendelkezik, hogy a program még a rendszámot sem tudta azonosítani a számból. Ebben az esetben újra át kell térnünk a gépi tanulásra, vagy javítanunk kell a kép minőségét.
Egyéb sikeres példák
A képminőség és tájolás legtöbbször helyes, a program képes volt azonosítani a rendszámot, és kiolvasta belőle a számot. Az alábbi pillanatfelvételek kevés sikeres eredményt mutatnak. Ismét az összes tesztkép és az itt használt kód elérhető lesz az itt megadott ZIP fájlban.
Remélem, megértette az automatikus rendszámtábla-felismerést a Raspberry Pi használatával, és élvezettel önmaga épített valami jót. Mit gondolsz, mit lehet még tenni az OpenCV-vel és a Tesseract- szal ?, Tudassa velem a gondolatait a megjegyzés részben. Ha bármilyen kérdése van a cikkel kapcsolatban, hagyja nyugodtan az alábbi megjegyzés részben, vagy használja a fórumokat más technikai kérdésekre.