Skip to content

Telegram Bot на aiogram, преобразующий входящие фотографии с помощью Style Transfer или CycleGAN

Notifications You must be signed in to change notification settings

mayo889/Telegram_Bot_NST_GAN

Repository files navigation

Телеграм бот

Aiogram StyleTransfer CycleGAN Heroku Webhook

Telegram Bot

Для написания бота использовалась библиотека aiogram для построения асинхронной архитектуры. Весь код в файле bot.py. В файле keyboards.py находятся используемые клавиатуры, а также длинные сообщения, чтобы не засорять основной файл.

Бот умеет делать следующие действия:

  1. Переносить стиль
    • Для работы необходимо отправить сначала боту фотографию стиля, а затем фотографию, на которую перенести стиль.
    • Есть возможность выбрать картинку стиля у бота. Предлагается на выбор 6 всемирно известных картин с краткой справкой (автор - название - год написания)
  2. Использовать CycleGAN
    • Превратить летнюю фотографию в зимнюю
    • Превратить зимнюю фотографию в летнюю
  3. Бот может отправить примеры, получаемые в результате работы 3 вышеназванных алгоритмов
  4. Перенаправить на данный репозиторий, чтобы ознакомиться с проектом.

Особенности:

  1. Запоминание пользователей и отправляемых ими фотографий реализовано через словарь, в котором сохраняются объекты класса для каждого пользователя, начавшего общение с ботом. В объекте класса хранится id пользователя, название выбранного алгоритма и в случае использования style transfer сохраняется фотография стиля. Фотография контента и фото для CycleGAN не сохраняются, а передаются сразу в пайплайн выбранного алгоритма.
  2. Бот отдает фотографию в том же разрешении, что и получил от пользователя. Так как для моделей необходимы квадратные фотографии, то используются паддинги
    • StyleTranfer: сжатие до 150 пикселей (причина в разделе Heroku)
    • CycleGAN: сжатие до 512 пикселей
  3. Алгоритмы запускаются в отдельном потоке с помощью threading.Thread
  4. Длительность работы:
    • StyleTrasfer: в среднем 4 минуты
    • CycleGAN: в среднем 30 секунд

StyleTransfer

Для переноса стилей были выполнены следующие действия:

  1. Взята предобученная модель VGG16
  2. Модель была дополнительно доучена на датасете Caltech 101, содержащим 101 категорию данных и 8677 картинок. Код обучения представлен в файле model_nst/train_vgg16.ipynb
  3. Чтобы сэкономить память, были сохранены веса только нужных слоев (первые 11) в файл models_wts/nst_features.pth
  4. Для переноса стилей использован классический алгоритм, который подразумевает итеративное изменение входной картинки на основе разницы с style и content картинками
  5. При формировании модели для Style Transfer не используются слои модели VGG16 напрямую, объявляются только необходимые 11 слоев через nn.Sequential с целью сэкономить память при дальнейшем использовании Heroku

CycleGAN

Для использования CycleGAN был взят код junyanz pytorch-CycleGAN-and-pix2pix Исходный код дает возможность использовать CycleGAN и pix2pix моделей в различных режимах на различных датасетах

Для использования такого большого проекта в собственных нуждах были выполнены следующие действия:

  1. Взята архитектура только CycleGAN в режиме для теста, чтобы генерировать изображения только в одну сторону (папка models)
    • Убраны лишние функции
    • Переделан вход модели так, чтобы она принимала не датасет, а сразу картинки
    • Модель сразу отдает результат генерации, а не пускает его дальше по пайплайну
  2. Пред и пост обработка фотографий делается собственными функциями
  3. Взяты параметры для запуска скрипта в тестовом режиме (папка options)
  4. Код переработан так, чтобы не использовать датасеты, также удалены любые функции связанные с ними.
  5. В папке scripts находится 1 скрипт для загрузки весов натренированного CycleGAN. Для загрузки необходимо перейти в папку с CycleGAN и запустить скрипт с выбранными весами. Я использовал summer2winter_yosemite и winter2summer_yosemite. Веса загружаются в папку checkpoints
$ cd model_cyclegan
$ bash ./scripts/download_cyclegan_model.sh summer2winter_yosemite
  1. Был переделан скрипт test.py таким образом, чтобы создать модель со стандартными параметрами и сохранить ее полностью в файлы pth для дальнейшего использования ботом. Сделано это для того, чтобы отпала необходимость сложного создания модели при работе бота. Модели сохраняются в папку models_wts. Скрипт test.py запускается следующим образом:
$ cd model_cyclegan
$ python test.py --name summer2winter_yosemite_pretrained --model test --no_dropout --gpu_ids -1

gpu_ids равняется -1, так как подразумевается использование модели только на CPU

Heroku

Бот был задеплоен на heroku. Для этого создан пустой init.py и Procfile, в котором указана команда, выполняемая при запуске heroku web: python bot.py

Через Heroku были заполнены config vars, в которых хранятся токен телеграм бота и настройки для webhook:

Возникшая проблема при работе с Heroku: Весь проект с установленными зависимостями, указанными в requirements.txt, занимает на сервере 351.4 Мб из 500 Мб. Создаваемая модель для style transfer при работе с разрешением картинок уже как минимум 160x160 пикселей, уже не помещается на сервере, несмотря на то, что все слои VGG16 не загружаются, а создаются только необходимые 11 слоев и веса к ним. По этой причине картинки для style transfer сжимаются до разрешения 150х150 пикселей, а затем получаемая картинка растягивается до исходного разрешения картинки, полученной от пользователя.

requirements.txt

Чтобы проект поместился на сервере в 500 Мб и по той причине, что все вычисления происходят на CPU, torch и torchvision загружаются только с поддержкой CPU. Heroku автоматически не сможет установить данные пакеты, поэтому в файле указывается ссылка откуда их загружать.

-f https://download.pytorch.org/whl/torch_stable.html
aiogram==2.13
Pillow==8.2.0
torch==1.9.0+cpu
torchvision==0.10.0+cpu

Структура репозитория

Описание файлов и папок
images
examples Примеры работы модели
styles Варианты картинок для стиля
model_cyclegan
checkpoints Веса, используемые для создания СycleGAN
models Архитектура СycleGAN
options Параметры для создания СycleGAN
scripts Внутри скрипт для загрузки весов CycleGAN
CycleGAN.py Пайплайн для СycleGAN
test.py Скрипт для создания моделей с загруженными весами
model_nst
StyleTransfer.py Модель и пайплайн для StyleTransfer
train_vgg16.py Дообучение модели VGG16
models_wts Веса для всех моделей
bot.py Код телеграм бота
keyboards.py Клавиатуры и сообщения для бота
image_processing.py Запуск пайплайнов для NST и CycleGAN
requirements.txt Необходимые пакеты
Procfile Команда при запуске Heroku
init.py Пустой файл для работы Heroku

About

Telegram Bot на aiogram, преобразующий входящие фотографии с помощью Style Transfer или CycleGAN

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published