Сделать одно изображение по референсу несложно. Гораздо сложнее сделать серию изображений, в которых меняются объекты и сюжеты, но сохраняется один визуальный стиль.

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

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

Я называю это геномом стиля.

Немного терминологии.
Геном — полное описание визуального языка без конкретного сюжета.
Ядро — обязательные признаки, без которых стиль теряет узнаваемость.

Скил — в рамках этого метода сохранённая инструкция на основе готового мастер-промпта, которая позволяет воспроизводить найденный визуальный стиль при смене объектов и действий.

Шаг первый. Подробное описание изображения

Сначала я загружаю референс и прошу его подробно описать как промпт.

Например:
Опиши изображение как подробный промпт: объект, композиция, формы, цвета, свет, материалы, фактуры, настроение, атмосфера и способ рендера.

На этом этапе нам очень важно ничего не отбрасывать. Нам необходимо максимально подробно разобрать изображение и понять, из чего оно состоит. При этом лучше избегать обобщающих слов вроде «винтажный», «кинематографичный» или «атмосферный». Подобные слова описывают впечатление, но не объясняют, из чего оно складывается.

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

То есть мы описываем не само впечатление, а выделяем все признаки стиля, которые его формируют.

Шаг второй. Чистый стиль

В следующем шаге я прошу удалить из описания все, что относится к конкретному сюжету и объекту. 

Например:
Убери конкретные объекты и сюжет. Оставь только визуальный стиль, композицию, палитру, свет, материалы, фактуры, настроение и способ рендера. 

Допустим, на исходном изображении ночная заправка. Сама заправка нам не нужна, неоновая вывеска на ней тоже.

Ночь может относиться только к этому конкретному сюжету.

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

В результате должно остаться описание не того, что изображено, а того, как это изображено.

Шаг третий. Ядро

И так как после очистки описание всё ещё может быть довольно большим, я прошу Chat GPT выделить обязательные признаки.

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

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

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

Шаг четвертый. Мастер-промпт

После этого я прошу Chat GPT собрать мастер-промпт на основе полученного результата.

Например:
Создай универсальный мастер-промпт. Меняемый предмет обозначь как [Subject], а при необходимости добавь [Action]. Все обязательные признаки визуального стиля сохрани постоянными.

В результате конкретный объект исчезает из постоянной части промпта. Остаётся примерно такая конструкция: [Subject], [Action]. А дальше — постоянные правила цвета, света, формы, фактуры, материалов и рендера.

Теперь в [Subject] можно подставить человека или птицу, а в [Action] — при необходимости указать действие для этого объекта. Если геном найден правильно, визуальный язык должен сохраниться.

Шаг пятый. Защита от расползания

Данный шаг нам нужен для того, чтобы модель постепенно не откатывалась к своим привычным решениям генерации.

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

Если стиль строится на плоских формах, проблемой могут стать объёмные градиенты и реалистичное освещение. Если в стиле нет контуров, модель не должна самостоятельно их добавлять. Если в нашем геноме заложено правило четырёх цветов, то их не должно внезапно стать больше или меньше.

Таким образом, у нас появляется дополнительная защита от расползания стиля.

Шаг шестой. Проверка генома

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

Например:
Проверь мастер-промпт на нескольких максимально разных объектах. Сравни результаты с исходным референсом и между собой. Если визуальный стиль начинает расползаться, уточни мастер-промпт, усилив обязательные признаки ядра. После проверки выдай исправленную версию.

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

Только после этой проверки мастер-промпт можно считать рабочим.

Шаг седьмой. Создание скила

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

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

Зачем вообще превращать это в скил?

Мастер-промпт решает одну задачу: он позволяет воспроизводить конкретный найденный стиль. Скил решает задачу уровнем выше: он сохраняет этот мастер-промпт в виде готовой инструкции, которую можно повторно использовать для генерации разных объектов. Это важная разница.

Мастер-промпт — это результат работы.
Скил — инструмент, который позволяет удобно использовать этот результат.

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

Где текста недостаточно

Не любой визуальный стиль можно полностью описать словами.

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

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

Также важно помнить, что один и тот же промпт может давать разные результаты в разных нейросетях. Например, вы создали и проверили свой стиль в ChatGPT, а потом решили использовать тот же самый промпт в другой нейросети. Даже если формулировка останется той же, результат может немного отличаться.

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

В итоге

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

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

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

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