Перейти к основному содержимому

Генерация изображений с помощью 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Инпейнтинг

Шедулеры​

Шедулеры управляют процессом шумоподавления:

ШедулерШагиКачествоСценарий использования
EulerDiscreteScheduler20-50ХорошееВыбор по умолчанию
EulerAncestralDiscreteScheduler20-50ХорошееБольше вариаций
DPMSolverMultistepScheduler15-25ОтличноеБыстро, высокое качество
DDIMScheduler50-100ХорошееДетерминированный
LCMScheduler4-8ХорошееОчень быстро
UniPCMultistepScheduler15-25ОтличноеБыстрая сходимость

Смена шедулеров​

from diffusers import DPMSolverMultistepScheduler

# Смена для более быстрой генерации
pipe.scheduler = DPMSolverMultistepScheduler.from_config(
pipe.scheduler.config
)

# Теперь генерация с меньшим количеством шагов
image = pipe(prompt, num_inference_steps=20).images[0]

Параметры генерации​

Ключевые параметры​

ПараметрПо умолчаниюОписание
promptОбязательныйТекстовое описание желаемого изображения
negative_promptNoneЧего следует избегать на изображении
num_inference_steps50Шаги шумоподавления (больше = лучше качество)
guidance_scale7.5Степень следования запросу (типично 7-12)
height, width512/1024Размеры вывода (кратны 8)
generatorNoneГенератор Torch для воспроизводимости
num_images_per_prompt1Размер пакета

Воспроизводимая генерация​

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]

Ссылки​

  • Расширенное использование — Пользовательские пайплайны, тонкая настройка, развёртывание
  • Устранение неполадок — Частые проблемы и решения

Ресурсы​