Математика заключает в себе не только истину, но и высочайшую красоту – красоту холодную и строгую, подобную красоте скульптуры.

Бертран Рассел

Кто интересуется темой рисующих нейросетей знают, что сейчас самый продвинутый и часто используемый интерфейс для Stable Diffusion (далее SD) это Automatic1111. Он позволяет использовать, вероятно, все существующие возможности SD на сегодня. Множество расширений, регулярные обновления и поддержка сообщества делают его мощным и удобным инструментом для генерации изображений. Но есть и альтернативные решения, одно из которых я сегодня рассмотрю.

Несмотря на то, что ComfyUI решает те же задачи, что и A1111, он обладает важными преимуществами и особенностями, которые делают его более гибким и универсальным (но в тоже время более сложным для освоения) инструментом, чем A1111. 

Основной такой особенностью является нодовое (узловое) представление компонентов, с которыми работает SD:

Некоторые ноды ComfyUI
Некоторые ноды ComfyUI

У такого решения есть как минимум два преимущества:

  • позволяет создавать сложные, мульти итеративные конфигурации и даже автоматизации процесса создания изображений;

  • помогает лучше понять, что происходит “под капотом” SD и как следствие лучше управлять этими процессами, повышая предсказуемость результата и его условное качество. 

В этой статье я расскажу как этим интерфейсом пользоваться, какие нам доступны ноды и что интересного можно сделать. Не буду рассказывать, как установить интерфейс – это несложно (в конце дам все нужные ссылки).

Начать стоит с этой маленькой и очевидной по функционалу панельки:

Помимо того что она запускает генерацию (queue prompt), в ней можно установить количество генераций подряд (extra options), посмотреть результаты предыдущих генераций (view history), а также загрузить пример простейшей схемы нод (load default), которые здесь называются “воркфлоу”. Рассмотрим эту схему:

Стандартный воркфлоу
Стандартный воркфлоу

Уже сейчас вы можете сгенерировать изображение, но при нажатии на queue prompt, скорее всего получите ошибку:

Это значит, что у вас нет модели, которая установлена в этом воркфлоу по умолчанию. Нам подойдет любая, например, стандартная 1.5. Модели складываются в папку: ComfyUI_windows_portable\ComfyUI\models\checkpoints

После этого у нас есть повод познакомиться с первой ключевой нодой:

Функционал у нее простой: она загружает модель, которую мы будем использовать. Про некоторые интересные модели я писал в одной из статей. У ноды есть одно поле, которое ссылается на модель, и три выхода. 

Следующая важная нода:

Это поле для ввода промпта. В любом воркфлоу используется минимум две таких ноды: одна для промпта, другая для негативного промпта. Кто генерит, уже знает, что “промптом” называется подсказка, по которой нейросеть будет генерировать изображение. Тут можно использовать похожий на A1111 синтаксис промптов (например (word:1.3)), для управления влиянием тех или иных слов, но работает он несколько иначе, поэтому будьте готовы столкнуться с некоторыми проблемами. Если вы про синтаксис ничего не знаете, просто пишите слова, и все будет работать. На вход обязательно нужно подать CLIP из предыдущей ноды, а выход пойдет в следующую:

Это нода, в которой происходят все настройки генерации. Если вы пользовались А1111, то все параметры будут вам знакомы, и уже сейчас вы начинаете понимать, как все устроено. Если же с SD вы раньше не сталкивались, то оставьте все по умолчанию и поищите гайд по параметрам генерации, сейчас их очень много. 

На вход мы подаем: 

  • модель;

  • промпт;

  • негативный промпт;

  • изображение в латентном пространстве.

 Для последнего нам понадобится следующая нода:

SD генерирует изображения в латентном пространстве и только потом преобразует их в пиксельное пространство. Это довольно важная концепция, понимание которой позволит строить собственные воркфлоу и гибко управлять выходящими изображениями. Данная нода создает “пустое” (буквально 0) изображение в латентном пространстве, указанного в полях размера. Поле batch size, позволяет за один проход генерировать сразу несколько изображений, но это потребует больше времени и памяти вашего GPU. 

Возвращаемся к семплеру: получив все нужные входы, он создает наше изображение в латентном пространстве. Чтобы увидеть получившийся результат, нужно перевести его в пространство пикселей – декодировать. Для этого используются Variational Autoencoder (или коротко VAE) и нода:

В каждой модели содержится свой VAE, поэтому на вход надо подать VAE из модели. Но мы также можем загрузить отдельный (например популярный vae-ft-mse-840000-ema-pruned) с помощью ноды Load VAE. 

Почти готово – после декодирования остается только визуализировать, получившееся изображение – используем последнюю ноду в этом воркфлоу:

Она просто сохраняет изображение в папку ComfyUI_windows_portable\ComfyUI\output и показывает нам получившийся результат. Есть аналогичная нода, которая показывает результат, но не сохраняет его – Preview Image (зачем она нужна расскажу позже).

Итак, зная как работает наш дефолтный воркфлоу, мы можем начать экспериментировать и вносить изменения. 

Разберемся как искать нужные ноды. Правый клик в пустом пространстве вызывает меню выбора нод.

Все ноды поделены по категориям – покажу их все и расскажу в общем о содержании и ключевых нодах.

Первая категория Sampling

Категория, в которой хранятся самые главные генерирующие изображения ноды. Со стандартным семплером вы уже знакомы, продвинутый отличается главным образом тем, что может генерировать изображение не с первого шага.

Следующая категория Loaders

Ноды из этой категории загружают разные модели. Из регулярно используемого тут уже знакомый нам Load Checkpoint, а также ноды: 

  • Load loRA – получить схожесть с конкретным персонажем, или объектом; 

  • Load ControlNet Model – управлять позой; 

  • Load Upscale Model – увеличить разрешение получившегося изображения. 

С  их функционалом вы знакомы, если пользовались А1111. 

Следующая категория Conditioning

Это ноды, позволяющие взаимодействовать с промптами. Из интересного:

  • Apply Control Net –  применить модель Control Net; 

  • Conditioning (Combine) -  смешать две ноды с промптом и использовать их усредненные значения; 

  • Conditioning (Set Area) - задать область на изображении, к которой будет применяться промпт. 

Категория Latent

Тут размещены ноды, которыми можно влиять на изображения в латентном пространстве, а также декодировать их в пиксельное или наоборот из пиксельного в латентное. Из важного: 

  • VAE Encode – перевести обычное изображение в латентное пространство; 

  • Latent Composit – смешать два латентных изображений полученных из двух семплеров; 

  • Upscale Latent – изменить размер изображения в латентном пространстве.

Категория Image

Ноды для работы с изображениями в пространстве пикселей. Многие будут знакомы тем, кто работал с редакторами растровых изображений. Тут расположены упоминавшиеся уже Save Image и Preview Image, а также: 

  • Load Image – нода для загрузки изображений с жесткого диска;

  • Upscale Image (Using model) – для увеличения размера итогового изображения с помощью модели.

Оставшиеся три категории вряд ли понадобятся вам на начальном этапе. 

Теперь если вы внимательно читали статью и пользовались А1111, у вас в голове должны были возникнуть ряд идей и вопросов и варианты их решения. Для тех же, кто еще не собрался с мыслями, я покажу несколько интересных воркфлоу.

Пример первый - Img2img

Добавим три ноды:

  • Load Image – мы загрузим изображение, которое будем преобразовывать;

  • VAE Encode –  переведёт изображение в латентное пространство;

  • Load VAE – загрузит альтернативный Variational Autoencoder, которым мы будем кодировать и декодировать изображения.

Теперь размер будет браться из загруженного изображение, поэтому не стоит загружать изображения больших размеров. Регулировать силу воздействия семплера на изображение можно с помощью параметра denoise (чем меньше, тем слабее воздействие).

Пример второй - Двойное семплирование

Добавим к стандартному воркфлоу ноды: 

Как видно мы просто скопировали ноды семплера и декодера. Теперь из первого семплера мы будем передавать данные не только в декодер, но и во второй семплер, в котором немного изменим настройки: denoise на 0.5 и steps на 30. Save image от первого сэмплера можно заменить на Preview image, так как он нам нужен только для сравнения результатов:

Как видно на изображении слева детализация выше, само изображение более четкое и реалистичное. И это происходит не только потому что во втором семплере больше шагов, но и потому что за входные данные берется уже сгенерированное первым семплером изображение. С помощью такого метода можно поправлять деформированные зрачки, артефакты на лице, неправильно рисующаяся уши или губы, увеличивать общую детализацию изображения.

Пример третий - комбинированное изображение

Теперь сделаем то, что не получится сделать в других интерфейсах – смешаем три модели в одной картинке! Для этого соберем следующий воркфлоу:

На первый взгляд довольно запутанно, но на самом деле все, что тут происходит тривиально: два семплера с разными моделями генерят два разных изображения. Затем нода Latent Composit смешивает их выставляет одно изображение поверх другого в определенной позиции (x0, y0 это левый верхний угол, feather - бленд-размытие между картинками). Потом получившееся изображение уходит в третий семплер с третьей моделью, который генерирует финальное изображение. 

Подводя итог: ComfyUI - уникальный и очень интересный инструмент, который добавляет много творчества и креатива в процесс генерации изображений. Я бы назвал это “процедурное рисование”, по аналогии с “процедурным моделированием”. С момента моего знакомства с рисующими нейросетями прошло чуть больше полугода, но кажется сменилась целая эпоха. В конце своей первой статьи я попробовал порассуждать, что нас ждет в ближайшие год-два – оказалось, что почти все случилось за какие-то 6 месяцев. Думаю, ближайшее будущее за подобными решениями. Как минимум в среде профессионалов, занимающихся созданием 2d контента.

Если у вас возникли вопросы касательно ComfyUI, пишите их в комментариях. Если будет достаточный интерес к теме, то я напишу вторую часть с подробным разбором каждой ноды.

Ссылки к статье:

Github интерфейса ComfyUI
Интерактивный обучение в виде визуальной новеллы (англ.)
Сайт со множеством моделей для SD 


Другие мои статьи:

Нейросеть рисует за меня?
Давайте запретим нейронные сети
Илон Маск кисти Ван Гога, или специализированные модели Stable Diffusion
Нейросети убьют 2d художников


Телеграм канал в котором я выкладываю интересные результаты генераций

Комментарии (14)


  1. rPman
    19.04.2023 04:22
    +4

    О!
    А теперь то же самое, но для кодогенерации, принципы те же но возможности наверное будут огого.


  1. shaytan
    19.04.2023 04:22
    +1

    Следует учитывать, что в CUI и а1111 по разному рассчитываются веса промптов. Это значит, что нет возможности обмениваться между ними промптами без доработок. Результаты, скорее всего, будут разные.

    https://github.com/comfyanonymous/ComfyUI/discussions/521

    Нет обработки конструкций типа [x::4] или [x:4] в промпте. Можно реализовать с адвансед Ксемплерами, но конструкция получатся монстроузная.

    https://github.com/comfyanonymous/ComfyUI/discussions/493


    1. Gorislav Автор
      19.04.2023 04:22
      +1

      Уже есть кастом нода которая решат проблему весов предлагая реализацию как в А1111. Но все равно одинаковые результаты получить не выйдет, так как сиды в ComfyUI генерируются на CPU


  1. shaytan
    19.04.2023 04:22
    +1

    При построении цепочек в ксемпоерах можно конвертировать сиды в инпут и соединить все с одним примитивом. Это заставит все семплеры стремиться к одному результату (при одинаковых промптах и семплерах)


    1. Gorislav Автор
      19.04.2023 04:22

      Если вы о двойном семплировании, то да, так можно сделать. Но чаще результат получается лучше если сиды разные.


  1. devzona
    19.04.2023 04:22
    +2

    Очень интересно. По сути, дизайнер переквалифицируется в аналог программиста ЧПУ. Раньше для вытачивания детали необходимо было карпеть над станком и долго вытачивать деталь вручную. Затем слесари были заменены ЧПУ станком, где специалист закладывает логику обработки детали, а станок сам без его непосредственного участия обрабатывает деталь. Теперь пришла очеред дизайнеров. Дизайнер обрабатывает не саму картинку, а закладывает в ComfyUI программу логики обработки изображения. Таким образом, мы говорим не про уничтожение профессии дизайнера, а о переквалификации из простого примитивного слесаря в программиста логики обработки изображения. Очень нужный материал, жду продолжения!


    1. Gorislav Автор
      19.04.2023 04:22

      Спасибо, интересное сравнение!


    1. yaarche
      19.04.2023 04:22

      Забавно, что по прошествии стольких лет люди так и не поняли смысла профессии дизайнера. Спросите нейросеть, она вам даст определение, ну или вики.


  1. eatsugar
    19.04.2023 04:22

    Возможно я очень далек от понимания современных инструментов по генерации изображений с помощью нейросетей и мой вопрос слишком очевиден. Тем не менее, каким наиболее простым способом (набором инструментов) можно огранизовать следующий рабочий процесс:

    1. Обучить нейросеть нужному стилю рисования используя набор имеющихся изображений в количестве нескольких сотен.

    2. Сгенерировать изображение по текстовому описанию и/или по другой картинке на прозрачном фоне для использования в виде асета.

    3. Пункт не обязательный, больше экспериментальный. Можно ли сгенерировать изображение с послойной структурой. Чтобы на выходе было: файл с поддержкой слоев, а внутри каждая значимая часть объекта на отдельном слое, чтобы была возможность костной анимации в случае необходимости.

    Спасибо


    1. Gorislav Автор
      19.04.2023 04:22

      1. Есть несколько способов, самые эффективные это дообучить модель, натренировав checkpoint (ищите по запросу Dreamdooth) или натренировать LoRA (модификатор параметров модели). Оба варианта не дадут точно снять "стиль", они скорее тренируются на условный образ объекта. Надо пробовать. Изображений для этого надо значительно меньше чем 100, достаточно приблизительно 20.

      2. Да, это можно сделать, в базовой сборке ComfyUI таких нод нет, но есть сторонние. Если вы владеете пайтоном, то можно написать вообще почти любой функционал по обработке изображений.

      3. Такого функционала я не видел, но возвращаясь к пункту 2 - пайтон разработчик хорошо понимающий как работать с изображениями сможет написать нужное решение.


      1. eatsugar
        19.04.2023 04:22

        А вы используете такие или подобные сценарии в игровых проектах? Или знаете о подобных сценариях в индустрии? Или на текущем этапе развития инструментов генерации усилия затраченные на приемлемый арт будут несравнимо больше усилий художника? При том что, как я понял, в сгенерированный арт практически невозможно вносить изменения.


        1. Gorislav Автор
          19.04.2023 04:22

          Применять можно уже сейчас, но это довольно ограниченный круг применимости. Под "ключ" можно делать иконки, оформление интерфейса, или концепты/иллюстрации персонажей не в полный рост. Если задаться целью, можно сделать и ассеты для 2д игры например. Это все реализуемо и скорее всего кем то уже внедряется. Править конечно придется все равно руками, так что пока это не отказ от 2д художников как специалистов, а скорее инструмент ускорения продакшена. Да и в будущем все равно нужны будут люди которые будут ставить правильную задачу нейросети и отбирать релевантные результаты.


    1. shaytan
      19.04.2023 04:22

      Про дообучение есть интересный ролик — https://www.youtube.com/watch?v=dVjMiJsuR5o

      Возможность сразу получить своё изображение на прозрачном фоне отсутствует. Есть эффективные способы вырезания вручную.

      Уже есть такая штука как latent couple, вроде. Там задача генерации изображения задаётся уже сразу послойно и потом изображения сливаются в одно. Сам не пробовал, но возможно, есть способ сохранения слоёв по отдельности.


  1. sadr0b0t
    19.04.2023 04:22

    реванш "проводного" программирования из эниака