Passport Validator

2023

A guilloche contour is crossed by a blue scanner band and sparse registration marks beside an indigo field.

What it does

Passport Validator takes an image of a scanned passport and returns the holder's structured information together with a separate portrait image. The project focuses on the machine-readable zone, or MRZ: the two lines of standardized characters printed at the bottom of a passport identity page.

Reading those lines is only the first step. OCR can produce text that looks plausible while changing a single character, and one character is enough to make a passport number or date wrong. The tool therefore treats extraction and validation as separate jobs.

How it works

PassportEye locates the MRZ and returns its raw text. I then parse the fields myself according to ICAO 9303, including the document type, name, nationality, passport number, date of birth, expiration date, and country-specific optional data.

The validator implements the ICAO check-digit algorithm for the passport number, birth date, and expiration date. Each check digit is calculated from the field that precedes it, so the program can report whether an extracted value is internally consistent instead of merely repeating the OCR output.

The country code is resolved through pycountry, and face_recognition isolates the portrait from the page and saves it separately. The command-line entry point keeps the workflow simple: provide an image, parse and validate the MRZ, then extract the face.

What I learned

The useful lesson was that standards make ambiguous documents tractable. OCR alone gives probabilities; ICAO 9303 adds positions, field lengths, and checksums that can challenge the OCR result. Combining a statistical tool with deterministic constraints produced something much more useful than either approach alone.

The project implements a focused subset of the standard rather than pretending to be a complete identity-verification system. It parses the fields present in the MRZ, validates three check digits, maps country codes, and preserves optional data without trying to infer what every country stores there.

View the source on GitHub

Провера пасоша

2023

Гијоширане контуре пресеца плава трака скенера са ретким регистрационим ознакама поред индиго поља.

Шта ради

Програм прима слику скенираног пасоша и враћа уређене податке о власнику, као и засебну слику његове фотографије. Пројекат се усредсређује на машински читљиву зону, односно два реда стандардизованих знакова при дну странице са личним подацима.

Само читање тих редова није довољно. OCR може да произведе текст који делује уверљиво, а ипак промени један знак. Један погрешан знак довољан је да број пасоша или датум буду нетачни. Зато су издвајање текста и провера података два одвојена корака.

Како ради

PassportEye проналази машински читљиву зону и враћа њен сирови текст. Затим самостално рашчлањујем поља према стандарду ICAO 9303: врсту документа, име, држављанство, број пасоша, датум рођења, датум истека и необавезне податке чије значење одређује свака држава.

Програм примењује ICAO алгоритам контролне цифре на број пасоша, датум рођења и датум истека. Контролна цифра израчунава се из поља које јој претходи, па програм може да покаже да ли је издвојена вредност унутрашње доследна, уместо да само понови резултат OCR-а.

Ознака државе разрешава се помоћу библиотеке pycountry, а face_recognition проналази фотографију на страници и чува је као засебну слику. Рад из командне линије остаје једноставан: учитати слику, рашчланити и проверити зону, па издвојити фотографију.

Шта сам научио

Најважнија поука била је да стандард може нејасан документ да претвори у решив проблем. OCR даје вероватне знакове; ICAO 9303 додаје положаје, дужине поља и контролне суме којима можемо да проверимо тај резултат. Спој статистичког алата и непроменљивих правила био је знатно кориснији од сваког приступа појединачно.

Пројекат намерно примењује ограничен део стандарда и не представља се као потпун систем за проверу идентитета. Рашчлањује поља из машински читљиве зоне, проверава три контролне цифре, повезује ознаке са државама и чува необавезне податке без нагађања шта свака држава у њима записује.

Погледајте изворни код на GitHub-у