python

Smart IdReader SDK — встраиваем распознавание в проекты на Python и PHP

  • пятница, 25 октября 2019 г. в 00:56:23
https://habr.com/ru/company/smartengines/blog/472536/
  • Блог компании Smart Engines
  • PHP
  • Python
  • Программирование
  • Обработка изображений


Мы, Smart Engines, продолжаем цикл статей про то, как встроить наши технологии распознавания (паспортов, банковских карт и других) в ваши приложения. Ранее мы уже писали про встраивание на iOS и Android, показывали, как встроить распознавание в Телеграм-бота, а сегодня мы расскажем про то, как работать с Python и PHP интерфейсами библиотеки распознавания Smart IDReader для использования на in-house сервере.


Кстати, список поддерживаемых нами языков программирования, помимо рассматриваемых здесь, включает C#, Objective-C, Swift и Java. Как и раньше, мы поддерживаем все популярные и многие непопулярные операционные системы и архитектуры, а наши бесплатные демонстрационные приложения доступны для скачивания из App Store и Google Play.


По традиции, демо-версия Smart IDReader SDK для Python и PHP вместе с примерами выложена на Github и доступна по ссылке.


Собираем обёртку


Поскольку версия подключаемого модуля должна совпадать с версией интерпретатора, мы поставляем не готовый модуль, а автосборщик, позволяющий собрать и развернуть на вашей машине необходимую обертку библиотеки распознавания Smart IDReader (поддерживаются Python 2/3 и PHP 5/7). Для этого необходимо запустить соответствующий сборочный скрипт, указав ему путь к нашей библиотеке libsmartidEngine.so и версию интерпретатора, под который нужно собрать модуль. К примеру, для Python это выглядит так:


bash build_python.sh ../../bin 3 

PHP собирается похожим образом, только в качестве второго аргумента передается путь к используемому вами php-config:


bash build_php.sh ../../bin /usr/bin/php56-config

Важно: после сборки полученный модуль будет ссылаться на libSmartidEngine.so по абсолютному пути, так что вначале установите библиотеку в удобную вам директорию!


Автосборщик распакует поставляемый в сборке SWIG, сгенерирует модуль и проверит его, запустив тест.


Обёртка библиотеки включает в себя два файла — модуль, написанный на Python/PHP, и расширение для интерпретатора (_pySmartIdEngine.so для Python и phpSmartidEngine.so). Для интеграции распознавания в проект необходимо импортировать модуль и подключить расширение.
В случае с Python для этого достаточно явно прописать путь к модулю и расширению:


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

import pySmartIdEngine 

В PHP модуль импортируется так же:


require(“phpSmartIdEngine.php");

а вот с расширением немного сложнее — dynamic linking не работает в некоторых версиях, так что для постоянной работы с расширением его необходимо положить в папку, где лежат все расширения для вашей версии ( к примеру /usr/lib/php56/modules) и подключить, прописав в дефолтный php.ini


extension=phpSmartisEngine.so

В примере с GitHub мы просто указываем интерпретатору использовать наш php.ini с уже прописанным расширением


php56 -c php.ini smartid_sample.php 

Итак, с подключением разобрались, смело идeм изучать пример!


Изучаем интерфейс


Пример запускается с тремя аргументами — путь к картинке, которую нужно распознать, путь к архиву с конфигурацией для движка и тип документа, который нужно распознать (тесты запускают пример для rus.passport.national (паспорт гражданина РФ))


python smartid_sample.py ../../testdata/passport_rf_2.jpg ../../data-zip/bundle_mock_smart_idreader.zip rus.passport.national

Как это работает:


# Создаём движок с указанием конфига (zip-архив, в в котором определяется набор поддерживаемых документов)
engine = pySmartIdEngine.RecognitionEngine(config_path)
# Задаём какие документы будем искать на картинке
session_settings = engine.CreateSessionSettings()
session_settings.SetEnabledDocumentTypes(document_types)

# Создаём сессию распознавания
session = engine.SpawnSession(session_settings)

# Кормим ей картинку и перезапускаем сессию 
resultFromImageFile = session.ProcessImageFile(image_path)
session.Reset()

# Выводим результат 
output_recognition_result(resultFromImageFile)

Подробнее остановимся на способах загрузки изображения: это может быть путь к файлу, строка в Base64 и буфер в памяти (как данные в форматах RGB\YUV NV21, так и сам jpeg-файл). Буферы могут быть внешними, так же их можно достать из объекта класса Image (предварительно создав его, указав путь к файлу или с помощью всё того же буфера)


Важно: саму картинку в формате RGB или YUV можно достать только в Python-модуле c помощью bytearray-объекта (создаём объект нужного размера, передаём его в метод CopyToBuffer, см. пример), в PHP вы сможете работать только со строкой в формате Base64!


Целиком это выглядит так (в Python):


engine = pySmartIdEngine.RecognitionEngine(config_path)

    session_settings = engine.CreateSessionSettings()

    session_settings.SetEnabledDocumentTypes(document_types)

# Создаём объект Image (позволяет работать с изображением)

     testImage = pySmartIdEngine.Image(image_path) 

# Создаём буффер в памяти, который можно отдать на распознавание

    binaryRGBfile = open(image_path, "rb")
    size = os.path.getsize(image_path)
    binaryRGBfileBuffer = bytearray(size)
    binaryRGBfile.readinto(binaryRGBfileBuffer)

# тоже самое, только в формате Base64

    f = open(os.path.join(sys.path[0],"base64.txt"), 'r')
    base64BufferString = f.readline()
    f.close()

# Base64-строку можно получить и напрямую из объекта

    # base64BufferString = testImage.GetBase64String()

# Создаём сессию распознавания

    session = engine.SpawnSession(session_settings)

# Распознаём картинку 

    resultFromImage = session.ProcessImage(testImage)
    session.Reset()

    resultFromImageFile = session.ProcessImageFile(image_path)
session.Reset()

    resultFromImageData = session.ProcessImageData(binaryRGBfileBuffer, size)
session.Reset()

    resultFromBase64 = session.ProcessImageDataBase64(base64BufferString)
session.Reset()

# Выводим результаты 

    output_recognition_result(resultFromImage)
    output_recognition_result(resultFromImageFile)
    output_recognition_result(resultFromImageData)
    output_recognition_result(resultFromBase64)

Python и PHP модули позволяют воспользоваться всем функционалом, предоставляемым С++ интерфейсом нашей библиотеки (за исключением работы с буфером в PHP, о чём написано выше).


Заключение


Мы рассмотрели работу с SmartIdEngine SDK в Python и PHP, в примерах мы отразили все сложности, с которыми можно столкнуться в процессе развертывания модуля на рабочей машине. Mock-версия библиотеки, представленная на гитхабе, позволяет продемонстрировать механизм развертывания модуля и изучить их интерфейс, не неся в себе никакого функционала распознавания. Для получения триальной версии, обращайтесь к нам: support@smartengines.ru