Генерация изображений с помощью Stable Diffusion
Современная генерация изображений по текстовому описанию с использованием моделей Stable Diffusion через библиотеку HuggingFace Diffusers. Применяется для создания изображений по текстовым запросам, преобразования изображений в изображения, инпейнтинга или построения собственных пайплайнов диффузии.
Метаданные навыка
| Источник | Опционально — установка через vibeos skills install official/mlops/stable-diffusion |
| Путь | optional-skills/mlops/stable-diffusion |
| Версия | 1.0.0 |
| Автор | Orchestra Research |
| Лицензия | MIT |
| Зависимости | diffusers>=0.30.0, transformers>=4.41.0, accelerate>=0.31.0, torch>=2.0.0 |
| Платформы | linux, macos, windows |
| Теги | Image Generation, Stable Diffusion, Diffusers, Text-to-Image, Multimodal, Computer Vision |
Справочник: полный SKILL.md
Ниже приведено полное описание навыка, которое загружает VibeOS при его активации. Это те инструкции, которые видит агент, когда навык активен.
Генерация изображений с помощью Stable Diffusion
Подробное руководство по генерации изображений с помощью Stable Diffusion с использованием библиотеки HuggingFace Diffusers.
Когда использовать Stable Diffusion
Используйте Stable Diffusion, когда:
- Нужно сгенерировать изображения по текстовому описанию
- Выполняется преобразование изображения в изображение (перенос стиля, улучшение)
- Требуется инпейнтинг (заполнение замаскированных областей)
- Выполняется аутпейнтинг (расширение изображений за границы)
- Создаются вариации существующих изображений
- Строятся собственные рабочие процессы генерации изображений
Ключевые возможности:
- Text-to-Image: генерация изображений по текстовым запросам на естественном языке
- Image-to-Image: преобразование существующих изображений с текстовым управлением
- Inpainting: заполнение замаскированных областей контекстно-зависимым содержимым
- ControlNet: пространственное управление (контуры, позы, глубина)
- Поддержка LoRA: эффективная тонкая настройка и адаптация стилей
- Несколько моделей: поддержка SD 1.5, SDXL, SD 3.0, Flux
Используйте альтернативы, если:
- DALL-E 3: для генерации через API без GPU
- Midjourney: для художественных, стилизованных результатов
- Imagen: для интеграции с Google Cloud
- Leonardo.ai: для веб-ориентированных творческих рабочих процессов
Быстрый старт
Установка
pip install diffusers transformers accelerate torch
pip install xformers # Опционально: эффективное использование памяти
Базовая генерация текста в изображение
from diffusers import DiffusionPipeline
import torch
# Загрузка пайплайна (автоопределение типа модели)
pipe = DiffusionPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
torch_dtype=torch.float16
)
pipe.to("cuda")
# Генерация изображения
image = pipe(
"Спокойный горный пейзаж на закате, высокая детализация",
num_inference_steps=50,
guidance_scale=7.5
).images[0]
image.save("output.png")
Использование SDXL (более высокое качество)
from diffusers import AutoPipelineForText2Image
import torch
pipe = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16,
variant="fp16"
)
pipe.to("cuda")
# Включение оптимизации памяти
pipe.enable_model_cpu_offload()
image = pipe(
prompt="Футуристический город с летающими автомобилями, кинематографическое освещение",
height=1024,
width=1024,
num_inference_steps=30
).images[0]
Обзор архитектуры
Трёхкомпонентная структура
Diffusers построен на трёх основных компонентах:
Пайплайн (оркестрация)
├── Модель (нейронные сети)
│ ├── UNet / Transformer (предсказание шума)
│ ├── VAE (кодирование/декодирование латентного пространства)
│ └── Текстовый энкодер (CLIP/T5)
└── Шедулер (алгоритм шумоподавления)
Поток выполнения пайплайна
Текстовый запрос → Текстовый энкодер → Текстовые эмбеддинги
↓
Случайный шум → [Цикл шумоподавления] ← Шедулер
↓
Предсказанный шум
↓
Декодер VAE → Финальное изображение
Основные концепции
Пайплайны
Пайплайны оркестрируют полные рабочие процессы:
| Пайплайн | Назначение |
|---|---|
StableDiffusionPipeline | Текст в изображение (SD 1.x/2.x) |
StableDiffusionXLPipeline | Текст в изображение (SDXL) |
StableDiffusion3Pipeline | Текст в изображение (SD 3.0) |
FluxPipeline | Текст в изображение (модели Flux) |
StableDiffusionImg2ImgPipeline | Изображение в изображение |
StableDiffusionInpaintPipeline | Инпейнтинг |
Шедулеры
Шедулеры управляют процессом шумоподавления:
| Шедулер | Шаги | Качество | Сценарий использования |
|---|---|---|---|
EulerDiscreteScheduler | 20-50 | Хорошее | Выбор по умолчанию |
EulerAncestralDiscreteScheduler | 20-50 | Хорошее | Больше вариаций |
DPMSolverMultistepScheduler | 15-25 | Отличное | Быстро, высокое качество |
DDIMScheduler | 50-100 | Хорошее | Детерминированный |
LCMScheduler | 4-8 | Хорошее | Очень быстро |
UniPCMultistepScheduler | 15-25 | Отличное | Быстрая сходимость |
Смена шедулеров
from diffusers import DPMSolverMultistepScheduler
# Смена для более быстрой генерации
pipe.scheduler = DPMSolverMultistepScheduler.from_config(
pipe.scheduler.config
)
# Теперь генерация с меньшим количеством шагов
image = pipe(prompt, num_inference_steps=20).images[0]
Параметры генерации
Ключевые параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
prompt | Обязательный | Текстовое описание желаемого изображения |
negative_prompt | None | Чего следует избегать на изображении |
num_inference_steps | 50 | Шаги шумоподавления (больше = лучше качество) |
guidance_scale | 7.5 | Степень следования запросу (типично 7-12) |
height, width | 512/1024 | Размеры вывода (кратны 8) |
generator | None | Генератор Torch для воспроизводимости |
num_images_per_prompt | 1 | Размер пакета |
Воспроизводимая генерация
import torch
generator = torch.Generator(device="cuda").manual_seed(42)
image = pipe(
prompt="Кот в цилиндре",
generator=generator,
num_inference_steps=50
).images[0]
Негативные промпты
image = pipe(
prompt="Профессиональное фото собаки в саду",
negative_prompt="размытое, низкое качество, искажённое, уродливое, плохая анатомия",
guidance_scale=7.5
).images[0]
Преобразование изображения в изображение
Преобразование существующих изображений с текстовым управлением:
from diffusers import AutoPipelineForImage2Image
from PIL import Image
pipe = AutoPipelineForImage2Image.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
torch_dtype=torch.float16
).to("cuda")
init_image = Image.open("input.jpg").resize((512, 512))
image = pipe(
prompt="Акварельная картина этой сцены",
image=init_image,
strength=0.75, # Степень преобразования (0-1)
num_inference_steps=50
).images[0]
Инпейнтинг
Заполнение замаскированных областей:
from diffusers import AutoPipelineForInpainting
from PIL import Image
pipe = AutoPipelineForInpainting.from_pretrained(
"runwayml/stable-diffusion-inpainting",
torch_dtype=torch.float16
).to("cuda")
image = Image.open("photo.jpg")
mask = Image.open("mask.png") # Белый = область инпейнтинга
result = pipe(
prompt="Красная машина, припаркованная на улице",
image=image,
mask_image=mask,
num_inference_steps=50
).images[0]
ControlNet
Добавление пространственного управления для точного контроля:
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import torch
# Загрузка ControlNet для управления контурами
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/control_v11p_sd15_canny",
torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
# Использование изображения контуров Canny в качестве управления
control_image = get_canny_image(input_image)
image = pipe(
prompt="Красивый дом в стиле Ван Гога",
image=control_image,
num_inference_steps=30
).images[0]
Доступные ControlNet
| ControlNet | Тип входа | Сценарий использования |
|---|---|---|
canny | Карты контуров | Сохранение структуры |
openpose | Скелеты поз | Позы человека |
depth | Карты глубины | 3D-ориентированная генерация |
normal | Карты нормалей | Детали поверхности |
mlsd | Отрезки линий | Архитектурные линии |
scribble | Грубые наброски | Преобразование наброска в изображение |
Адаптеры LoRA
Загрузка тонко настроенных адаптеров стилей:
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
torch_dtype=torch.float16
).to("cuda")
# Загрузка весов LoRA
pipe.load_lora_weights("path/to/lora", weight_name="style.safetensors")
# Генерация в стиле LoRA
image = pipe("Портрет в обученном стиле").images[0]
# Настройка силы LoRA
pipe.fuse_lora(lora_scale=0.8)
# Выгрузка LoRA
pipe.unload_lora_weights()
Несколько LoRA
# Загрузка нескольких LoRA
pipe.load_lora_weights("lora1", adapter_name="style")
pipe.load_lora_weights("lora2", adapter_name="character")
# Установка весов для каждой
pipe.set_adapters(["style", "character"], adapter_weights=[0.7, 0.5])
image = pipe("Портрет").images[0]
Оптимизация памяти
Включение выгрузки на CPU
# Выгрузка модели на CPU, когда не используется
pipe.enable_model_cpu_offload()
# Последовательная выгрузка на CPU — более агрессивная, медленнее
pipe.enable_sequential_cpu_offload()
Разделение внимания
# Снижение памяти за счёт вычисления внимания частями
pipe.enable_attention_slicing()
# Или конкретный размер части
pipe.enable_attention_slicing("max")
Эффективное внимание xFormers
# Требуется пакет xformers
pipe.enable_xformers_memory_efficient_attention()
Разделение VAE для больших изображений
# Декодирование латентного пространства тайлами для больших изображений
pipe.enable_vae_slicing()
pipe.enable_vae_tiling()
Варианты моделей
Загрузка разной точности
# FP16 (рекомендуется для GPU)
pipe = DiffusionPipeline.from_pretrained(
"model-id",
torch_dtype=torch.float16,
variant="fp16"
)
# BF16 (лучшая точность, требуется GPU Ampere+)
pipe = DiffusionPipeline.from_pretrained(
"model-id",
torch_dtype=torch.bfloat16
)
Загрузка отдельных компонентов
from diffusers import UNet2DConditionModel, AutoencoderKL
# Загрузка пользовательского VAE
vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse")
# Использование с пайплайном
pipe = DiffusionPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
vae=vae,
torch_dtype=torch.float16
)
Пакетная генерация
Эффективная генерация нескольких изображений:
# Несколько запросов
prompts = [
"Кот, играющий на пианино",
"Собака, читающая книгу",
"Птица, рисующая картину"
]
images = pipe(prompts, num_inference_steps=30).images
# Несколько изображений на запрос
images = pipe(
"Красивый закат",
num_images_per_prompt=4,
num_inference_steps=30
).images
Типовые рабочие процессы
Рабочий процесс 1: Высококачественная генерация
from diffusers import StableDiffusionXLPipeline, DPMSolverMultistepScheduler
import torch
# 1. Загрузка SDXL с оптимизациями
pipe = StableDiffusionXLPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16,
variant="fp16"
)
pipe.to("cuda")
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_model_cpu_offload()
# 2. Генерация с настройками качества
image = pipe(
prompt="Величественный лев в саванне, освещение золотого часа, 8k, детализированная шерсть",
negative_prompt="размытое, низкое качество, мультфильм, аниме, набросок",
num_inference_steps=30,
guidance_scale=7.5,
height=1024,
width=1024
).images[0]
Рабочий процесс 2: Быстрое прототипирование
from diffusers import AutoPipelineForText2Image, LCMScheduler
import torch
# Использование LCM для генерации за 4-8 шагов
pipe = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16
).to("cuda")
# Загрузка LoRA LCM для быстрой генерации
pipe.load_lora_weights("latent-consistency/lcm-lora-sdxl")
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
pipe.fuse_lora()
# Генерация за ~1 секунду
image = pipe(
"Красивый пейзаж",
num_inference_steps=4,
guidance_scale=1.0
).images[0]
Частые проблемы
Нехватка памяти CUDA:
# Включение оптимизаций памяти
pipe.enable_model_cpu_offload()
pipe.enable_attention_slicing()
pipe.enable_vae_slicing()
# Или использование меньшей точности
pipe = DiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
Чёрные/шумные изображения:
# Проверка конфигурации VAE
# При необходимости отключение проверки безопасности
pipe.safety_checker = None
# Обеспечение согласованности dtype
pipe = pipe.to(dtype=torch.float16)
Медленная генерация:
# Использование более быстрого шедулера
from diffusers import DPMSolverMultistepScheduler
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
# Уменьшение количества шагов
image = pipe(prompt, num_inference_steps=20).images[0]
Ссылки
Расширенное использование— Пользовательские пайплайны, тонкая настройка, развёртываниеУстранение неполадок— Частые проблемы и решения
Ресурсы
- Документация: https://huggingface.co/docs/diffusers
- Репозиторий: https://github.com/huggingface/diffusers
- Хаб моделей: https://huggingface.co/models?library=diffusers
- Discord: https://discord.gg/diffusers