Опыт применения Stable Diffusion для создания игр

Как мы с командой во время геймджема и без художника сделали игру с упором на красивую графику.

Опыт применения Stable Diffusion для создания игр

Всем привет. Неделю назад вместе с командой снова поучаствовал в Siberian Game Jam и в рамках конкурса мы решились попробовать сделать игру, арт для которой будет полностью сгенерирован нейросетью. Скажу сразу – опыт оказался успешным (нашу игру можете взглянуть по ссылке), в связи с чем меня попросили подробнее рассказать о процессе работы с нейросетями в контексте разработке игр.

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

О брендах

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

  • DALL-E — самая первая подобная разработка таких масштабов от OpenAI, на технологиях которого всё и основано. Отзывов о ней слышал мало, наверное потому что долгое время была полузакрыта и сейчас доступ к ней получить тоже не так легко, как к аналогам. Работает из браузера, функций немного.
  • Midjourney – лучшим описанием этой нейросети будет «MacOS от мира нейросетей», ведь разработчики потратили много сил на то, чтобы её использование было максимально простым, приятным и эффективным. Интерфейс простой, а все результаты генерации можно мгновенно вешать на стену в рамке. Работает через бота в Discord.
  • Stable Diffusion – это уже «Linux от мира нейросетей», полностью открытая и доступная технология. Обученная на открытых данных, открытыми технологиями и поддерживаемая в том числе сообществом. Отсюда буквально ежедневные крупные обновления, полный контроль и огромные требования к квалификации пользователя, чтобы он если что смог починить неправильно установленную библиотеку или откатиться на прошлую версию из-за бага, зачем-то залитого в ветку master. Работает с вашего компа или через браузер в облаке. В первую очередь о ней дальше и буду вести речь.

Как установить и что требуется

Если вы хотите запустить Stable Diffusion у себя на компьютере, вам потребуется:

  • От 10 гб свободного дискового пространства
  • От 4-х гб видеопамяти для стабильной работы
  • Ну и всё остальное чтобы было на уровне средне-высоких спецификаций, чтобы генерация занимала секунды, а не минуты
  • Знание английского и хотя бы поверхностное знакомство с git, python и pip будет большим плюсом

Если у вас почти ничего из этого нет, вы можете использовать Stable Diffusion в облаке, например в бесплатном Google Colab (до 6 часов бесплатного использования в сутки) или любом другом уже платном сервисе (в среднем 2 бакса в час) .

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

Что умеет

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

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

Интерфейс программы. Сверху вкладочки с основными функциями и поле для ввода запроса, в центре куча настроек, снизу (Script) куча спрятанных очень полезных функций<br />
Интерфейс программы. Сверху вкладочки с основными функциями и поле для ввода запроса, в центре куча настроек, снизу (Script) куча спрятанных очень полезных функций

Существует три основных функции, доступных в интерфейсе: txt2img (текст в картинку), img2img (картинка в картинку) и inpaint (перерисовка изображения по маске). Всё остальное основано на вариации этих трёх.

В интерфейсе вы найдёте очень много галочек, но самое важное, что вам нужно знать – это три самых основных параметра, которые используются во всех функциях инструмента:

  • Sample steps (количество шагов) – сколько шагов нейросеть будет обрабатывать изображение. Грубо говоря, чем больше – тем чётче будет изображение.
  • CFG Scale (степень руководства классификатора) – степень следования направлению нейросетью, чем больше – тем больше нейросеть будет жертвовать внутренним устройством рисунка в угоду соответствия текстовому запросу.
  • Denoising strength (степень устранения шума) – насколько сильно результат генерации будет отличаться от изначального изображения на входе, используется только при редактировании изображений.

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

А если вам этого мало, советую обратить внимание на подробный список функций с объяснением их работы, дополнительные плагины и скрипты.

Что не умеет

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

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

Во-вторых, даже если в инструменте указано поле для ввода слов, не надо думать, что нейросеть понимает слова, которые вы ей пишите. Не понимает. Почитаете про китайскую комнату, вам станет понятнее о чём идёт речь. Сюда же можно добавить, что данные для обучения собирались со всего интернета автоматическим и малоконтролируемым образом, так что они были не совсем высокого качества. Сообщество до сих пор пытается понять, как на результат генерации влияют те или иные слова, и находят довольно неожиданные и невероятные открытия. Тут кстати вы можете найти гайдбук по запросам, а тут подробнее узнать, какие теги используют другие люди и для чего.

Очень известный и очень смешной пример непонимания нейросетью контекста: "Лосось в реке" ("Salmon in the river") изображён не как полноценная живая рыба, а как кусок мяса. Будьте готовы и сами столкнуться с таким.<br />
Очень известный и очень смешной пример непонимания нейросетью контекста: "Лосось в реке" ("Salmon in the river") изображён не как полноценная живая рыба, а как кусок мяса. Будьте готовы и сами столкнуться с таким.

В-третьих, у нейросети нет никакой памяти. Она не помнит, что она делала 5 минут назад, и а через 5 минут не вспомнит, что она делала сейчас. Составление однородных изображений – это до сих пор сложная задача, пусть и уже решённая, но в данном инструменте такой функции пока нет.

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

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

Но концепты она рисует шикарные...<br />
Но концепты она рисует шикарные...

Как применял

В первую очередь мы сразу решили, что будем весь арт генерировать нейросетью, поэтому это наложило на нас определённые жанровые ограничения – нужно было сделать игру, в которой можно использовать много плоской художественной графики. Жанр быстро нашёлся – Point-n-Click quest. Нейросеть использовали большей частью для отрисовки фонов, но так же для персонажей и предметов. Интерфейс и анимации делали уже сами.

Сначала определились с визуальным дизайном – хотелось чего-то сказочного, но простого и с небольшой палитрой. Сгенерировали несколько концепт-артов по ключевым словам, выбрали самый понравившийся и уже отталкивались от него. Потребовалось много сил, чтобы подобрать нужные ключевые слова, которые бы и дальше делали арт одинаково качественный и похожий друг на друга, получалось не всегда (например фон в домике котика очевидно как будто нарисованный акварелью, несмотря на обилие ключевых слов, в которых описывалось, что так лучше не делать). Ниже запрос, который я добавлял ко всем изображениям помимо основных требований.

[vector graphics] concept art artstation beautiful masterpiece pastel athmosphere bright sunny

Со стороны может казаться, что нейросеть полностью заменяет человеческий труд, то это совсем не так: ей нужен оператор, который постоянно будет вести её в правильном направлении, и это на самом деле отдельная работа, пусть и намного более простая, чем рисовать арт самому. Иногда мне приходилось буквально часами сидеть и многократно нажимать кнопку «генерировать», чтобы получить именно тот арт, который хотя бы достаточно соответствовал по требованиям, и пока занят компьютер (а у меня нейросеть занимает большую часть ресурсов компьютера), параллельно заниматься чем-либо ещё выходит не очень. Ещё нужно учитывать, что нейросеть не может генерировать сразу много изображений (максимум – 16 за раз) .

Пайплайн я позаимствовал в основном из видео ниже.

Типичный алгоритм генерации фона выглядел так:

  • С постоянным подбором параметров сгенерировать 10-30 начальных изображений через txt2img.
  • Выбрать понравившийся, одобрить с членами команды, отправить в дорисовку.
  • С постоянным подбором параметров сгенерировать 10-30 вариантов расширенных изображений, ведь нам требовались широкие фоны, по которым можно долго передвигаться (в основном использовали 1792х768 и шире) через img2img + outpainting.
  • С постоянным подбором параметров перерисовать всё, что не нравится в изображении, через inpaint, попутно зарисовывая эти детали в графическом редакторе, чтобы дать нейросети нужные ориентиры, что именно нужно нарисовать, потому что только одного текстового запроса не хватает. На каждую деталь в среднем по 50 попыток.

В итоге на один фон уходил минимум час монотонной работы.

Первоначальные варианты домика, по которым примеряли желаемый арт-дизайн<br />
Первоначальные варианты домика, по которым примеряли желаемый арт-дизайн

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

Тот самый арт внутри домика<br />
Тот самый арт внутри домика

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

Ещё очень частой проблемой является какая-нибудь мелкая деталь, которую хочется заменить, но вы не можете объяснить нейросети, что вы хотите взамен - часто легче за пару нарисовать это самому в графическом редакторе, чем десятки раз нажимать "генерировать", ожидая, когда нейросеть случайно догадается сама. Не стесняйтесь подобного подхода.

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

Часто общая концепция изображения очень нравилась, но не нравилась реализация – для такого есть генерация схожих изображений, которая тоже очень помогала. Котик, например, очень сильно перерисован с картинки взятой из интернета. Сперва мы хотели просто проверить, каков будет результат, но он нам настолько понравился, что решили оставить. По поводу вопроса воровства ассетов – у котика совершенно другой стиль рисовки, другое выражение лица и другая одежда, старыми остались только пропорции и тот факт, что это белый котик, стоящий на ножках, поэтому конечно такой подход очень удобный. Но это всё таки единичный случай и обычно мы старались сгенерировать всё с нуля.

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

В итоге за три дня работы, в свободное от программирования игры время, я смог сгенерировать 15 фонов и 5 персонажей для игры. Примеры в галерее ниже.

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

Опыт применения Stable Diffusion для создания игр
104104
34 комментария

Комментарий недоступен

14
Ответить

Ох уж эти маскировщики...

2
Ответить

Спасибо за ссылки и инструкции!

5
Ответить

Пример с лососем охуителен.

Нейросети смогут вытеснить креативщиков своим свежим взглядом на многие вещи. Прикиньте картинка с "лососем" в рекламе под слоганом "Свежая рыба!"

Автор китайской комнаты не прав в корне. Наши нейроны тоже ничего не знают о информации которую они передают. Тем не менее сознание у нас есть.

Десять лет назад я смеялся в разговорах о сознании в машинах. Сейчас я вам скажу следующее:

Бойтесь нейросетей!

5
Ответить

Он не то что неправ в корне, просто у китайской комнаты есть один аспект, который очень редко принимают во внимание: человек внутри китайской комнаты действительно не понимает, что он делает. Но — сам по себе он при этом обладает и сознанием, и самой способностью понимать. А в следствие этого (при условии, что он жрать не жрёт, стареть не стареет и может в китайской комнате просидеть сколько понадобится) он может за какое-то, пусть и долгое, время постепенно разгадать смысл. Такие дела.

Ответить

так в webui есть generate forever, правой кнопкой нажать на кнопку generate и выпадает меню

3
Ответить

А есть какое-то видео из вашей игры? Я как раз монтирую свой ролик, там как раз буду рассказывать про нейросети при разработке цепляющего визуала игр.

2
Ответить