Dowody Osobiste
Dowody Osobiste - detekcja i odczytywanie treści przekazanych kopii dowodów osobistych.
Ten dokument opisuje sposób instalacji i integracji podsystemu detekcji i odczytu treści kart zawierających zdjęcia polskich dowodów osobistych z systemem FormAnalyzer RBEE.
Zdjęcia dowodów osobistych mogą być dostarczane zarówno jako pojedyncze karty zawierające tylko obraz dowodu osobistego jak i w postaci zdjęć zawierających dowód osobisty na tle innych przedmiotów.
Zadaniem modułu detekcji i odczytu dowodów osobistych jest:
- Sprawdzenie czy dana strona dokumentacji zawiera zdjęcie dowodu osobistego.
- Określenie w jakim miejscu na stronie znajduje się zdjęcie dowodu osobistego. Brana jest pod uwagę możliwość występowania na jednej karcie dokumentacji zarówno zdjęcie wierzchniej jak i spodniej strony dowodu osobistego.
- Odczyt treści zdjęć dowodów osobistych i standaryzowanie odczytanych danych według wzorca dowodu.
Moduł detekcji i odczytu dowodów osobistych wykorzystuje system sztucznej inteligencji Tensorflow i może być wspomagany sprzętowym rozwiązaniem przyspieszającym obliczenia.
Projekt
Jeżeli w określonym projekcie chcemy wykrywać karty zawierające zdjęcia dowodów osobistych to należy w cechach projektu zaznaczyć pole: Wyszukuj obrazy dowodów osobistych
Po aktywowaniu tego pola system, w trakcie odczytu przesyłek, będzie sprawdzał czy poszczególna strona zawiera zdjęcie dowodu osobistego. Jeżeli zdjęcie dowodu osobistego zostanie wykryte wówczas będzie zastosowany specjalizowany mechanizm czytania treści dowodu osobistego a odczytane dane wraz z specjalnymi etykietami umieszczone jako wynik odczytania karty. Pozostała treść karty nie będzie czytana.
Uwaga detekcja dowodu osobistego (bez GPU) to około 0.2 sekundy dla każdej przetwarzanej strony!
Typ Dokumentu
W projekcie należy utworzyć jeden typ dokumentu odpowiadający treści dowodu osobistego i aktywować pole "Dowód osobisty".
Pola dla dowodu osobistego
Nazwisko nazwisko |
Etykieta:
NAZWISKOOKSIWZAN
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Inny
Funkcja JS wyznaczania wartości:
Wyodrębnianie metadanych: TAK
Weryfikacja: NIE function (value, docValue) { function rezultat(value, kod, wiadomosc) { // kod == 0 => sukces // kod > 0 => błąd // kod < 0 => ostrzeżenie // value: string | number | Date // dla wartości kod > 0 wartość value będzie ignorowana. return { value: value, error: kod, message: wiadomosc }; } // in browser activate debugger break // debugger; if (!value || !value.length) return rezultat(value, 1, "EMPTY"); if (value.length > 1) return rezultat(value, 2, "TOO MANY"); var val = value[0]; var nen = docValue.nazwisko_en ; if (nen && nen.length) nen = nen[0].wartosc ; else nen = ""; if (val.wartosc == "RZPOLDOODLOPZR" || !val.wartosc) { val.wartosc = nen ; } if (val.wartosc == "RZPOLDOODLOPZR" || !val.wartosc) { val.wartosc = "" ; } return rezultat(value, 0, "OK"); } |
Imiona imie |
Etykieta:
IMIONAANOIMI
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Inny
Funkcja JS wyznaczania wartości:
Wyodrębnianie metadanych: TAK
Weryfikacja: NIE function (value, docValue) { function rezultat(value, kod, wiadomosc) { // kod == 0 => sukces // kod > 0 => błąd // kod < 0 => ostrzeżenie // value: string | number | Date // dla wartości kod > 0 wartość value będzie ignorowana. return { value: value, error: kod, message: wiadomosc }; } // in browser activate debugger break // debugger; if (!value || !value.length) return rezultat(value, 1, "EMPTY"); if (value.length > 1) return rezultat(value, 2, "TOO MANY"); var imp = docValue.imie_pen; if (imp && imp.length) imp = imp[0].wartosc; if (imp === "RZPOLDOODLOPZR" || !imp) imp = ""; var imd = docValue.imie_den; if (imd && imd.length) imd = imd[0].wartosc; if (imd === "RZPOLDOODLOPZR" || !imd) imd = ""; var val = value[0]; if (val.wartosc == "RZPOLDOODLOPZR" || !val.wartosc) { if (imp && imd) val.wartosc = "".concat(imp, " ", imd); else { val.wartosc = "" ; if (imp) val.wartosc = imp; if (imd) val.wartosc = imd ; } } return rezultat(value, 0, "OK"); } |
Nazwisko rodowe |
Etykieta:
NAZWISKORODOWEEWODOROKSIWZAN
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Inny
Funkcja JS wyznaczania wartości:
Wyodrębnianie metadanych: TAK
Weryfikacja: NIE function (value, docValue) { function rezultat(value, kod, wiadomosc) { // kod == 0 => sukces // kod > 0 => błąd // kod < 0 => ostrzeżenie // value: string | number | Date // dla wartości kod > 0 wartość value będzie ignorowana. return { value: value, error: kod, message: wiadomosc }; } // in browser activate debugger break // debugger; if (!value || !value.length) return rezultat(value, 1, "EMPTY"); if (value.length > 1) return rezultat(value, 2, "TOO MANY"); var val = value[0]; if (val.wartosc == "RZPOLDOODLOPZR") { val.wartosc = "" } return rezultat(value, 0, "OK"); } |
Imiona Rodziców |
Etykieta:
IMIONARODZICOWWOCIZDORANOIMI
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Inny
Funkcja JS wyznaczania wartości:
Wyodrębnianie metadanych: TAK
Weryfikacja: NIE function (value, docValue) { function rezultat(value, kod, wiadomosc) { // kod == 0 => sukces // kod > 0 => błąd // kod < 0 => ostrzeżenie // value: string | number | Date // dla wartości kod > 0 wartość value będzie ignorowana. return { value: value, error: kod, message: wiadomosc }; } // in browser activate debugger break // debugger; if (!value || !value.length) return rezultat(value, 1, "EMPTY"); if (value.length > 1) return rezultat(value, 2, "TOO MANY"); var val = value[0]; if (val.wartosc == "RZPOLDOODLOPZR") { val.wartosc = "" } return rezultat(value, 0, "OK"); } |
Data urodzenia |
Etykieta:
DATAURODZENIAAINEZDORUATAD
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Data
|
PESEL |
Etykieta:
PESELLESEP
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
PESEL
|
Numer dowodu |
Etykieta:
NUMERREMUN
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Inny
wzorce:
[A-Z]{3}\s{0,5}\d{6}
|
Termin ważności |
Etykieta:
TERMINNIMRET
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Data
|
Nazwisko EN Nazwisko zapisane bez polskich znaków diakrytycznych |
Etykieta:
NAZWISKOENNEOKSIWZAN
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Inny
|
Imię Pierwsze EN imie_pen Imię zapisane bez polskich znaków diakrytycznych |
Etykieta:
IMIEPENNEPEIMI
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Inny
|
Imię Drugie EN imie_den Imię zapisane bez polskich znaków diakrytycznych |
Etykieta:
IMIEDENNEDEIMI
Obszar wyszukiwania:
część linii, wysokość 1
typ pola:
Inny
|
Instalacja i konfiguracja
Instalacja i konfiguracja dodatkowej funkcjonalności detekcji i odczytywania dowodów osobistych obejmuje:
- Instalacje (aktualizacje) systemu FormAnalyzer RBEE do wersji co najmniej 1.4.0
Instalację należy dokonać zgodnie z dostarczonym dokumentem aktualizacji systemu. - Instalacje modułu detekcji i odczytu dowodów osobistych FormAnalyzer RBEE DO
- Konfiguracje modułów FormAnalyzer RBEE Text Extractor do współpracy z FormAnalyzer RBEE DO.
Instalacja modułu detekcji i odczytu dowodów osobistych - FormAnalyzer RBEE DO
Moduł detekcji i odczytu dowodów osobistych - FormAnalyzer RBEE DO korzysta z systemu Tensorflow i interpretera Python. Konieczne jest wykonanie następujących czynności instalacyjnych:
- Instalacja środowiska Python wersja 3.8 wraz z umożliwieniem korzystania przez wszystkich użytkowników stacji roboczej.
python-3.8.6-amd64.exe
- Instalacja środowiska Tensorflow 2.4
pip3 install tensorflow lub dla środowiska zamkniętego pip3 --retries 0 install wheel-0.36.2-py2.py3-none-any.whl pip3 --retries 0 install six-1.15.0-py2.py3-none-any.whl pip3 --retries 0 install astunparse-1.6.3-py2.py3-none-any.whl pip3 --retries 0 install protobuf-3.14.0-py2.py3-none-any.whl pip3 --retries 0 install gast-0.3.3-py2.py3-none-any.whl pip3 --retries 0 install termcolor-1.1.0.tar.gz pip3 --retries 0 install numpy-1.18.5-cp38-cp38-win_amd64.whl pip3 --retries 0 install h5py-2.10.0-cp38-cp38-win_amd64.whl pip3 --retries 0 install wrapt-1.12.1.tar.gz pip3 --retries 0 install urllib3-1.26.2-py2.py3-none-any.whl pip3 --retries 0 install requests-2.25.0-py2.py3-none-any.whl pip3 --retries 0 install chardet-3.0.4-py2.py3-none-any.whl pip3 --retries 0 install absl_py-0.11.0-py3-none-any.whl pip3 --retries 0 install google_pasta-0.2.0-py3-none-any.whl pip3 --retries 0 install Keras_Preprocessing-1.1.2-py2.py3-none-any.whl pip3 --retries 0 install tensorflow_estimator-2.3.0-py2.py3-none-any.whl pip3 --retries 0 install opt_einsum-3.3.0-py3-none-any.whl pip3 --retries 0 install pyasn1-0.4.8-py2.py3-none-any.whl pip3 --retries 0 install pyasn1_modules-0.2.8-py2.py3-none-any.whl pip3 --retries 0 install rsa-4.6-py3-none-any.whl pip3 --retries 0 install cachetools-4.2.0-py3-none-any.whl pip3 --retries 0 install google_auth-1.24.0-py2.py3-none-any.whl pip3 --retries 0 install idna-2.10-py2.py3-none-any.whl pip3 --retries 0 install urllib3-1.26.2-py2.py3-none-any.whl pip3 --retries 0 install certifi-2020.12.5-py2.py3-none-any.whl pip3 --retries 0 install requests-2.25.0-py2.py3-none-any.whl pip3 --retries 0 install oauthlib-3.1.0-py2.py3-none-any.whl pip3 --retries 0 install requests_oauthlib-1.3.0-py2.py3-none-any.whl pip3 --retries 0 install google_auth_oauthlib-0.4.2-py2.py3-none-any.whl pip3 --retries 0 install Werkzeug-1.0.1-py2.py3-none-any.whl pip3 --retries 0 install tensorboard_plugin_wit-1.7.0-py3-none-any.whl pip3 --retries 0 install Markdown-3.3.3-py3-none-any.whl pip3 --retries 0 install grpcio-1.34.0-cp38-cp38-win_amd64.whl pip3 --retries 0 install tensorboard-2.4.0-py3-none-any.whl pip3 --retries 0 install tensorflow_cpu-2.3.1-cp38-cp38-win_amd64.whl pip3 --retries 0 install Pillow-8.0.1-cp38-cp38-win_amd64.whl
- Instalacja Tesseract 5.0
tesseract-ocr-w64-setup-v5.0.0-alpha.20200328.exe
Uzupełnić katalog C:\Program Files\Tesseract-OCR\tessdata niezbędnymi plikami danych treningowych traineddata z dostarczonego pakietu instalacyjnego. Wymagane pliki:
- pol.traineddata
- ocrb.traineddata
- eng.traineddata
- osd.traineddata
- Instalacja OpenCV i pytesseract:
pip3 --retries 0 install opencv_contrib_python-4.5.1.48-cp38-cp38-win_amd64.whl pip3 --retries 0 install pytesseract-0.3.7-py2.py3-none-any.whl
- Instalacja pakietu zarządzania serwisami python win32:
pip3 --retries 0 install pywin32-300-cp38-cp38-win_amd64.whl koniecznie jako administrator wykonane z katalogu python38: python Scripts/pywin32_postinstall.py -install
- Utworzenie katalogu programu dla modułu FormAnalyzer RBEE DO np. C:\Program Files\ARHAT\RBEE\DO i umieszczenie w nim kopii elementów:
klasyfikatordowodow.py odczyttrescidowodow.py doklasyfikator.h5 rozpakowany katalog modelu: dowody_detekcja.7z
- Utworzenie katalogu roboczego dla modułu FormAnalyzer RBEE DO np. C:\RBEE\DO
UWAGA Katalog roboczy musi być dostępny do odczytu i zapisu dla użytkownika wykonującego serwis FormAnalyzer RBEE DO oraz dla użytkowników wykonujących moduły FormAnalyzer RBEE Text Extractor. - Aktualizacja skryptu klasyfikatordowodow.py w zakresie wskazania katalogów roboczych modułu i listy identyfikatorów (numerów) obsługiwanych FormAnalyzer RBEE Text Extractor:
mode = "application" # "service" model_root = "C:\\Program Files\\ARHAT\\RBEE\DO\\dowody_detekcja" klasyfikator_h5 = "C:\\Program Files\\ARHAT\\RBEE\\DO\\doklasyfikator.h5" data_root = "C:\\RBEE\\DO_DEV" zarejestrowane_te = [1, 2, 3, 4, 5, 6, 7, 8]
- Uruchomienie klasyfikatordowodow.py jako aplikacji i weryfikacja działania. Przykładowo można przygotować projekt z włączoną detekcją dowodów osobistych i przetworzyć pojedynczą przesyłkę obserwując powstanie i automatyczne usunięcie plików komunikatów w katalogu roboczym. UWAGA pełne uruchomienie i załadowanie się modeli wymaga około 30 sekund. Dopiero po tym czasie należy rozpocząć podawanie dokumentów.
- Zmiana skryptu do pracy jako serwis:
mode = "service" # "application"
- Uruchomienie skryptu klasyfikatordowodow.py w trybie administracyjnym w celu instalacji serwisu.
klasyfikatordowodow.py --username domain\\username --startup delayed install Usage: 'klasyfikatordowodow.py [options] install|update|remove|start [...]|stop|restart [...]|debug [...]'" Options for 'install' and 'update' commands only: --username domain\\username : The Username the service is to run under --password password : The password for the username --startup [manual|auto|disabled|delayed] : How the service starts, default = manual Options for 'start' and 'stop' commands only: --wait seconds: Wait for the service to actually start or stop. If you specify --wait with the 'stop' option, the service and all dependent services will be stopped, each waiting the specified period.
- Uruchomienie serwisu i sprawdzenie działania.
Konfiguracja modułów FormAnalyzer RBEE Text Extractor do współpracy z FormAnalyzer RBEE DO.
W celu konfiguracji modułu FormAnalyzer RBEE Text Extractor do współpracy z FormAnalyzer RBEE DO należy dla każdego modułu wskazać w pliku application.Production.json dodatkowe parametry:
"DetektorDowodowId": 1,
"DetektorDowodowFolder": "C:\\RBEE\\DO",
"DetektorDowodowNuance": true
Parametr DetektorDowodowId musi być nieujemną liczbą całkowitą i musi być dla każdej instancji Text Extractor unikalny. Zwyczajowo jest to 1, 2. ... 8
Odpowiednie wartości muszą być w klasyfikatordowodow.py patrz: zarejestrowane_te = [1, 2, 3, 4, 5, 6, 7, 8]
Dodatkowo jeżeli chcemy skorzystać z wielogłosowego rozpoznawania za pomocą licencji Nuance należy ustawić parametr DetektorDowodowNuance na wartość true