Разное

Синтаксис Stable Diffusion в Automatic1111 и NMKD

Самое время рассказать про синтаксис Prompt-инжиниринга, с помощью которого вы сможете улучшить генерацию изображений в Stable Diffusion 1.5 — 2.1 и контролировать то, как именно алгоритмы нейросети обрабатывают текстовые подсказки.

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

Приятного просмотра!

Синтаксис Stable Diffusion для генерации изображений в Automatic1111 и NMKD

Синтаксис Stable Diffusion для начинающих

Синтаксис Stаbale Diffusion, который вам нужно изучить в первую очередь — скобки. Для генерации изображений используются три вида скобок — (), [], {}.

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

Например, написав (colored hair) без каких-либо коэффициентов, вы усилите эффект "цветных волос" в 1.1 раза. Если добавить больше скобок, сила воздействия дополнительно увеличится. Поэтому запись (((colored hair))) с значительной вероятностью поможет изменить цвет волос персонажа.
Девушка с цветными волосами - нейросетевой арг, сгенерированный с помощью Stable Diffusion 1.5

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

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

Принцип воздействия похож на предыдущий — значение токена считается эталонным (единицей или 100%), квадратные скобки являются множителем, однако умножение происходит в диапазоне от 0.9 до 0.1.

Написав [fern], вы измените вероятность появления папоротника со 100% до 90% (100%*0.9=90%). Добавив больше квадратных скобок, вы ещё сильнее ослабите воздействие ключевого слова, вплоть до полного исчезновения папоротника с картинки.

Стоит учитывать, что «изменение вероятности» влияет на картинку нелинейно — сильнее проявляется для токенов в середине и в конце промта, слабее воздействует на токены, прописанные в самом начале.

Помимо расположения, влияние оказывает и значимость отдельных токенов для используемой модели. Малозначимые слова легко "стираются" даже одиночными скобками, основные практически не убираются, лишь ослабляются или смешиваются с другими.
Нюдс с симпатичной рыжеволосой девушкой, сгенерированный в нейросети Stable Diffusion

Есть ещё один способ использовать скобки в Stable Diffusion — указав коэффициент воздействия внутри или снаружи них.

Например, (white silk shirt:1.5) или (wreath on head:1.5) в полтора раза усилят вес фраз «белая шёлковая рубашка» («венок на голове»), чтобы выбранные элементы гарантированно появлялись на каждой генерируемой картинке. И наоборот, [white silk shirt:0.8] или [wreath on head:0.8] помогут удалить их с тела модели.

Девушка в белой рубашке на голое тело, позирующая на сером размытом студийном фоне - арт, сгенерированный с помощью нейросети Stable Diffusion

Воздействие коэффициентов снаружи скобок немного отличается от множителей внутри.

Во-первых, в NMKD они действуют сильнее, чем в Stable Diffusion webui.

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

Как эту особенность можно использовать?

Установить коэффициент воздействия после круглых скобок в Stable Diffusion и использовать значения от 0.1 до 1.7, чтобы сместить вес токенов в ту или иную сторону. Если один токен преобладает над другим, можно использовать десятые, сотые и тысячные значения после точки, чтобы сгладить результат.

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

Нейросетевой портрет с девушкой в зелёном платье, позирующей в лесу. Для создания арта использовался синтаксис Prompt-инжиниринга для Stable Diffusion (Automatic1111)

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

В формате текстовой подсказки это выглядит следующим образом — (Triss Merigold)1.57, (Daisy Ridley)0.83.

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

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

Создание громоздких комбинаций - не лучший способ использования синтаксиса нейросети SD, но именно с помощью него можно создавать потрясающие работы, заметно отличающиеся от обычных результатов генерации изображений.
Магическое зелье с северным сиянием внутри. Для создания изображения использовался расширенный синтаксис запросов Stable Diffusion

Ещё один способ изменить силу воздействия отдельных слов или фраз в вашем промпте — использовать плюсы и минусы.

Добавив плюс после слова (фразы), можно усилить воздействие токена, добавив минус — ослабить его. Заключив часть промпта в круглые скобки, воздействовать плюсами или минусами можно сразу на несколько слов.

Пример использования: blue eyes + beauty eyes усиливает влияние двух соседних фраз, blue+ усиливает воздействие голубого цвета, (blue eyes)+ добавляет вес сразу всей фразе, (blue eyes)+++ значительно увеличивает вес токена.

Рыжеволосая девушка в откровенном зелёном платье позирует в летнем лесу на закате - эро арт, созданный в нейросети SD

Увеличивать вес слова (фразы) имеет смысл, если вы написали в текстовой подсказке green dress или orange dress, из-за чего у вас поменялся цвет глаз, но вы очень сильно хотите вернуть его обратно.

Примечание: базовые токены (например, цвет одежды) могут влиять на всю палитру генерируемого изображения, будь то фон, костюм, цвет волос или цвет глаз.

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

Допустим, вы ввели blue dress для генерации голубого платья, а токен blue задал не только оттенок платья, но и цвет глаз. В таком случае сначала попробуйте указать точный цвет глаз (например, red eyes, green eyes) и запустить генерацию. Не помогло? Напишите (blue eyes)---, чтобы ослабить влияние токенов "голубоглазости". Если и это не подействовало, попробуйте увеличить вес ключевых токенов. Для красных глаз это будет (red eyes)+++, для зелёных - (green eyes)+++.

Подобным образом можно изменить и другие оттенки, либо избавиться от ненужных объектов.

Синтаксис Stable Diffusion в Automatic1111 и NMKD не ограничивается обычными скобками, плюсами и минусами.

Если сочетать слова подобным образом — {words|different words|more words}, SD сделает случайный выбор между словами, разделёнными символом | и заключёнными в {}. Это удобно, если вы хотите разнообразить результат. Использование сочетания [wordA:wordB:0.5] сделает так, что половину шагов будет генерироваться слово A, а во второй половине — слово B.

Учитывайте, что рандомизация с помощью синтаксиса {} не всегда работает корректно, а с некоторыми моделями нейросетей и вовсе бесполезна. Поэтому в первую очередь стоит использовать другие способы контроля над генерацией изображений.

Синтаксис <> используется со специальными моделями нейросетей — LoRa — и применяется с целью активировать модель и задать степень её воздействия.

Эротическая фотосессия на природе - образец генерации, созданный с помощью синтаксиса Stable Diffusion и кастомной модели LoRa

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

Для активации модели достаточно прописать используемые ключевые слова (в упоминаемом примере это будут zelyonaya_kometa, comet, green comet и так далее), а также использовать специальный синтаксис — <lora:zelyonaya_kometa:1>.

Регулируя коэффициент после двоеточия (0.3, 0.5, 0.75, 1 и так далее), вы ослабите или усилите влияние модели, смешаете генерируемый результат со стилем выбранной версии SD или другими LoRa.

Синтаксис LoRa в Stable Diffusion можно использовать для передачи стиля, добавления образа или элементов окружения. Название, заключённое в <>, зависит от выбранной модели нейронной сети, как и типичные токены для её активации.

Чтобы научить модель передавать нужные детали, перед тренировкой в документе формата .txt нужно описать характерные ключевые слова и токены для быстрой имитации совокупного образа (стиля). В одной модели можно использовать как один, так и несколько особенных токенов (вроде ledivbelom или zelyonaya_kometa).
Леди в белом платье - арт в нейросети Stable Diffusion

Другие интересные варианты синтаксиса Stable Diffusion:

1) [to:when] — добавляет токен к подсказке после фиксированного количества шагов;
2) [from::when] — удаляет токен из подсказки после фиксированного количества шагов.

Пример: [fantasy:cyberpunk:16] landscape.

Сначала Stable Diffusion будет рисовать пейзаж в стиле фэнтези, но после 16 шагов нейросеть переключится на рисование киберпанк-ландшафта, продолжая с того места, где остановилась до этого.

Вот вам пример посложнее — fantasy landscape with a [mountain:lake:0.25] and [an oak:a christmas tree:0.75][ in foreground::0.6][ in background:0.25] [shoddy:masterful:0.5] (настройка сэмплера — 100 шагов).

Сначала нейросеть будет генерировать фэнтезийный пейзаж с горой и дубом на переднем плане, после 25 шагов переключится на пейзаж с озером и дубом, затем начнёт создавать новые сцены после 50, 60 и 75 шагов. Использование подобного синтаксиса будет полезно для получения разнообразных результатов и усложнения генерации.

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

Подробнее о синтаксисе Automatic можно прочитать здесь, о возможностях настройки промптов в NMKD — тут.

Особенности синтаксиса SDXL

Модель Stable Diffusion XL или SDXL намного лучше распознаёт текстовые подсказки на естественном языке, поэтому может использоваться без создания монструозных промтов и применения сложного синтаксиса. Чтобы получить красивый результат, достаточно написать ключевые слова и короткие предложения на английском языке, разделяя их запятыми!

Если этого будет недостаточно, можно усилить влияние токенов, используя символы ” и **. Например, чтобы создать портрет ведьмака, вести ”The Witcher Portrait”  или **The Witcher Portrait**. Спецсимволы Stable Diffusion можно использовать многократно, увеличивая вес нескольких ключевых слов. Для получения стабильных результатов рекомендую начинать с кавычек!

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

Как использовать синтаксис Stable Diffusion?

Чтобы использовать синтаксис Stable Diffusion, сначала вам необходимо установить программу с графическим интерфейсом, поддерживающую текстовый ввод с расширенными параметрами. Например, Automatic1111 или NMKD. После установки софта останется лишь ввести управляющие символы в поле Prompt (зону для добавления текстовых подсказок) и настроить их под собственные нужды.

Образцы настроек я уже приводил на странице выше.

Удачных экспериментов!

Понравилась статья?

Поддержите автора репостом, комментарием, подпиской на Telegram и другие страницы!

Профессиональный фотограф из Приморского края. Работаю в Находке, Владивостоке и Золотой Долине. Пишу статьи о фото и гик-культуре, в том числе про аниме, игры, путешествия и генеративные нейросети. Фотографии выкладываю на рабочей странице (https://olegmorozfoto.ru/) и в Telegram (https://t.me/tengy_photos). Всегда рад новым читателям, подписчикам и клиентам! ✨❤️

8 комментариев

  • Владислав

    «Увеличивать вес слова (фразы) имеет смысл, если вы написали в текстовой подсказке green dress или orange dress, из-за чего у вас поменялся цвет глаз, но вы очень сильно хотите вернуть его обратно. Подобным образом можно написать (blue eyes)—, если написали blue dress и хотите задать другой цвет глаз.»

    Будьте добры, обьяните как полному профану.

    1 … если вы написали в текстовой подсказке green dress или orange dress, из-за чего у вас поменялся цвет глаз.

    Причем цвет глаз, если прописано green dress/orange dress???

    2 Подобным образом можно написать (blue eyes)—, если написали blue dress и хотите задать другой цвет глаз

    Нам же нужно усилить цвет глаз, так зачем мы уменьшаем влияние (blue eyes)—???
    По идее нужно же наоборот увеличивать.

    3 …если написали blue dress и хотите задать другой цвет глаз.
    Причем blue dress к цвету глаз???

    • Tengyart

      Здравствуйте!

      Модели Stable Diffusion чувствительны к базовым токенам, например, к оттенкам, поэтому цвет одежды может повлиять на цвет глаз. Это ответ на первый вопрос. Если оттенок не критичен, дополнительно указывать ничего не нужно.

      Дальше возникла путаница из-за коряво составленного описания. Это не ваша проблема, а мой просчёт, сейчас попробую исправить.

      2) Правильно думаете, обычно вес токенов стоит усиливать. Ослабление чаще нужно для проблемных ситуаций. Допустим, вы ввели blue dress, а в голубой окрасилось не только платье модели, но и её глаза. Порой достаточно указать другой оттенок (не усиливая его), чтобы картинка изменилась нужным образом. Но бывает и так, что даже с увеличением веса токенов всё равно проскальзывают «паразитные оттенки» (например, один из глаз остаётся голубым). В таком случае (blue eyes) — — — поможет ослабить «избыточную голубоглазость», чтобы получать нужные оттенки чаще.

      Хотя это не панацея. SDXL воспринимает фразы намного точнее, поэтому там (чаще всего) не нужно городить костыли, а в SD 1.5 и ранее может понадобиться не только усиливать или ослаблять отдельные токены, но и переставлять их местами, а то и добавлять «неудачные токены» в негативные подсказки (используйте это лишь в самых запущенных случаях!). То, что я тут написал — это лишь общие рекомендации, а не самая надёжная инструкция по использованию синтаксиса Stable Diffusion для получения 100% результатов генерации, увы.

      3) Ответ напрямую связан с первым вопросом. Многие модели Stable Diffusion (до версии 1.5 включительно) переносят цвет одежды на другие участки картинки — волосы, фон, глаза, макияж и т.д. Использование blue dress для генерации портретов может привести к созданию лиц с голубыми глазами (волосами и т.п.). Если генерируется только одежда, то blue dress никак на цвет глаз не влияет, угу)

  • xjhn

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

    • Tengyart

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

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

  • Прохожий в кедах

    «вы уменьшите вероятность появления папоротника на картинке в 0.9 раз»
    Шеф, уменьшить в 0.9 раз — фактически, означает увеличить)
    Пример: 100 / 0.9 = 111.(1)

    • Tengyart

      Благодарю за замечание!

      Не учёл, что это воспринимается не так, как изначально задумывалось. Это огромный ляп с моей стороны, косо написал)

    • Tengyart

      Подразумевал умножение, а не деление, но неправильно это обозначил. Надо подкорректировать)

      Спасибо вам!

Оставить комментарий