Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Данный проект является выполнением итогового проекта Deep Learning School 1 семестр.

Пояснительная записка к телеграм-боту.

При разработке бота я столкнулся с двумя серьёзными проблемами. Решением обеих проблем стал отказ от загрузки бота на heroku или любой другой сервер.

  1. Первым делом я реализовал общение с пользователем и запустил бота на heroku. О том, как это сделать нашёл статью, как мне кажется, лучше предложенной в задании https://teletype.in/@cozy_codespace/Hk70-Ntl4

  2. После этого я дописал к коду нейросеть, воспользовавшись статьёй из задания https://pytorch.org/tutorials/advanced/neural_style_tutorial.html и обнаружил, что теперь для загрузки на heroku не хватает памяти. Дело в том, что heroku предоставляет 500Мб памяти, а веса VGG19 весят больше 500Мб.

  3. Решая эту проблему, я стал гуглить примеры телеграм ботов, чтобы узнать, какие есть ещё способы разместить бота на удаленном хостинге. Не найдя ни одного телеграм-бота с нейросетью, я стал искать просто рабочих ботов с нейросетевой обработкой картинок. Все боты, которые я нашёл, оказались отключены – не отвечали на сообщения. Подумав, я понял, почему таких ботов нет. Бот с нейросетью очень тяжелый, и его дорого хостить. Поэтому даже вновь разработанных ботов отключают через время. В процессе сёрфинга я натыкался на сайты-конструкторы телеграм-ботов. Эти сервисы предоставляют возможность создать бота, не написав ни строчки кода. Но такие боты способны выполнять только базовые алгоритмы и не могут иметь «под капотом» нейросеть. Также эти сервисы умеют бесплатно хостить разработанных на них ботов. Таким образом можно сделать вывод, что предоставление бесплатных 500 Мб от хероку или амазона бесполезно. Если нужен бот без нейросети, то совсем не обязательно писать для него код - есть много сайтов, где его можно сконструировать и захостить. А если нужен бот с нейросетью, то он всё равно не поместится на эти бесплатные 500 Мб. И даже если поместится, то он будет ужасно медленным, потому что хероку и амазон не предоставляют GPU. Это ещё одна причина, почему такие боты долго не живут. Раз GPU не предоставляется, то для быстрой работы нужно искать другое платное место. И мы опять возвращаемся к тому, что таких ботов дорого хостить. Лишь спустя долгое время я наткнулся на следующие статьи:

    https://medium.com/analytics-vidhya/create-your-own-deepart-clone-pytorch-neural-style-transfer-web-app-using-streamlit-with-code-b12c0e41d4c7

    https://github.com/JadeBlue96/Style-AI

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

  4. Временно забив на эту проблему, я перешел к реализации работы с несколькими пользователями. Чтобы это можно было сделать, я с самого начала решил использовать aiogram. Асинхронность позволяет выполнять функции в любом порядке бесконечное количество раз, но этого недостаточно для работы с несколькими пользователями. Ведь бот всё-равно не будет знать, на каком этапе общения с каким пользователем он находится. Для него все пользователи – это один и тот же человек. Я решил создать словарь, ключами которого будут id пользователя, а значениями – объекты специального класса. Этот объект содержит все параметры, необходимые для корректной работы с каждым пользователем в отдельности. Подробнее описано в комментариях к коду.

  5. Теперь вернёмся к тому, что нейросеть, работая на heroku очень долго обрабатывает изображения. Возникает следующая проблема: бот не реагирует ни на что, пока не закончит работу нейросеть. То есть в этот момент другой пользователь не сможет получить ответ от бота. Это связано с тем, что даже если метод асинхронный, он не даст выполняться другому асинхронному методу, пока он сам не закончится, либо пока в нём не произойдет вызов другого асинхронного метода. Таким образом, необходимо, чтобы сеть работала независимо от диалога. В итоге, у проблемы оказалось 2 решения: либо создавать несколько потоков: в один засовывать работу нейросети, в другой общение с пользователем, а в третий диспетчер очереди картинок и отправки результатов, либо делать тоже самое, но с использованием не потоков, а микросервисов. При том, в варианте с созданием нескольких потоков, придётся отказываться от aiogram, потому что параллельность и асинхронность мешать нельзя. Мне приходилось раньше работать с многопоточным программированием. Опыт подсказывает, что в процессе разработки придётся решить огромную кучу ошибок. На отладку такой архитектуры просто не хватит времени, отведенного на разработку проекта.

  6. В начале я написал, что столкнулся с двумя проблемами. Они описаны в пункте 3 и пункте 5. А именно: моя нейросеть не помещается на хероку, и моя нейросеть медленно работает на cpu, убивая на это время бота. В итоге я пришёл к максимально оптимальному решению, с минимумом затрат времени и максимумом эффективности. Я решил хостить бота у себя на компе. Ко мне на комп нейросеть точно поместится. Кроме того, я могу использовать cuda, что в 100 раз ускорило работу нейросети. Я также смог улучшить качество работы, увеличив количество эпох и разрешение картинок. Теперь нейросеть обрабатывает картинки быстро, и, соотвтетсвенно, сократилось время зависания бота. Теперь эта пауза почти незаметна. А чтобы бот работал всегда, я поместил его в автозагрузку. Теперь он всегда работает, когда включен компьютер.

  7. Так как я не выполнил одно из основных заданий, я решил подумать над выполнением дополнительного. Так я придумал добавить в бота ещё одну нейросеть – улучшения качества изображений. На этом сайте https://paperswithcode.com/paper/photo-realistic-single-image-super-resolution приведен список всех репозиториев с нейросетями для улучшения качества. Я просмотрел все примеры из списка на pytorch, отбирая те, которые уже имеют веса, и которые не требуют установки матлаба. Из оставшихся у меня заработал пример https://github.com/xinntao/BasicSR. Так как я с базового потока, и вообще не изучал GANы, пришлось изучить. Есть генератор и дискриминатор. Сначала на реальных больших изображениях обучается дискриминатор. Его цель – запомнить, как они выглядят. Затем на генератор подаются маленькие копии тех больших изображений. Задача генератора – сделать из них большие изображения таким образом, чтобы дискриминатор не смог их отличить от настоящих больших изображений. Поэтому сеть и называется состязательной. Я скачал этот репозиторий и подключил его к своему боту, немного изменив исходный код.

  8. Размышляя о том, как ещё улучшить своего бота, я добавил поддержку нескольких языков, обратную связь и кнопку сброса. Для поддержки нескольких языков я сделал специальные классы, содержащие все фразы, которые бот умеет говорить. Необходимо также помнить, что каждый пользователь может выбрать свой язык, поэтому объект этого класса помещается в объект пользователя. Обратная связь реализована следующим образом: при команде report бот присылает приглашение оставить отзыв о себе. Следующее сообщение от пользователя бот присылает мне в лс, не указывая автора сообщения. Также я подумал, что было бы удобно иметь возможность сбросить личные настройки бота. Это удаляет объект пользователя в словаре и все его картинки, если они есть. Таким образом можно сбросить работу, если отправил не то изображение, передумал или выбрал не то действие. Точно также можно отменить оставление отзыва.

About

Telegram-бот для переноса стиля (Neural Style Transfer) и апскейла изображений (GAN), курсовой проект DLS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages