géppel olvasható zónák észlelése útlevélképekben
a mai blogbejegyzés nem lenne lehetséges a PyImageSearch Gurus tag nélkül, Hans Boone. Hans egy számítógépes látásprojekten dolgozik, amely automatikusan felismeri a géppel olvasható zónákat (MRZs) az útlevélképekben — hasonlóan a fenti képen észlelt régióhoz.
az útlevelek vagy utazási kártyák MRZ régiója két osztályba sorolható: 1.és 3. Típus. Az 1. típusú MRZ-k három sor, mindegyik sor 30 karaktert tartalmaz. A 3. típusú MRZ-nek csak két sora van, de minden sor 44 karaktert tartalmaz. Mindkét esetben az MRZ kódolja az adott állampolgár azonosító adatait, beleértve az útlevél típusát, az útlevél azonosítóját, a kibocsátó országot, a nevet, az állampolgárságot, a lejárati dátumot stb.
a PyImageSearch Gurus tanfolyamon Hans megmutatta nekem a projekt előrehaladását, és azonnal érdeklődni kezdtem. Mindig is szerettem volna számítógépes látás algoritmusokat alkalmazni az útlevélképekre (főleg szórakozásból), de ehhez hiányzott az adatkészlet. Tekintettel az útlevélben található személyes azonosító adatokra, nyilvánvalóan nem tudtam blogbejegyzést írni a témáról, és megosztani az algoritmus fejlesztéséhez használt képeket.
szerencsére Hans beleegyezett, hogy megossza néhány minta/minta útlevél képet, amelyekhez hozzáfér — én pedig megragadtam a lehetőséget, hogy játszhassak ezekkel a képekkel.
most, mielőtt messzire eljutnánk, fontos megjegyezni, hogy ezek az útlevelek nem “valódiak” abban az értelemben, hogy összekapcsolhatók egy tényleges emberrel. De ezek valódi útlevelek, amelyeket hamis nevek, címek stb. a fejlesztők dolgozni.
azt gondolhatnánk, hogy az útlevél MRZ régiójának észleléséhez egy kis gépi tanulásra van szükség, talán a lineáris SVM + HOG keretrendszer segítségével egy “MRZ detektor” felépítéséhez — de ez túlzás lenne.
ehelyett az MRZ detektálást csak olyan alapvető képfeldolgozási technikákkal tudjuk elvégezni, mint a küszöb, a morfológiai műveletek és a kontúrtulajdonságok. A blogbejegyzés fennmaradó részében részletesen bemutatom, hogyan alkalmazhatom ezeket a módszereket az útlevél MRZ régiójának kimutatására.
keresi a forráskódot ehhez a bejegyzéshez?
ugrás jobbra a Letöltések szakaszra
géppel olvasható zónák észlelése útlevélképeken
menjünk előre és kezdjük el ezt a projektet. Nyisson meg egy új fájlt, nevezze el detect_mrz.py
néven, majd írja be a következő kódot:
# import the necessary packagesfrom imutils import pathsimport numpy as npimport argparseimport imutilsimport cv2# construct the argument parse and parse the argumentsap = argparse.ArgumentParser()ap.add_argument("-i", "--images", required=True, help="path to images directory")args = vars(ap.parse_args())# initialize a rectangular and square structuring kernelrectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 21))
a 2-6. sor importálja a szükséges csomagokat. Feltételezem, hogy már telepítette az OpenCV-t. Szüksége lesz az imutils-re is, a kényelmi funkciók gyűjteményére, hogy megkönnyítse az alapvető képfeldolgozási műveleteket az OpenCV segítségével. A imutils
telepítése a pip
használatával lehetséges :
$ pip install --upgrade imutils
innen a 9-11 sorok kezelik a parancssori argumentum elemzését. Itt csak egyetlen kapcsolóra van szükségünk, --images
, amely a feldolgozni kívánt útlevélképeket tartalmazó könyvtár elérési útja.
végül a 14-es és a 15-ös sorok két magot inicializálnak, amelyeket később morfológiai műveletek alkalmazásakor fogunk használni, különösen a záró műveletnél. Egyelőre egyszerűen vegye figyelembe, hogy az első kernel téglalap alakú, szélessége körülbelül 3x nagyobb, mint a magasság. A második kernel négyzet alakú. Ezek a kernelek lehetővé teszik számunkra, hogy megszüntessük az MRZ karakterek közötti réseket és az MRZ sorok közötti nyílásokat.
most, hogy a parancssori argumentumokat elemeztük, elkezdhetjük az adatkészletünk minden egyes képének hurkolását, és feldolgozhatjuk őket:
# loop over the input image pathsfor imagePath in paths.list_images(args):# load the image, resize it, and convert it to grayscaleimage = cv2.imread(imagePath)image = imutils.resize(image, height=600)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# smooth the image using a 3x3 Gaussian, then apply the blackhat# morphological operator to find dark regions on a light backgroundgray = cv2.GaussianBlur(gray, (3, 3), 0)blackhat = cv2.morphologyEx(gray, cv2.MORPH_BLACKHAT, rectKernel)
a 20. és 21. sor betölti az eredeti képet a lemezről, és átméretezi, hogy maximális magassága 600 pixel legyen. Az alábbiakban láthat egy példát az eredeti képre:
Gauss-elmosódást alkalmaznak a 26.vonalon a nagyfrekvenciás zaj csökkentése érdekében. Ezután blackhat morfológiai műveletet alkalmazunk az elmosódott, szürkeárnyalatos képre a 27. vonalon.
a blackhat operátort a sötét régiók (azaz az MRZ szöveg) világos háttérrel (azaz maga az útlevél hátterével) történő feltárására használják. Mivel az útlevél szövege világos háttéren mindig fekete (legalábbis ezen adatkészlet szempontjából), a blackhat művelet megfelelő. Az alábbiakban láthatja a blackhat operátor alkalmazásának kimenetét:
az MRZ detektálás következő lépése a blackhat kép gradiens nagyságú ábrázolásának kiszámítása a Scharr operátor segítségével:
# compute the Scharr gradient of the blackhat image and scale the# result into the range gradX = cv2.Sobel(blackhat, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)gradX = np.absolute(gradX)(minVal, maxVal) = (np.min(gradX), np.max(gradX))gradX = (255 * ((gradX - minVal) / (maxVal - minVal))).astype("uint8")
itt kiszámítjuk a Scharr gradienst a blackhat kép x tengelye mentén, feltárva a kép olyan területeit, amelyek nem csak sötétek a világos háttér előtt, hanem függőleges változásokat is tartalmaznak a gradiensben, például az MRZ szöveges régiót. Ezután ezt a gradiens képet visszaminősítjük a tartományba min / max méretezéssel:
bár nem teljesen nyilvánvaló, hogy miért alkalmazzuk ezt a lépést, azt mondom, hogy rendkívül hasznos a hamis pozitív MRZ észlelések csökkentésében. Enélkül véletlenül megjelölhetjük az útlevél díszített vagy tervezett régióit MRZ-ként. Ezt gyakorlatként hagyom Önnek, hogy ellenőrizze, hogy a blackhat kép gradiensének kiszámítása javíthatja-e az MRZ észlelési pontosságát.
a következő lépés az MRZ tényleges vonalainak észlelése:
# apply a closing operation using the rectangular kernel to close# gaps in between letters -- then apply Otsu's thresholding methodgradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel)thresh = cv2.threshold(gradX, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
először egy záró műveletet alkalmazunk a négyszögletes kernel segítségével. Ez a záró művelet célja az MRZ karakterek közötti rések megszüntetése. Ezután az Otsu módszerével küszöböt alkalmazunk a kép automatikus küszöbértékére:
amint a fenti ábrából láthatjuk, az MRZ vonalak mindegyike jelen van a küszöbtérképünkben.
a következő lépés a tényleges vonalak közötti rések lezárása, így egy nagy téglalap alakú régiót kapunk, amely megfelel az MRZ-nek:
# perform another closing operation, this time using the square# kernel to close gaps between lines of the MRZ, then perform a# series of erosions to break apart connected componentsthresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel)thresh = cv2.erode(thresh, None, iterations=4)
itt egy újabb záró műveletet hajtunk végre, ezúttal a négyzetmagunk segítségével. Ez a kernel az MRZ egyes vonalai közötti rések lezárására szolgál, így egy nagy régiót kapunk, amely megfelel az MRZ-nek. Ezután egy sor eróziót hajtanak végre a csatlakoztatott alkatrészek szétválasztására, amelyek esetleg a zárási művelet során csatlakoztak. Ezek az eróziók hasznosak az MRZ szempontjából irreleváns kis foltok eltávolításában is.
egyes útlevélvizsgálatok esetén az útlevél határa a zárási műveletek során kapcsolódhatott az MRZ régióhoz. Ennek orvoslására a kép bal és jobb szélének 5% – át nullára állítjuk (azaz fekete):
# during thresholding, it's possible that border pixels were# included in the thresholding, so let's set 5% of the left and# right borders to zerop = int(image.shape * 0.05)thresh = 0thresh - p:] = 0
az alábbiakban láthatja a határ eltávolításának kimenetét.
a fenti 5.ábrához képest most láthatja, hogy a szegélyt eltávolították.
az utolsó lépés az, hogy megtaláljuk a kontúrokat a küszöb képünkön, és a kontúrtulajdonságok segítségével azonosítsuk az MRZ-t:
# find contours in the thresholded image and sort them by their# sizecnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)cnts = sorted(cnts, key=cv2.contourArea, reverse=True)# loop over the contoursfor c in cnts:# compute the bounding box of the contour and use the contour to# compute the aspect ratio and coverage ratio of the bounding box# width to the width of the image(x, y, w, h) = cv2.boundingRect(c)ar = w / float(h)crWidth = w / float(gray.shape)# check to see if the aspect ratio and coverage width are within# acceptable criteriaif ar > 5 and crWidth > 0.75:# pad the bounding box since we applied erosions and now need# to re-grow itpX = int((x + w) * 0.03)pY = int((y + h) * 0.03)(x, y) = (x - pX, y - pY)(w, h) = (w + (pX * 2), h + (pY * 2))# extract the ROI from the image and draw a bounding box# surrounding the MRZroi = image.copy()cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)break# show the output imagescv2.imshow("Image", image)cv2.imshow("ROI", roi)cv2.waitKey(0)
az 56-58. sorban kiszámítjuk a küszöb képünk kontúrjait (azaz körvonalait). Ezután vesszük ezeket a kontúrokat, és méretük alapján csökkenő sorrendben rendezzük őket az 59. sorban (ami azt jelenti, hogy a legnagyobb kontúrok az elsők a listában).
a 62.sorban elkezdünk hurkolni a kontúrok rendezett listáján. Ezen kontúrok mindegyikéhez kiszámítjuk a határoló négyzetet (66.sor), és két tulajdonság kiszámítására használjuk: a képarányt és a lefedettségi arányt. A képarány egyszerűen a határoló doboz szélessége osztva a magassággal. A lefedettségi arány a határoló doboz szélessége osztva a tényleges kép szélességével.
e két tulajdonság felhasználásával ellenőrizhetjük a 72.sorban, hogy megvizsgáljuk-e az MRZ régiót. Az MRZ téglalap alakú, szélessége sokkal nagyobb, mint a magasság. Az MRZ-nek a bemeneti kép legalább 75% – át is el kell terjednie.
feltéve, hogy ez a két eset áll fenn, a 75-84 vonalak a határoló doboz (x, y) koordinátáit használják az MRZ kibontásához és a határoló doboz megrajzolásához a bemeneti képen.
végül a 87-89 sorok mutatják az eredményeket.
eredmények
az MRZ detektor működésének megtekintéséhez hajtsa végre a következő parancsot:
$ python detect_mrz.py --images examples
alább látható egy példa a sikeres MRZ felismerés, az MRZ vázolt zöld:
itt egy másik példa a géppel olvasható zóna észlelésére egy útlevélképben Python és OpenCV használatával:
nem számít, hogy az MRZ régió a kép tetején vagy alján található-e. Morfológiai műveletek alkalmazásával, kontúrok kivonásával és kontúrtulajdonságok kiszámításával képesek vagyunk az MRZ problémamentesen kivonni.
ugyanez igaz a következő képre:
adjunk egy másik képet egy próbát:
eddig csak az 1.típusú MRZ-ket láttuk, amelyek három sort tartalmaznak. Módszerünk azonban ugyanolyan jól működik a 3. típusú MRZ-kkel, amelyek csak két sort tartalmaznak:
Íme egy másik példa a 3-as típusú MRZ kimutatására:
mi a következő lépés? Ajánlom a PyImageSearch egyetemet.
30 + összes osztály • 39H 44m videó * Utolsó frissítés: 12/2021
★★★★★ 4.84 (128 * 3000 + beiratkozott hallgató
erősen hiszem, hogy ha megfelelő tanárod lenne, akkor elsajátíthatnád a számítógépes látást és a mély tanulást.
gondolod, hogy a számítógépes látás és a mély tanulás tanulása időigényes, elsöprő és bonyolult? Vagy bonyolult matematika és egyenletek? Vagy számítógépes diplomát igényel?
ez nem így van.
mindössze annyit kell tennie, hogy elsajátítsa a számítógépes látást és a mély tanulást, hogy valaki egyszerű, intuitív módon magyarázza el a dolgokat. És pontosan ezt teszem. Küldetésem az oktatás megváltoztatása és a mesterséges intelligencia témáinak komplex oktatása.
ha komolyan tanul számítógépes látás, a következő megálló legyen PyImageSearch University, a legátfogóbb számítógépes látás, mély tanulás, és OpenCV természetesen ma online. Itt megtudhatja, hogyan lehet sikeresen és magabiztosan alkalmazni a számítógépes látást munkájára, kutatására és projektjeire. Csatlakozzon hozzám a számítógépes látás elsajátításában.
a PyImageSearch Egyetemen belül megtalálod:
- &ellenőrzés; 30+ tanfolyamok alapvető számítógépes látás, mély tanulás, és OpenCV témák
- &ellenőrzés; 30+ bizonyítványok befejezése
- &ellenőrzés; 39H 44M on-demand videó
- &ellenőrzés; vadonatúj tanfolyamok megjelent minden hónapban, biztosítva akkor lépést tartani a state-of-the-art technikák
- &ellenőrzés; előre konfigurált Jupyter notebookok a Google Colab-ban
- &ellenőrzés; futtassa az összes kódpéldát a webböngészőben — Windows, MacOS és Linux rendszeren működik (nincs szükség fejlesztői környezet konfigurálására!)
- &ellenőrzés; Hozzáférés a központosított kód repos minden 500 + oktatóanyagok PyImageSearch
- & ellenőrzés; Egyszerű egy kattintással Letöltések kód, adatkészletek, előre képzett modellek, stb.
- & ellenőrzés; hozzáférés mobilon, laptopon, asztalon stb.
kattintson ide, hogy csatlakozzon PyImageSearch University
összefoglaló
ebben a blogbejegyzésben megtanultuk, hogyan kell felismerni a géppel olvasható zónák (MRZ) útlevél vizsgál csak az alapvető képfeldolgozási technikák, nevezetesen:
- küszöb.
- színátmenetek.
- morfológiai műveletek (konkrétan zárások és eróziók).
- Kontúrtulajdonságok.
ezek a műveletek, bár egyszerűek, lehetővé tették számunkra az MRZ régiók észlelését a képeken anélkül, hogy fejlettebb funkciókinyerési és gépi tanulási módszerekre kellene támaszkodnunk, mint például a lineáris SVM + HOG az objektumérzékeléshez.
ne feledje, amikor kihívást jelentő számítógépes látásproblémával szembesül — mindig vegye figyelembe a problémát és feltételezéseit! Amint ez a blogbejegyzés bemutatja, meglepődhet, hogy a tandemben használt alapvető képfeldolgozási funkciók mit tudnak elérni.
még egyszer, egy nagy köszönet PyImageSearch Gurus tagja, Hans Boone, aki szállított nekünk ezeket a példát útlevél képek! Köszönöm Hans!