Нейросеть: как нарисовать лису с крыльями. Долгая история с множеством попыток (18+)

Автор: wayerr

(Осторожно, жуткие картинки и траффик.) 

Итак, сейчас я расскажу как у нейросети (речь про "stable diffusion", далее просто SD) успешно попросить нарисовать странного, например обычную четвероногую лису с крыльями.

Лиса с крыльями (не идеально, увы), нарисованная Stable Diffusion (prompt и остальное дальше в блоге).

Кто-то скажет, что тут сложно? В общем, если это и в правду оказалось не сложно, то приносите в коменты "подсказку" (т.е. текст запроса, он же prompt), будет интересно поглядеть. 

Я же подробно расскажу как составляется эта "подсказка". 

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

Учитывая что вторая нейросеть насмотрелась на несколько миллиардов картинок, что многовато, то увидеть она может очень много всего. 

Проблема в первой нейросети и в векторе. 

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

Но в нашем случае вектора в любом случае хватит - более того, в интернете не мало картинок лис с крыльями, так, что всё просто? 

Нет, потому, что картинки в интернете называются абы как (а-ля "8k hd wallpaper" и в LAION-5B по которому обучалась нейросеть таких много), потому что нейросеть могла их и не видеть. 

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

Простой пример, "colored paper" + слова в табличке:

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

Зная всё это, начнём прикручивать к лисе крылья. Всё скриншоты ниже с одними и теми же параметрами: "Steps: 20, Sampler: DDIM, CFG scale: 7, Seed: 3855750872, Size: 512x512"

"fox with wings":

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

"fox winged":

Ну да, я же не в том порядке пишу. Попробуем:

"winged fox":

В некотором смысле ой. Хотя, и крылья и лиса есть. 

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

"winged fox, fox with wings":

"fox with wings, winged fox":

Делаем два вывода: порядок имеет значение, а главное что действительно слова накладываются и в какой-то мере улучшаются (ну если быть оптимистом). Может попробовать наложить что-то ещё, допустим, предположить, что лиса у нас в полёте?

"fox flying on wings":

Как-то странно оно выглядит и что-то неуловимо напоминает. Те кто хоть как-то знакомы с животным миром, уже всё поняли, а мы сделаем вид, что не знакомы и загуглим.

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

У некоторых реализаций SD есть negative prompt который якобы позволяет исключать вещи, которые нам не нужны на картинке, но увы, в моём случае он исключал и крылья, то бишь заставить работать я его не смог. Тогда я задумал обходной манёвр: запросить волка с крыльями, а потом переделать его в лисицу (ну или гибрида). Грифнов и пегасов я тоже смотрел, но у нейросети с этим сложно. В итоге, я заметил, что нейросеть видит разницу между wolf fox и wolf-fox, и тогда я подумал (впервые, видимо)...

"fox-with-wings":

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

"winged-fox":

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

"winged-fox realistic art"

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

"winged-fox realistic art fox-woman winged-woman":

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

"winged-fox realistic art fox-woman winged-woman, epic fantasy character art":

Тут надо отметить, что "character art" - здесь нужен не столько для стиля, сколько для того чтобы спозицинировать нейросеть, иначе оная может показывать не персонажа, а куски его. Почему так, а не портрет? Потому что в интернете мало кто подписывает картинки как "портрет". А вот "epic fantasy" - это уже элемент стилизации. Он не всегда срабатывает и иногда мешает (например если нужна фантастика или киберпанк), но нашем случае крылатые персонажи вполне из фентези. 

Ещё немного стиля и фон.

"winged-fox realistic art fox-woman winged-woman, epic fantasy character art, wallpaper 4k hd sunset":

К слову самый безобидный вариант сказать нейросети, что нужна "модная картинка" это попросить "wallpaper hd", потому что практические всякую качественную картинку очищают от исконных тегов и выкладывают именно с таким описанием, не важно что там. За счет такой массовости эта фраза не так сильно искажает работу нейросети - под таким тегом бывает всё что угодно, но обычно дельно нарисованное. Иногда ещё можно использовать "detail art", к слову.

Теперь в полёт:

"flying-winged-fox realistic art fox-woman winged-woman, epic fantasy character art, wallpaper 4k hd sunset"

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

"flying-winged-fox realistic furry-art fox-woman winged-woman fox-with-wings, epic fantasy character art, wallpaper 4k hd sunset":

Тут я уже смотрел не по 4-ре картинки, а по 8-мь. По идее лучше сразу смотреть больше, но это если скорость вас устраивает. Если ориентироваться на малое число картинок, то при подгоке "подсказки" можно получить эффект, когда она работает только для видимы картинок.

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

"flying-winged-fox realistic furry-art fox-woman winged-woman fox-with-wings, fox feathered-wings furry-art, epic character art, wallpaper hd, sunset":

Тут я убрал fantasy потому что оно увеличивало антропоморфность, и добавил "fox feathered-wings furry-art". Сложно найти разницу. Но в целом появилась на втором арте вторая лапа, чуть симметричнее стал первый арт и т.п. Надо отметить, что это на малом числе шагов. По идее можно искать картинки и тут. но в итоге, когда "посказка" готова, лучше число шагов поднимать и там уже смотреть. Потому что зображения "уточняются", как я писал выше. Смотрите сами, та же подсказка но не 20 как везде, а 60 шагов:

Так как подсказка "кривая", а мы хотим странного, то в SD ставится побольше число картинок и запускате массовая генерация. Я ставил что-то около полусотни (8-10 пакетов по 6-ть штук - моя карта не тянет 8-мь). И потом из этого выбирал, что пригоднее. 

Надо отметить, что результат "кривой" подсказки сильно варьируется от sampler, так я использую DDIM, но итоговый запуск делал поочерёдно на нём и на LMS. Результаты под катом попарно, сначала DDIM потом то же зерно, но LMS:


Пардон, эта картинка была одинаковая на обоих самплерах, потому я забыл её копию сохранить 8).







Это не всё, и не сказать чтобы самые правильные с т.з. анатомии. Но Местами разница показательна.

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


flying-winged-fox realistic furry-art fox-woman winged-woman fox-with-wings, fox feathered-wings furry-art, epic character art, wallpaper hd, sunset

Steps: 40, Sampler: LMS, Seed: 3855750902

flying-winged-fox-woman fox-furry-art fox-woman-with-wings, realistic furry-art, epic character art, wallpaper hd, sunset

Steps: 50, Sampler: DDIM, Seed: 3855750902

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

upd. Теоретически, наверное быстрее начинать генерировать кучу картинок с более простой "подсказки"  (даже а-ля 'flying-winged-fox') добавив нужного стиля, а потом просто выбрать понравившиеся картинки и докрутить. С другой стороны будут ли они вообще и сколько их будет.

+56
1 421

0 комментариев, по

2 325 425 206
Наверх Вниз