Как распознать паспорт на Python за 5 минут

Python сегодня используется практически на всех этапах разработки — от быстрых прототипов и MVP до промышленных серверных и высоконагруженных систем. Поэтому возможность быстро встроить распознавание документов непосредственно в Python-приложение особенно удобна для разработки и интеграции прикладных решений.

Smart ID Engine позволяет распознавать удостоверяющие личность документы и извлекать из них структурированные данные и изображения отдельных полей. В этом туториале мы за несколько шагов подключим библиотеку к Python-проекту, настроим распознавание российского паспорта, обработаем изображение и получим результат через API.

В данной статье рассказывается о том, как подключить библиотеку, настроить распознавание и получить результат распознавания паспорта РФ на python при помощи библиотеки Smart Engines. Полный код доступен на GitHub.

Пошаговое встраивание в Python-приложение

1. Подключение библиотеки

Для подключения библиотеки в проект необходимо скопировать в ваш проект файлы обертки (папка bindings), саму библиотеку (папка bin) и конфиг распознавания (папка data-zip с файлом bundle_…se). Обертку и библиотеку нужно подключить в проект:

sys.path.append(os.path.join(sys.path[0], '<path_to/bindings/python/>'))
sys.path.append(os.path.join(sys.path[0], '<path_to/bin/>'))

и импортировать библиотеку:

import pyidengine

2. Создание движка распознавания

Движок распознавания создается из конфига распознавания (data-zip/bundle_…se). В параметрах необходимо указать путь к нему и параметр ленивой инициализации (True/False). При значении False все внутренние объекты будут инициализированы сразу не дожидаясь, когда они понадобятся для какой-то конкретной сессии.

engine = pyidengine.IdEngine.Create('<path_to_config>', True)

3. Настройка распознавания

Настройка распознавания (settings) включают в себя выбор режима распознавания (mode), маски документа (document type masks), а также при желании указание дополнительных опций. Для распознавания документа по одному изображению используется режим singleshot (если документ распознается по нескольким картинкам — default). Для внутреннего паспорта РФ требуется специфицировать маску документа, указав rus.passport.national в доступных к распознаванию документах.

settings = engine.CreateSessionSettings()
settings.SetCurrentMode("singleshot")
settings.AddEnabledDocumentTypes("rus.passport.national")

4. Распознавание документа

Сессия распознавания паспорта РФ подразумевает распознавание одного документа (по одному или нескольким кадрам). Для распознавания другого документа создайте новую сессию, настройки можно оставить те же. Создание сессии осуществляется путем указания ранее созданных настроек (settings) и персонализированной подписи (personalized_signature).

session = engine.SpawnSession(settings, <personalized_signature>)

Загрузка изображения паспорта РФ по пути (path_to_image):

image = pyidengine.Image.FromFile(<path_to_image>)

Распознавание паспорта:

session.Process(image)

Получение результата:

result = session.GetCurrentResult()

5. Извлечение информации из результата распознавания

Тип документа

doc_type = result.GetDocumentType()
print(f"Тип документа: {doc_type}")

Вывод:

Тип документа: rus.passport.national

Описание документа

doc_info = session.GetDocumentInfo(doc_type)
description = doc_info.GetDocumentDescription()
print(f"Описание документа: {description}")

Вывод: 

Описание документа: Russian Passport (national)

Текстовые поля

Включают все текстовые строки, которые были извлечены с документа

text_field_iterator = result.TextFieldsBegin()
print("Текстовые поля:")
while(text_field_iterator != result.TextFieldsEnd()):
    field = text_field_iterator.GetValue()
    name = field.GetName() # название поля
    value = field.GetValue().GetFirstString().GetCStr() # значение поля
    is_accepted = "+" if field.GetBaseFieldInfo().GetIsAccepted() else "-" # представленность поля
    confidence = field.GetBaseFieldInfo().GetConfidence() # уверенность распознавания поля
    print(f"[{is_accepted}] ({confidence:.2f}) {name}: {value}")
    text_field_iterator.Advance()

Вывод:

Текстовые поля:
[+] (1.00) birthdate: 12.09.1982
[+] (1.00) birthplace: ГОР. АРХАНГЕЛЬСК
[+] (1.00) name: ЕВГЕНИЙ
[+] (1.00) number: 000000
[+] (1.00) patronymic: АЛЕКСАНДРОВИЧ
[+] (1.00) series: 1104
[+] (1.00) surname: ИМЯРЕК
...

Полный вывод содержит более 30 полей, включая информацию об органе выдачи и MRZ-строку.

Поля изображений

Включают в себя вырезанные из исходного документа зоны интереса при их наличии. Для паспорта РФ — это подпись владельца, подпись органа выдачи, фото владельца, штамп.

image_field_iterator= result.ImageFieldsBegin()
    while(image_field_iterator != result.ImageFieldsEnd()):
      field = image_field_iterator.GetValue()
      name = field.GetName() # название поля
      image = field.GetValue() # изображение
      is_accepted = "+" if field.GetBaseFieldInfo().GetIsAccepted() else "-" # представленность поля
      confidence = field.GetBaseFieldInfo().GetConfidence() # уверенность распознавания поля
      width = field.GetValue().GetWidth()
      height = field.GetValue().GetHeight()
      print(f"[{is_accepted}] ({confidence:.2f}) {name}  {width} x {height} ")
      image_field_iterator.Advance()

Вывод:

[+] (1.00) authority_signature 700 x 550
[+] (1.00) photo 214 x 214
[+] (1.00) signature 700 x 550
Содержание