Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Я никогда не умел рисовать. До сегодняшнего дня даже не запускал Photoshop. И тут ко мне подходит жена и говорит: "А слабо нарисовать персонажа?", — а я ей такой: "А вот не слабо". И пошла жара...

Задание

Действие происходит в мобильной игре в стиле фермы Hay Day. Вместо кур и пшеницы там можно выращивать разные сорта винограда и делать вино.

Персонаж

  • Фермер (винодел)
  • Невысокого роста
  • Полный
  • С тонкими ногами
  • В фартуке с кармашком
  • В шляпе
  • Синие джинсы, подвернутые снизу
  • Рубашка в клеточку, рукава подвернуты
  • Темно-коричневые волосы слегка вылезают из под шляпы
  • Густые усы, но без бороды
  • За усами не видно губ
  • Круглый нос
  • Голубые глаза

Референсы

Инструменты

Для решения задачи я решил воспользоваться сладким плодом технологического прогресса — нейросетью Stable Diffusion. Для этого поднял сервер в облаке с видеокартой Nvidia A100, 40 GB VRAM. На нем развернул веб-интерфейс от AUTOMATIC1111 и скачал модель версии 1.5. С такой конфигурацией я мог генерировать несколько тысяч картинок в час (1 картинку за ~0.8 сек).

Веб-интерфейс от AUTOMATIC1111 со стандартными настройками
Веб-интерфейс от AUTOMATIC1111 со стандартными настройками

Чтобы удостовериться, что все работает, ввел запрос

a farmer

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Prompt Engineering

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

a mobile game character farmer. Short, blue jeans, turned up at the bottom, brown mustache, yellow-orange plaid shirt, sleeves turned up, farm hat, blue eyes, round nose, no lips visible behind the mustache, but no beard, dark brown hair like a mustache, coming out a little from under the hat, in an apron with a pocket, like a pastry chef

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Выглядит так себе. Кстати, обычно на этом этапе люди и останавливаются, подкрепляя аргументом

Х*йня эти ваши нейросети

(с) Джейсон Стэтхем

Я же решил продолжить. Нашел на просторах интернета Prompt Engineering Guide и посмотрел несколько туториалов на YouTube.

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

a full-body view

Prompt

Не стоит недооценивать важность Negative Prompt. Он представляет из себя набор утверждений, которые мы не хотим видеть на сгенерированных изображениях. Туда я добавил

a cropped body, cropped legs, out of frame

Negative Prompt

Стиль изображений далек от референсов. Чтобы это исправить, я переписал начало запроса

a mobile game character farmer, (game concept:1.3), unity engine

Кстати, в AUTOMATIC1111 (text:1.3) означает, что мы поднимаем вес фразы с 1 до 1.3.

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

Чтобы снизить число артефактов, когда сеть рисует по две головы и отрывает людям ноги, я усовершенствовал negative prompt.

Итоговый text-to-image запрос

Prompt:

a (full-body:1.2) view of a mobile game character farmer, short stature, blue jeans, turned up at the bottom, brown mustache, yellow-orange plaid shirt, sleeves turned up, farm hat, blue eyes, round nose, no lips visible behind the mustache, no beard, dark brown hair like a mustache, coming out a little from under the hat, old brown gloves, a farmer in an apron with a pocket, like a pastry chef, (game concept:1.3), symmetry, unity engine, art by carlosortega, dmitrodanilov

Negative Prompt:

a cropped body, cropped legs, beard, two heads, (ugly:1.2), duplicate, morbid, out of frame, (poorly drawn hands:1.2), (poorly drawn face:1.2), mutation, deformed, blurry, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, long neck

Image-to-image

Мы подобрали текстовый запрос, который позволяет стабильно рисовать забавных, маленьких фермеров. Теперь начинается магия. Возьмем уже знакомый нам референс и прогоним его несколько раз через img2img, используя значения deniosing: 0.6, 0.65, 0.7, 0.75.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

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

Небольшое отступление про deniosing — это ключевой параметр в img2img. Чем ниже его значение, тем ближе сгенерированный результат будет к исходному изображению. Чем выше, тем больше нейросеть будет проявлять фантазии в соответствии с текстовым запросом.

img2img, Denoising: 0.6, Sampler: euler a, Steps: 20, cfg (guidence_scale): 7
img2img, Denoising: 0.6, Sampler: euler a, Steps: 20, cfg (guidence_scale): 7

Подставим полученное изображение в качестве референса и снова прогоним через несколько итераций img2img, варьируя денойзинг в диапозоне от 0.5 до 0.75.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

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

Плюсы:

  • Глаза не как у терминатора
  • Отсутствуют двойные брови
  • Отсутствует красный артефакт под ухом

Минусы:

  • Левая рука превратилась в горшок с цветами
  • Часть правой руки превратилась в пятно на фартуке
  • Шляпа оставляет желать лучшего
  • Усы и рот плохо проработаны
  • Рубашка должна быть в клеточку

Inpainting

Когда найдена форма, можно перейти к устранению недостатков. Во вкладке inpainting создадим маску, где должна находиться шляпа.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Прогноим несколько итераций с денойзингом 0.85 и запросом

a yellow farm hat with ribbon at the hem

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Задали силуэт шляпе. Теперь прогоним изображение несколько раз с оригинальным промптом через img2img и deniosing 0.6.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

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

Удалим ластиком в Photoshop зеленую ленточку от фартука.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Добавим в начало запроса акцент на руки вместо full-body view

nice hands, mobile game character farmer, short stature, blue jeans, turned up at the bottom, brown mustache, a yellow shirt with large grey checks, sleeves turned up, a yellow farm hat with ribbon at hem, blue eyes, round nose, no lips visible behind the mustache, no beard, dark brown hair like a mustache, coming out a little from under the hat, old brown gloves, a farmer in an apron with a pocket, like a pastry chef, (game concept:1.3), symmetry, unity engine, art by carlosortega, dmitrodanilov

И через несколько итераций img2img рука начнет отрастать.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Аналогичный трюк проделаем с правой рукой. А также вспомним, что наш персонаж должен быть полным. Нейросеть изначально ожидает изображение 512x512. Если это не так, то изображение растягивается до нужных размеров. Используя это знание, обрежем белый фон по бокам и снова прогоним через img2img.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

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

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

С помощью инструмента "Сморщивание" в разделе "Пластика" Photoshop уменьшим толщину ног.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Создадим маску вокруг рубашки.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

И несколько раз прогоним с запросом

a yellow shirt with large grey checks

Получим рубашку в клеточку

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Upscaling

Прогоним изображение через img2img на низком denoising в диапозоне от 0.1 до 0.3. При этом увеличим разрешение до 1024х1024, поставим LMS Sampler, 150 steps и поднимем CFG до 10. А в запрос добавим

sharpen, 4k, HD, very detailed

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Таким образом мы сгенерировали несколько вариаций изображения в более высоком разрешении и сгладили шероховатости. Хотя не обошлось и без потерь в области лямки на левой руке.

В Photoshop поднимем резкость в области ног. В AUTOMATIC1111 перейдем во вкладку Extras и воспользуемся ESRGAN_4x + 0.5 SwinIR_4x, чтобы увеличить качество в 4 раза. Сайт убивает разрешение, но поверьте мне, оно выросло. Итоговое изображение весит 10 МБ.

Накидываем концепт игрового персонажа с помощью нейросети Stable Diffusion

Заключение

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

Самопиар

3333
16 комментариев

А мне наоборот SD зашел больше чем MJ. Лучше получается настроить и передать свои мысли нейронке)

2

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

Легче в гугле вбить «фермер персонаж» мы получим куда интереснее результаты.

2

Это всё интересно, но на моей практике гораздо быстрей можно получить почти финальный результат из пред обученной модели на определенный объект. Вот как пример попытка сгенерировать персонажа, вид с верху. При том что это первая итерация. Возможно результат получился бы гораздо лучше у топик стартера если бы в промте использовалось больше упоминаний разных иллюстраторов.

1

Так как MJ выдаёт более лучший результат по гораздо короткому запросу, более удачный вариант получился бы через связку MJ и SD таким образом что с начало генерируем в MJ а уже в SD через img2img плодим варианты.

1

Прекрасная yellow shirt )
Мне так SB на просьбу нарисовать красные светящиеся стелы упорно рисовал синие )

1

да, про yellow я чет забыл в процессе :)

В итоге получились разные марио)

1