Генерация изображений Apache-2.0

ControlNet

Diffusion · Lvmin Zhang · 2023

VRAM по точности

Точность VRAM Качество Рекомендация
FP16 6 ГБ Максимальное Для продакшена
INT8 4 ГБ Хорошее

Совместимые GPU

GPU VRAM Поддерживает
24 ГБ FP16, INT8 Арендовать
24 ГБ FP16, INT8 Арендовать

Рекомендуемые фреймворки

Характеристики модели

Технические параметры

Разработчик
Lvmin Zhang
Год выпуска
2023
Архитектура
Diffusion
Лицензия
Apache-2.0
Разрешение
512x512
Формат вывода
PNG

Применение

Controlled image generation Pose-guided generation Depth-guided generation Edge-guided generation

ControlNet — семейство дополнительных сетей условий к Stable Diffusion: вы подаёте структурированный сигнал (канни, глубина, openpose, скетч и т.д.), а базовая модель «подстраивает» картинку под него. Это не отдельный генератор сам по себе — обычно пара SD 1.5 / SDXL + конкретный вес ControlNet. Главная выгода — предсказуемая геометрия и композиция без ручной ретуши десятков seed’ов.

Запуск на cloudcompute.ru

Шаг 1 — Арендуйте GPU

Память складывается из базовой модели + ControlNet; для связки SD 1.5 + один контроллер часто достаточно RTX 3090. Перейдите в каталог GPU.

Шаг 2 — Запустите ComfyUI

docker run --gpus all -p 8188:8188 \
  -v comfyui-data:/root \
  ghcr.io/ai-dock/comfyui:latest

Откройте http://localhost:8188. В ComfyUI удобнее всего собирать граф с нодами ControlNet: выберите базовый checkpoint (SD 1.5 или SDXL) и совместимый с ним вес контроллера (canny, depth, openpose…).

Шаг 3 — Сгенерируйте изображение

Минимальный пример в Diffusers (Canny + SD 1.5; нужен opencv-python-headless):

import torch
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from diffusers.utils import load_image
from PIL import Image
import cv2
import numpy as np

base = "runwayml/stable-diffusion-v1-5"
canny_id = "lllyasviel/sd-controlnet-canny"

image = load_image("https://huggingface.co/lllyasviel/sd-controlnet-canny/resolve/main/images/human_line.png")
image = np.array(image)
canny = cv2.Canny(image, 100, 200)
canny = Image.fromarray(canny)

controlnet = ControlNetModel.from_pretrained(canny_id, torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    base, controlnet=controlnet, torch_dtype=torch.float16
)
pipe = pipe.to("cuda")

out = pipe("a man dancing, full body, studio lighting", image=canny).images[0]
out.save("output.png")

Оптимизация

  • Подбирайте controlnet_conditioning_scale: слишком высокий — «жёсткая» копия контура, слишком низкий — слабый контроль.
  • Для SDXL используйте SDXL-совместимые веса ControlNet, а не чекпоинты от SD 1.5.