Stable Diffusion XL. Генерируем картинки нейросетью на своем компьютере
Ты, наверное, уже наслышан о нейронке Stable Diffusion, рисующей картинки локально на твоем компьютере без всяких сервисов с платными токенами. Недавно вышла новая версия — SDXL, то есть «Extra Large». В этой статье мы с тобой установим ее и посмотрим, как она генерирует картинки.
ПРИСТУПАЕМ
Чтобы гонять SDXL локально, нам потребуется видеокарта относительно свежего поколения и хотя бы 6 Гбайт видеопамяти, также подойдет «мак» с чипом серии M. Однако я буду все делать в Windows на машине с картой Nvidia.
Установщик будет качать и ставить многочисленные модули общим объемом 10–15 Гбайт, так что предлагаю промотать статью вниз и сразу запустить процесс, чтобы все успело скачаться, пока ты читаешь статью.
Тебе понадобится Python версии 3.10, и никакой другой — в актуальной сборке Python 3.12 не работают некоторые нужные пакеты. Скачать его можешь с официального сайта.
Установив Python, скачай приложение Fooocus со страницы проекта на GitHub. Распакуй архив в папку, куда будет установлено приложение, и запусти установщик одной из команд:
Повторюсь, времени это займет много — проект использует сотню с небольшим пакетов, а для его работы понадобится скачать файл модели SDXL размером в 6,5 Гбайт. Пока это происходит, разберемся, что это за Fooocus такой и какое отношение он имеет к Stable Diffusion.
STABLE DIFFUSION XL В ОБЛАКЕ
Пока скачиваются необходимые для работы Fooocus файлы, Stable Diffusion XL можно опробовать быстро и совершенно бесплатно, воспользовавшись DreamStudio — официальным облачным сервисом, созданным в Stability AI.
Интерфейс простой: строка ввода, выбор соотношения сторон и количества генерируемых изображений. Система даже подставит случайный запрос — в моем случае это «a woman holding a gun stands in a desert 1800’s America Western town». Запрос не хуже других, будем и дальше отталкиваться от него.
Жму на кнопку, через несколько секунд изображения готовы. Их можно скачать «как есть», в разрешении 1024 на 1024, или воспользоваться умным алгоритмом повышения разрешения ESRGAN.
На первый взгляд картинки выглядят симпатично, приятная цветовая гамма в духе старых фотографий.
Однако сразу бросаются в глаза известные болячки нейросетей: лица и конечности. Лицо, кисти рук — извечная беда Stable Diffusion. И если с кистями рук все не так однозначно (слишком гибкие, слишком много возможных положений), то лица нейросеть должна генерировать идеально — но только если у нее достаточно пространства для работы.
Суть проблемы: изображения создаются в низком разрешении; в результате тех пикселей из полного разрешения в 1024 на 1024 точки, которые занимает небольшое на отдалении лицо, просто недостаточно, чтобы тщательно отрисовать объект. С этой бедой можно справиться, чем мы и займемся чуть позже, уже в локальной версии Stable Diffusion.
ЛОКАЛЬНЫЕ ДИСТРИБУТИВЫ STABLE DIFFUSION
Сама по себе Stable Diffusion работает через командную строку и требует определенных навыков для установки и использования. Делать это вручную нет никакой необходимости: в сети достаточно готовых сборок, где к нейросети прикручен локальный веб‑интерфейс (а иногда и не веб; есть сборки, в которых взаимодействие с сетью сделано в виде отдельного приложения, обычно для Windows). Новому пользователю разобраться во всех этих сборках и отличиях между ними непросто.
Пожалуй, самая популярная сборка для обладателей карт Nvidia — это Stable Diffusion web UI, она же — AUTOMATIC1111. Однако не так просто будет с нуля разобраться во всех параметрах генерации, а первые результаты, вероятно, не поразят качеством. Более того, сам процесс генерации на слабой видеокарте может оказаться настолько медленным, что ты можешь подумать, что вся эта возня не для тебя. Все это вполне решаемо, и AUTOMATIC1111 не зря самая популярная сборка. Тем не менее начинать работать со Stable Diffusion я рекомендую с чего‑то более простого, и Fooocus для этого подходит идеально.
Какие вообще бывают сборки?
Сборок Stable Diffusion множество, я упомяну только те, что меня заинтересовали больше других.
- Fooocus — идеальна для начинающих, сразу выдает картинки отличного качества, хорошо работает как на слабых, так и на мощных видеокартах. В то же время серьезно ограничивает пользователя.
- AUTOMATIC1111 — один из наиболее популярных проектов. Здесь есть огромные возможности для расширения через подключаемые модули. Но здесь довольно высокий порог вхождения. Как правило, если появляется какое‑нибудь новое интересное решение для Stable Diffusion, то в первую очередь оно оформляется в виде расширения для A1111.
- Форк AUTOMATIC1111 за авторством vladmandic — тут еще более широкие возможности, но и еще более высокий порог вхождения по сравнению с оригиналом. Многие полезные расширения, которые в A1111 нужно искать и устанавливать самостоятельно, уже входят в сборку, но мне удалось добиться стабильной работы лишь с третьей попытки.
Три перечисленные выше сборки используют унифицированный синтаксис для составления запросов. Это полезно, например, для того, чтобы просто скопировать запрос с сайта Civitai.
- InvokeAI — еще один интересный продукт. Синтаксис отличается, а пользовательский интерфейс отличается очень сильно.
- ComfyUI — проект с уникальным интерфейсом, название которого, впрочем, не должно тебя обмануть: ничего особенно комфортного тут нет. Чтобы сгенерировать картинку, нужно создавать узлы и соединять их стрелочками, как это делалось в стародавние времена на блок‑схемах, которые изучались на уроках информатики.
- nod.ai SHARK — проект, оптимизированный для карт AMD. Другие проекты могут работать с картами AMD, но у SHARK это получается намного лучше.
ПЕРВЫЙ ЗАПУСК
Когда установка Fooocus завершится, можно запускать. В зависимости от того, какой файл ты запустишь, программа использует предустановленные настройки для генерации изображений одного из перечисленных типов. При первом запуске соответствующего файла нужная модель (размером 6,5 Гбайт) будет скачана автоматически. В браузере откроется пустое окно с полем ввода и большой кнопкой Generate.
a woman holding a gun stands in a desert 1800's America Western town
Через несколько секунд получаем пару изображений.
Выберем одно из сгенерированных изображений. Вот оно в оригинальном разрешении.
С руками все плохо, лицо... попробуем улучшить. Функции постобработки откроются, если поставить галочку Input Image. Для начала увеличим разрешение картинки: достаточно просто перетащить только что сгенерированную картинку вниз, на область, помеченную надписью Drag above image to here.
Нас интересует вариант удвоения разрешения. После того как функция отработает, получим такую картинку.
Обрати внимание, что в увеличенном изображении буквально из ниоткуда взялись дополнительные мелкие детали. Если приглядеться, станет заметно, что при сохранении общей композиции исходное и увеличенное изображения отличаются в деталях. Именно так работают умные алгоритмы увеличения разрешения; для генерации увеличенного изображения используются модели и алгоритмы, подобные тем, которые применялись для генерации исходной картинки. Степень вариативности в Fooocus ты контролировать не можешь (но это возможно в AUTOMATIC1111).
Термины
Inpaint — добавление, изменение или удаление объектов внутри картинки без изменения ее размеров или разрешения.
Outpaint — изменение размеров или соотношения сторон картинки; «дорисовывание» по краям изображения. Недостающие области будут дорисованы при помощи исходной модели и введенного изначально запроса. В идеале такая «расширенная» картинка будет состыкована с оригиналом совершенно бесшовно.
На картинке удвоенного разрешения лицо уже почти как настоящее. Попробуем еще улучшить его встроенной в Fooocus функцией Inpaint. Для этого только что увеличенную картинку нужно перетащить в область Inpaint or Outpaint, после чего кисточкой выбрать лицо.
Опционально можно добавить дополнительные ключевые слова в поле Inpaint additional prompt. Например, highly detailed face (но можно и что‑то другое, например чтобы изменить цвет глаз или еще какие‑то черты). Жмем Generate.
Лучше вышло или хуже по сравнению с оригиналом — вопрос спорный, но уж точно выросла детализация, а черты лица стали более правильными. На примере другой картинки можно пронаблюдать за процессом в деталях.
Теперь проделаем то же самое с руками.
Если кисти рук находятся на заметном расстоянии друг от друга, то их лучше выбирать и обрабатывать по отдельности. В противном случае область для перерисовки выйдет слишком большой и ощутимого результата мы не получим. В нашем примере кисти рук рядом, поэтому их можно обработать в один проход.
В итоге получается такая картинка.
КАК СОСТАВИТЬ ЗАПРОС
О составлении запросов к нейросети мы поговорим подробнее в следующих статьях. В Fooocus поддерживается стандартный синтаксис приоритетов, совместимый с AUTOMATIC1111. В частности, оборачивание слова из запроса в одинарные скобки увеличивает его весовой коэффициент в 1,1 раза; если обернуть в двойные, то в 1,2 раза. Дальнейшее изменение весов задается, например, так: (token:1.3)
.
Однако вручную задавать веса нет необходимости, достаточно выделить ключевое слово (или несколько слов, разделенных запятыми) и нажать Ctrl-вверх для повышения веса или Ctrl-вниз для понижения.
Stable Diffusion обрабатывает запросы пачками по 75 токенов, причем наибольший вес имеют токены в начале пакета. Если используется длинный запрос или расширение в виде стиля, то система может разбить его на несколько пачек в совершенно неожиданном для тебя месте, и повышенный вес незаслуженно получит какой‑нибудь незначительный модификатор. О том, как с этим бороться, я расскажу в одной из следующих статей, когда будем разбираться с AUTOMATIC1111 (в Fooocus таких возможностей все равно пока нет).
Наконец, важный момент: Fooocus по умолчанию использует локальное GPT-подобное расширение запросов, чтобы получить более красивое изображение (это можно отключить в расширенных настройках, сняв галочку со стиля Fooocus V2). Посмотреть, какой именно запрос был направлен на генерацию, можно в файле log.html
(он создается в выходной папке; его можно также открыть из вкладки Advanced → History Log).
Вот, например, как в реальности выглядел наш запрос:
Original Prompt: a woman holding a gun stands in a desert 1800's America Western townNegative Prompt: unrealistic, saturated, high contrast, big nose, painting, drawing, sketch, cartoon, anime, manga, render, CG, 3d, watermark, signature, labelFooocus V2 Expansion: a woman holding a gun stands in a desert 1800's America Western town, highly detailed, magic mystical, dramatic light, cinematic, intricate, beautiful, sharp focus, extremely professional composition, elegant, very inspirational, special color, stunning, excellent, winning, modern, artistic, perfect, new classic, best, creative, positive, cute, spiritual, vibrant, iconic, rationalStyles: ['Fooocus V2', 'Fooocus Photograph', 'Fooocus Negative']
Нейросети ушел запрос Fooocus V2 Expansion с негативными ключевыми словами из Negative Prompt. А следующая за ней картинка была уже с другим запросом:
Fooocus V2 Expansion: a woman holding a gun stands in a desert 1800's America Western town, still, cinematic, dramatic ambient, intricate detailed, sharp focus, elegant, highly detail, polished, extremely scientific, magical, mystical, historic royal, full color, artistic, deep aesthetic, very inspirational, original, holy, scenic, fascinating, epic, great creative, thought, fancy, iconic
Таким образом, с настройками по умолчанию Fooocus самостоятельно модифицирует твои запросы по алгоритму, похожему на тот, что используется в коммерческих онлайновых нейросетях. Если тебя не устраивает такое поведение, то можно отключить стиль Fooocus V2 из вкладки Advanced → Styles.
ПРОДВИНУТЫЕ ВОЗМОЖНОСТИ
В Fooocus есть и дополнительные возможности, доступные, если отметить галочку Advanced.
На вкладке Settings можно выбрать желаемое соотношение сторон и разрешение (впрочем, есть рекомендованный разработчиками Stable Diffusion набор).
- Speed — это количество итераций алгоритма. Чем больше шагов, тем более детальным может получиться изображение.
- Image Number — число генерируемых в пакете вариантов изображения. По умолчанию генерируется две картинки, можно задать от 1 до 32.
- Negative Prompt — уже заполненное поле с отрицательными ключевыми словами. Обрати внимание, что Fooocus уже заполняет это поле за тебя. Не зайдя на вкладку Advanced, ты об этом, скорее всего, и не узнал бы.
Как использовать негативные ключевые слова?
Ценность негативных ключевиков несомненна, но их очень часто понимают и используют неправильно, без нужды засоряя запрос словами вроде bad hands, bad anatomy, ugly, deformed. Stable Diffusion совершенно не интересно специально создавать bad hands и bad anatomy, и их перечисление в списке ключевых слов в большинстве моделей бесполезно: все подобные вхождения давно имеют отрицательный вес в самой модели. Да, их упоминание может (случайно) избавить от проблемы в конкретном изображении — но, во‑первых, та же проблема может возникнуть вновь в других картинках, а во‑вторых, такого же случайного эффекта можно добиться небольшим изменением любого другого параметра.
Негативные ключевые слова стоит использовать, в точности понимая зачем. Один случай — когда нужно дополнительно усилить заданный в основном запросе стиль (например, при фотореалистичном запросе заблокировать anime, cg, render). Другой — когда нужно убрать какую‑то конкретную деталь или объект, который в противном случае будет присутствовать в изображении. Простой пример: при использовании стиля Midjourney в картинках возникает избыток бирюзового цвета; его можно легко убрать, добавив слово teal в негативный запрос.
В то же время отрицательные слова, несомненно, влияют на финальное изображение, особенно когда их много или они «сильные». Увлекшись ими, можно как добиться идеального результата, так и получить картину «черный квадрат» или совершенно деформированное, «рыхлое» изображение, созданное из остатков того, что не попало под негативные ключевые слова.
Наконец, под полем Negative Prompt притаилась малозаметная галочка с подписью Random. По умолчанию она выбрана. Если ее снять, появится возможность выбрать не случайный, а фиксированный сид (seed). Это может понадобиться в двух случаях: если ты хочешь в точности воссоздать ранее сгенерированное изображение (его сид всегда доступен в файле log.htm
) и если ты хочешь изучить, как повлияет на финальную картинку изменение текстового запроса (в этом случае не забудь отключить стиль Fooocus V2: этот стиль динамический, он будет меняться от запроса к запросу). По окончании экспериментов не забудь вернуть сид в случайное значение.
На этом пока закончим рассмотрение расширенных возможностей Fooocus, но поговорить еще есть о чем, так что продолжение следует.
НЕДОСТАТКИ FOOOCUS
Один из основных недостатков Fooocus — единственный алгоритм повышения разрешения (upscaling), который к тому же нужно использовать вручную.
До определенного момента изображения как бы не существует; весь процесс «дистилляции» происходит в латентном пространстве. «Вытащить» оттуда изображение означает перевести его из латентного пространства в пространство пикселей. Как только изображение «вытащили» в пространство пикселей, новых деталей в нем уже не появится: их можно только «додумать», основываясь на том, что уже есть, — самом изображении, текстовом запросе и модели.
На этом принципе основаны все «интеллектуальные» системы повышения разрешения — такие как мощный инструмент chaiNNer или ориентированный на рисованные изображения (и даже анимации!) Waifu2x Extension GUI. На этом же принципе работает апскейлер в Fooocus: уже готовое пиксельное изображение загружается в постпроцессор (img2img), в котором и происходят последующие манипуляции.
Есть и другой подход — повышение разрешения в латентном пространстве, еще до того, как изображение будет переведено в пиксели. При этом подходе дополнительные детали не возникают из ничего: их создает всё та же модель, которая выдала изначальное изображение. Очевидно, что так сделать можно только во время генерации, но не после нее — с уже готовой картинкой.
Пока что отметим: в Fooocus такой опции нет. А где есть? В других, более сложных продуктах — например, в AUTOMATIC1111, в котором доступен выбор из множества моделей повышения разрешения от стандартных до латентных включительно.
Далее — процесс «исправления» лиц и конечностей, который в Fooocus требует ручного вмешательства и использует пусть и очень хорошую, но внешнюю модель. В AUTOMATIC1111 можно делать это автоматически — и намного лучше: специализированное расширение автоматически распознает в кадре лица (а если нужно, то и конечности) и заставит систему в максимальном доступном разрешении заново сгенерировать тайл, в котором находится лицо, используя ту же модель и тот же запрос, что и в основной генерации. После этого исправленный тайл бесшовно встраивается в основную картинку. Преимущества такого подхода не только в автоматизации процесса, но и в более высоком качестве результата.
В Fooocus практически нет возможностей расширения. Наконец, не всем подойдет рабочий процесс, ориентированный на создание нескольких «черновиков» на первом шаге и последующую ручную «доработку напильником» одного‑двух понравившихся вариантов.
ДОСТОИНСТВА
С другой стороны, Fooocus исключительно прост в использовании, а его система расширения запроса офлайновым GPT-подобным алгоритмом (стиль Fooocus V2) уникальна среди подобных проектов и вполне способна создать конкуренцию Midjourney.
Fooocus идеален в своей нише: это простой инструмент, прекрасно подходящий для начального обучения Stable Diffusion, позволяющий в один клик создавать шедевры и обладающий вполне достаточными для многих и многих пользователей возможностями настройки. Он прекрасно оптимизирован (по крайней мере, для карт Nvidia) и не требует ухищрений для стабильной работы даже на слабых видеокартах.
А вот когда ты уже понял, чем основная модель отличается от рефайнера, для чего нужны LoRA и чем они отличаются от стилей, что такое seed и на что влияет параметр CFG, — тогда можно запустить AUTOMATIC1111 и не потеряться в обилии параметров.
Как дела с законностью?
Для личного использования ты можешь создавать любые картинки, не нарушающие законов страны, в которой ты находишься. А вот с публичным использованием созданных изображений дела обстоят чуть сложнее. Твои права ограничиваются лицензиями всех продуктов и моделей, которые были использованы в процессе.
Лицензия самого Stable Diffusion дает тебе довольно широкие права, как и лицензии многих сборок. У Fooocus и AUTOMATIC1111 лицензия GPL 3.0, у других продуктов нужно смотреть отдельно. У большинства моделей SDXL с Civitai — лицензия CreativeML Open RAIL++-M, которая также дает достаточно широкие возможности. У некоторых моделей лицензии более жесткие, так что нужно проверять.
В то же время судебный процесс против разработчиков ряда нейросетей набирает обороты. Напомню, что около года назад художники подали иск против разработчиков нейросетей, обвинив тех в незаконном использовании их творчества для обучения моделей.
Гарантированно лицензионно чистые изображения своим пользователям предлагают создавать все крупные фотобанки, обучившие генеративные модели на изображениях, на которые у них точно есть необходимые права. Shutterstock заявляет, что фотографам за использование их изображений будет выплачиваться компенсация. С аналогичным предложением вышла на рынок и Getty Images.
ПРОДОЛЖЕНИЕ СЛЕДУЕТ
Когда я начинал статью о программе, которая устанавливается и запускается командой run.bat
, имеет одно поле ввода и кнопку Generate, мне представлялась, что текст вряд ли будет длинным. Но, как это часто бывает, текст быстро вышел из‑под контроля. Тема генеративного искусственного интеллекта чрезвычайно обширна, и рассказать в единственной статье обо всем, о чем хотелось, мне не удалось.
В запланированном продолжении я собираюсь написать о том, какие бывают базовые модели, где их брать и на какие обратить внимание в первую очередь; о том, для чего нужны рефайнер (refiner) и LoRA и как их использовать; как работают стили и чем они отличаются от LoRA; наконец, о том, на что влияют параметры Guidance Scale (он же — CFG value) и Image Sharpness (это не о контурной резкости). Кто знает, возможно, в будущем я напишу о разнице между оранжевой кошкой, кошкой и апельсином, кошкопельсином и кошкой‑апельсином. Не пропусти!