Как я сделал дискорд-бота для генерации художественных изображений и поэтического текста о них


Привет, добро пожаловать!

Я создал «Pyetra, the poet». Он автоматически генерирует изображение, используя модель MidJourney, и, наконец, текст, используя модель GPT-3 davinci.

Вот как выглядит запуск моего скрипта 3 раза подряд, с результатами без вишни:

Давайте пройдемся по процессу, как это было достигнуто

1. Генерация изображения:

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

Модели изображений получают некий входной сигнал и генерируют с его помощью выходной сигнал (изображение), в случае MidJourney входной сигнал называется подсказкой (текст, содержащий то, что вы хотите, чтобы модель сгенерировала).

Некоторые примеры:

Простая подсказка: «мрачный жнец»

Сложная подсказка: «женщина-воин в образе ангела смерти в доспехах с массивными черными крыльями на спине, темное фэнтези, туман, туман, небесный свет, эпический, барроко, роккоко, детали, фотореалистичный рендер, 3ds max + v ray, чрезвычайно детализированный и сложный, центральная композиция, элегантный, vfx, unreal engine 5, октановый рендер, чрезвычайно контрастный, чрезвычайно резкие линии, 8k, —ar 2:3».

Обратите внимание, что уровень детализации и «тегов» в подсказке играет огромную роль в создании более сложного, детализированного и креативного изображения, что часто называют «качеством подсказки». Интересно, что дело не обязательно в размере подсказки, а в использовании «тегов», которые модель сможет понять.

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

Как генерировать высококачественные подсказки?

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

Чтобы достичь этого, мне нужно было создать такой набор данных, я использовал selenium, который является инструментом автоматизации браузера, и с его помощью я сделал так называемый веб-скрейпинг, зайдя на сайт MidJourney и некоторые каналы discord, чтобы получить большой объем высококачественных подсказок, сделанных другими людьми. Если вы работаете на настольном компьютере, вы можете увидеть часть моего набора данных, перейдя по этой ссылке.

Очень помогло то, что на сайте MidJourney есть раздел «Лучшие творения», в котором представлены удивительные творения и подсказки, которые были использованы для их создания.

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

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

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

Некоторые модели изображений, такие как DALL-E, планируют предоставить API, способ взаимодействия с моделью в вашем коде. С API довольно просто интегрировать модель изображения и создавать собственные проекты, продукты или решения, использующие модель. Без API все еще есть некоторые способы взаимодействия с ней, но они более непоследовательны, и я бы не рекомендовал делать это для чего-то серьезного или производственного.

В настоящее время (на момент написания этой заметки) MidJourney не имеет API, поэтому для автоматической генерации изображения с помощью этой модели мне пришлось сделать пользовательский скрипт, который использует selenium (инструмент автоматизации браузера, о котором я упоминал) для входа в аккаунт discord в браузере, а затем взаимодействует с ботом MidJourney с помощью команды /imagine.

2. Генерация текста:

Для генерации текста я использую модель OpenAI text-davinci-002.

Сначала я думал просто отправить запрос MidJourney на davinci, но результаты всегда были очень общими и более или менее одинаковыми.

Поскольку такие слова, как «рендеринг», «8k», «иллюстрация», «детализация», «unreal engine», «hdr», «высокий контраст» очень часто встречаются в этих подсказках, я часто видел, как davinci говорит о них и отклоняется от темы, говоря об индустрии видеоигр и тому подобном (из-за таких тем, как рендеринг и unreal engine).

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

Поэтому сначала я очистил подсказку, удалив кучу слов, которые заставляют davinci выходить за рамки темы, стало намного лучше, но я все еще не был удовлетворен результатами.

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

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

Если вы не знакомы с этим продуктом Google, вот некоторые из его возможностей

Знакомьтесь, Google Vision

Он предоставляет список «меток», то есть классификаций, сделанных моделью. Часто он содержит объекты, присутствующие на изображении, а также некоторые сведения, например «вымышленный персонаж».

Он предоставляет список «объектов», обычно он возвращает очень мало объектов, но больше тех, которые присутствуют в изображении.

Он предоставляет список «свойств», содержащий такие части информации, как цвета, присутствующие в изображении, и его соотношение сторон.

Предоставляя всю эту информацию davinci, текст, который он будет генерировать, будет касаться элементов, цветов и особенностей, которые можно найти в изображении, поэтому он будет гораздо менее общим и гораздо более специфичным для самого изображения.

В настоящее время я использую обе идеи, исключил ряд слов из подсказки (например, «unreal engine» и «rendering») и передаю санированную подсказку, а также информацию об изображении из google cloud vision в модель davinci.

И вот конечный результат:

Вкратце, вот что происходит:

Моя облачная архитектура выглядит следующим образом:

(Поскольку я не могу модифицировать google cloud function runtime, чтобы установить chrome и использовать selenium, я использую google cloud run with docker вместо этого).

Ниже приведен вызов API davinci, который я выполняю, где переменная ‘formatted_all_features’ содержит цвета, метки и объекты, найденные на изображении, а ‘formatted_sanitized_prompt’ содержит подсказку MidJourney без ключевых слов, которые не имеют отношения к генерации текста davinci

response = openai.Completion.create(
  model='text-davinci-002',
  prompt=(
    f"Write a text talking loosely about the art that you made and its"
    f" {formatted_all_features} and {formatted_sanitized_prompt}"
  ),
  temperature=1,
  max_tokens=800,
  top_p=1,
  frequency_penalty=1.02,
  presence_penalty=1.02
)
Вход в полноэкранный режим Выход из полноэкранного режима

Надеюсь, вам понравилось читать или это было информативно в любом качестве.

  • Баннер этого поста был сгенерирован с помощью MidJourney
  • MidJourney — это развивающийся проект, и опыт все еще значительно меняется, изображения, содержащиеся в этом посте, были созданы в 8/7/2022 (%m/%d/%Y) году.

Не стесняйтесь задавать вопросы, вносить предложения и связываться со мной:
Мой e-mail: lukkamvd@gmail.com
вот мой linkedin

Оцените статью
devanswers.ru
Добавить комментарий