Как контролировать позу и вид персонажа при генерации в нейросети
Разберёмся вместе
Если кто-то говорит, что "нейросети заменили художников еще вчера", то этот человек ни разу не пробовал сгенерировать что-то самостоятельно. Нейросеть действительно может нарисовать что угодно, без вопросов, собирай промт и генери. Но дело в том, что генерить сетка каждый раз будет что-то совершенно новое, что не подойдет к серьезной работе. Вот вы просите нарисовать вам девушку в белой рубашке и синей юбке на фоне заката, нейросеть нарисует. Но при том же самом запросе следующая картинка будет целиком отличаться — появятся уши, хвосты, изменится поза, положение, количество пальцев и так далее. Если у вас задача генерить какой-нибудь рандомный хентай, то вопросов нет, если же хотите рисовать одного и того же персонажа каждый раз в одной и той же одежде, лишь меняя позу — вы словите геморрой, а если задумаетесь о том, чтобы рисовать двух и более персонажей, то это вообще практически сейчас нереально по многим причинам.
Итак, сеть может нарисовать нам что угодно (ну почти), только у нас нет инструментов для этого и вообще не ясно когда появятся. Если же есть желание попробовать сделать какой-то комикс, где набор персонажей и вы готовы помучаться, то можно попробовать поискать костыли.
Первое, что приходит на ум - это собрать свою Lora или Textual Inversion, это мини-нейросеть с весами чисто под вашего персонажа. Делается это для того, чтобы сетка в какой-то момент вместо запроса "девушка" не начала рисовать "собаку". Почему? Потому что сеть может, вот почему. Lora или Ti должны стремления сетки ограничить.
Второй момент - поза. Да, ее можно контролировать через промт, делать позу стоя (standing), на коленях (seiza) и прочие doggystyle, но еще раз, если мы делаем не порнуху, а хотим тонко контролировать положение рук-ног, пальцев, головы и так далее, просто текстового запроса может не хватить. Совсем недавно появились два полезных расширения - Control Net и T2i-adapter, которые занимаются тем, что пытаются уговорить нейросетку "пожалуйста, рисуй по тому наброску, что я тебе дал" и в виде наброска может использоваться как скелет, так и набросок, нормалмапа и карта сегментации, а так же их комбинации.
Люди, знакомые с 3д моделированием, наверняка подумали "ну и в чем проблема, есть персонаж, есть его скелет - ну и двигай, получая то, что надо". Все бы хорошо, но это не работает, уж точно не так, как вы ожидаете. При движении костей персонаж будет хвататься руками за части тела, менять свои пропорции и творить полный бардак.
Давайте еще раз зафиксируем, что сейчас нейросети - это достаточно кривая и нестабильная вещь, совершенно не подходящая для чего-то серьезного. Потому то, что дальше будет описано - это лишь исследование и пробы с тестами, результат тоже будет абсолютно далек от идеала, но дает чуть больше контроля и может кого-то натолкнет на более умные подходы и сделает мир немного лучше. Для стабилизации персонажа и его одежды я взял Лену из Бесконечного лета, которую выложил MikuIncarnator, он же 42 на dtf (за что ему спасибо).
Для тестов Control-net я уже давно нащупал, что если через него передать эскиз, то довольно быстро можно получить "анимешный" вид или "мультяшную" стилизацию, стоит только чуть отпустить сетку, но это чревато тем, что будут теряться детали и меняться положение. Я же все же хотел больше контроля. Один из самых нормальных вариантов - подсовывать эскиз того, что хочешь получить, с различимыми формами. То есть если вы ждете, что там будет девушка с волосами и в школьной форме, то желательно это и накидать.
После недель мучений, очень приятно было видеть, как сетка разбирает то, что на эскизе и заполняет почти правильно (под почти правильно считается вероятность выше 10%). Но не будешь же каждый раз рисовать руками в 2д эскиз, хотелось бы это дело упростить и тут подходит уже 3д редактор. Достаточно отмоделить в очень простом лоу-поли то, что хотим получить, разделяя на зоны и части, заригать и двигать - и тогда после рендера будет получаться вполне неплохо.
Следующая проблема - с таким подходом некоторые части тела могут пересекаться и нейросеть не будет их понимать. Тут на помощь подойдет карта глубины, в control-net может поставить два обработчика и он будет подсказывать, что "это кисть и она ближе к камере, чем нога", что поможет нарисовать верно, а не положить кисть на бедро, например.
Плюс данного подхода еще один - обычно в нейросетках девушки очень пухленькие. Это. конечно. мило, но если цель сделать высокого и стройного персонажа, то тут будут болты, текстом добиться такого тяжело. Однако, рисуя карты, можно произвольно вытягивать формы и это просто шик.
При этом никуда не теряется возможность освещать персонажа через img2img с использованием промта. Само собой, что и выражение лица можно контролировать текстом, тут рисовать что-то с нуля особо смысла не вижу.
Так же вариация этого метода дает возможность принудительно подсунуть нейросетке модель кистей рук и стоп, что так же поможет рисовать их верно.
Обнаружилась и забавная особенность. Сетка Лены была натренирована на рубашку с юбкой, отчего чтобы ее "раздеть", пришлось принудительно писать теги "nude, completly nude". Без них даже нарисованная без одежды рисовалась одежда, что полезно на самом деле.
Что же мы получаем в итоге? Всего лишь возможность крутить персонажа и двигать его части тела так, как мы хотим, чего не добиться при просто использовании промта или костей cnet. Именно связка эскиза и карты глубины дает хоть какую-то степень контроля.
Очевидно, что нейросетка достаточно мощная вещь, но инструментов для работы с ней пока что нет и не скоро будут. Что-то получить выходит лишь через адские костыли. Но потенциал виден, как пример, тут сетка прекрасно понимает, что волосы - это волосы и рисует их как надо, в итоге получается Лена Славявна.
Для тех, кто не умеет рисовать и моделировать, тоже есть вариант - взять vroid, там создается довольно грубая 3д модель, а потом через нейросеть обработать с огрублением параметров. Отдельно расскажу, если кому-то это будет нужно. Тот же Cnet, но через img2img с Denoize в районе 0.4-0.8.
Надеюсь, это окажется кому-то полезным. Всем всего хорошего.
Скрины sd и Cnet, если у кого-то остались вопросы.
upd: подумалось, что вместо hed при использовании цветной модели можно использовать seg обработку, при этом будет несколько плюсов. Первый - нет препроцесса и быстрее запустится, с cnet это проблема. Далее, можно разукрасить разным цветом разные руки, локоны и так далее, при повороте это меньше будет сливаться в кашу. Попробуйте, может лучше подойдет.