August 29, 2023

Фрагменты и вес в Midjourney

Когда вы видите в чьём-то запросе два двоеточия "::" — это фрагментированный запрос, или как он иногда называется в англоязычных мануалах, “multiprompt”. Эти двоеточия как бы «разрезают» запрос на несколько частей — фрагментов, каждый из которых обладает своей силой влияния на финальное изображение.

После каждого такого кусочка стоит число — вес фрагмента (weight). Чем выше это число, тем больше фрагмент будет влиять на результат генерации и наоборот.

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

a hedgehog :: 3.5 came out of the fog :: it took its knife out of its pocket :: 2

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

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

Вкратце, значимость фрагментов запроса можно описать вот таким примером:

Этот фрагмент будет значим в финальном изображении :: 1.5 Этот фрагмент будет в финальном изображении :: Этот фрагмент будет едва заметен в финальном изображении :: 0.5 Этого фрагмента скорее всего не будет в финальном изображении :: -0.5

Вес всех фрагментов в запросе

Важно отметить, что «сила» фрагмента зависит не от конкретного числа, а от отношения этого числа к общему весу всех фрагментов.

То есть, не важно, полтора это или три, важно, насколько полтора или три значимы в сравнении с общим весом фрагментов.

Строго говоря, финальная картинка — это арифметическое средневзвешенное всех фрагментов запроса. Но проще всего воспринимать значимость фрагмента как процент от суммы весов всех фрагментов в запросе.

💡 Помните, что чем больше фрагментов в запросе, тем менее значимым становится каждый из них

Приведу пример

Если вес первого фрагмента равен 3, а вес всех фрагментов (всего запроса) равен 6, то первый фрагмент будет на 50% влиять на общий результат:

foggy day :: 3 a hedgehog :: 1.5 knives :: 1.5

foggy day = 3 / (3 + 1.5 + 1.5) = 0.5 или 50%

Если же вес всех фрагментов равен 18, то объекты и детали первого фрагмента будут значимы всего на 17%, и «потеряются» на финальном изображении:

foggy day :: 3 a hedgehog :: 7 knives :: 8

foggy day = 3 / (3 + 7 + 8) = 0.166...

Да, если сделать два этих запроса (с одинаковым сидом или эталонным изображением), вы получите очень похожие результаты: Midjourney сама пересчитает вес в обоих запросах и он станет одинаковым.

Очень тонкий лёд

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

Можно объяснить это так: разделив положительное число на отрицательное мы получим отрицательное. Разделив отрицательное — получим положительное.

Выходит, что все фрагменты с положительным собственным весом в «общем» весе получат отрицательные значения и наоборот. И после финального пересчёта Midjourney придётся рисовать только те фрагменты, у которых собственный вес был изначально отрицательным и избегать тех, у которых он был положительным, хотя должно быть наоборот.

Чтобы избежать путаницы, бот не пропустит такие запросы.

С нулем всё куда интереснее. В математике результат деления на ноль не определён, однако Midjourney такой запрос обработает. И чем ближе сумма весов будет приближаться к нулю, тем менее «стабильными» будут результаты. Математика подсказывает, что чем ближе к нулю вы окажетесь, тем сильнее будут проявляться фрагменты с положительным весом. Скорее всего вы будете получать что-то прекрасное, но уже слабо относящееся к первоначальному запросу:

Автор с ником Cirkut исследовал этот «Зиро спейс» в Midjourney, я напишу об этом в другой статье.

Как использовать вес?

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

Метод создания сцены

Простая и действенная техника: создать сцену с помощью первого фрагмента, а «заселить» её с помощью последующих:

coffee house, twilight atmosphere :: two friends argue about money ::

Метод слайдера

Копируя элемент главного фрагмента во второстепенный, мы создаём виртуальный «слайдер», позволяя увеличивать или уменьшать значимость этого элемента в первом, главном фрагменте:

A fat black cat sleeps on the window sill :: fat :: 0.5

Вес последнего фрагмента можно менять, увеличивая или уменьшая «толстость» кота: