Stable Diffusion. Улучшаем фото с сохранением черт лица.
В этом материале я покажу как увеличить изображение с исправлением недочётов и повышением детализации. Данный процесс отлично подойдёт как для старых фотографий, так и сгенерированных на небольшом разрешении.
Для этого нам понадобится Stable Diffusion с Controlnet.
В данном примере будем использовать модели от SD 1.5, т.к. нам понадобится Controlnet с определёнными моделями, которых нет в XL.
Весь процесс можно разбить на 3 этапа:
1) Увеличение изображения с незначительным повышением детализации, с приоритетом на сохранение черт лица.
2) Точечное исправление недочётов
3) Повторяем пункты 1 и 2, но с приоритетом на детали.
Рассмотрим каждый этап подробнее. В качестве заготовки будем использовать сгенерированное изображение с заменённым лицом - это усложнённый вариант, т.к. здесь нам нужно сохранить узнаваемые черты лица, а само лицо имеет явные недочёты в виде замыленности и неправильной геометрии глаз - исправление этих моментов является особенностью этого метода увеличения, т.е. это не обычное увеличение. Само исходное изображение и результат будет в конце, что бы было удобнее сравнивать без необходимости долгого скроллинга страницы. Итак приступим.
Для начала нам понадобится немного подготовиться, необходимо скачать файлы и разместить в соответствующих папках, возможно у Вас уже есть всё необходимое:
• Фото модель для генерации (...\webui\models\Stable-diffusion\) - Главным критерием при выборе модели, является его способность делать изображения фотографического качества или в другой нужной Вам стилистике. Для фото вполне неплохо подходит модели epicphotogasm_z, photon_v1, juggernaut_reborn и другие.
• Juggernaut Negative Embedding (...\webui\embeddings\) - устраняет недочёты
• Add More Details - Detail Enhancer / Tweaker (细节调整) LoRA (...\webui\models\Lora\) - Добавляет детализацию
• SDXLrender (...\webui\models\Lora\) - Повышает контрастность и качество кожи сопоставимое с уровнем XL но на моделях SD1.5
• 4xNomosUniDAT_otf (...\webui\models\ESRGAN\) - Апскейлер - для увеличения изображения
• Расширения Controlnet не ниже 1.1.1.440 и Tiled Diffusion - ставятся через менеджер расширений.
1 ЭТАП. Цель увеличить изображение с небольшими улучшениями, но с сохранением узнаваемости.
Для этого нужно закинуть картинку в img2img. В подсказке должны быть только Lora "<lora:more_details:1>, <lora:SDXLrender_v2.0:0.6>", а в негатив пишем улучшалки на реализм и Embidding: " (worst quality, low quality, lowers,:1.4) jpeg artifacts, poorty drawn, doll, Illustration, graphic, eg, cgi, cartoon, anime, glitch, 3d. 2d. octane, sketch, acrylic, painting, drawing, airbrushing, semi-realistic, rendering, blender, digital art, manga, (ugly eyes:1.1), under-saturation, overexposure, underexposed, JuggernautNegative-neg".
Выставляем настройки:
- Sampling method = DPM++ 3M SDE Karras
- Denoising strength=0,35 (степень допустимого изменения оригинала). Чем меньше - тем больше искажений при увеличении, чем больше - тем больше теряется лицо
- CFG Scale=7, оставляем по умолчанию исходя из рекомендаций к модели. Если поставим меньше - будет размытое, не детализированное изображение, в этом случае обязателен 2-й этап. Если поставим больше - потеряем реалистичность, ввиду передачи большего количества параметров и необходимости их запихнуть в итоговую генерацию, что может привести к "пережарке" и появлению дефектов.
- Далее включаем три вкладки controlnet. На первой вкладке выбираем Canny сразу ставим параметрControl Weight=0,7. На второй Lineart с препроцессором lineart_realistic, Control Weight=0,7. На третьей Tile/Blur с препроцессором tile_resample и только на этой вкладке меняем приоритет на ControlNet is more important, а параметр Control Weight=0,7.
- Включаем вкладку Tiled Diffusion. Настройки:
• Latent tile width=128, область наложения для согласования плиток. зависит от разрешения исходного изображения, исходим из того что наш исходник лежит в пределах от 512 до 1280 px. Обратите внимание на итоговый результат глаз, если они выйдут разными - увеличивайте этот параметр,
• Latent tile overlap = 8, область размытия перехода границ плитки, увеличивайте если их увидите, но слишком большое значение приведёт к появлению артефактов,
• Latent tile batch size=4, количество одновременно обрабатываемых плиток что немного влияет на скорость, но зависит от размера вашей видеопамяти,
• Scale Factor=2, во сколько раз будем увеличивать исходник,
• Upscaler=4xNomosUniDAT_otf, или 4x_NMKD-Siax_200k, 4x-UltraSharp.
Жмём генерировать.
В качестве результата должны получить увеличенное в разрешении изображение, более сглаженные линии "вставки лица", более гладкая кожа, более детальные глаза и губы.
2 ЭТАП. Исправляем недочёты.
Под недочётами понимаем лишний мусор или неверно проявленная родинка на коже, возможно искривление радужной оболочки или появление шишки на лбу :) Так же можно исправить глаза, которые могут получить разный оттенок, или поправить нос, подбородок, волосы. Данный этап можно использовать и как после первого этапа, дабы исправить недочёты до их проявления, так и после третьего этапа.
На этом этапе нужно выполнить следующее:
- перекидываем полученное на втором этапе изображение на вкладку inpaint, маской выделяем проблемные области или те места где что-то хотим дорисовать.
- удаляем описание и негатив, пускай нейросеть просто перерисует нам выделенный участок. Или наоборот дорабатываем описание с учётом того что хотим увидеть под маской.
- отключаем расширения с предыдущего этапа (controlnet и SD upscaler)
- ставим Inpaint area=Only masked (рисовать в маске) - в этом случае указанное далее разрешение будет использоваться только для области под маской.
- Что бы сохранить оригинал, оставляем значение Denoising strength=0.3 и меньше
Жмём генерировать, повторяем со всеми областями где есть косяки или где нужно что-то перерисовать в соответствии с подсказкой.
3 ЭТАП. Цель добавить деталей и лучше прорисовать имеющиеся.
- Перекидываем полученное изображение на предыдущем этапе в главное окно img2img и повторяем генерацию исходя из аналогичных соображений по всем параметрам из первого пункта. Желательно поменять Sampling method=DPM++ 2M Karras, т.к. он больше накидывает деталей.
При нажатии на кнопку генерировать должна начаться обработка плитками с захватом областей, но плиточек будет больше чем в предыдущем этапе, от этого и пропорциональное увеличение обработки по времени.
Если изображение теряет сходство с лицом оригинала или появляются некие артефакты - понижайте Denoising strength и лучше устраняйте дефекты на втором этапе. Если всё хорошо, можете сделать ещё лучше увеличив Denoising strength до 0,5.
Дочитав до этого места Вы можете спросить меня: "А почему бы просто не увеличить на первом этапе размер не в 2, а в 4 раза, затем пройтись inpaint и получить такой же результат?" - можно и так, но постепенное увеличение даёт возможность поменять семплеры которые будут оказывать непосредственное влияние на конечный результат ввиду разных целей при увеличении (сохранение черт или добавление детализации), а так же не допустить распространение своевольных неточностей в интерпретации исходника, вовремя подстроив значения CFG Scale и Denoising strength, а так же применив устранение косяков через inpaint. Кроме того можно на одном из этапов заменить саму модель генерации и получить ещё больше ништяков.
Вот пример оригинала и его увеличения, минуя второй этап - и так сойдёт для обучающих целей:
Сравним при увеличении (исходник-1этап-2этап):
Пример из разряда усложнённых, т.к. требовалось максимально сохранить оригинальные черты, а само изображение рассогласованное по своей сути композиции, что затрудняет нейросети согласование деталей в которой с одной стороны должна быть Женщина, а с другой некий небритый мужчина, представим себе что я ХЗ кто это :P
Незабываем, многое зависит от основной модели генерации, поэтому выбирайте ту, которая может генерировать реалистичные фото, в данном случае использовалась модель: photon_v1 Кроме того, можете поэкспериментировать с Upscaler, и Sampler выбрав наиболее подходящий на свой вкус и цвет.
Как видим, результат довольно неплохой, по крайней мере есть направление в котором копать. Можно придраться что кожа "пластиковая" и прочие вещи которые исправляются с помощью - правильно Stable Diffusion! Но это отдельная тема.
Другие способы замены и больше примеров с тестами вы найдёте перейдя по ссылке - stALogen.ru