v.1.55 от 15.07.23

Гайд предназначен для людей уже знакомых с обычной работой в AUTOMATIC1111 webui, ориентирующихся во вкладках и инструментах на них. В связи с ленью автор не вставил скриншотов, ограничившись текстовым описанием элементов, поэтому без опыта будет сложно. Если же вы не уверены пока в своих своих, то есть гайд с подробными объяснениями работы элементов от другого автора - https://rentry.co/sd__upscale Также есть гайд по альтернативному, более новому способу апскейла с помошью расширения ControlNet - https://rentry.org/UpscaleByControl

Про апскейл и инпаинт в AUTOMATIC1111 webui

Для тех, кому некогда читать

Апскейл: качаем апскейлер valar отсюда: https://mega.nz/file/STI3kIKJ#mr3PqAu35SI9yGHWUdCJsXm2kai1R1SrsYsBafyH-Vo
Кладём в папку models\ESRGAN, перезапускаем (если был запущен) Automatic, проверяем чтобы на valar стояла галочка "отображать" в Settings
Из PNG Info передаём картинку в img2img, выбираем внизу скрипт SD_upscale, ставим denoise 0.28, генерируем.
Outpaint: из PNG Info передаём картинку в img2img, выбираем внизу скрипт Poor man's outpainting, выбираем галочками те стороны, в которые мы хотим расширить картинку, ставим denoise 1, генерируем.

Внимание! Апскейл занимает много времени и полностью грузит видеокарту. Пожалуйста, проверяйте изредка её температуру и состояние. Особенно нагружается память, причём гораздо больше, чем при обычной генерации. Разница может достигать 10 градусов и выше(например, 76 при обычной работе и 88 при апскейле). Важно для всех карт начиная от 3060 Ti. Если у вас используется nvme ssd, то с очень большой вероятностью видеокарта греет и его. Хорошо бы проверить и его температуру после 1-2 часов работы SD.

Дальше уже для тех, кто торопится не так сильно (но, возможно, хочет ускорить апскейл примерно в 2 раза)

tl;dr как из
tl;dr как из

получить:
получить:

Disclaimer Вариант не претендует на абсолютную истину, это просто workflow автора. Если у вас он другой - замечательно.

Исходим из того, что в процессе «рыбалки» у нас получилась понравившаяся генерация низкого разрешения, а мы хотим получить 2-4-8K UHD на выходе для установки на "обои" современного 16:9 монитора. Для простоты определимся, что у нас есть 1024х768.

  1. Настроим сохранение в png, если до этого стояло в jpg, т.к. у нас будет много этапов пересохранения, которые будут вносить в Jpeg дополнительные искажения каждый раз. Итоговый файл потом можно будет пересохранить в jpg, если дальнейшее редактирование не планируется;
  2. Втянем генерацию в PNG Info, получим данные генерации и передадим их в img2img;
  3. В img2img оставляем все параметры, кроме Denoise – ставим его на 1, обязательно оставляем сид, при его известности (улучшит гладкость швов);
  4. Выбираем скрипт Poor man's outpainting, дефолтные настройки не меняем, кроме того, в какие стороны нам надо расширять исходный рисунок. В нашем случае – только влево и вправо. Их и оставляем. Генерируем;
  5. Получаем на выходе 1280х768. Уже неплохо, но ещё не 16:9. Втягиваем новую картину опять в img2img. На качество швов и того, что нагенерило в пустом месте пока не обращаем внимания. Это поправим потом. Промт и настройки менять не надо, они остались от начальной картинки. Меняем только размеры, т.к. теперь они 1280х768. Опять п.3
  6. Получили 1536х768. Уже с запасом для 16:9. Теперь любым софтом кропим в отношении ~16х9 и с размерами кратными 64, получаем 1404х768;
  • Отступление. Возможно вам может захотеться сдвинуть сюжет или персонажа из центра - те самые правила третей, золотого сечения. Тогда можно ещё понаращивать картинку и вырезать кроп не совсем из центра. Дальше как обычно;
  1. Пришло время убирать швы и ту дичь, если она нагенерилась на доливках. Здесь возможны два варианта:
    а) если доливки получились удачные, и фон продолжается, имеются лишь небольшие швы, то можно ограничиться втягиваением картинки опять в img2img, УБИРАНИЕМ всех скриптов, Denoise на минимум 0.25-0.3, seed на -1 (рэндомный, т.к. если начинать с того же, что был в исходной картинке, то у нас не будет разных результатов, сколько бы не перезапускали генерацию) и генерируем 1-2 иттерации, выбираем удачную;
    б) на доливках жесть, вроде чего-нибудь неожиданного, к тому же попавшего "на передний" план. Тогда через PNG Info втягиваем картинку с инфой в Inpaint, в окно исходника вставляем уже сделанный нужный кроп, выставляем его размеры, seed на -1. Далее выделяем маской то, что нам не нравится, ставим галку Inpaint at full resolution, Denoise ~0.7, задаем число генераций, можно сразу не стесняться и ставить 10, т.к. выбирать придётся много, и ждём.

*На всех стадиях можно менять число шагов и сэмплер как угодно и как подсказывает опыт.
Из личных предпочтений:

  • для апскейла DDIM, который генерит много шума, из которого каждый последующий апскейл будет выдумывать детали, 30-50 шагов, достаточно быстрый;
  • для «быстро, хорошо, сердито» нагенерить лоуресов - DPM++ 2M Karras, 30 шагов, один из самых быстрых сэмплеров;
  • для просто генераций батчем, когда хочется чего-то и время не важно, можно поставить DPM Adaptive, который иногда на выходе выдаёт очень интересные результаты, а в худшем случае – делает не хуже остальных сэмплеров, но работает медленно, игнорируя заданное число шагов. Также достойны внимания LMS Karras, DPM++ SDE Karras*
  1. Итак, у нас есть наконец перегенеренный файл, где швы более-менее слились, можно начинать повышать разрешение. Втягиваем итог Inpaint'а (или фотошопа, им можно быстро собрать куски из разных генераций, что проще, чем ждать, пока всё совпадёт на одной картинке) в im2img;
  2. Настраиваем im2img уже по-другому. Выбираем сэмплер (DDIM / DPM++ 2M Karas/ ), сид тоже меняем на -1, старый больше не понадобится, выбираем скрипт SD_upscale. Выставляем размеры файла и тут есть очень важная особенность:

При выбранном скрипте SD upscale в img2img ЭТО НЕ РАЗМЕРЫ ВЫХОДНОГО ФАЙЛА, и даже не размеры входного файла. Заданные размеры в параметрах - это размеры "окна", которым скейлер оперирует, на сколько кусочков он дробит картинку.

Пусть мы закинули файл размером 1536х1152 и такие же размеры выставились в настройках. Т.о. скейлер для получения итогового изображения удвоенного размера должен собрать его из 4 изображений указанного размера. Однако у нас есть ещё поля по 64 пикселя по-умолчанию (можно изменить) для сглаживания швов между частями итогового изображения. Т.о. получится не 4, а 9 (3 х 3) изображения размером 1536х1152. И это разрешение фрагмента (1536х1152 в рассматриваемом случае) и есть ограничивающий нас размер, а не итоговое разрешение. Мы не можем задать размер кусочка больше, чем влезает в видеопамять. Но итоговое разрешение картинки может быть сколь угодно большим при сохранении размера элемента таким, чтобы хотя бы один элемент влезал в память.Такими небольшими размерами "окна" картинку можно бесконечно увеличивать (повторяя шаги). Для проверки этого утверждения за 4 прохода апскейла была сгенерирована картинка 24576 х 18432 (450 мегапикселов). В процессе потребление памяти было не выше 12Гб (т.к. в настройках размеры всегда оставались размеры картинки из первого шага).

Отдельным выводом из этого следует, что можно радикально ускорить апскейл, уменьшив число кусочков, на которое будет дробиться картинка. Т.е. добавив размер полей (по-умолчанию стоит 64 пикселя), мы сможем уменьшить число генераций с 9 (при размерах 1536х1152) до 4 (при размерах 1600х1216) и, соответственно, уменьшить в два раза необходимое время. При наличии знания азов математики и достаточно большого объёма видеопамяти размеры можно увеличить до ровно х2 от изначальных, и тогда апскейл пройдёт одним куском, полностью убирая возможность появления "призраков". О вариациях размеров "окна" подробно рассказано в https://rentry.co/sd__upscale Из минусов деления на 4 части - швы между частями пройдут ровно посреди изображения. Поэтому иногда лучше оставить деление на 9 или другие варианты.

Картинка 24576 х 18432 (450 мегапикселов, imgur шакалит до 5000 пикселов, поэтому совсем оригинал здесь (54мб): https://dropmefiles.com/TfkXc):
450 мегапикселов

И кроп 1500х1125 из неё:
450 мегапикселов

Перефразируя: увеличиваете картинку в первый раз? Ставьте в размер при SD upscale исходный размер + 64 пиксела. Увеличиваете второй и последующий разы? Оставляйте размер из первой стадии.

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

В конце не забываем выбрать апскейлер. В общих Settings оставляем только R-ESRGAN General WDN 4xV3 (усредненно лучший по PSNR) и R-ESRGAN 4x+ Anime6B (очень хорошо выглаживает картинки 2д). Затем скачиваем с https://upscale.wiki/wiki/Model_Database ещё остальные: начать стоит с Lollypop (выглаживает хорошо людей) и valar (природа, вещи, люди, овер-детализация). Дальше с понимаем того, как работает каждый апскейлер, можно попробовать другие. Например, разные от Ultrasharp от NMKD. Отдельным номером в списке идет LDSR. Он требует минимум 12Гб VRAM. Работает х4 дольше остальных Результаты местами потрясающие, местами не стоят таких затрат. Скачиваем отсюда: https://heibox.uni-heidelberg.de/f/31a76b13ea27482981b4/?dl=1 и https://heibox.uni-heidelberg.de/f/578df07c8fc04ffbadf3/?dl=1 два файла и кладем в папку /models/LDSR. Внимание: имена файлов важны, должно быть project.yaml и model.ckpt, если другие, то переименовываем.

Сравнение апскейлеров
Пусть после аутпаинта имеем картинку 1792х1024:
Исходник

И вот результаты первого шага повышения разрешения. Потом ещё будет делаться второй шаг.
Просто удвоение:

Просто удвоение
пикселарт, мммм

Бикубическое в графическом редакторе:
Бикубическое в графическом редакторе
жипег-шакалы здесь работают во вторую смену

4x_foolhardy_Remacri:
4x_foolhardy_Remacri
оч неплохо

4x_Valar_v1:
4x_Valar_v1
даже лучше remacri, но уже появились лишние детали. Их можно убрать, копируя куски с генераций с денойсом ниже

lollypop:
lollypop
гладко везде, где надо, и где не надо, ерунда на куртке, но хорошие шнурки, лишние детали

R-ESRGAN General WDN 4xV3:
R-ESRGAN General WDN 4xV3
баланс

R-ESRGAN 4x+ Anime6B:
R-ESRGAN 4x+ Anime6B3
тоже гладко, акцент на чистых линиях

LDSR:
LDSR
камень потрясный, остальное надо смотреть, куртка пережарилась

В итоге для данной картинки всё-таки был выбран LDSR для проверки его работы. Второй шаг делался valar. Но в процессе пришлось убирать лишние артефакты, заменяя их кусками из других генераций. Опыт показал, что этим скейлерам denoise нужен ниже.
Итог 2-ступенчатого повышения разрешения в 4 раза (1 шаг - LDSR, 2 шаг - valar):

LDSR+valar

И справочно пример работы 2 шагов LDSR на удачном для него исходнике:
До:
До

После:
После

  1. Denoise выбираем эмпирически, исходя из того, что на картинке, и насколько много нам надо добавить деталей: 0.4-0.45 – добавит много деталей, но выражение лица изменится, могут появиться "призраки" - новые люди, коты в стенах etc, но всё равно имеет смысл сделать такую генерацию, чтобы потом взять из него богатые фонцы. 0.3-0.35 – баланс деталей и лишних артефактов. 0.28-0.35 – обычно спокойно без глюков, но и детальность почти не растет, 0.2-0.28 – очевидно. Из всего списка скейлеров для LDSR и valar лучше ставить нижние значения из указанных пределов, генерят много лишнего иначе. Настроили, генерим, пьём чай. Простой вариант – сделали одну генерацию с малым денойсом (около 0.3). Сложный – сделать две с ~0.45 и с ~0.3, совместили в фотошопе слои, прорезали дырки где надо, чтобы лишнее закрывалось с другого слоя, сохранили;

По личным ощущениям для 3D-аниме стилистики хорошо получается сочетания: ldsr-valar / valar-wdn(0.33, 0.27), но это не догма. Возможно, для вышей картинки лучшим окажется другое сочетание. См. дополнительно Личные ощущения2 в конце

  1. Теперь у нас есть файл 2808х1536, можно остановиться здесь. Или можно и повторить п.п. 7-9 с новыми размерами. По-умолчанию WebUI не дает выставить разрешение выше 2048, но это можно поменять в ui-config.json. Каждый шаг увеличивает время генерации в 4 раза (как увеличивается и число пикселей в картинке), чая потребуется много;

За чаем можно рассмотреть разные варианты работы двух этапов скейлинга. Оказывается, не все йогурты одинаково полезны есть разница, кого взять первым, а кого вторым. И сочетание anime6b+valar будет очень сильно отличаться по итогу от valar+animeb6. Причина: если первый шаг масштабирования "заполировал" всю картинку, то на втором этапе часть, конечно, будет нарисована заново, но очень много информации будет потеряно. И если это не было специально задумано, то лучше "выглаживающие" скейлеры не ставить в первый этап. Это очевидные lollypop и anime6b. Своё право на существование они имеют, однако использовать их лучше только тогда, когда на выходе ожидается малая детализация и "гладкая" прилизанная картинка. Сравнение нескольких самых характерных пар см. в конце.

Каждой картинке - свой апскейлер. Например, этой valar противопоказан. Здесь R-ESRGAN General WDN 4xV3 и R-ESRGAN 4x+ Anime6B:
Как это вообще работает?

  1. Теперь у нас есть файл 5616х3072, а начинали с размера «почтовой марки». И если вы нашли баланс между денойсом и "призраками", то картинка стала гораздо лучше и детальнее. Но иногда случается, что детальность никак не набирается. Причина 1 – VAE от NAI/Anything, причин не знаю, просто обнаруженный факт. Причина 2 – хз, неудачная генерация и сюжет, понять и простить. Также могут мешать повышению четкости наличие в промте DOF, depth of field и подобных тэгов. Убираем их, если есть. Глубину при необходимости настроим в п.13;

Дополнительный финт для тех, кто уже немного разобрался. Промт можно менять. И на каждом шаге апскейла мы можем что-нибудь добавить для атмосферы или убрать (персонажа, если идём на рекорд по мегапикселам). Самое простое, например: дописать тэг light particles, который добавит атмосферные искорки-светяшки вроде пылинок в солнечном свете или subsurface scattering, который хорошо включает RTX для преломления и отражения, но в основной генерации на него обычно жалко токенов .

Для тех, кто любит контролировать всё сам можно разделить стадии именно апскейла и повышения детализации, т.к. скрипт SD_upscale просто делает эти две стадии сам последовательно. Особого смысла в этом нет, кроме одно случая - пресловутый LDSR. Бывает немного грустно, когда прождав n-минут ты получаешь безнадёжно запоротый файл пальцами или руками. И снова ждать, пока LDSR просчитает свои 100-200 шагов. Однако этого можно избежать: повышаем разрешением через Extras нашим любимым LDSR. Затем всё по обычном алгоритму в img2img, НО(!) выбираем апскейлер None, коэффициент увеличения 1, настраиваем только Denoise. Так даже если мы перестараемся с denoise или что-то ещё будет не идеально, нам не придётся второй раз ждать бессмысленного повторного повышения разрешения через LDSR. Мы это слелали один раз, а дальше только занимаемся детализацией.

  1. Для улучшения результата можно ещё подкорректировать цвета в вашем любимом редакторе;

И не всегда корректировка - это усиление цветности и яркости:

Сумерки

  1. Ещё одно улучшение - можно получить эффект размытия объектива, сфокусировать "взгляд" зрителя на выбранной точке, размыв остальное. Да, мы, получается здесь будем размывать только что полученную детализацию в каких-то местах, но зато в других она останется повышенная. Для этого устанавливаем из стандартных extension Автоматика stable-diffusion-webui-depthmap-script. Появится вкладка Depth. Грузим в неё нашу картинку, выбираем модель midas_v21 либо dpt_beit_large_512 (midas 3.1) - они дают наиболее "гладкие" карты глубин, лучше всего подходящие для имитации ГРИП объектива. НЕ ВКЛЮЧАЕМ галку Match input size, иначе детальность карты тоже будет слишком высокая. Выставляем разрешение сети 512х512. Снимаем галки Image Boost (опять слишком детальная карта) и Combine into one image (слить в один файл карту глубин и исходный файл). Можно запускать. При первом запуске скрипт качает несколько моделей. Можно сделать и на https://huggingface.co/spaces/pytorch/MiDaS, загрузив свою картинку (или сжав её в jpeg, т.к. там есть ограничение на размер).
    Пример карты глубин

Далее открываем в Фотошопе результат предыдущих шагов и карту глубин. В альфа канал картинки загружаем карту глубин (её можно немного размыть фильтром Фильтрах – Размытие - Размытие по Гауссу с радиусом 3-5 пикселов, т.к. в результаты из Мидаса иногда со ступеньками, похожими на артефакты jpeg-сжатия ), запускаем в Фильтрах – Размытие – Размытие объектива, далее выбираем источником глубин альфа канал, настраиваем ползунками то, что мы хотим видеть резким, что размытым, и степень этого. Сохраняем в отдельный итоговый файл;

  1. Вы великолепны!
  • За бортом остался процесс img2img коллажа или обычного фото, но освоив изложенное, должно придти понимание, что это почти то же самое;
  • Вместо фотошопа вы можете использовать тот инструмент, к которому привыкли;
  • Есть ещё простой вариант для ленивых (или если нет оригинального промта): написать в строку промта не оригинальную, а просто "very highly detailed", denoise 0.25-0.3 и поиграть CFG в районе 11-15, требуя от сети "Деталей дай, да!". Но раз вы досюда дочитали, то, это наверное слишком просто? Качество всё равно будет ниже.

Быстрые ответы на встречавшиеся вопросы, на которые пока нет отдельного развёрнутого пункта:

  • Что делать с промтом, когда исходник сгенерен с лорами?
    Ничего делать не надо. Можно оставлять. Сильного усиления влияния лор на итог не замечено. С другой стороны, для интереса можно на 1-2 ступени попробовать убрать лоры. Тогда их влияние на итоговое изображения будет ослаблено.
  • Как апскейлить изображение после controlnet?
    Апскейлить как обычное, не включая controlnet. Работает абсолютно нормально.

Примеры работы разных пар скейлеров

У нас есть подготовленная к увеличению разрешения картинка формата 16:9
low res
Идея хороша, но ей бы деталек... На лицо лучше пока не смотреть

anime6b-valar
anime6b-valar
Первая ступень загладила всё, после этого valar как мог дорабатывал, но все детали очень крупные. Бесполезная работа. Плохо.

ldsr-valar
ldsr-valar
Первая ступень поняла очень много, что казалось мазнёй и даже сообразила сделать что-то вроде DOF, после этого valar добавил детализации. Очень хорошо.

valar-anime6b
valar-anime6b
valar постарался, а anime6b всё снова загладила, да ещё и совсем рэндомно и неаккуратно. Вывод - вместе эти два скейлера вообще не сочетаются. Плохо.

valar-remacri
valar-remacri
valar постарался, remacri тоже обычно хорошо справлялся с природой, но тут что-то пошло не так. Явно видна структура "под холст". Плохо.

valar-valar
valar-valar
Два valar друг другу не мешают. Второй продолжил работы первого. Деталей много. Настолько, что они просто колят глаз. Однако с этим можно справиться при необходимости потом. Как вариант можно использовать. Хорошо.

remacri-valar
remacri-valar
Сильно лучше, чем обратная пара, но всё равно, не самая лучшая работа remacri. valar же просто "вцепляется" во всё, что видит. Нормально.

valar-ldsr
valar-ldsr
valar на первом шаге тут прекрасен. И как мы помним ldsr на первом шаге тоже отработал отлично, и втором не подкачал. Проблема только одна - ОЧЕНЬ ДОЛГО. Результат - на отлично.

ldsr-ldsr
ldsr-ldsr
ldsr внутри, ldsr снаружи. Сразу признан безоговорочно идеальным для этого случая. Тут нет безумной (и бездумной) детализация valar-valar, но есть очень мягая и приятная проработка природы, листочков, одежды, кроссовок, лица. Появился чёткий и красивый DOF, добавленные в последней ступени в промт light particles чудесно вписались. Общая теплота картинки и её импакт выросли на порядок. Лучшая связка. Кот бы сомневался. Главное, не перебарщивать с силой. Здесь использовался denoise 0.3 везде, однако даже с ним на промежуточных картинках можно увидеть артефакты, которые, впрочем, потом легко убираются.

Справочно: вариант "дешёво-сердито" из Extra, 4x увеличение через valar-valar
extra
Как пример, зачем вообще мучиться увеличивая в img2img.

Финал после обработки:
final

Личные ощущения2: с ними спустя 4 месяца и сменой стилистики на более "плоскую" - 2D случилась некоторая переоценка. Теперь рабочий процесс выглядит примерно так: первоначальный апскейл проводится в х1.5 в img2img просто повышением разрешение (без скрипта) с небольшим денойсом (~0.3) для сохранения "когерентности" изображения. Далее делается апскейл 1-2 раза с помощью 4x-AnimeSharp с аналогичными настройка (~0.3 денойс, увеличение х1.5). Для 2D-шной стилистики на взгляд автора такие настройки дают более приятный результат: гладкие чёткие линии и хорошую детализацию неслучайными элементами.

Пример апскейла изображения таким способом:
final

*Личные ощущения3: появились новые инструменты вроде ControlNet и Tiled Duffusion. Подробное описание варианта апскейла с помощью них - https://rentry.org/UpscaleByControl

Пример апскейла изображения с такой техникой:
byControlNet

Отдельно пример апскейла очень старой картинки сделанной на очень старой модели:

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

That all, folks.

Версии

15.07.23 v1.55
Добавлен пример апскейла старого изображения через ControlNet, как пример устаревания текущего гайда.
08.07.23 v1.54
Добавлена ссылка на подробное описание одного из способов апскейла с помощью ControlNet
03.04.23 v1.53
Кратое упоминание ситуаций апскейла с лорами или controlnet;
Абзац про некратное увеличение х1.5 и апскейлер 4x-AnimeSharp.
21.03.23 v1.52
Добавлена в рекомендуемые модель глубин dpt_beit_large_512 (midas 3.1).
16.02.23 v1.51
Убран remacri, как устаревший;
Добавлено описания раздельного повышения разрешения через Extras и потом отдельно последующей детализации.
02.02.23 v1.5
Форматирование, формулировки, примеры;
Ссылка на дополняющий гайд.
29.12.22 v1.4
Добавлено предупреждение о необходимом опыте в Автоматике;
Причесан стиль и формулировки.
25.12.22 v1.32
Добавлены "спидраны" для тех, кто очень торопится;
Отредактирован п.6, добавлен в рекомендованные сэмплеры DPM++ 2M Karas;
Отредактирован п.8, уточнен порядок выбора размера в настройках (не является размерами итогового файла), позволяющий ускорить апскейл до 2(!) раз по-сравнению с настройками по-умолчанию;
заменён пример двойного LDSR;
перенесены версии.

18.12.22 v1.31
Отредактирован п.13, добавлено описание локального получения карты глубин.
15.12.22 v1.3
Отредактирован п.10 в связи с добавление сравнения пар разных апскейлеров.
13.12.22 v1.2
Переписаны:
п.5, убрано спорное понижение разрешения;
п.8-13, с учетом нового разрешения;
добавлено сравнение скейлеров.

12.12.22 v1.1
Добавлен п.0 про сохранение в png
Добавлен абзац в п.5 про самый первый скейлинг и возможность остаться в разрешении 1404х768;
Добавлена инфа про другие апскейлеры в п.8;
Исправлен п.10 про лишние шаги, убраны;
Добавлен очень простой вариант в самом конце (не идеальный).

11.12.22 v1.0

Edit
Pub: 09 Dec 2022 20:10 UTC
Edit: 15 Jul 2023 13:47 UTC
Views: 22726