Многие из вас сталкивались со 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). Как это влияет на наш результат, рассмотрим на любимом графике :)  Как видно, более сильный промпт сильнее влияет на результат, но в определённых ситуациях начинает пережаривать его, создавая артефакты, так что это тоже нужно учитывать. Наибольшее влияние на результат стилизации, помимо чекпойнта, оказывают 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 стилистически хороший результат не получится, но при низком мы потеряем сходство. Опять же, нужно поймать баланс. На словах кажется сложнее, чем на практике. Как только опробуете весь алгоритм на нескольких изображениях, станет намного проще интуитивно подбирать значения параметров. Также можно случайно выбирать один из заданных заранее стилей при помощи этого расширения, а ещё можно полистать этот и подобные сайты, где наглядно продемонстрированы стили разных художников, но это всё уже как домашнее задание :)   Backend Developer | AI Artist