Как обрабатывать изображения с бота telegram без сохранения в файл - PullRequest
0 голосов
/ 23 января 2020

Мой бот-телеграмма предназначен для классификации изображений, поэтому мне нужно сначала прочитать изображение от пользователя, например, с помощью cv2.imread(telegram_image.jpeg, 1), прежде чем выполнять какую-либо обработку и запускать на нем мою модель. Есть ли способ сделать это, не загружая файл образа с бота телеграммы?

У меня есть такой код:

bot = telegram.Bot(token=TOKEN)
@app.route('/{}'.format(TOKEN), methods=['POST'])
def start():
    # retrieve the message in JSON and then transform it to Telegram object
    update = telegram.Update.de_json(request.get_json(force=True), bot)
    chat_id = update.message.chat.id
    msg_id = update.message.message_id
    imageId = update.message.photo[len(update.message.photo)-1].file_id

Я пытаюсь развернуть на Heroku (с использованием Flask), но ранее возникали проблемы с загрузкой файлов с использованием update.message.photo[-1].get_file().download(). Код выполнялся без ошибок, но я нигде не мог найти файл изображения.

Извините, я новичок в этом, действительно буду признателен за любую помощь или предложения, спасибо!

1 Ответ

0 голосов
/ 23 января 2020

Я предлагаю использовать python-telegram-bot для этого, если вы еще этого не сделали. Вики великолепна и не использует Flask.

. Вы можете избежать сохранения файла на диск и сохранить его в памяти, используя BytesIO. Функция для обработки сообщения может выглядеть следующим образом:

from io import BytesIO

def photo(update: Update, context: CallbackContext):
    file = context.bot.get_file(update.message.photo[-1].file_id)
    f =  BytesIO(file.download_as_bytearray())

    # f is now a file object you can do something with

    result = somefunction(f)

    response = 'I procsseed that and the result was %s' % (result,)

    context.bot.send_message(chat_id=update.message.chat_id, text=response)

Затем добавьте обработчик в диспетчер. Обратите внимание, что с помощью Filters.photo только сообщения, являющиеся фотографиями, дойдут до этого обработчика:

photo_handler = MessageHandler(Filters.photo, photo)
dispatcher.add_handler(photo_handler)

Это поддерживает последнюю версию (v12) API.

Вы также можете использовать wi sh чтобы взглянуть на сценарий, который я собрал: tg_client.py . Это часть большого репо, который выполняет обработку изображений через библиотеку Yolov3. Также реализована поддержка блокировки связи с ботом вплоть до вашего собственного идентификатора пользователя телеграммы (дополнительную информацию см. На моей вики-странице ).

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


EDIT : I Мне кажется, я частично неправильно понял ваш вопрос, поэтому я отвечу на эту часть:

, используя cv2.imread(telegram_image.jpeg, 1), прежде чем выполнять какую-либо обработку и запускать на нем мою модель. Есть ли способ сделать это, не загружая файл изображения с бота телеграммы?

Я обработал это в своем коде благодаря этому ответу , который предлагает использование cv2.imdecode вместо cv2.imread.

Так что somefunction выше, может обработать это как:

def somefunction(input_stream):
    image = cv2.imdecode(numpy.fromstring(input_stream, numpy.uint8), 1)

    # image is now what cv2.imread('filename.jpg',1) would have returned.

    # rest of your code.

    return 'the result of the processing'

Это позволяет избежать записи файла на диск, так как все это обрабатывается в памяти.

...