Основи роботи з ComfyUI: покроковий гайд для художників та CG-спеціалістів

Привіт! Мене звати Володимир Старушко, я AI Art Engineer у Plarium. Працював у компанії як 2D Artist, потім як Lead 3D Artist, а останні два роки займаюся впровадженням ШІ в артпроцеси.

У цьому матеріалі розповім про ComfyUI — ШІ-інструмент для генерації зображень, що працює на основі Stable Diffusion. Також покроково покажу, як створити в цій програмі власний арт: від завантаження моделі та написання промптів до налаштування KSampler і розширення можливостей за допомогою доповнень LoRA та ControlNet.

Ми розпочнемо з базового рівня, але саме це потім дасть вам змогу будувати складніший workflow.

Чому саме ComfyUI

ComfyUI — це редактор на базі нод, побудованих на Python, що виконують певні функції. З’єднуючи кілька нод, ви будуєте workflow, який генерує зображення.

Наші арткоманди тестують і використовують чимало ШІ-сервісів, але ComfyUI має кілька переваг.

  1. Прозорість. Можна побачити весь процес генерації зображення, легко відредагувати будь-який крок, а також одразу зрозуміти, як це впливає на результат.
  2. Гнучкість і кастомізація. Workflow адаптується під конкретний проєкт, сетинг чи стиль. Оскільки ComfyUI є системою open source, ноди для неї створює спільнота з усього світу, тому можна реалізувати практично будь-яке завдання, зокрема підключити платні моделі для генерації відео.
  3. Масштабованість. ComfyUI розгортається й на сервері, завдяки чому десятки художників здатні системно працювати з єдиним налаштованим середовищем.

Інтерфейс ComfyUI

У Plarium ми працюємо з ComfyUI через внутрішню систему ArtMaker. Це наш власний інструмент для ШІ-генерації зображень, побудований на базі ComfyUI. Він інстальований на спільному сервері, тому арткоманди користуються одним налаштованим середовищем, не встановлюючи нічого локально та не турбуючись про ліцензійні обмеження моделей.

Як установити ComfyUI

Завантажити ComfyUI можна як portable-версію з GitHub або через звичайний інсталятор.

Одразу після завантаження редактор буде порожнім. Щоб програма запрацювала, вам потрібні моделі, завдяки яким генеруються зображення. Про те, як їх додавати, я розкажу в наступному розділі.

Як створити базовий workflow у ComfyUI та згенерувати зображення

За генерацію відповідає нода KSampler. У ній зібрані налаштування, що вказують системі, скільки робити проходів, які семпли використовувати, з яким впливом промпту робити генерацію тощо.

У KSampler є чотири входи (model, positive, negative, latent_image), які нам потрібно заповнити.

1. У вхід model завантажуємо базову модель, наприклад із ноди Load Checkpoint

Нода Load Checkpoint має три виходи:

  • MODEL— керує тим, як саме генерується зображення;
  • CLIP — розшифровує текстовий промпт;
  • VAE — перетворює латентне зображення на звичайне й навпаки.

Можна сказати, що це три окремі компоненти (моделі), запаковані в один файл.

Яку модель вибрати

Є декілька основних видів моделей.

  • Stable Diffusion 1.0–1.5 — досі активно використовуються, хоча й натреновані на зображеннях 512 × 512 px.

Порада. Під час генерування 1024 × 1024 px з нуля в базовому KSampler модель майже завжди створює артефакти дублювання (дві голови, зайві кінцівки). Щоб отримати якісне зображення в роздільності 1024 px в SD 1.5, обов’язково потрібен Hires Fix або Hi-Res Upscale workflow.

  • SDXL — наступне покоління, натреноване на 1024×1024 px. Модель працює з роздільністю до ~2000 px.
  • Flux — сучасніша версія, що перетворює текстові описи на високоякісні зображення, краще розуміє промпти, має високий рівень деталізації та реалістичності.
  • Pony — SDXL-модель, донавчена на великому масиві аніме- та мультяшних зображень.

Ми розбиратимемо workflow для простіших моделей SD 1.5, SDXL. Для Flux назви та кількість нод трохи відрізнятимуться. Це доволі важка модель, що займає багато пам’яті, тож звертайте увагу на вимоги, чи потягне її ваш комп’ютер.

Найпопулярніший ресурс, де можна знайти й порівняти моделі, — civitai.com.
На сайті є приклади генерацій, рекомендовані налаштування й фільтри.

Порада. Вибирати модель варто не за назвою, а за тим, під що вона навчена: одні дають реалістичніші версії, інші — більш стилізовану чи анімовану картинку, треті краще працюють з оточенням. Модель не домалює те, чого не знає.

Наприклад, ви хочете згенерувати спартанця, але вам потрібен ракурс ззаду. Якщо модель не навчена на різних видах спартанських шоломів, вона спробує використати те, що в неї вже є, і результат не буде влучним. Якщо не вдається отримати потрібний результат з однією моделлю, спробуйте іншу.

2. Додаємо ноди позитивного та негативного промптів

Для цього на робочому просторі відкриваємо дві ноди CLIP Text Encode, які перетворюють текстовий промпт на токени (condition). Це формат, зрозумілий моделі. Сюди ми вводимо:

  • позитивний промпт — те, що хочемо обовʼязково бачити в зображенні;
  • негативний — те, чого хочемо уникнути.

3. Додаємо ноду Empty Latent Image

Latent space — це стиснутий у десятки разів внутрішній простір, у якому модель опрацьовує не повне зображення, а його компактне представлення, що значно пришвидшує генерацію.

Додатково з’єднуємо ноди. Раніше я зазначав, що Load Checkpoint має три частини. CLIP потрібно зʼєднати з відповідними значеннями в нодах CLIP Text Encode, щоб модель могла правильно зчитати текстові промпти.

4. Декодуємо результат

За замовчуванням KSampler створює латентне зображення. Його потрібно декодувати у звичайне растрове, що й робить нода VAE Decode. Спочатку додаємо її, а далі підключаємо ноду Preview Image, щоб одразу бачити результат генерації.

Фінально поєднуємо ноду VAE, що відповідає за модель (Load Checkpoint), із нодою VAE Decode.

Готово! Ми побудували мінімальний workflow для генерації зображень.

Налаштовуємо KSampler

Розберімося з ключовими параметрами.

  • Seed — параметр випадковості генерації. Коли модель створює нове зображення, то не починає одразу малювати персонажа. Спочатку вона бачить хаотичний набір випадкових пікселів. Саме Seed визначає, яким буде цей хаос. За однакових налаштувань і Seed ви завжди отримаєте той самий результат. Зміна показника дає змогу повторювати результати або свідомо їх варіювати.
  • Control after generate — це параметр, який визначає, що робити зі значенням Seed після завершення генерації. Найпоширеніші варіанти — Fixed і Randomize. Seed у значенні Fixed не змінюється, а в значенні Randomize після кожної генерації ComfyUI автоматично створює новий випадковий Seed.

Інші чотири параметри залежать від конкретної моделі. На civitai.com автори моделей зазвичай указують рекомендовані значення для правильного використання цієї моделі.

  • Steps — кількість кроків, які має зробити модель, щоб згенерувати зображення.
  • CFG scale — показник того, наскільки сильно модель дотримується вашого промпту: що вище значення, то точніше згенероване зображення відповідає текстовому опису.
  • Sampler — алгоритм, за яким відбувається генерація. Одним із найуніверсальніших вважають DPM++ 2M, бо він зазвичай забезпечує гарний баланс між деталізацією, швидкістю та стабільністю.
  • Scheduler — параметр, що визначає, як саме розподілятимуться кроки генерації між початком і кінцем процесу. Наприклад, Normal розподіляє кроки більш рівномірно. Karras приділяє більше уваги фінальним етапам, коли модель уже працює над дрібними деталями. Саме тому його часто використовують для отримання більш чітких і деталізованих зображень.

Порада. Якщо на сторінці моделі даних немає, перегляньте метадані згенерованого зображення. ComfyUI зберігає у файлі повний workflow. Зображення можна перетягнути на робочий простір і відновити всі налаштування.

Пишемо промпт

Коли всі налаштування введені, переходимо до генерації. Пишемо у відведені поля позитивний та негативний промпти.

Наприклад, щоб створити середньовічну лицарку, пишу позитивний промпт: «Woman in armor, in battle». Але я не хочу, щоб у неї було світле волосся, тому як негативний промпт додаю «Blond».

Вибираю модель DreamShaperXL. Для KSampler виставляю такі налаштування: seed 1, steps 4, cfg 2, sampler dpmpp_sde, scheduler karras.

Вам може здатися, що промпти, які я ввів, банальні. Проте старі моделі, як-от SD 1.5 та SDXL, не розуміють розгорнутих описових речень. Вони краще обробляють короткі фрази, написані через кому. Тому «woman in armor, in battle» спрацює краще за розлогий промпт. Новіші моделі, як-от Flux, уже краще розуміють довші описи.

Порада. Якщо треба підсилити вплив якоїсь деталі, візьміть її в дужки.

Порада. Якщо потрібно отримати зображення більшого розміру, використовуйте апскейлери: вони не просто збільшують арт, а й доробляють деталі, яких не було в меншому варіанті.

Запускаємо процес генерації та зберігаємо зображення

Натискаємо Run (або Ctrl + Enter). Ось такий результат у нас вийшов:


Щоб завантажити результат, натисніть правою кнопкою миші на зображення та виберіть Save Image. Можна також налаштувати автоматичне завантаження генерацій, замінивши ноду Preview Image на Save Image.


Image-to-Image Workflow: як у ComfyUI змінити готове зображення

Генерація зображень із нуля в ComfyUI не найпоширеніша для нас практика, бо часто їхнє походження легко зчитати, а це суттєво знижує довіру. Також ШІ поки не може генерувати глибші ідеї чи продуманіших персонажів, які є в наших проєктах. Тому більшість реальних завдань — це редагування, покращення чи виправлення наявних артів.

Як побудувати Image-to-Image Workflow

1. Додаємо ноду Load Image та завантажуємо потрібне зображення.

2. Перетворюємо результат із растрового формату на латентний через додаткову ноду VAE Encode. Після цього зʼєднуємо з KSampler.

Ключовим параметром KSampler тут є Denoise. Він визначає, наскільки сильно можна змінювати вхідне зображення.

  • Значення ближче до 1.0 — модель майже повністю перемальовує все заново.
  • Значення ближче до 0 — зберігає вхідне зображення майже без змін.

Практичний прийом. Якщо вхідне зображення занадто реалістичне для ігрової стилістики, я проганяю його через менш реалістичну модель із невисоким значенням Denoise (0,3–0,5), а також навпаки. Це дає контрольований перехід між стилями без втрати композиції та пропорцій оригіналу.

Як розширити можливості базової моделі завдяки LoRA

LoRA — це невелика додаткова модель, яка не замінює основну, а доповнює її: додає знання, яких у базовій моделі не було. Наприклад, базова модель не знає, який вигляд має конкретний персонаж із нашої гри, але якщо навчити LoRA на референсах цього персонажа в різних ракурсах, модель почне генерувати саме його.

Як налаштувати LoRA

  1. Шукаємо потрібну LoRA. Її теж можна знайти на civitai.com. Для цього у фільтрі Model Types обираємо пункт LoRA. LoRA прив’язана до конкретного типу базової моделі. Тобто для моделі SD 1.5 вам потрібно підбирати у фільтрах LoRA SD 1.5.
  2. Підключаємо окрему ноду Load LoRA. Розміщуємо її між Load Checkpoint і KSampler. Нода Load LoRA отримує MODEL і CLIP із Checkpoint і видає видозмінені MODEL та CLIP.

  3. Додаємо в промпт слово-тригер. Щоб LoRA спрацювала, у промпт зазвичай треба додати ключове слово-тригер, яке вказав автор LoRA. Його можна знайти в інформації про модель, поле Trained Words.

Ось, наприклад, ключове слово, яке потрібне для LoRA, щоб створити зображення тієї самої лицарки як 3D-рендер.


ControlNet: як контролювати деталі генерації

ControlNet — це ще одна підключена модель, яка дає змогу зберегти конкретну геометрію (позу персонажа, контури обладунків або 3D-об’єм), повністю змінюючи стиль, матеріали та деталі. Наприклад, якщо вам потрібно зберегти форму спорядження персонажа й по-новому промалювати матеріали, ControlNet допоможе «сказати» це моделі.

Щоб використати ControlNet, потрібен зв’язок між трьома нодами.

  1. Load ControlNet Model — модель контролю (наприклад, Depth, Canny або OpenPose). Саму модель також треба завантажити. Багато опцій можна знайти на вже знайомому нам сайті civitai.com.
  2. ControlNet Preprocessor — обробляє вхідне зображення й перетворює його на карту контролю (карту глибини, контури або графічний «скелет»). Можна працювати без цієї ноди, якщо завантажити готове зображення / карту контролю зі свого компʼютера.
  3. Apply ControlNet — застосовує налаштування до генерації, впливаючи на позитивний і негативний промпти (CONDITIONING).

Варіантів контролю багато, але є основні.

  • Depth: створює карту, де світлі ділянки означають об’єкти, розташовані ближче до камери, а темні — далі від неї. Зберігає 3D-об’єм, пропорції та відстані в просторі, але дає моделі свободу перемальовувати деталі й текстури.
  • OpenPose: фіксує лише «скелет» персонажа (положення голови, тулуба й кінцівок), повністю ігноруючи одяг, зовнішність та тло.
  • Canny / Lineart: зчитує чіткі лінії та детальні межі об’єкта.

Потрібний варіант можна вибрати в налаштуваннях Preprocessor. Я використовую Preprocessor із нод ComfyUI ArtVenture. Щоб установити їх, вам треба відкрити ComfyUI Manager -> Custom Nodes Manager і знайти ComfyUI ArtVenture.

З’являється нода ControlNet Preprocessor, яка може генерувати потрібні карти контролю.

Після додавання нод Load ControlNet Model, ControlNet Preprocessor та Apply ControlNet об’єднуємо зв’язки й можемо генерувати зображення.

Ключовим налаштуванням ноди Apply ControlNet є Strength: що вищий цей параметр, то точніше зберігається задана форма, поза чи контур, тому менше свободи залишається для стилістичних змін.

Ви дізналися про основні можливості програми. Це база, з якою можна впевнено починати працювати з ComfyUI. Якщо опанувати її, далі можна будувати окремі workflow для обличчя та тіла, тренувати власні LoRA під конкретний сетинг і персонажів, працювати з новішими моделями, як-от Flux.

Сподіваюся, цей гайд допоможе вам зробити перші впевнені кроки в ComfyUI. Успіхів в експериментах!

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини

👍ПодобаєтьсяСподобалось4
До обраногоВ обраному4
LinkedIn


Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

СomfyUI — дуже класний інструмент, але базових налаштувань зазвичай для реальних робочих завдань замало, треба копати глибше

Жінка в обладунках, посеред бою, блондинка. Згенеровано за допомогою якоїсь шняги з повзуннками.

там навпаки «не блондинка». + автор же каже, що робив як приклад на stable diffusion, а там дійсно бкз власних ЛоРА виходить нейрослопно. зато безплатно і локально.

але там в одну кнопку можна і нанобанани і прочі платні шняги пришити.

За всрату кількість токенів, тобто грошей.. Нащо — не зовсім зрозуміло, але компанія показує, що вони не аби хто, а в ногу з прогресом)
Чи намалював би художник самостійно таку тіпшу, та навіть значно краще та якісніше? Авжеж. Але ж не для цього взагалі-то Ai-гіганти витрачають міліарди на піар свого лайна.

Дивлячись який художник — я знаю купу фріланс художників якіб і приблизно навіть таке не намалювали, але гроші взяли би. Я сам таким платив не раз за набагато гіршу якість і за ті гроші не маю ні до кого з них притензій. Чи ви виключно про тих художників які малюють добре, але думають що весь бюджет проекту можна виключно на їх винагороду потратити? А замовник гроші має з повітря брати, або просто не бути таким «ніщебродом»? Так от знайте що 90% бізнесу у світі — це малий бізнес.

справа в тому, що коли я агрюсь на ллм-ки в культурних продуктах (а це не тільки ігри, це й музика, книги, кіно і тд), так от, я агрюсь переважно не як художник, в якого можуть забрати роботу. А як в першу чергу користувач та споживач цих продуктів. ллм-ки кратно збільшили кількість лайна навкруги. Якщо раніше, люди намагались робити якісні речі в тому числі й через те, що витрачали на це чималі кошти, і тому мали доп.мотивацію зробити якісний продукт, який відіб’є вложене. То тепер будь який, як ви (не я) висловились «ніщеброд» може вивалити в інтернет будь що: сміщний відос в інсту, говномузику, яка засірає предложку, мотиваційний пост в Лінкдіні і тд. Ок, це обиватєлі бавляться, але що в нас відбувається в серйозних конторах? спеціалісти, які проміняли свій досвід і навички на написання промптів — потроху деградують і вже не взмозі навіть адекватно контролювати ту срань, яку робить ллм-ка. Тут в нас Пларіум в статті, тим часом подивимось на Бліззардів, які не так давно тішили гарною графікою, а наразі чомусь виродились в одне й те саме, нудне.. цікаво, чому так? Думаю тому що і там хтось умний вирішив, що художнику краще тягати туди-сюди параметри в нодах, а не малювати) Мої співчуття художникам і мої співчуття глядачам.

блізард ще до ллм-ок спаплюжився — не треба його притягувати)
Від усіх інших я як користувач відчуваю що тільки виграв — я не пам’ятаю такої кількості різних і оригінальних ігр як почало з’являтися саме зараз. І ясно що у багато чому як раз завдяки ЛЛМ-кам, що зробили поріг входу в індустрію трохи нижчим. Так, почало з’являтися і ще більше лайна — але просто не купуйте його і буде вам щастя.

Якщо раніше, люди намагались робити якісні речі в тому числі й через те, що витрачали на це чималі кошти

нєнєнє — витрачали кошти майже завжди не ті люди що робили, не плутайте. Це взагалі не пов’язано.

То тепер будь який, як ви (не я) висловились «ніщеброд» може вивалити в інтернет будь що: сміщний відос в інсту, говномузику, яка засірає предложку, мотиваційний пост в Лінкдіні і тд.

Раніше він все теж саме теж міг (і робив!), тільки результат був ще гірший, а зараз результат став трохи кращий і ви обурюєтесь насправді не через те, що лайно лізе вам в монітор, а через те що це лайно стало на колір і смак майже не відрізняємо від того лайна до якого ви звикли і тепер ви можете наїстися цього нового лайна і тільки згодом зрозуміти що сталося)) Вибачте за лайняну алегорію)
Остальне про співчуття художникам — підтримую. А також програмістам які справді любили писати код, музикантам і т.д.

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

Ну ця «людина з поганим смаком» самотужки вміє розробити продукти якими користуються мільйони. Тому такий «поганий смак» — не показник. До речі навіть не сперечаюся, я знаю що маю низькі вимоги до графіки і стилю (не тільки в іграх). Ну той що що я не графодрочер? В геймдеві я не працюю.

Дай мені мільйон грошиків з ізраілю, і я теж самотужки тобі зроблю продукт яким користуются мільйони. Вони вже давно пересікли межу коли просто йде закупівля трафіку, а «продукт» пересічна людина навіть не назве.

Не треба мільйону грошиків. Достатньо розуміння що користь від чогось і його зовнішній вигляд: дві незалежні характеристики товару. І зовнішній вигляд це те що приваблює користувача, це та сама «реклама». Але утримує користувача не це, а саме корисність для нього продукту. Якщо це гра — то геймплей та наповненість контентом. Саме в іграх графіка теж, але в плані утримання ігрока її роль вже набагато менша ніж у продуманого геймплею та наповненістю різним контентом (про це навіть проводили якось наукове дослідження що підтвердило це).

ну тоді яку рекламу і утримання дає ця прожарена ші фотка, яку гравець може згенерити в гроці.

а зробив би це художник за 5 хвилин? і якіх токенів, якщо це на локальній машині робмиться. нєнє, інструмент цікавий, перспектива є, база ентузіастів є.

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