ControlNet и IP‑Adapter: точный контроль генерации
Задача страницы. Показать, как добиваться управляемой генерации изображений (и видео‑кадров) с помощью ControlNet и IP‑Adapter: какие есть типы кондиционирования, как настраивать веса/расписания влияния, какой VRAM/время нужны, как построить пайплайны в ComfyUI и Automatic1111, как бенчмаркать качество и стабильность, и как это внедрить в проде.
TL;DR
- ControlNet задаёт структуру/геометрию (эскиз, канни, поза, глубина, линии, сегментация).
- IP‑Adapter переносит стиль/референс и/или идентичность с изображения, держит композицию базовой модели.
- На SDXL добавление 1 ветки ControlNet обычно даёт +2–4 ГБ VRAM и +15–35% времени; на SD3 — +3–6 ГБ и большее замедление.
- Для стабильности используйте расписание влияния (ранний «захват» структуры, затем «уход» влияния) и лимиты разрешений/шагов.
Связанные страницы: /solutions/image-video-gen/ • /solutions/image-video-gen/comfyui/ • /solutions/image-video-gen/automatic1111/ • /solutions/image-video-gen/sdxl/ • /solutions/image-video-gen/sd3/ • /solutions/image-video-gen/upscaling/ • /solutions/image-video-gen/face-restoration/ • /solutions/image-video-gen/video/ • /solutions/image-video-gen/batch-render/ • инфраструктура: /solutions/performance-tuning/ • /solutions/cost-planner/ • /solutions/monitoring-logging/ • /solutions/llm-inference/observability/ • /solutions/llm-inference/streaming/ • /solutions/storage-data/
Когда выбирать ControlNet, IP‑Adapter или ничего
- ControlNet (структура): нужен фиксированный контур/поза/планировка — каталоги, продуктовые фото, архитектурные планы, тех. иллюстрации, комикс‑стили, анимационные breakdown’ы.
- IP‑Adapter (стиль/идентичность): нужны стилизация по референсу, совпадение цветовой палитры/освещения, мягкая передача айдентики лица/объекта без жёсткой привязки к позе.
- Без кондиционирования: быстрые эскизы, свободное творчество, когда контроль мешает разнообразию.
Типы кондиционирования и сценарии
| **Тип** | **Что задаёт** | **Частые сценарии** | **Препроцессор/источник** |
| **Canny/Edge** | Контур, границы | Рекреация эскиза, предмет на белом фоне, шейпы | Края из исходной картинки или эскиза |
| **Pose/Skeleton** | Положение/жесты человека | Каталоги одежды, сцены с людьми | Детектор позы, ключевые точки |
| **Depth/Normal** | Глубина/рельеф | Архвиз, продукты, интерьеры | Карта глубины/нормалей |
| **Lineart/Anime** | Чистые линии | Комиксы/манга‑стили | Лайн‑арт из сканов/фильтров |
| **MLSD/Lines** | Прямые/чертёж | Архитектура, UI‑черновики | Детектор линий |
| **Tile/Detail** | Детализация по тайлам | Увеличение резкости/узоров | Плиточная карта/тайловая сеть |
| **Segmentation** | Семантические области | Замена фона/цвета, маскирование | Маска сегментации |
| **IP‑Adapter (Style)** | Цвет/палитра/стиль | Брендинг, унификация каталога | Референс‑изображение |
| **IP‑Adapter (Identity)** | Идентичность/фейс | Портреты, герои/маскоты | Референс лица/объекта |
Параметры влияния: как не «пережать» Обозначим: w — вес ControlNet/IP‑Adapter (0..1), t∈[0,1] — нормированная линия времени шагов.
Распределение влияния по шагам
w_eff(t) = w * schedule(t; start, end, shape)
# start/end ∈ [0,1], shape ∈ {"linear","cosine","exp"}
Рекомендации:
- Структура (Canny/Depth/Line): w=0.6–1.0, start=0.0, end=0.5–0.7, shape=linear — сильный «захват» в начале, мягкий «отпуск» к концу.
- Поза (Pose): w=0.5–0.8, end=0.6–0.8 — сохранение позы до середины/конца.
- Стиль (IP‑Adapter): w=0.3–0.7, start=0.0–0.2, end=1.0 — стиль «лежит» поверх всей траектории; для строгого стиля повышайте w.
- Идентичность (IP‑Adapter Face): w=0.5–0.9, можно заморозить ранние слои CLIP‑условий.
Препроцессоры (для ControlNet)
- Canny: low/high thresholds → не делайте контуры слишком «жирными»; чаще 100/200 (старт), варьируйте под контент.
- Pose: чистите «лишние» точки/сегменты, чтобы не вносить шум.
- Depth/Normal: избегайте «ступеней» — сглаживание перед подачей помогает.
Влияние на VRAM и время
| **База** | **+1 ветка ControlNet** | **+IP‑Adapter** | **Комментарий** |
| **SD 1.5 (fp16)** | +1–3 ГБ, +10–25% времени | +0.5–1.5 ГБ, +5–15% | зависит от разрешения/шагов |
| **SDXL (fp16)** | **+2–4 ГБ**, +15–35% | **+1–2 ГБ**, +10–20% | refiner добавит ещё |
| **SD3 (fp16)** | **+3–6 ГБ**, +20–40% | **+1.5–3 ГБ**, +15–25% | закладывайте запас |
Планируйте диски: локальный NVMe‑кэш весов/модулей даёт меньше «холодных стартов» (см. /solutions/storage-data/).
ComfyUI: пример графа с ControlNet и IP‑Adapter
Мини‑скелет JSON для SDXL с Canny‑контролем и стилизацией IP‑Adapter (условные имена классов нод):
{
"1":{"class_type":"CheckpointLoaderSimple","inputs":{"ckpt_name":"sdxl_base.safetensors"}},
"2":{"class_type":"CLIPTextEncode","inputs":{"text":"studio product photo, soft light","clip":["1","CLIP"]}},
"3":{"class_type":"CLIPTextEncode","inputs":{"text":"blurry, watermark, artifacts","clip":["1","CLIP"]}},
"10":{"class_type":"LoadImage","inputs":{"image":"control_ref.png"}},
"11":{"class_type":"CannyEdgePreprocess","inputs":{"image":["10","IMAGE"],"low":100,"high":200}},
"12":{"class_type":"ControlNetLoader","inputs":{"control_net":"control-canny.safetensors"}},
"13":{"class_type":"ControlNetApplyAdvanced","inputs":{
"positive":["2","CONDITIONING"],"negative":["3","CONDITIONING"],
"control_net":["12","CONTROL_NET"],"image":["11","IMAGE"],
"strength":0.8,"start":0.0,"end":0.6}},
"14":{"class_type":"IPAdapterLoader","inputs":{"ip_model":"ip-adapter.safetensors"}},
"15":{"class_type":"LoadImage","inputs":{"image":"style_ref.jpg"}},
"16":{"class_type":"IPAdapterApply","inputs":{
"conditioning":["13","CONDITIONING"],"ip_model":["14","IP_MODEL"],
"image":["15","IMAGE"],"weight":0.5,"start":0.2,"end":1.0}},
"4":{"class_type":"EmptyLatentImage","inputs":{"width":1024,"height":1024,"batch_size":1}},
"5":{"class_type":"KSampler","inputs":{
"model":["1","MODEL"],"seed":123,"steps":28,"cfg":6.5,
"sampler_name":"dpmpp_2m","scheduler":"karras",
"positive":["16","CONDITIONING"],"negative":["3","CONDITIONING"],
"latent_image":["4","LATENT"]}},
"6":{"class_type":"VAEDecode","inputs":{"samples":["5","LATENT"],"vae":["1","VAE"]}},
"7":{"class_type":"SaveImage","inputs":{"images":["6","IMAGE"]}}
}
Графы, кэш и профили VRAM — см. /solutions/image-video-gen/comfyui/. Automatic1111: API‑запросы с ControlNet и IP‑Adapter
ControlNet (txt2img)
curl -X POST "http://<host>:7860/sdapi/v1/txt2img"
-H "Content-Type: application/json"
-d '{
"prompt": "studio product, soft light",
"negative_prompt": "blurry, watermark",
"width": 1024, "height": 1024,
"steps": 28, "cfg_scale": 6.5, "seed": 42,
"alwayson_scripts": {
"controlnet": {
"args": [{
"input_image": "data:image/png;base64,<BASE64>",
"model": "control_canny_sdxl",
"weight": 0.8,
"guidance_start": 0.0,
"guidance_end": 0.6,
"processor_res": 1024,
"threshold_a": 100,
"threshold_b": 200
}]
}
}
}'
IP‑Adapter (стиль)
curl -X POST "http://<host>:7860/sdapi/v1/txt2img"
-H "Content-Type: application/json"
-d '{
"prompt": "clean product photo, catalog look",
"width": 1024, "height": 1024, "steps": 26, "cfg_scale": 6,
"alwayson_scripts": {
"ipadapter": {
"args": [{
"image": "data:image/jpeg;base64,<BASE64>",
"weight": 0.5,
"start_at_step": 0.2,
"end_at_step": 1.0
}]
}
}
}'
Флаги запуска, hi‑res и тайлинг — /solutions/image-video-gen/automatic1111/. Стриминг прогресса — /solutions/llm-inference/streaming/.
Качество vs скорость: рабочие паттерны
- «Захват‑и‑отпуск»: сильный ControlNet в начале (w=0.7–1.0, end≈0.5–0.7), затем его влияние уходит — итог выглядит естественнее.
- Двойной проход: preview с низкими шагами → апскейл/денойз → (опц.) короткий refiner или мягкий IP‑Adapter (см. /solutions/image-video-gen/upscaling/, /solutions/image-video-gen/sdxl/).
- Тайлинг: для 2–4k используйте тайловую диффузию и ControlNet‑Tile; следите за швами.
- Batch и кэш: сохраняйте карты (canny/pose/depth) — не прогоняйте препроцессор повторно.
Бенчмаркинг: как измерять «точность» и стабильность
Набор данных. Соберите пары (входная карта/референс → желаемый результат), 50–200 сцен на каждую задачу. Храните версии (модель/адаптер/препроцессор).
Метрики (оффлайн):
- Edge‑SSIM (структурное сходство по канни/границам) — насколько соблюдена геометрия.
- Pose‑L2 (средняя ошибка ключевых точек) — для позы.
- Color/Style distance (простой emd/ΔE, эмбеддинговый косинус) — насколько совпал стиль IP‑Adapter.
- Images/min, p95 t_step — производительность.
- VRAM пик — эксплуатация.
Онлайн‑метрики: CSAT/оценки, доля «доправок», p95 латентности, ошибки/тайм‑ауты (см. /solutions/llm-inference/observability/). Организация экспериментов и отчётов — /solutions/monitoring-logging/, экономика — /solutions/cost-planner/.
Видео и последовательности
- Консистентность по кадрам: фиксируйте ControlNet‑карты на ключевых кадрах, для промежуточных — интерполируйте/смягчайте вес.
- Масштабирование: раздавайте кадры по воркерам (см. /solutions/image-video-gen/video/); финально — денойз/апскейл → транскод.
- Метрики: fps, доля «миганий», «шовных» дефектов, транскод‑латентность.
Наблюдаемость, алерты, логи
Собирайте (см. /solutions/monitoring-logging/):
- images_per_min, t_step_ms, steps, resolution, batch, queue_wait.
- Доли успешных препроцессоров, среднее время препроцессоров.
- GPU util/HBM, OOM/ретраи; I/O (загрузка весов, кэш‑хиты).
- Алерты: рост p95 t_step_ms, падение стиля/геометрии (на оффлайн‑валидации), OOM>0.
Стоимость и профили инстансов
Прикидка времени и цены
T ≈ O + S × t_step × (1 + overhead_control)
Imgs_per_hour ≈ 3600 / T
Cost_per_1000 ≈ (GPU_hour_price × Num_GPU) / (Imgs_per_hour / 1000)
Где overhead_control — 0.1–0.4 для 1 ветки ControlNet; IP‑Adapter даёт чуть меньше. Пулы: интерактив — on‑demand, пакет — interruptible (см. /solutions/interruptible-patterns/). Детали — /solutions/llm-inference/costs/, /solutions/cost-planner/.
Безопасность и политика
- Белые списки моделей/модулей, лимиты R/S/CFG/batch, лимиты весов ControlNet/IP‑Adapter.
- Санация промптов, маскирование PII и токенов, политика контента (см. /solutions/security/, /solutions/llm-inference/guardrails/).
Траблшутинг
- «Резиновая» геометрия → увеличьте w в начале, сократите end, очистите карты (меньше шума).
- Пластик/переперерисовка → снизьте CFG, уменьшите w IP‑Adapter, ослабьте hi‑res denoise.
- Шумы/лесенка контуров → отрегулируйте Canny (thresholds), примените сглаживание.
- OOM → снизьте разрешение/шаги/батч, отключите часть веток, включите тайлинг.
- Медленный старт → локальный кэш весов, прогрев моделей, объединение очередей short/long.
- Стиль «переедает» контент → уменьшите w IP‑Adapter, сместите start к 0.2–0.3.
Как запускать в cloudcompute.ru
Шаблоны в /solutions/templates/:
- “ComfyUI‑Control” — SD/SDXL/SD3 графы с Canny/Pose/Depth, IP‑Adapter, кэш весов, SSE‑прогресс.
- “A1111‑Control” — WebUI с включённым ControlNet/IP‑Adapter, ограничители параметров, API‑профили.
- “Batch‑Render” — очереди/ретраи/отчёты; связка с апскейлом/реставрацией для финала.
Чек‑лист перед продом
- Выбраны режимы: структура (ControlNet), стиль/идентичность (IP‑Adapter) или их комбинация.
- Настроены веса/расписания (start/end/shape) и пороги препроцессоров.
- Подтверждены VRAM‑профили и латентность на целевых R/S.
- Кэш весов/карт на NVMe; очереди short/long; on‑demand/interruptible пулы.
- Метрики/алерты/логи подключены; оффлайн‑бенч с эталонами.
- Политики/лимиты параметров и список разрешённых модулей активированы.
Готовы запустить?
Запустить GPU-сервер