
Многие из вас сталкивались со Stable Diffusion и знают, что с помощью этой нейросети можно генерировать изображения. Однако немногие знают, что с её помощью можно также стилизовать существующие изображения, что довольно сильно расширяет простор для её применения. Этот процесс намного проще генерации изображений с нуля. Этим мы и займёмся, а в качестве основы возьмём колоритную фотографию Джеймса Гандольфини.
Фотография

Инструменты
Любой GUI для работы со Stable Diffusion, который поддерживает ControlNet. Я буду использовать самый популярный - AUTOMATIC1111. Установка и настройка находятся за рамками статьи и включают в себя много нюансов, однако могу посоветовать использовать этот удобный установщик и почитать это.
В случае AUTOMATIC1111 потребуется плагин для поддержки ControlNet.
Модели для ControlNet - Tile и Canny. Кидать в
stable-diffusion-webui\extensions\sd-webui-controlnet\models
.Textual Inversion модель для улучшения качества итогового изображения - easynegative. Кидать в
stable-diffusion-webui\embeddings
.Чекпойнт на базе Stable Diffusion 1.5 непосредственно для генерации изображений. Я буду использовать Dreamshaper 8. Кидать в
stable-diffusion-webui\models\Stable-diffusion
.VAE для улучшения цветопередачи - vae-ft-mse-840000-ema-pruned. Кидать в
stable-diffusion-webui\models\VAE
.
Подготовка
Идём во вкладку Settings
, жмём Show all pages
и через Ctrl + F
ищем quicksettings
. В найденном поле выбираем два элемента - sd_vae
и CLIP_stop_at_last_layers
. После в самом верху жмём Apply settings
и Reload UI
.
Настройки

После перезагрузки интерфейса видим, что в шапке страницы у нас появилось две новых настройки. В Stable Diffusion checkpoint
выбираем скачанный чекпойнт, в SD VAE
- скачанный VAE, Clip Skip
устанавливаем в 2
(для интересующихся, но в целом на большинстве чекпойнтов тоже улучшает результаты).
Настройки

Базовая генерация
На этом все подготовительные этапы закончились. Идём во вкладку img2img
и перетаскиваем наше изображение в окно. В поле Prompt
нужно описать его. Самые ленивые могут нажать на кнопку Interrogate CLIP
, чтобы нейросеть CLIP описала изображение за нас, а нам осталось только это описание скорректировать. В поле Negative prompt
вставляем название скачанной ранее Textual Inversion модели - easynegative
. В Sampling method
и Sampling steps
выбираем DPM++ 2M Karras
и 22
(для интересующихся). Далее ищем иконку с транспортиром и жмём на неё, чтобы установить разрешение выбранного изображения в качестве разрешения для генерации. Если изображение больше 2000 пикселей по одной из сторон или вашей видеокарте не хватает памяти, то пропорционально уменьшайте разрешение.
Настройки


Один из основных параметров, которые нам придётся корректировать, - это Denoising strength
. Он отвечает за то, насколько сильно базовое изображение будет изменено в процессе генерации. Как это всё работает в совокупности, проще всего понять при помощи графиков. Графики различаются дописанным в промпт стилем (он указан под графиком).
Графики


Как видно, чем больше Denoising strength
, тем меньше на результат влияет наше базовое изображение. Уже на данном этапе вас могут устроить какие-то результаты, однако заметно, что при сильной стилизации изображение начинает сильно уходить далеко от базового, и дальше мы будем с этим бороться.
Продвинутая генерация
Итоговое изображение генерируется на основе случайного шума, за основу для которого берётся число seed
. Зафиксируем его, нажав на кнопку с зелёными стрелочками (для этого предварительно нужно сгенерировать что-то - seed
берётся у последнего сгенерированного изображения). Таким образом мы сможем отслеживать, как на результат влияют различные настройки.
Идём во вкладку ControlNet
, в ControlNet Unit 0
перетаскиваем наше изображение. Включаем чекбоксы Enable
, Pixel Perfect
, Allow Preview
и Preview as Input
. В Control Type
выбираем Canny
, после чего у нас автоматически должны заполниться поля Preprocessor
и Model
. Нажимаем на иконку рядом с Preprocessor
и видим, что у нас появилось изображение с контуром на основе базового изображения. За детализацию этого контура отвечают ползунки Canny Low Threshold
и Canny High Threshold
. Если контур будет чересчур детализированным, то у итогового изображения появятся артефакты. Если же деталей будет не хватать, то сходство с базовым изображением будет хромать. Нужно поймать баланс. Очередной важный параметр - Control Weight
. Он отвечает за то, как сильно этот самый ControlNet Unit
будет влиять на результат. Подробнее его влияние мы разберём дальше на графиках.
А пока переходим во вкладку ControlNet Unit 1
и перетаскиваем наше изображение и туда. Включаем чекбоксы Enable
и Pixel Perfect
. Control Type
- Tile
, Preprocessor
- tile_colorfix+sharp
.
Настройки


А теперь, когда мы указали все необходимые параметры, можно наконец-то разобраться, что же вообще происходит. Конечно же, при помощи графиков. По оси X меняется Control Weight
модели Tile
, по Y - Control Weight
модели Canny
.
Графики


Проще самому понять, что происходит на этих графиках, чем объяснить. Но явно видно закономерность: чем больше X, тем больше изображение походит на базовое; чем больше Y, тем больше сходство в деталях. На разных базовых изображениях и при разном Denoising Strength
лучшие сочетанияControl Weight
также могут различаться, но с большой вероятностью это будут значения где-то из середины графика (0.25-0.75
).
Также видно, что при высоком Denoising Strength
по оси Y у изображения начинают проявляться артефакты. Это может быть связано как с тем, что вы задали слишком детализированный контур, так и с тем, что промпт для стилизации пережаривает результат. Чтобы усилить какую-то часть промпта, её оборачивают в скобки и указывают коэффициент силы - (anime style:1.5)
. Как это влияет на наш результат, рассмотрим на любимом графике :)
График

Control Weight
для Tile
моделиКак видно, более сильный промпт сильнее влияет на результат, но в определённых ситуациях начинает пережаривать его, создавая артефакты, так что это тоже нужно учитывать.
Итоги
Наибольшее влияние на результат стилизации, помимо чекпойнта, оказывают 4 настройки:
Denoising Strength
,Tile Control Weight
,Canny Control Weight
,Prompt Strength
.
Базовый процесс стилизации изображения включает в себя следующие этапы:
Описываем базовое изображение, устанавливаем основные параметры,
ControlNet
пока не включаем. Описываем стиль. Генерируем изображения наDenoising Strength
0.5-1.0
, чтобы понять, на что ориентироваться на выходе, хороший ли мы выбрали чекпойнт, правильно ли описали желаемый стиль.Как только сгенерировали стилистически хорошее изображение, фиксируем
seed
и включаемControlNet
. ЗадаёмControl Weight
в диапазоне0.25-0.75
и смотрим, насколько хорошо ложится стиль, насколько хорошее сходство с оригиналом, не появляются ли артефакты. Если что-то не устраивает, крутим один из основных параметров.Как только поймали хорошие параметры, ставим
seed
в-1
и генерируем нужное количество изображений.Как только захотели сменить стиль, учтите, что в зависимости от стиля может потребоваться повысить/понизить
Control Weight
. Если мы хотим изображение в стиле, например, Гигера, то при высокомControl Weight
стилистически хороший результат не получится, но при низком мы потеряем сходство. Опять же, нужно поймать баланс.
На словах кажется сложнее, чем на практике. Как только опробуете весь алгоритм на нескольких изображениях, станет намного проще интуитивно подбирать значения параметров.
Также можно случайно выбирать один из заданных заранее стилей при помощи этого расширения, а ещё можно полистать этот и подобные сайты, где наглядно продемонстрированы стили разных художников, но это всё уже как домашнее задание :)
Ещё немного случайных примеров





