Мы, 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