Я задумал создать сайт, где каждый пользователь может сгенерировать одну картину с помощью GPT от Сбера (что-то вроде text-to-image). Пользователь вводит запрос, выбирает стиль и цвет, и затем все сгенерированные картинки объединяются в одну общую(один раз) и в режиме реального времени генерируется сетка со всеми пользовательскими картинкми.
К сожалению, развернуть проект не получилось: при отправке запроса с хостинга API Сбера возвращал connection refused.
Код проекта можно посмотреть и потестировать здесь: GitHub репозиторий.
Интересные решения в коде
Поскольку картинок должно было быть много, идея загрузки всех изображений и их объединения с помощью GPT сразу отпала. Вместо этого я решил собирать текстовые запросы пользователей и выделять ключевые моменты через библиотеку NLTK. Вот код для суммаризации текста:
2. Создание сетки из картин
На сайте я хотел показать сетку из всех картин в реальном времени, потому что общая картина генерировалась бы только один раз. Для создания сетки я использовал numpy, а также добавил подписи с позициями картин в сетке. Чтобы поддерживать актуальность сетки, я создал фоновую задачу, которая регенерирует её каждые 5 картинок (5 — оптимальное количество, определенное опытным путем).
3. Автоматизация заполнения базы данных
Так как я выделил стиль и цвет в отдельные модели БД (это было сделано для удобства — чтобы потом легко находить самый популярный стиль и цвет и использовать их в общей картине), я заранее знал, какие будут стили и цвета. Чтобы не создавать их вручную при каждом запуске в новом окружении, я написал такой скрипт:
Color.objects.bulk_create([Color(color=short_cut) for short_cut, color in COLORS.items()])
Style.objects.bulk_create([Style(style=short_cut) for short_cut, style in STYLES.items()])
4. Функция шаринга
Надеясь, что проект всё же удастся развернуть, я добавил функцию, которая давала пользователям одну дополнительную генерацию за каждый шаринг сайта. На бэке я просто менял флажок can_add, но на фронте реализовал это следующим образом:
В итоге я также добавил лидерборд для тех, кто шарил сайт, настроил celery, redis, и завернул всё это в Docker.
Надеюсь, эта статья была полезной и вдохновляющей. Делитесь своим мнением в комментариях!