Smart IDReader SDK — как написать Telegram-бота на Python для распознавания документов за 5 минут

в 3:54, , рубрики: github, ocr, open source, python, SDK, smart idreader, Блог компании Smart Engines, обработка изображений, Программирование, распознавание, распознавание банковских карт, распознавание изображений, распознавание паспорта

Smart IDReader by Smart Engines

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

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

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

Что нам понадобится

От SDK нам потребуется несколько файлов:

  • Python-интерфейс библиотеки распознавания (pySmartIdEngine.py)
  • Динамическая библиотека С++ ядра распознавания (в случае Linux — _pySmartIdEngine.so)
  • Архив конфигурации (*.zip)

Для написания Telegram-бота мы выбрали telepot.

Взаимодействие с ядром распознавания

С подробной информацией о библиотеке можно ознакомиться в документации, а сейчас рассмотрим только самое необходимое.

Подключим библиотеку и сконфигурируем движок распознавания:

# Подключаем python-интерфейс библиотеки распознавания
import pySmartIdEngine as se 

# Путь к файлу конфигурации
smartid_config_path = 'bundle_mock_smart_idreader.zip' 

# Создаем движок распознавания, лучше сделать один раз и держать в памяти
smartid_engine = se.RecognitionEngine(smartid_config_path) 

Теперь можно написать функцию распознавания изображения:

def recognize_image_file(smartid_engine, image_file_path):
    # Получаем настройки по умолчанию и включаем нужные типы документов
    session_settings = smartid_engine.CreateSessionSettings()
    session_settings.AddEnabledDocumentTypes('rus.passport.national')

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

    # Распознаем изображение
    result = session.ProcessImageFile(image_file_path)

    # Конвертируем распознанные строковые поля в dict
    recognized_fields = {}
    for field_name in result.GetStringFieldNames():
        field = result.GetStringField(field_name)
        recognized_fields[field_name] = field.GetValue().GetUtf8String()

    # Возвращаем строковое JSON-представление распознанных полей
    return json.dumps(recognized_fields, ensure_ascii=False, indent=2)

Реализация бота для распознавания присланных ему изображений

Мы пойдем по простому пути и воспользуемся примером из документации telepot. Нам нужно написать класс, объект которого будет создаваться на каждый чат, и реализовать в нем функцию on_chat_message. Также в конструктор мы будем передавать ранее созданный движок распознавания, чтобы каждый раз не тратить время на его создание:

import telepot
from telepot.delegate import per_chat_id, create_open, pave_event_space
from telepot.loop import MessageLoop

class SmartIDReaderBot(telepot.helper.ChatHandler):
    def __init__(self, seed_tuple, smartid_engine, **kwargs):
        self.smartid_engine = smartid_engine

        super(SmartIDReaderBot, self).__init__(seed_tuple, **kwargs)

    def on_chat_message(self, msg):
        try:
            content_type, chat_type, chat_id = telepot.glance(msg)

            if content_type in ['document', 'photo']:
                content = msg[content_type] if content_type == 'document' 
                     else msg[content_type][-1]
                if 'file_id' in content:
                    # Скачиваем файл изображения
                    downloads_dir = 'downloaded_images'
                    os.makedirs(downloads_dir, exist_ok=True)
                    temp_path = os.path.join(downloads_dir,
                        'chat_%d_id_%d_temp.png' % (chat_id, msg['message_id']))
                    self.bot.download_file(content['file_id'], temp_path)

                    # Распознаем изображение
                    recognition_result_str = recognize_image_file(
                        self.smartid_engine, temp_path)

                    # Посылаем сообщение с результатом распознавания
                    self.send_message(recognition_result_str)
            else:
                self.send_message("Send me a photo and I'll recognize it!")
        except Exception as e:
            self.send_message('Exception: %s' % e.message)

    def send_message(self, message):
        self.sender.sendMessage(message)
        print(message)

Наконец, создадим и запустим бота:

# Создаем бота
bot = telepot.DelegatorBot(args.token, [
    pave_event_space()(
        per_chat_id(), create_open,
        SmartIDReaderBot, smartid_engine, timeout=1000000
    )
])

# Запускаем бота
MessageLoop(bot).run_as_thread()

while 1:
    time.sleep(10)

Вместо args.token следует подставить свой уникальный token бота, получаемый после его регистрации. Если вы никогда не создавали бота, то на официальном сайте Telegram есть подробная инструкция.

Заключение

Вот и все! Мы рассказали, как с помощью Python-интерфейса Smart IDReader SDK написать своего Telegram-бота для распознавания документов.

Заметим, что особенностью наших продуктов является их полная автономность — им не нужен интернет. Но если вдруг очень захочется, то с помощью Telegram можно очень просто распознавать документы удаленно. Однако, по российскому законодательству распознавать удаленно можно только свои документы. Чтобы работать с данными документов других людей, необходимо не только стать оператором по обработке и хранению персональных данных, иметь необходимую инфраструктуру для защиты этих данных, но также защищать все телефоны и компьютеры, на которых происходит распознавание. Поэтому, наши коллеги из Sum&Substance с помощью наших библиотек разработали платформу для удаленного распознавания и проверки данных документов, при этом заботясь о юридической стороне вопроса.

Автор: SmartEngines

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js