Публикую метод как ставить нейронкой персонажей в приличные позы

Wan 2.2 Pose Control

Я уже некоторое время пытаюсь решить задачу позирования персонажей с помощью открытых моделей. Моя предыдущая попытка с Flux.2 Klein дала неплохие результаты, но страдала от "стилевого сдвига" и оригинальные пропорции персонажа вообще не соблюдала (например, соотношение головы и тела). Так то сохранять дизайн и стиль персонажей (это ещё называют "согласованность") по-прежнему остаётся слабым местом моделей редактирования изображений (особенно когда это касается стилизованных персонажей), но есть одно исключение: Wan2.2 I2V Video. И тут ничего удивительного - от видеомодели ожидается что персонаж на одном кадре будет похож сам на себя на последующих кадрах.

Короче, после длительных экспериментов с моделью Wan 2.2 я обнаружил определённую технику промптинга, которая позволяет "поместить персонажа из image_1 в позу из image_2".

Ссылка на воркфлоу для нетерпеливых.

Итак, наша задача звучит так: "Возьми персонажа слева и заставь её скопировать позу справа"

Публикую метод как ставить нейронкой персонажей в приличные позы

Это можно сделать двумя способами с использованием локальных открытых моделей:

  1. Воркфлоу замены персонажа Flux.2 Klein
  2. Воркфлоу Wan 2.2 Pose Control (об этом и пойдёт речь в данной статье)

Сразу показываю как выглядит результат каждого из методов:

Какая вышла лучше?
Какая вышла лучше?

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

Публикую метод как ставить нейронкой персонажей в приличные позы

Ладно, идея вот в чём: попросить Wan сгенерировать последовательность из 80 кадров в режиме First-Frame-Last-Frame. Эта последовательность будет состоять из 4 частей:

  1. Персонаж просто стоит
  2. Персонаж двигается, копируя позу из референса
  3. Персонаж трансформируется в персонажа из изображения-референса позы
  4. Персонаж из референса позы находится в кадре

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

Как писать структурированный промпт

Вот два промпта, использованных в примере выше:

Женщина с серебрянными волосами

0s: girl with short silver hair, in green pleated skirt and leather boots is standing 1s: girl with short silver hair, in green pleated skirt and leather boots turns to the left, kneels, places left hand on her head, puts right hand between her legs 2s: she keeps her pose frozen in place. Scene transitions into another scene 3s: her body transforms into another character with white skin, bald head at white background

Мужик с чёрной бородой

0s: black man with sharp teeth in green suit and dark pants is standing at white background 1s: black man with sharp teeth in green suit and dark pants sits in the armchair with tilted head and hand at his chin, crosses legs 2s: he keeps his pose frozen in place. Scene transitions into another scene 3s: her body transforms into another character short orange dress, orange top hat, brown hair and fishnet

Описание персонажа повторяется, чтобы его можно было извлечь с помощью Apply Text Template из расширения comfy-mtb:

или через обычную встроенную в ComfyUI ноду Replace
или через обычную встроенную в ComfyUI ноду Replace

Можно извлечь описание персонажа и получить такой шаблон:

Женщина с серебрянными волосами

0s: {var_1} is standing 1s: {var_1} turns to the left, kneels, places left hand on her head, puts right hand between her legs 2s: she keeps her pose frozen in place. Scene transitions into another scene 3s: her body transforms into another character with white skin, bald head at white background

Мужик с чёрной бородой

0s: {var_1} is standing at white background 1s: {var_1} sits in the armchair with tilted head and hand at his chin, crosses legs 2s: he keeps his pose frozen in place. Scene transitions into another scene 3s: his body transforms into another character short orange dress, orange top hat, brown hair and fishnet

Разберём 4 части этого промпта.

0s — Начальное описание

Здесь вы описываете первый кадр. В большинстве случаев достаточно 'is standing', но можно также указать начальную позу персонажа.

1s — Собственно позирование

Здесь вы указываете движения, которые персонаж должен совершить, чтобы перейти из начальной позы в целевую. Лучше всего работают простые движения (turns left, sits down, crouches, raises hand), перечисленные через запятую. Также можно добавить 'Camera follows his movement', если целевая поза требует другого угла камеры.

2s — Пауза перед переходом сцены

Всегда одинаковая: he/she keeps his pose frozen in place. Scene transitions into another scene. Часть 'Scene transitions into another scene' здесь наиболее важна — Wan 2.2 уважает эту границу (что удивительно, на самом деле).

3s — Привязка последнего кадра

Выглядит так: body transforms into another character <описание персонажа в последнем кадре>. Мы хотим, чтобы Wan 2.2 понял, что персонаж в начале видео отличается от персонажа в конце.

Практический пример

Отработаем полученные знания на практике. Вот наш персонаж и изображение с позой:

*Pose reference
*Pose reference

1. Начинаем с описания персонажа. Ничего сложного:

Жёлный робот-гуманоид
Жёлный робот-гуманоид

2. Следующий шаг - описание движений:

Поворачивается к зрителям, держа чёрный пистолет двумя руками
Поворачивается к зрителям, держа чёрный пистолет двумя руками

1. И наконец, пишем переход к последнему кадру:

"Его тело трансформируется в другого персонажа с короткими чёрными волосами в чёрном костюме и короткой чёрной юбкой"
"Его тело трансформируется в другого персонажа с короткими чёрными волосами в чёрном костюме и короткой чёрной юбкой"

К сожалению, это не срабатывает:

Wan 2.2 смог уловить положение пистолета, но не позу

Главная причина в том, что тёмная одежда на целевом изображении не даёт модели "считать" позу. К счастью, это можно исправить в Flux.2:

Remove hair, remove clothes and draw this person bald and in skin tone underwear. Turn into white wireframe figure
Remove hair, remove clothes and draw this person bald and in skin tone underwear. Turn into white wireframe figure

Снова запускаем воркфлоу Pose Control, но уже с обновлённым промптом:

"Его тело трансформируется в другого персонажа с лысой головой и белой кожей"
"Его тело трансформируется в другого персонажа с лысой головой и белой кожей"

На этот раз результат значительно лучше:

Ссылка на воркфлоу (там есть заметка о рекомендуемом файнтюне Wan 2.2)

Несколько советов:

  • Весь процесс работает лучше всего, когда между первым и последним кадром есть заметный контраст: разный цвет волос, цвет кожи, фон и т.д. Можно даже заранее обработать референс позы другой моделью - превратить его в фигуру-манекен, чтобы у Wan было больше шансов считать позу.
  • Если некоторые элементы дизайна персонажа исчезают (перчатки, например, имеют свойство пропадать слишком рано), добавьте их в промпт с описанием персонажа, чтобы модель помнила об этом элементе дизайна.
  • Если изображение персонажа и изображение-референс позы имеют разные размеры, попробуйте добавить "Camera zooms in capturing new view" или "Camera zooms out capturing new view".

Если разобрались как установить себе ComfyUI и Wan 2.2 посмотрите гайды типа этого:

Вот так.

184
34
8
7
5
1
103 комментария