Как написать Telegram-бот для распознавания изображений на Python

Эта статья посвящена написанию бота для Telegram, который распознает изображения, используя нейронные сети. Статья состоит из трех основных разделов: введение, выбор технологий и пошаговая инструкция.


Этот текст является четвертой частью моей серии Weekend Hack — кратких разборов новых идей и концепций в разработке. Эта серия ориентирована на обучение на практике, так что каждая статья сопровождается подробными инструкциями.


Курс «Python для анализа данных»
Идет набор в группу 2 700₽ в месяц

Введение

Автоматическое распознавание изображений (например, распознавание объектов и классификация изображений) может стать невероятно ценным инструментом для бизнеса. Если вы владеете форумом, приложением для знакомств или любой другой платформой, на которую пользователи загружают контент, автоматизация распознавания изображений может иметь решающее значение. Используя автоматизированные решения, вы убиваете двух зайцев одним выстрелом:

Во-первых, автоматизация представляет большую ценность для конечных пользователей, позволяя им выполнять поиск изображений по темам, таким образом избегая утомительной задачи классифицировать изображения вручную. Практическим примером этого является функция поиска Unsplash, которая ищет изображения по заданному ключевому слову.

Во-вторых, системы распознавания изображений представляют ценность и для самих владельцев системы, позволяя, например, отфильтровывать контент, на котором присутствуют обнаженные тела. Одним словом, автоматизация позволяет повысить качество предоставляемых услуг. Звучит отлично, не так ли?

Варианты приложения подобных технологий бесконечны, а преимущества такого подхода очевидны. Но остается главный вопрос: какое решение выбрать для задачи распознавания? Существует множество как готовых решений, так и различного проприетарного и open-source программного обеспечения, на базе которого можно создать свое собственное решение.  В следующем разделе мы рассмотрим некоторые варианты.

Выбор технологий

Как было сказано выше, существует множество провайдеров, которые предоставляют услуги по распознаванию изображений и видео с помощью API: Google Vision, Amazon Rekognition, Clarifai… Но возникает вопрос: будут ли мои данные защищены? Вот комментарий Google касательно использования данных:

“Когда вы отправляете изображение в Cloud Vision API, мы должны хранить это изображение в течение короткого периода времени, чтобы выполнить анализ и вернуть вам результаты. Сохраненное изображение обычно удаляется через несколько часов. Google также временно регистрирует некоторые метаданные о ваших запросах через API Vision (например, время получения запроса и размер запроса), чтобы улучшить наш сервис и бороться со злоупотреблением.”

«Обычно удаляется»… Но что значит “обычно”?

Если для вас важны вопросы прав на владение данными и конфиденциальности, существует возможность создать собственный инструмент для распознавания изображений на базе существующих технологий. Стоит отдельно упомянуть ряд open-source решений, таких как TensorFlow, Darknet, MLpack и Keras, которые позволят вам лучше контролировать что именно происходит с вашими изображениями.

В этом уроке мы сосредоточимся на создании нашего собственного классификатора изображений, используя Darknet. Затем мы напишем на Python бот для Telegram и разместим его на Glitch для взаимодействия с классификатором.

В итоге процесс будет выглядеть следующим образом: пользователь выбирает изображение и отправляет его боту в Telegram. Бот классифицирует и распознает объекты на изображении, а потом отправляет пользователю результат. Звучит просто, правда?

Специализация Full-stack веб-разработчик на Python
Идет набор в группу 5 900₽ в месяц

Пошаговая инструкция

Хорошо, приступим к делу!

1. Строим скелет бота

Так как в предыдущей статье я уже объяснял как создать бот, я не буду повторяться, а попрошу вас использовать пошаговую инструкцию из этого поста. Выполните первые два шага и измените имя приложения по своему вкусу. Не зацикливайтесь на дескрипторах бота, позже мы добавим нужный нам дескриптор для обработки полученных изображений.

2. Подключаем Darknet

Для того, чтобы проанализировать изображения, отправленные боту, нам нужно подключить Darknet. Все команды установки доступны в файле install.sh в проекте на Glitch.

Для ввода команд выберите в нашем проекте на Glitch Tools > Full Page Console.

Select Tools and Full Page Console to install Darknet in Glitch

Выберите Full Page Console, чтобы установить Darknet

Чтобы установить Darknet, перейдите в папку .data в Glitch. Это важно, потому что эта папка будет сохранена, когда Glitch перейдет в спящий режим.

cd .data
git clone https://github.com/pjreddie/darknet.git
cd darknet
make

Важно помнить, что, хотя вы можете обучать свои собственные модели (и должны, в зависимости от того, как вы планируете их использовать), обычно это довольно дорогой вычислительный процесс. Учитывая то, что мы будем запускать нашего бота с помощью Glitch с очень ограниченными мощностью и местом (1 CPU, 512 RAM, 200 MB памяти), обучить модель будет совершенно невозможно.

В нашем случае лучшим решением будет использовать предварительно обученную модель. Мы будем использовать существующие веса, что позволит нам управиться быстрее. Мы загрузим два файла весов: darknet19.weights для классификации изображений и yolov3-tiny.weights для распознавания объектов.

<p># execute in the ./darkent directory</p>

wget https://pjreddie.com/media/files/darknet19.weights
wget https://pjreddie.com/media/files/yolov3-tiny.weights

Обратите внимание, что мы выбрали небольшие веса из-за ограничений памяти и мощности процессора, которые доступны в Glitch на данный момент. Вы можете использовать и другие веса (подробнее об этом можно узнать в разделах сайта Darknet о классификации изображений и обнаружении объектов), если вы работаете в среде с большими мощностями. Тогда полученный результат будет еще лучше.

3. Подключаем бот

Отлично, скелет нашего бота готов, Darknet установлен, время подключить наш бот. Я не буду пояснять здесь каждую строчку кода ниже, весь код с подробными комментариями вы можете найти в моем проекте на Glitch.

Ниже приведен фрагмент кода основного дескриптора (обратите внимание, что он использует вспомогательные функции). Он срабатывает каждый раз, когда новая картинка отправляется в бот.

@bot.message_handler(content_types=['photo'])

def handle(message):

 # extract the image name for further operations

 image_name = save_image_from_message(message)

 

 # execute object recognition

 object_recognition_image(image_name)

 # send object recognition results

 bot.send_photo(message.chat.id, open('.data/darknet/predictions.jpg','rb'), 'Identified objects')

 

 # execute image classification

 classification_list_result = classify_image(image_name)


 # send classification results

 output = 'The image classifies as:\n'

 for result in classification_list_result:

   output += result

 output += '\n🚀 Gimme more pics! 🚀'

 bot.reply_to(message, output)
 

 # remove picture from server

 cleanup_remove_image(image_name);

4. Тестируем бота

Отлично, все готово, давайте протестируем работу нашего бота.

Его можно найти в Telegram по ID: @wh_image_classificator_bot. Возможности классификации и распознавания ограничены по техническим причинам, но тем не менее результаты выглядят весьма неплохо!

Dog picture classification and object recognition

Распознавание на примере фото с собаками

Распознавание на примере фото автомобиля


Выводы

Использование готовых API для распознавания изображений дает невероятные возможности, но когда конфиденциальность или возможность оффлайн обработки имеют решающее значение, создание собственной системы распознавания может быть отличной альтернативой.

Обратите внимание, что наш пример показал только небольшую долю функционала и продуктивности, которых возможно достичь с помощью других тренировочных наборов и подходов.

Ресурсы

Оригинал: Building an Image Recognition bot for Telegram using Python

Перевод: Ухарова Елена

Поделиться:
Опубликовано в рубрике PythonTagged ,

SkillFactory.Рассылка