Каталог решений - Распознавание паспорта РФ. Python+1С без сторонних сервисов

Распознавание паспорта РФ. Python+1С без сторонних сервисов

Распознавание паспорта РФ. Python+1С без сторонних сервисов

В наличии

В данной публикации мы рассмотрим методы разработки приложений на Python + 1С для распознавания Паспорта РФ.

Категория:

Описание

Погуглив просторы интернета, я нашел подобные решения для 1С. Но все эти разработки требуют пересылку данных на сторонние ресурсы. А передача персональных данных на сторону не такая уж хорошая идея, ведущая к нарушением законов РФ (персональные данные и т.п.).

И таки решил написать такое решение, которое будет работать на вашем ПК (серверах) без всяких там сторонних сервисов. Но так как Python так же, как и 1С, язык программирования некопилированный, то решение подобной задачи стало не такой уж и простой, но вполне решаемой.

В качестве основы был позаимствован репозитарий paSport_eye на GiHub. Данный продукт был адаптирован под Windows и 1С

Данная болванка очень простая, но при этом использует такие библиотеки, как Dlib и CV2, которые довольно-таки хорошо себя показали в распознавании лиц и изображений.

В качестве распознавателя мы используем бесплатный и самый на мой взгляд мощный продукт по распознаванию текста "pytesseract" от компании HP.

Итак, начнем: 

1. Для начала установим Python.

Рекомендую ставить версию 3.9, так как с другими версиями могут возникнуть сложности по установке библиотек. 

2.Далее открываем командную строку и входим в папку, куда вы установили Python, к примеру 

cd c:\pyhton

3. Устанавливаем библиотеки

  1. Библиотека OpenCV 
    python -m pip install opencv-python
  2. Библиотека Pillow 
    python -m pip install Pillow
  3. Библиотека pytesseract
    python -m pip install pytesseract
  4.  Библиотека rembg
    python -m pip install rembg
  5. Библиотека imutils
    python -m pip install imutils
  6. Библиотека matplotlib
    python -m pip install matplotlib
  7. Библиотека dlib Так как версии выше 22 автоматически устанавливают библиотеки куда, а после чего надо долго танцевать с бубнами и установкой библиотек Cuda — рекомендую ставить версию 19.22.1
    python -m pip install -U dlib==19.22.1
  8. Библиотека tesseract-ocr   
    pip install pytesseract

         

4. Далее ставим программный продукт Tesseract. Он необходим для распознавания текста. 

Данный продукт распространяется в открытом коде и собрать его под linux очень просто. Но нам нужна Windiws сборка и скомпилить+зарелизить его под Виндовоз не так уж и просто. Поэтому воспользуемся сборкой для win64 от немецких коллег из Мангеймского университета. Ссылка тут — Tesseract-ocr-w64-setup-5.3.0.20221.

1. Установку нужно делать на диск "С:" в папку %Program Files% (по умолчанию). Если сменить папку — то придется допиливать один Python модуль.

2. Необходимо выбрать расширенную установку и выбрать дополнительный набор Кириллических символов  для распознавания русского языка. 

Поздравляю, у вас теперь установлен прокачанный Python.

Как установить ПО 1С8, думаю, рассказывать не буду и пойдем дальше.

Скачиваем Python модули и разархивируем их, к примеру, в Папку c:\Python\Passp.

Сам архив полностью с открытым кодом(openSource)  имеет основной файл passport.py и библиотеки в папке Lib.

Так же вспомогательные файлы для машинного обучения.

 

 

Давайте рассмотрим файл passport.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import cv2
import argparse
import os
from lib.output import OUTput
from lib.rm_bg import RemoveBG
from lib.face_work import FaceWork
from lib.text_recognition import TessRecogn
from lib.search_data_with_cv2 import SDWCV2
from lib.script_return_abs_path import ReturnAbsPathPict
from lib.script_convert_image import ReturnPathConvertImage

def main():
    ap = ap = argparse.ArgumentParser(
                                        prog="python3 pasport_eye.py",
                                        usage="%(prog)s -p /ПУТЬ/К/ПАПКЕ/С/ИЗОБРАЖЕНИЯМИ --improved_recognition ON или OFF -o terminal или scv",
                                        description='''
                                                        
    )
    ap.add_argument(
                    "-p", "--path_pict", required=True,
                    help="Путь к каталогу изображений паспортов!"
    )
    ap.add_argument(
                    "--improved_recognition", required=True,
                    help='''
                            Метод улучшенного распознования: ON или OFF.
                            ON - более точное распознавание, но и "выхлоп" от
                            скрипта более "жирный", так же, медленная работа скрипта.
                            OFF - все как обычно, но возможно, не точное распознавание.
                    '''
    )
    ap.add_argument(
                    "-o", "--output", required = True,
                    help = '''

                    Метод выполнения скрипта: trminal или csv.
                    terminal - создается папка: название_базы + _recogn,
                    в ней подпапка pict - лица из паспортов
                    и подпапка descript - дескрипторы в двоичном формате,
                    выхлоп распознования - в терминал.

                    csv - дескрипторы(в формате: float), изображение лиц(в формате: base64),
                    а так же данные паспортов сохраняются в НАЗВАНИЕ_БАЗЫ_С_ИЗОБРАЖЕНИЯМИ.csv
                    '''
    )
    ap.add_argument(
                    "-f", "--output_file", required=True,
                    help="путь к результирующему файлу"
    )
    
    args = vars(ap.parse_args())
    
    if str(args["improved_recognition"]).lower() == "on" or str(args["improved_recognition"]).lower() == "off":
        improved_recognition = str(args["improved_recognition"]).lower()
    else:
        print("improved_recognition только ON или OFF\nВыход!")
        sys.exit()

    if str(args["output"]).lower() == "terminal" or str(args["output"]).lower() == "csv":
        output = str(args["output"]).lower()
    else:
        print("output только terminal или csv\nВыход!")
        sys.exit()


    # получаем правильный путь к файлам с точки срения python
    path_pict=os.path.abspath(str(args["path_pict"]).lower())
    abs_path_folder, filename = os.path.split(path_pict)
    list_abs_path_folder = ReturnAbsPathPict().main(abs_path_folder)

    folder = f"{path_pict}"
    abs_path_pict = os.path.abspath(folder)


    path_output = os.path.abspath(str(args["output_file"]).lower())
    #print(abs_path_pict)
    #print(list_abs_path_folder)
    

    print(f"Идет распознование изображения: {abs_path_pict}\n")
    # возврат полного пути + конвертация изображения в .png
    path_cache_pict = ReturnPathConvertImage(abs_path_pict).main(abs_path_pict,list_abs_path_folder)
    # возврат полного пути + удаление заднего плана
    #path_pict_no_bg = RemoveBG(path_cache_pict, visualization=False).main()
    path_pict_no_bg = path_cache_pict

    # возврат словаря с данными(изображение без фото лица, само фото лица) + дескрипторы лица
    dict_image_no_face_and_cropped_face = FaceWork(path_pict_no_bg, visualization=False).main()
    # возврат списка выделенных данных с помощью cv2
    data_list_gorizontal, data_list_vertical = SDWCV2(dict_image_no_face_and_cropped_face, visualization=False).main()
    # возврат списка распознанных с помощью tesseract данных
    list_all_data_gorizontal, list_all_data_vertical = TessRecogn(
                                                                        improved_recognition,
                                                                        data_list_gorizontal,
                                                                        data_list_vertical
        ).main()

    OUTput(
                args,
                output,
                path_output,
                dict_image_no_face_and_cropped_face,
                list_all_data_gorizontal,
                list_all_data_vertical
        ).main()

if __name__ == "__main__":
    main()

Тут, думаю, все понятно:

1. модуль python получает необходимые аргументы — входные данные (изображение и название выходного файла и т.п.), которые нам понадобятся для вызова из 1С.

2. Конвертируем фото в png и меняем размер. 

3. Далее распознаем лицо, используя библиотеки Open CV и Dlib на фото, для того чтобы правильно перевернуть фото. 

4. После чего по заранее известным координатам получаем обрезки рисунков с необходимыми нам текстами.

5. Далее распознаем текст и выводим его в CSV файл.   Easy 😉

Ну что же, осталось подружить все это добро с 1С.

Пишем обработку на 1С.  Тестировалось на Платформе 8.3.22.1750


&НаКлиенте
Процедура Распознать(Команда)
	объект.ИмяВыходногофайла= "C:/python/paasport/output" + СокрЛП(Новый УникальныйИдентификатор())+".csv";
	КомандаСистемы("C:\Python39\python C:\python\paasport\passport.py --p """+объект.Паспорт+""" --improved_recognition=off -o=csv -f="""+объект.ИмяВыходногофайла+"""","C:\python\paasport\"); 
	Ожидание();
КонецПроцедуры

&НаКлиенте
Процедура Ожидание()
	МойФайл = Новый Файл(объект.ИмяВыходногофайла);
	
	Если НЕ МойФайл.Существует() Тогда 
		ПодключитьОбработчикОжидания("Ожидание",1);
	иначе                                         
		Текст = Новый ЧтениеТекста;
		Текст.Открыть(объект.ИмяВыходногофайла);              
		Строка = Текст.ПрочитатьСтроку();
		объект.данныеПаспорта= Строка;
		ОтключитьОбработчикОжидания("Ожидание");

	КонецЕсли;	
КонецПроцедуры	

В итоге получаем неплохой результат.

 

Все получилось…

has been added to your cart:
Оформление заказа