Это Style Transfer Telegram бот, который умеет переносить стиль с одной фотографии на другую как с помощью классического алгоритма Гатиса так и с использованием CycleGAN. Для написания бота использовалась библиотека aiogram для создания асинхронной архитектуры. Код телеграм бота находится в файле bot.py. В файле keyboards.py находятся используемые клавиатуры и длинные сообщения.
- Перенос стиля:
- Для работы необходимо осначала отправить фотографию стиля, а потом фотографию, на которую требуется перенести выбранный стиль.
- Есть возможность выбора заранее предустановленных стилей выполненных на основе 8 всемирно известных картин.
- Использование CycleGAN:
- Превратить фотографию в картину, выполненную в стиле работ Ван Гога.
- Превратить фотографию в картину, выполненную в стиле работ Моне.
- Бот может показать примеры, получаемые в результате выполнения 3 вышеуказанных алгоритмов.
- Перенаправить на репозиторий с проектом.
- Запоминание пользователей и отправляемых ими фотографий реализовано через словарь, в котором сохраняются объекты класса для каждого пользователя, начавшего общение с ботом. В объекте класса хранится id пользователя, название выбранного алгоритма и фотография стиля (в случае использования Style Transfer). Фотография контента и фото для CycleGAN не сохраняются, а передаются напрямую в пайплайн выбранного алгоритма.
- Бот отдает фотографию в том же разрешении, что и получил от пользователя. Так как для моделей необходимы квадратные фотографии, то используются паддинги.
- StyleTranfer: сжатие до 250 пикселей (оптимальное время\качество).
- CycleGAN: сжатие до 512 пикселей.
- Алгоритмы запускаются в отдельном потоке с помощью threading.Thread.
- Длительность работы:
- StyleTrasfer: в среднем до 5 минут.
- CycleGAN: в среднем до 15 секунд.
Для переноса стилей с помощью классического алгоритма Гатиса было выполнено следующее:
- Взята предобученная на датасете Imagenet модель VGG19.
- Модель была дообучена на датасете Caltech 101, содержащим 8677 изображений в 101 категории. Код обучения представлен в файле model_nst/train_vgg19.ipynb.
- С целью оптимизации и экономии вычислительных ресурсов, были сохранены веса только первыx 11 слоёв модели в файл models_wts/vgg19.pth.
- Алгоритм переноса стиля использует итеративное изменение входной картинки на основе разницы между style и content картинками.
Для реализации CycleGAN был взят код junyanz pytorch-CycleGAN-and-pix2pix, который, в свою очередь, ссылается на jcjohnson fast_neural_style. Код дает возможность использовать CycleGAN и pix2pix модели в различных режимах и на различных датасетах.
Перед использованиям в целях оптимизации были выполнены следующие действия:
- Архитектура CycleGAN применяется только в режиме для теста, чтобы позволяет генерировать изображения только в одну сторону (папка models)
- Модель принимает на вход изображения, а не датасет.
- Убраны неиспользуемые функции.
- Модель сразу возвращает результат генерации.
- Пост- и предобработка фотографий делается собственными функциями.
- Используются параметры для запуска скрипта в тестовом режиме (папка options).
- Все функции использующие датасеты вместо изображений удалены.
- В папке scripts лежит скрипт для загрузки весов предобученного CycleGAN. Для загрузки необходимо перейти в папку с CycleGAN и запустить скрипт с выбранными весами. Все веса загружаются в папку checkpoints
$ cd model_cyclegan
$ bash ./scripts/download_cyclegan_model.sh style_vangogh
- Для того, чтобы избежать сложного создания модели, скрипт test.py был исправлен таким образом, чтобы создать модель со стандартными параметрами и сразу сохранять ее в файл pth для дальнейшего использования ботом. Модели сохраняются в папку models_wts. Скрипт test.py запускается следующим образом:
$ cd model_cyclegan
$ python test.py --name style_vangogh_pretrained --model test --no_dropout --gpu_ids -1
gpu_ids равен -1, так как подразумевается использование модели только на CPU.
В связи с тем, что все вычисления выполняются на CPU, установлены СCPU версии Torch и Torchvision.
Проект был собран на Python версии 3.9.0
aiogram==2.19
Pillow==9.0.1
torch==1.10.2
torchvision==0.11.3
python-dotenv==0.19.2
Описание файлов и папок | ||
---|---|---|
images | ||
examples | Изображения с примерами работы модели | |
styles | Предустановленные изображения со стилями | |
model_cyclegan | ||
checkpoints | Директория для загрузки весов для создания СycleGAN | |
models | Архитектура СycleGAN | |
options | Параметры для создания СycleGAN | |
scripts | Скрипт для загрузки весов CycleGAN | |
CycleGAN.py | Пайплайн СycleGAN | |
test.py | Скрипт для создания моделей с загруженными весами | |
model_nst | ||
StyleTransfer.py | Модель и пайплайн для StyleTransfer | |
train_vgg19.ipynb | Дообучение модели VGG19 на датасете ScalTech | |
models_wts | Веса для всех моделей | |
bot.py | Код телеграм бота | |
keyboards.py | Клавиатуры и сообщения для бота | |
image_processing.py | Запуск пайплайнов для NST и CycleGAN | |
requirements.txt | Необходимые пакеты | |
.env | Файл с переменными окружения |