Генерация изображений персонажей с помощью AI и при чем тут Тейлор Свифт

Вы, вероятно, слышали о Тейлор Свифт и очень креативном наборе изображений, созданных одним из её фанатов. Что могу сказать — это был лишь вопрос времени, когда кто-то это сделает. Как мы знаем — не бывает плохой  рекламы, однако что если вас зовут не Тейлор Свифт, и никто не создает и не ищет ваши изображения в Google?

Хотя это действительно очень печально, по крайней мере вы можете создать свои собственные изображения. Правда если вы хотите использовать генеративные модели для создания последовательных историй с элементами сюжета, это не так просто, как вам могло показаться. Создать одного-двух персонажа с помощью Dall-e или Stable Diffusion довольно просто. Но что, если вы хотите создать целую историю с одними и теми же персонажами в разных обстановках и стилях? Исследователи генеративных моделей неустанно работают над тем, чтобы упростить для вас процесс создания собственного творческого искусства с вашим любимым актером, но пока что это не так просто.

Так что же мы можем сделать сейчас? Давайте посмотрим.

Для целей этой статьи мы не будем использовать Тейлор Свифт, так как я не фанат. Вместо этого давайте создадим то, чего хочет каждая девушка — сказку с принцем (конечно же, на белом коне). Принц мужественный, красивый и благородный — почти как я сам.

Промптинг

Для начала давайте сгенерируем обучающий датасет, используя обычный ChatGPT 4.0 с Dall-e, используя очень подробный запрос вроде этого:

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

И вот результаты:

d9f91244af1abaa8b56b5e81761a48a7.png

Результаты неплохие (определенно напоминает меня). Изображения более или менее последовательны и выглядят похожими. Они не настолько похожи, как нам требуется, чтобы использовать только prompting для создания связного рассказа, но достаточно хороши для создания тренировочного сета.

Stable Diffusion

Поскольку обычный промптинг не справился с нашей задачей, давайте попробуем более продвинутые техники. Все мы слышали о Stable Diffusion (если нет у меня есть статья об этом). Что если мы сделаем fine-tuning Stable Diffusion для принца с нашим обучающим набором данных? Разве тонкая настройка не решает все проблемы?

Мы будем использовать https://stable-diffusion-art.com/embedding/ . Данный подход позволяет создать персонажа и использовать его для дальнейшей генерации. Был проведен эксперимент с несколькими тренингами и генерациями.

В результате тренировки создались эмбединги со следующими изображениями:

9046b764bc9c5bbfdeacc258104bda20.png

Не очень то похоже на то, что мы хотели, не так ли? Изображения совершенно разные, мои бывшие жены и то были более последовательны чем это. Проблемы, которые мы здесь видим:

  • Сгенерированные изображения не похожи на оригинальное изображение

  • Когда мы генерируем сцену — модель игнорирует все детали о местоположении и просто генерирует персонажа. Коней тоже не завезли.

  • Тренировка модели возможна только через веб-интерфейс Stable Diffusion, автоматизировать это непросто.

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

LORA и DreamBooth для диффузии

Lora — это техника тонкой настройки, которая позволяет настраивать модель, используя небольшое количество обучаемых параметров. Учитывая что нынче модели такие отожранные, это позволяет тренировать существующие модели за разумное время и ресурсы.

DreamBooth — это техника тренировки, которая обновляет всю модель text-to-image, тренируя всего на нескольких изображениях объекта или стиля.

Мы хотим натренировать базовую модель Stable Diffusion изображением нашего принца, чтобы она знала, какого именно принца мы хотим. По желанию вы можете ассоциировать его с определенным уникальным токеном, например .

DreamBooth здесь нужен как дополнительный шаг, поскольку без него тонкая настройка на ограниченном наборе изображений приводит к тому, что модель выводит персонажа только в тех же углах/позах, что и в обучающем наборе данных, и в целом становится глупее (см. DreamBooth: Fine Tuning Text‑to‑Image Diffusion Models for Subject‑Driven Generation). Я не собираюсь углубляться в объяснение работы Lora, так как это тема для другой статьи, но мы хотим чего-то вроде этого:

34a73df6f22cec6d88e32e0f0ce38e8e.png

Для тренировки давайте используем сервисы Stable Diffusion здесь:

https://stablediffusionapi.com/docs/train-model/lora-finetune/ — тренировка lora

https://stablediffusionapi.com/docs/train-model/finetune-v2 — тренировка DreamBooth

Как базовую модель возьмем Midjourney и наш тренировочный набор выше. Параметры тренировки:

{
  "_token": "",
  "key": "",
  "channel": "train_in_model",
  "class_prompt": "An image of a prince on the white horse",
  "base_model_id": "midjourney",
  "endpoint": "create-request",
  "training_type": "men",
  "instance_prompt": "An image of prince_on_the_white_horse person",
  "images": [
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/1.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/10.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/11.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/2.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/3.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/4.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/5.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/6.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/7.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/8.png",
    "https://s3.timeweb.com/bac216d5-ai-labs-public/princedataset/9.png"
  ],

  "webhook": "https://stablediffusionapi.com/training_status/SmapI87z5JRrbcHFQUtTD3P2A",
  "seed": null,
  "base_model": "prompthero/openjourney",
  "max_train_steps": "2000",
  "training_id": "SmapI87z5JRrbcHFQUtTD3P2A"
}

Тренировка заняла примерно 30 минут. После тренировки мы сгенерировали изображения в разных позах. Вот примеры:

{
    "prompt": "mdjrny-v4 style An image of prince_on_the_white_horse person riding a horse on the seashore. Show blue sky with the sun. Dreamy style.",
    "negative_prompt": "painting, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, deformed, ugly, blurry, bad anatomy, bad proportions, extra limbs, cloned face, skinny, glitchy, double torso, extra arms, extra hands, mangled fingers, missing lips, ugly face, distorted face, extra legs, anime",
    "model_id": "SmapI87z5JRrbcHFQUtTD3P2A",
    "panorama": null,
    "self_attention": null,
    "width": "512",
    "guidance": 7.5,
    "height": "768",
    "samples": "1",
    "safety_checker": "no",
    "steps": 20,
    "seed": null,
    "webhook": null,
    "track_id": null,
    "scheduler": "UniPCMultistepScheduler"
}

bbe935dfc0f92fc3bc87ab6880514bf4.png

{
    "prompt": "mdjrny-v4 style An image of prince_on_the_white_horse person riding a horse through mountains",
    "negative_prompt": "painting, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, deformed, ugly, blurry, bad anatomy, bad proportions, extra limbs, cloned face, skinny, glitchy, double torso, extra arms, extra hands, mangled fingers, missing lips, ugly face, distorted face, extra legs, anime",
    "model_id": "SmapI87z5JRrbcHFQUtTD3P2A",
    "panorama": null,
    "self_attention": null,
    "width": "512",
    "guidance": 7.5,
    "height": "768",
    "samples": "1",
    "safety_checker": "no",
    "steps": 20,
    "seed": null,
    "webhook": null,
    "track_id": null,
    "scheduler": "UniPCMultistepScheduler"
}

e7b2aae7909bf62671110d9571542290.png

Выглядит очень впечатляюще, если вы живете в 1992 году. Некоторые заметки:

  • Обученные изображения не выглядят полностью так же, как оригинал, хотя определенное сходство есть

  • Качество хуже, чем у midjourney и DALL·E 3

  • Тренировка занимает 30 минут и стоит 1$ за одну сессию

  • StableDiffusion может обрабатывать ограниченное количество токенов за один раз. Есть трудности с генерацией детализированного местоположения

Заключение

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

Использование комбинации gpt-4 vision, gpt-4 и Dall-e 3

Модель gpt-4 vision принимает изображение героя в качестве входных данных и делает очень подробное описание героя (лицо, одежда, волосы и т. д.). Затем мы используем Dalle-3 для генерации изображений:

Вот пример промпта:

Сгенерируй изображение согласно следующему описанию:

Принц: Принц обладает благородным и уверенным демоном, со светлой кожей и темными, волнистыми каштановыми волосами. У него крепкая линия челюсти и легкая щетина, а его глаза сосредоточенны и решительны. Он носит королевский синий двубортный пиджак с золотой вышивкой и деталями на пуговицах. Под ним белая рубашка со стоящим воротником. Ярко-красный плащ наброшен на его левое плечо и струится за ним, указывая на движение.

Конь: Конь — мощный и элегантный белый скакун с мускулистым телосложением, широкой грудью и изогнутой шеей. Его грива и хвост длинные, пышные и ухоженные, с мягким серебристым блеском. Снаряжение коня роскошное, с изысканными деталями из красного бархата и золотого листа. Заметны декоративные элементы, такие как лобовая повязка, украшенная красными розами и золотым филигранью, и седло, которое также очень нарядное.

Одежда и аксессуары: Наряд принца дополнен коричневыми кожаными перчатками и подходящими высокими верховыми сапогами с тонкой отделкой. На левом боку у него висит меч, что видно по рукоятке, выглядывающей из-под плаща. Его поза прямая, излучает авторитет и грацию.

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

Действие: принц держит меч в левой руке

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

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

6748f2f2f7b93e7e2eb6e77473b78e15.pngЭпично

Эпично

Вы не всегда сможете получить персонажа, который на 100% похож на оригинал, но получается довольно близко. Используя модель Dalle-3, этот подход позволяет получить максимальное качество генерации. Выглядит очень похоже на оригинал и генерация проходит достаточно быстро, так что в зависимости от ваших потребностей этот вариант вам может подойти.

LORA + ControlNet debd + Stable Diffusion

Самый комплексный подход. ControlNet — это техника, которая позволяет использовать другие изображения в качестве трафарета для указания параметров желаемого результата изображения, например, позы или фона, гораздо более точным образом:

Как работает ControlNet: сервис для контролируемой генерации изображений

ControlNet: использование трафарета

Это очень полезная вещь для нашей задачи. Вот что мы делаем:

  • Используя GPT-4 Dall-e, создаем около 100 изображений нужного лица

  • Делаем тренировку lora, используя эти изображения и https://stable-diffusion-art.com/train-lora/. Мы тренируемся для вложений лица.

  • Используя control net, нам нужно создать маску героя  debd в требуемой позиции

  • С помощью control net генерируем нашего принца

  • Возможны артефакты вроде лишних пальцев, так что вам, возможно, придется исправлять их вручную

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

Похожий подход был реализован здесь для стилизации изображений: https://huggingface.co/spaces/InstantX/InstantID. Работает весьма хорошо, основное изображение используется как трафарет:

Промпт: A photo of a person on Arrakis in Fremen outfit

Промпт: A photo of a person on Arrakis in Fremen outfit

Так что попробуйте.

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

© Habrahabr.ru