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:

  1. Sprawdzenie czy dana strona dokumentacji zawiera zdjęcie dowodu osobistego.
  2. 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.
  3. 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.

FormAnalyzer RBEE wyszukuj obrazy dowodów osobistych

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".

FormAnalyzer RBEE 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:

  1. Instalacje (aktualizacje) systemu FormAnalyzer RBEE do wersji co najmniej 1.4.0
    Instalację należy dokonać zgodnie z dostarczonym dokumentem aktualizacji systemu.
  2. Instalacje modułu detekcji i odczytu dowodów osobistych FormAnalyzer RBEE DO
  3. 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:

  1. Instalacja środowiska Python wersja 3.8 wraz z umożliwieniem korzystania przez wszystkich użytkowników stacji roboczej.
    python-3.8.6-amd64.exe
    
  2. 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
    
  3. 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
    Uwaga Niezbędne jest uzupełnienie systemowej ścieżki dostępu do modułów wykonywalnych o katalog zainstalowanego tesseract. Polecenie tesseract musi być wykonywalne dla użytkownika, który będzie wskazany jako wykonawca serwisu klasyfikatora dokumentów.
  4. 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
    
  5. 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
    
  6. 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
    
  7. 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.
  8. 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]
    
  9. 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.
  10. Zmiana skryptu do pracy jako serwis:
    mode = "service" # "application"
    
  11. 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.
    
  12. 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

Arhat sp.z o.o.
ul. Antoniego Józefa Madalińskiego 23 lok.7 A
02-513 Warszawa, Polska

tel: +48-22-8491225
e-mail: Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.

© 2020 Arhat. All rights reserved. Powered by Indico.pl