machineleesbare zones detecteren in paspoortafbeeldingen

mrz_output_04

de blog post van vandaag zou niet mogelijk zijn zonder Pyimagesearch Goeroes lid, Hans Boone. Hans werkt aan een computer vision project om automatisch Machine-readable Zones (Mrz ‘ s) te detecteren in passport images — net als de regio gedetecteerd in de afbeelding hierboven.

het MRZ-gebied in paspoorten of reiskaarten valt in twee klassen: Type 1 en type 3. Type 1 Mrz ‘ s zijn drie regels, waarbij elke regel 30 tekens bevat. Het type 3 MRZ heeft slechts twee regels, maar elke regel bevat 44 tekens. In beide gevallen codeert de MRZ de identificatiegegevens van een bepaalde burger, waaronder het type paspoort, paspoort-ID, land van afgifte, naam, nationaliteit, vervaldatum, enz.Binnen de Pyimagesearch goeroe cursus liet Hans me zijn voortgang zien en ik raakte meteen geïnteresseerd. Ik heb altijd al Computer vision algoritmen willen toepassen op paspoortafbeeldingen( voornamelijk voor de lol), maar miste de dataset om dit te doen. Gezien de persoonlijk identificeerbare informatie die een paspoort bevat, kon ik natuurlijk geen blogpost schrijven over het onderwerp en de beelden delen die ik gebruikte om het algoritme te ontwikkelen.

Gelukkig stemde Hans ermee in om enkele van de sample/specimen paspoortafbeeldingen te delen waar hij toegang toe heeft — en ik greep de kans om met deze afbeeldingen te spelen.

voordat we te ver gaan, is het belangrijk om op te merken dat deze paspoorten niet “echt” zijn in de zin dat ze kunnen worden gekoppeld aan een echt mens. Maar het zijn echte paspoorten die werden gegenereerd met valse namen, adressen, enz. voor ontwikkelaars om mee te werken.

je zou kunnen denken dat om de MRZ regio van een paspoort te detecteren je een beetje machine learning nodig hebt, misschien met behulp van Het lineaire SVM + HOG framework om een “MRZ detector” te construeren — maar dat zou overkill zijn.

in plaats daarvan kunnen we MRZ detectie uitvoeren met alleen basis beeldverwerkingstechnieken zoals drempelwaarden, morfologische bewerkingen en contoureigenschappen. In de rest van deze blogpost, Ik zal in detail mijn eigen kijk op hoe deze methoden toe te passen om de MRZ regio van een paspoort te detecteren.

op zoek naar de broncode van dit bericht?

Ga naar rechts naar de sectie Downloads

detecteren van machineleesbare zones in passport images

laten we dit project starten. Open een nieuw bestand, noem het detect_mrz.py en voer de volgende code in:

# 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))

lijnen 2-6 importeren onze benodigde pakketten. Ik neem aan dat je OpenCV al hebt geïnstalleerd. Je hebt ook imutils nodig, mijn verzameling comfortfuncties om basisbewerkingen voor beeldverwerking met OpenCV eenvoudiger te maken. U kunt imutils installeren met pip :

$ pip install --upgrade imutils

vanaf daar verwerken regels 9-11 het ontleden van ons commandoregelargument. We hebben hier slechts een enkele switch nodig, --images , dat is het pad naar de directory met de passport images die we gaan verwerken.

ten slotte initialiseren de regels 14 en 15 twee kernels die we later zullen gebruiken bij het toepassen van morfologische operaties, in het bijzonder de afsluitende operatie. Merk op dat de eerste kernel rechthoekig is met een breedte van ongeveer 3x groter dan de hoogte. De tweede kernel is vierkant. Deze kernels zullen ons toelaten om hiaten tussen MRZ karakters en openingen tussen MRZ regels te dichten.

nu onze opdrachtregelargumenten zijn ontleed, kunnen we beginnen met een looping over elk van de afbeeldingen in onze dataset en ze verwerken:

# 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)

lijnen 20 en 21 laadt onze originele afbeelding van de schijf en maakt het formaat ervan tot een maximale hoogte van 600 pixels. U kunt hieronder een voorbeeld van een originele afbeelding zien:

figuur 1: Onze originele paspoortafbeelding waarin we de MRZ proberen te detecteren.
figuur 1: Onze originele paspoortafbeelding waarin we de MRZ proberen te detecteren.

Gaussiaanse vervaging wordt toegepast op lijn 26 om hoogfrequente ruis te verminderen. We passen dan een blackhat morfologische operatie toe op het wazig, grijswaarden beeld op lijn 27.

een Blackhat-operator wordt gebruikt om donkere gebieden (m.a.w. MRZ-tekst) te onthullen tegen lichte achtergronden (m.a.w. de achtergrond van het paspoort zelf). Aangezien de paspoorttekst altijd zwart is op een lichte achtergrond (tenminste in termen van deze dataset), is een blackhat-operatie aangewezen. Hieronder kun je de uitvoer zien van het toepassen van de Blackhat operator:

Figuur 2: Het toepassen van de blackhat morfologische operator onthult de zwarte MRZ tekst tegen de lichte paspoort achtergrond.
Figuur 2: Het toepassen van de Blackhat morfologische operator onthult de zwarte MRZ-tekst tegen de lichte paspoortachtergrond.

de volgende stap in MRZ detectie is het berekenen van de gradient magnitude representatie van de blackhat afbeelding met behulp van de Scharr operator:

# 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")

hier berekenen we de Scharr-gradiënt langs de x-as van de Blackhat-afbeelding, die gebieden van de afbeelding laat zien die niet alleen donker zijn tegen een lichte achtergrond, maar ook verticale veranderingen in de gradiënt bevatten, zoals het MRZ-tekstgebied. We nemen dan deze gradiëntafbeelding en schalen het terug in het bereik met min / max schalen:

Figuur 3: Het toepassen van Scharr operator op onze blackhat afbeelding onthult regio ' s die sterke verticale veranderingen in gradiënt bevatten.
Figuur 3: Het toepassen van Scharr operator op onze blackhat-afbeelding onthult regio ‘ s die sterke verticale veranderingen in gradiënt bevatten.

hoewel het niet helemaal duidelijk is waarom we deze stap toepassen, zal ik zeggen dat het zeer nuttig is bij het verminderen van vals-positieve MRZ detecties. Zonder dat kunnen we per ongeluk verfraaid of ontworpen gebieden van het paspoort markeren als de MRZ. Ik laat dit als een oefening aan jou over om te verifiëren dat het berekenen van de gradiënt van het blackhat-beeld de nauwkeurigheid van MRZ-detectie kan verbeteren.

de volgende stap is om te proberen de werkelijke regels van de MRZ te detecteren:

# 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)

eerst passen we een afsluitoperatie toe met behulp van onze rechthoekige kernel. Deze sluitbewerking is bedoeld om hiaten tussen MRZ-karakters te dichten. Vervolgens passen we thresholding toe met behulp van de methode van Otsu om automatisch de afbeelding te drempelwaarden:

Figuur 4: Een afsluitoperatie uitvoeren met behulp van een rechthoekige kernel (die breder is dan hoog) om gaten te dichten tussen de MRZ-tekens
Figuur 4: Het toepassen van een afsluitoperatie met behulp van een rechthoekige kernel (die breder is dan hoog) om gaten te dichten tussen de MRZ-karakters

zoals we uit de bovenstaande figuur kunnen zien, is elk van de MRZ-regels aanwezig in onze drempelafbeelding.

de volgende stap is het dichten van de gaten tussen de werkelijke lijnen, waardoor we een groot rechthoekig gebied krijgen dat overeenkomt met de MRZ:

# 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)

hier voeren we een andere sluitoperatie uit, deze keer met behulp van onze vierkante kernel. Deze kernel wordt gebruikt om hiaten tussen de afzonderlijke lijnen van de MRZ te dichten, waardoor we een groot gebied krijgen dat overeenkomt met de MRZ. Een reeks erosies worden dan uitgevoerd om verbonden componenten die tijdens de sluiting kunnen zijn samengevoegd uit elkaar te breken. Deze erosies zijn ook nuttig bij het verwijderen van kleine blobs die niet relevant zijn voor de MRZ.

Figuur 5: een tweede afsluitoperatie wordt uitgevoerd, ditmaal met behulp van een vierkante kern om de gaten tussen afzonderlijke MRZ-lijnen te dichten.
Figuur 5: Een tweede afsluitoperatie wordt uitgevoerd, deze keer met behulp van een vierkante kern om de gaten tussen afzonderlijke MRZ-lijnen te dichten.

bij sommige paspoortscans kan de grens van het paspoort tijdens de sluitingsoperaties aan de MRZ-regio zijn gehecht. Om dit te verhelpen, zetten we 5% van de linker-en rechterrand van de afbeelding op nul (d.w.z., zwart):

# 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

u kunt de uitvoer van onze border verwijdering hieronder te zien.

Figuur 6: 5% van de pixels links en rechts op nul zetten, zodat het MRZ-gebied niet aan de gescande marge van het paspoort wordt bevestigd.
Figuur 6: 5% van de pixels links en rechts op nul zetten, zodat het MRZ-gebied niet aan de gescande marge van het paspoort wordt bevestigd.

vergeleken met Figuur 5 hierboven, kunt u nu zien dat de rand is verwijderd.

de laatste stap is het vinden van de contouren in onze dorsale afbeelding en het gebruik van contoureigenschappen om de MRZ te identificeren:

# 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)

op lijn 56-58 berekenen we de contouren (d.w.z., contouren) van ons dorste beeld. We nemen deze contouren en sorteren ze op basis van hun grootte in aflopende volgorde op lijn 59 (wat betekent dat de grootste contouren de eerste zijn in de lijst).

op Regel 62 beginnen we met een looping over onze gesorteerde lijst van contouren. Voor elk van deze contouren berekenen we het bounding box (lijn 66) en gebruiken het om twee eigenschappen te berekenen: de beeldverhouding en de dekkingsverhouding. De beeldverhouding is gewoon de breedte van het begrenzende kader gedeeld door de hoogte. De bedekkingsverhouding is de breedte van het begrenzingskader gedeeld door de breedte van de werkelijke afbeelding.

met behulp van deze twee eigenschappen kunnen we een controle uitvoeren op lijn 72 om te zien of we de MRZ-regio onderzoeken. De MRZ is rechthoekig, met een breedte die veel groter is dan de hoogte. De MRZ moet ook ten minste 75% van de invoerafbeelding overspannen.

op voorwaarde dat deze twee gevallen behouden blijven, gebruiken regels 75-84 de (x, y)-coördinaten van het bounding box om de MRZ te extraheren en het bounding box op onze invoerafbeelding te tekenen.

tenslotte tonen de regels 87-89 onze resultaten.

resultaten

voer het volgende commando uit om onze MRZ detector in actie te zien:

$ python detect_mrz.py --images examples

hieronder ziet u een voorbeeld van een succesvolle MRZ detectie, met de MRZ in het groen:

Figuur 7: links hebben we ons invoerbeeld. En rechts hebben we de MRZ-regio die met succes is ontdekt.
Figuur 7: links hebben we onze invoerafbeelding. En rechts hebben we de MRZ-regio die met succes is ontdekt.

hier is een ander voorbeeld van het detecteren van de machineleesbare Zone in een paspoortafbeelding met behulp van Python en OpenCV:

Figuur 8: Toepassing van MRZ-detectie op een gescand paspoort.
Figuur 8: Toepassing van MRZ-detectie op een gescand paspoort.

het maakt niet uit of de MRZ-regio aan de boven-of onderkant van de afbeelding staat. Door morfologische bewerkingen toe te passen, contouren te extraheren en contoureigenschappen te berekenen, kunnen we de MRZ probleemloos extraheren.

hetzelfde geldt voor de volgende afbeelding:

figuur 9: detecteren van machineleesbare zones in beelden met behulp van computer vision.
figuur 9: detecteren van machineleesbare zones in beelden met behulp van computervision.

laten we een andere afbeelding proberen:

Figuur 10: Ook hier kunnen we de MRZ in de paspoortscan detecteren met behulp van basisbeeldverwerkingstechnieken.
Figuur 10: Ook hier kunnen we de MRZ in de paspoortscan detecteren met behulp van basisbeeldverwerkingstechnieken.

tot nu toe hebben we alleen Type 1 Mrz ‘ s gezien die drie regels bevatten. Onze methode werkt echter net zo goed met type 3 Mrz ‘ s die slechts twee regels bevatten:

Figuur 11: detecteren van de MRZ in een type 3 paspoortafbeelding met behulp van Python en OpenCV.
Figuur 11: Detecteren van de MRZ in een type 3 paspoort image met behulp van Python en OpenCV.

hier is een ander voorbeeld van het detecteren van een type 3 MRZ:

Figuur 12: computervisie en beeldverwerking toepassen om machineleesbare zones in beelden te detecteren.
Figuur 12: computervisie en beeldverwerking toepassen om machineleesbare zones in beelden te detecteren.

Wat is het volgende? Ik raad PyImageSearch University aan.

Cursusinformatie:
30 + totaal aantal lessen * 39u 44m video * laatst bijgewerkt: 12/2021
★★★★★ 4.84 (128 Ratings) * 3.000+ studenten ingeschreven

ik ben er sterk van overtuigd dat als je de juiste leraar je computer visie en deep learning zou kunnen beheersen.

denkt u dat het leren van computervisie en diep leren tijdrovend, overweldigend en ingewikkeld moet zijn? Of om complexe wiskunde en vergelijkingen te betrekken? Of vereist een graad in informatica?

dat is niet het geval.

alles wat je nodig hebt om computer vision en deep learning onder de knie te krijgen is dat iemand je dingen in eenvoudige, intuïtieve termen uitlegt. En dat is precies wat ik doe. Mijn missie is om het onderwijs te veranderen en hoe complexe onderwerpen van kunstmatige intelligentie worden onderwezen.

als je serieus bent over het leren van computer vision, moet je volgende stop PyImageSearch University zijn, de meest uitgebreide computer vision, deep learning en OpenCV cursus die vandaag online is. Hier leer je hoe je computer vision succesvol en met vertrouwen kunt toepassen op je werk, onderzoek en projecten. Doe mee aan computer vision mastery.

binnen PyImageSearch University vindt u:

  • &controleren; 30+ cursussen over essentiële computer vision, deep learning en OpenCV-onderwerpen
  • ✓ 30+ certificaten van voltooiing
  • ✓ 39h 44m on-demand video
  • ✓ elke maand nieuwe cursussen die ervoor zorgen dat u de nieuwste technieken kunt volgen
  • ✓ vooraf geconfigureerde Jupyter-Notebooks in Google Colab
  • &controleer; voer alle codevoorbeelden uit in uw webbrowser-werkt op Windows, MacOS en Linux (geen dev-omgevingsconfiguratie vereist!)
  • &controleren; Toegang tot gecentraliseerde code repo ‘ s voor alle 500+ tutorials op PyImageSearch
  • ✓ eenvoudige één-klik downloads voor code, datasets, voorgetrainde modellen, enz.
  • &controleer; toegang op mobiel, laptop, desktop, enz.

Klik hier om deel te nemen aan PyImageSearch University

samenvatting

In deze blogpost hebben we geleerd hoe we machineleesbare Zones (Mrz ‘ s) in paspoortscans kunnen detecteren met alleen basisbeeldverwerkingstechnieken, namelijk:

  • drempel.
  • verlopen.
  • morfologische bewerkingen (met name dichtingen en erosies).
  • Contoureigenschappen.

deze bewerkingen, hoewel eenvoudig, stelden ons in staat om de MRZ-regio ‘ s in afbeeldingen te detecteren zonder te hoeven vertrouwen op meer geavanceerde extractie-en machine learning-methoden zoals lineaire SVM + HOG voor objectdetectie.

onthoud, wanneer u wordt geconfronteerd met een uitdagend computervisieprobleem — overweeg altijd het probleem en uw veronderstellingen! Zoals deze blog post laat zien, je zou verbaasd zijn wat basis beeldverwerking functies gebruikt in tandem kan bereiken.

nogmaals een grote dank aan Hans Boone, lid van PyImageSearch Goeroes, die ons deze voorbeelden van paspoortafbeeldingen heeft gegeven! Bedankt Hans!

Leave a Reply

Het e-mailadres wordt niet gepubliceerd.