--cref, исследование.
@srefrandomЧасть Первая. Создание референса.
Предисловие
Когда я только начал генерировать в mj, я практически сразу влюбился в --cref. Сама возможность создавать изображения с одним и тем же персонажем надолго захватила меня - я делал серии иллюстраций и целые фотосеты, просто потому что мог)
Но при этом, я заметил, что пользуются этой функцией как-будто немногие. Ей посвящено не особо много материалов в сети. Те, что имеются, не особо подробные, а иногда и ошибочные. И на форумах её обсуждения - скорее нишевая вещь (и опять же, полная заблуждений).
Потому, со временем, и родилась идея сделать подобный гайд, для тех, кому эта функция интересна.
Но для начала, несколько важных замечаний.
Во-первых, если кто не в курсе:
--cref - это команда в midjourney, которая запускает функцию "consistent character" или "character reference". Она позволяет создавать разные изображения с одним и тем же персонажем, т.е. переносит его внешность из одной генерации в другую. Вы просто пишете в промте --cref, а дальше вставляете ссылку на нужную картинку (или даже не одну).
Во-вторых:
Статья рассчитана на тех, кто умеет пользоваться midjourney и знаком со всеми основными функциями. Но если есть какие-либо вопросы, всегда можно задать их на моём канале.
В-третьих:
Как и с любым другим нюансом midjourney, здесь нет и не может быть универсальных решений и советов. То, что сработало с одним референсом, может не сработать с другим. То, что получилось с одним промтом, не факт, что получится с другими. Каждый случай нужно рассматривать отдельно. А потому, не стоит относится к этой статье, как к строгой инструкции. Это, скорее, просто большой обзор возможностей функции --cref, основанный на моём опыте её использования. Его цель - задать направление для ваших собственных экспериментов.
В-четвёртых:
Все приведённые здесь генерации сделаны в Midjourney v6. Я не очень люблю v6.1 - особенно, когда дело касается человеческих лиц (эта версия всегда сильнее стилизует лица, делая их более кукольными). Вы же можете пользоваться, естественно, и тем, и другим, но помните - персонаж сгенерированный с одного референса разными версиями нейронки, будет выглядеть немного по-разному.
В-пятых:
Уже совсем скоро должна выйти v7. И вполне возможно, что в работе --cref что-нибудь изменится. Тем не менее, я всё таки решил данную статью сделать сейчас. А за изменениями будем следить - если что, сделаю обновление.
И в-шестых:
Это мой первый опыт написания подобных вещей, так что, если будет сумбурно, простите)
Итак, приступим.
Генерация и отбор
Пожалуй, самая трудоёмкая, скучная и неблагодарная часть. Из-за этого, многие пользователи бросают всю затею в самом начале.
Проще будет показать. Поэтому, чтобы понять в чём же проблема, давайте начнём уже генерировать!
Наш начальный промт:
photo of an young european woman with black hair --ar 3:4 --v 6 --style raw

(Зачем тут --style raw? Этот параметр поможет нам получить более натуральные и живые лица.)
Попробуем использовать эту картинку как референс. В промте прописываем ссылку на неё после --cref.
photo of a woman dressed in yellow t-shirt --ar 3:4 --cref https://i.imgur.com/Cv8UUx3.jpeg --cw 0 --v 6

Эм. Мягко говоря, не совсем то, что на референсе.
(Пока что не обращайте внимания на параметр --cw. Что это и как работает мы разберём ниже.)
Давайте попробуем другие варианты.


Начинаете улавливать? Попробуем ещё раз этот же референс, на всякий случай.

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






Думаю, суть вы поняли. Алгоритм, по которому mj анализирует лица, работает, скажем так, интересно. Он стабильно преувеличивает некоторые черты лица оригинала, выдавая результат, который в лучшем случае - не очень похож на оригинал, а в худшем - его смело можно назвать шаржем. Здесь нам ещё повезло - не было усов) А mj очень любит их пририсовать, поверьте.
В этом и кроется главная проблема первого шага - вам, скорее всего, придётся перебрать довольно много вариантов, прежде, чем вы найдёте референс, с которого получится подходящее лицо.
Поэтому, берегите своих моделей) Если вы нашли отличный референс - вы нашли сокровище.
(Специфичность работы данного алгоритма сразу отметает варианты использования в качестве персонажей живых людей. Ну, использовать-то как референс можно любую фотку, но не стоит ждать, что персонаж будет похож на оригинал. Зачастую, сходство там получается ещё меньше, чем на примерах выше.)
Итак, перебрав разные варианты, слегка меняя промт, я нашёл тот, который меня устроил.



На мой вкус, здесь наоборот слишком "гладкое" и стилизованное лицо, но с этим уже можно работать.
Давайте сделаем ещё пару генераций, чтобы лучше рассмотреть нашу подопытную.
close up photo of a woman smiling --style raw --ar 2:3 --cref https://i.imgur.com/zF5K2IV.jpeg --cw 0 --v 6

selfy photo of a woman dressed in red t-shirt, she blows a kiss, shot on iphone, no photoshop --style raw --ar 5:7 --cref https://i.imgur.com/zF5K2IV.jpeg --cw 0 --sref 2132321835 --sw 20 --v 6

photo of a woman dressed in a sundress, garden setting --style raw --ar 2:3 --cref https://i.imgur.com/zF5K2IV.jpeg --cw 0 --v 6

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

И именно так --cref и работает. Отличия от исходника, зачастую, будут сильны, но вы получите персонажа, который будет вполне себе консистэнт.
2. В итоговых генерациях внешность тоже немного плавает. И это неизбежно. Но тем не менее, персонаж вполне узнаваем. Особенно же страдают детали: родинки, веснушки и ямочки на подбородке могут то появляться, то исчезать; цвет глаз периодически меняется; формы тела и рост тоже скачут и т.д. Но подобные вещи легко правятся через "vary (region)".
--cw, character weight
Возможно, главная причина, по которой я решил писать этот гайд) Я устал объяснять, как работает этот параметр (а иногда приходилось даже спорить).
--cw X - параметр, который пишется в промте после ссылки на персонажа. X - число от 0 до 100. По-умолчанию он равен 100, т.е. если вы не пропишите эту команду, значение будет именно 100.
Насчёт него существует распространённое заблуждение: чем выше число ставишь, тем более похожим на исходное лицо будет персонаж. Звучит, в целом логично, более того - примерно по такому же принципу работает --sw у функции --sref. И по-своему, это утверждение даже правдиво (просто не в том смысле, о котором думаешь в первую очередь).
Давайте посмотрим на примерах. Пройдёмся по одиннадцати промтам с нашей моделью, которые будут отличаться только значением параметра --cw (от 0 до 100, с шагом в 10).
photo of a woman dressed in white t-shirt and black skirt, muted blue wall in the background --ar 2:3 --style raw --cref https://i.imgur.com/zF5K2IV.jpeg --cw 0 --v 6











Итак, что мы здесь видим?
Действительно можно уловить некоторые изменения в чертах лица, с ростом --cw. Но во-первых, насколько лицо становится более похожим на исходник - вопрос дискуссионный (и, что главное, ответ на него - не универсальный для разных референсов). Во-вторых, черты лица всё равно продолжают плюс-минус так же плавать и на высоких значениях --cw.
Что же на самом деле здесь происходит?
Character weight скорее можно назвать "охватом" персонажа.
На низких значениях, mj воспроизводит только лицо и волосы. Но чем выше значение - тем больше дополнительных элементов будет учитываться (это и одежда, и стилистика/настроение исходника, и даже посторонние предметы в кадре, если они есть). Да, за счёт этого, "похожесть" увеличивается, но довольно своеобразным способом.
Я бы даже сказал, что на высоких значениях, --cref начинает работать немного и как --sref.
Вот ещё пример:
Возьмём один из уже имеющихся у нас референсов.

Мы уже делали с него генерации, на значении --cw 0. Добавим --cw 20 и --cw 100.



Давайте попробуем другой промт:
photo of a woman dressed in black dress and black boots, she has bright violet make up, flat white background --ar 9:16 --cref https://i.imgur.com/bgXTvI0.jpeg --v 6


Можем видеть, что при повышении значения параметра, mj начинает сильнее игнорировать промт и подгонять генерацию под исходник. Сильно ли меняется лицо? Нууууу, мне кажется, что нет.
Если же референс - это фотография крупным планом, то при повышении --cw, всё равно происходит некоторая стилизация. Более того, часто происходит так, что mj будет выдавать более крупные планы с таких референсов, игнорируя промт.
(Ещё один нюанс. Есть у вас референс с изображением человека по пояс. Вы решаете попробовать обрезать его и использовать только лицо. Имейте в виду, что скорее всего внешность начнёт немного отличаться от той, что была раньше. Да, как бы странно это ни было, mj создаёт лицо персонажа, ориентируясь не только на лицо.)
Подведём итоги.
Лично я редко использую значения --cw выше 30. В этом диапазоне мы имеем полный контроль над моделью, но и можем, при желании, слегка стилизовать изображение под исходник. И когда создаю моделей, я предпочитаю тех, которые и на --cw 0 будут выглядеть для меня приемлемо.
Тем не менее, это очень интересный инструмент, позволяющий точнее воспроизводить целостный образ персонажа, а не только лицо. Подобное может пригодиться, например, при создании серии иллюстраций к истории или для кадров, с которых будет сделано большое видео.
С другой стороны, я в таких случаях больше полагался бы на --sref. Но, как и всегда, универсальных решений тут нет. Возможно, в ваших ситуациях именно высокие --cw окажутся полезны.
Повторный анализ
Повторным анализом я называю ситуацию, когда мы берём картинку, уже сделанную через --cref, и делаем референсом уже её. Может показаться, что это неплохой способ сделать более конкретный референс для нашего персонажа. И иногда, так действительно можно получить более точно соответствующий вашим желаниям результат. Иногда.
Проблема, опять же, в нашем алгоритме анализа лиц. Mj прогонит через него наш новый исходник, и мы опять получим неожиданный итог и совсем другого персонажа.
Примеры:
Вот генерации с двух полученных нами картинок из первой главы.




Комментарии, думаю, излишни.
Тем не менее, поэкспериментировать стоит. Некоторые из моих моделей именно этим способом были сделаны, и он вполне рабочий.
"Особые приёмы"
Есть несколько методик, описание которых я встречал в сети. И которые, якобы, помогут вам создать персонажа.
На деле же, здесь (как и всегда с mj) настоящее казино. Может помогут, может нет.
1. Двойной референс.
Метод заключается в том, чтобы при создании изначального референса, сделать снимки лица с разных углов.
Например, так:
photo portrait of a woman with long black hair, she has aquiline nose and big eyes, split into 2 images, shot in different angles --ar 2:1 --v 6

Пример генерации:

По своему опыту, могу сказать, что особой пользы я не увидел. Разница с исходником всё равно остаётся, плавающая внешность в генерациях - тоже.
Иногда кажется, что как-будто получаются более точные генерации. Но такое бывает и с одиночными снимками. Как я писал выше, универсальных решений, к сожалению, нет.
Тем не менее, хуже от этого не будет. Так что, можно пробовать.
2. Метод уточнения.
Более хитрая методика, основанная на повторном анализе. Действительно бывает полезной, но требует в разы больше работы.
Как я писал в предисловии, после команды --cref можно прописать сколько угодно ссылок. И mj будет генерировать персонажа, смешивая все исходники (подробнее об этом в следующей главе).
Последовательность действий в этой технике такая:
1. Делаем несколько генераций с референса.
2. Выбираем наиболее понравившуюся картинку.
3. Добавляем её в наш референс второй ссылкой.
4. Повторяем всё сначала, уже с двумя ссылками.
Таким образом, вы как бы набираете вашего персонажа, как бусы, добавляя и добавляя новые ссылки, пока не получите то, что нужно.
Но есть проблемы. Во-первых, как и при обычном повторном анализе, в большинстве случаев вы получите не "уточнение", а совсем другого персонажа. Во-вторых, это ооочень много работы ради сомнительного результата. Более того, вам придётся каждый раз пихать в промт целое полотно ссылок, что просто неудобно.
Возможность подробно исследовать эту методику оставляю всем желающим) А мы переходим дальше.
Смешивание персонажей
Итак, вот мы указали в промте несколько ссылок на разных персонажей. Каким образом произойдёт их смешивание?
Если честно, чёрт знает каким)
Возможность очень интересная, но я пока что так и не смог найти каких-то закономерностей в её работе.
Посмотрим на примерах.
Возьмём нашу основную модель и смешаем с моделью из предыдущей главы.


photo of a woman, she dressed in white t-shirt and black skirt, muted blue wall in the background --ar 2:3 --style raw --cref https://i.imgur.com/zF5K2IV.jpeg https://i.imgur.com/VNivyfH.jpeg --cw 0 --v 6

Как видим, смешение происходит с явным перекосом в сторону второй модели.
(Когда вы используйте функцию --sref, т.е. style reference, вы можете задавать пропорции разным ссылкам вашего референса. Здесь такого нет. Mj сам решает, в каких пропорциях смешать персонажей.)
Ради эксперимента, переставим ссылки местами в промте.
photo of a woman, she dressed in white t-shirt and black skirt, muted blue wall in the background --ar 2:3 --style raw --cref https://i.imgur.com/VNivyfH.jpeg https://i.imgur.com/zF5K2IV.jpeg --cw 0 --v 6

Внезапно, кое-что поменялось! Причёска явно вдохновлена первой моделью, а не второй.
Чтобы удостовериться, сгенерируем по этому промту ещё раз:

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

Да, здесь картинка уже рисованная, но это не важно, и так даже интереснее (и она в этой статье ещё появится в разделе про рисунки).
Для начала, вот что получается с неё одной:
photo of a woman, she dressed in white t-shirt and black skirt, muted blue wall in the background --ar 2:3 --style raw --cref https://i.imgur.com/trT5Eed.jpeg --cw 0 --v 6

(Здесь интересен ещё вот какой момент. У mj, судя по всему, есть некий набор типажей, которые он использует при генерации через --cref. Если вы будете много экспериментировать с этой функцией, со временем вы начнёте замечать похожие черты лиц, появляющиеся в генерациях с разных референсов. А генерация фоток с рисунков, исходя из моего опыта, даёт большую вариативность.)
А теперь смешиваем.
photo of a woman, she dressed in white t-shirt and black skirt, muted blue wall in the background --ar 2:3 --style raw --cref https://i.imgur.com/zF5K2IV.jpeg https://i.imgur.com/trT5Eed.jpeg --cw 0 --v 6

Как по мне, мы получили уже более равномерную смесь.
И на последок, проверим вот что:
Что будет, если мы склеим две картинки-исходника в одну? И нам не придётся прописывать по несколько ссылок в промт.
Давайте посмотрим. Референс у нас будет вот такой:

Вот что мы получаем при генерации:

И персонаж изменился. Так что, имейте в виду: подобное склеивание использовать можно (и для "метода уточнения", например), но результат будет отличаться от отдельных картинок (что открывает ещё больший простор для экспериментов).
Итог
Создание персонажа действительно бывает сложным) Мало просто придумать хороший промт. Помимо этого, нужно чтобы наш референс нормально проходил через алгоритм анализа mj. И к сожалению, это момент, на который мы никак не можем повлиять. Остаётся только перебирать и перебирать варианты, а так же бесконечно экспериментировать со смесями.
Но ведь, на самом деле, на таком подходе и основана вся работа с mj, если вы хотите лучший результат)
Часть Вторая. Работа с персонажем.
Часть Третья. Несколько персонажей в одном кадре.
Часть Четвёртая. Рисованные персонажи.
Часть Пятая. Необычные персонажи. (+Бонус)