Stable Diffusion 是一款基于潜在扩散模型(Latent Diffusion Model, LDM)的开源文生图模型,由 CompVis 团队与 Stability AI 合作研发,于 2022 年 8 月开源发布。它标志着 AI 图像生成从封闭研究走向大众化——在消费级 GPU 上即可运行,为创作者、开发者和研究者打开了无限可能。
AI 图像生成在 2020–2022 年间经历了两次关键跃迁:
| 阶段 | 时间 | 代表技术 | 关键突破 | 局限性 |
|---|---|---|---|---|
| GAN 时代 | 2014–2021 | StyleGAN, BigGAN | 生成速度极快(秒级),人像真实 | 模式坍塌,多样性不足,难控制 |
| 扩散模型兴起 | 2020–2021 | DDPM, DDIM | 高质量生成,多样性好 | 推理极慢(需数千步迭代),计算成本高 |
| 潜在扩散革命 | 2022 | Stable Diffusion (LDM) | 在潜空间扩散,速度提升 10-100 倍 | — |
核心创新:Stable Diffusion 不是直接在像素空间做扩散,而是先用变分自编码器(VAE) 将图像压缩到低维潜空间(Latent Space),在潜空间中执行扩散过程,最后用 VAE 解码器重建图像。这使得:
| 时间 | 事件 | 意义 |
|---|---|---|
| 2021.12 | CompVis 发布 LDM 论文 | 提出潜在扩散架构 |
| 2022.07 | Stability AI 资助训练 SD 1.4 | 首个公开可用的文生图模型 |
| 2022.08 | SD 1.4 正式开源 | 引爆 AI 图像生成社区 |
| 2022.10 | SD 1.5 发布(RunwayML 维护) | 社区最广泛使用的版本 |
| 2022.11 | SD 2.0/2.1 发布 | 引入深度估计、改进文本理解 |
| 2023.07 | SDXL 发布 | 1024×1024 原生分辨率,质量大幅提升 |
| 2023.11 | SDXL Turbo 发布 | 1-4 步即可生成,实时生成成为可能 |
| 2024.02 | SD 3.0 发布 | 引入 MMDiT 架构,文本理解能力飞跃 |
| 2024.10 | SD 3.5 发布 | 改进版本,社区广泛采用 |
前向扩散过程(Forward Diffusion)逐步向数据添加高斯噪声,直至完全变为随机噪声:
其中 是噪声调度(noise schedule),控制每一步添加的噪声量。经过 步后,。
反向去噪过程(Reverse Denoising)学习从噪声恢复数据:
模型通过预测噪声 来实现去噪:
具体数值示例:假设初始图像 为标准化的猫咪图像(像素值范围 ),使用线性噪声调度 到 ,:
| 步骤 | 噪声比例 | 信号比例 | 图像可见度 | ||
|---|---|---|---|---|---|
| 0 | — | 1.0 | 0% | 100% | 🔍 原始图像 |
| 100 | 0.0021 | 0.914 | 9.3% | 90.7% | 轻微噪声颗粒 |
| 300 | 0.0062 | 0.702 | 29.7% | 70.3% | 轮廓清晰,细节模糊 |
| 500 | 0.0103 | 0.497 | 50.3% | 49.7% | 仅能分辨大致形状 |
| 700 | 0.0144 | 0.319 | 68.1% | 31.9% | 几乎无法辨认 |
| 1000 | 0.0200 | 0.135 | 86.5% | 13.5% | 🔍 接近纯噪声 |
Stable Diffusion 的创新在于将像素空间的扩散转移到潜空间。完整架构由三个核心组件构成:
┌─────────────────────────────────────────────────────────────┐
│ Stable Diffusion 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │ CLIP Text │ ──→ τ_θ ─→ │ Cross-Attention │ │
│ │ Encoder │ (Prompt │ ┌──────────────┐ │ │
│ │ (text → │ Embed) │ │ U-Net (ϵ_θ) │ │ │
│ │ 768/1280d) │ │ │ ↓ ↓ ↓ ↓ ↓ │ │ │
│ └──────────────┘ │ │ Self-Attn + │ │ │
│ │ │ Cross-Attn │ │ │
│ ┌──────────────┐ │ │ + ResBlock │ │ │
│ │ VAE Encoder │ ──→ z = ───→│ ↓ ↓ ↓ ↓ ↓ │ │ │
│ │ (Pixel→Latent)│ E(x) │ └──────────────┘ │ │
│ └──────────────┘ └──────────────────────┘ │
│ ↓ ↓ │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │ VAE Decoder │ ←──── z' ←─│ Denoised Latent │ │
│ │ (Latent→Pixel)│ │ │ │
│ └──────────────┘ └──────────────────────┘ │
│ │
│ VAE: x∈R^(3×512×512) → z∈R^(4×64×64) → x'∈R^(3×512×512) │
│ 压缩因子: 512/64 = 8, 空间维度压缩 64 倍, 通道从 3→4 │
└─────────────────────────────────────────────────────────────┘
VAE 负责图像在像素空间和潜空间之间转换。
编码器(Encoder, ):
解码器(Decoder, ):
VAE 训练时使用感知损失(Perceptual Loss)和 KL 正则化:
具体效果:VAE 压缩使得信息损失在可接受范围内。在 COCO 验证集上,VAE 的重建 PSNR 约为 23-25 dB,SSIM 约为 0.70-0.75,人眼基本无法区分原始图像和重建图像。
U-Net 是扩散过程的核心神经网络,负责预测噪声。
结构特点:
各层参数规模(SD 1.5):
| 层级 | 分辨率 | 通道数 | 注意力层 | 交叉注意力 | 参数量 |
|---|---|---|---|---|---|
| 输入 | 64×64 | 320 | — | — | — |
| 下采样 1 | 64×64 | 320 | 自注意力 | 有 | ~14.7M |
| 下采样 2 | 32×32 | 640 | 自注意力 | 有 | ~29.4M |
| 下采样 3 | 16×16 | 1280 | 自注意力 | 有 | ~58.8M |
| 中间层 | 8×8 | 1280 | 自+交叉注意力 | 有 | ~58.8M |
| 上采样 3 | 16×16 | 1280 | 自注意力 | 有 | ~58.8M |
| 上采样 2 | 32×32 | 640 | 自注意力 | 有 | ~29.4M |
| 上采样 1 | 64×64 | 320 | 自注意力 | 有 | ~14.7M |
| 总计 | ~860M |
交叉注意力机制是实现文本控制的关键。在注意力层中:
其中:
这意味着每个像素位置的潜变量会"关注"与其语义相关的文本 token。例如,当生成"一只戴帽子的猫"时:
CLIP(Contrastive Language-Image Pre-training)将自然语言描述转换为模型可理解的向量表示。
| 版本 | 文本编码器 | 嵌入维度 | 最大 Token 数 | 特点 |
|---|---|---|---|---|
| SD 1.x | CLIP ViT-L/14 | 768 | 77 | 基础版,理解力适中 |
| SD 2.x | OpenCLIP ViT-H/14 | 1024 | 77 | 改进的中文/长文本 |
| SDXL | 双编码器(CLIP + OpenCLIP) | 1280 | 77×2 | 更丰富语义,支持风格控制 |
| SD 3 | 三个 T5-XXL + CLIP | 4096 | 512 | 深度文本理解,长 prompt 支持 |
Prompt 编码流程:
"一只戴帽子的猫在花园中散步"
1. Tokenization (CLIP tokenizer):
[49406, 175, 318, 14420, 539, 286, 11537, 1406, 4449, 49407]
(每个 token 映射到词汇表中的一个索引)
2. Embedding (文本编码器):
→ 77 × 768 维张量 (SD 1.x)
→ 每个 token 映射到 768 维向量
3. 传递给 U-Net:
在交叉注意力层中作为 K 和 V 使用
完整生成流程(以 SD 1.x 为例,50 步 DDIM 采样器):
步骤 0: z_T ≈ N(0, I) ← 随机噪声 (4×64×64)
↓
步骤 1-50: z_t → U-Net → ϵ_θ → z_{t-1} ← 逐步去噪
↓
步骤 50: z_0 ≈ 潜空间中的"干净"图像
↓
解码: x = VAE_decode(z_0) ← 重建为 512×512 RGB 图像
Classifier-Free Guidance (CFG) 控制文本条件的强度:
其中:
CFG 尺度的影响(其他参数固定时):
| CFG 尺度 | 图像特性 | 适合场景 | 典型问题 |
|---|---|---|---|
| 1.0–3.0 | 多样性高,但文本遵循弱 | 实验性艺术 | 可能不按 prompt 生成 |
| 5.0–7.5 | 推荐的平衡区间 | 大多数场景 | 质量/遵循度最佳 |
| 10.0–12.0 | 文本遵循强,色彩饱和度高 | 需要精确控制 | 可能出现过度饱和 |
| 15.0–20.0 | 极端遵循,图像可能不自然 | 特定精确需求 | 伪影、颜色失真 |
训练数据:LAION-5B 英文子集(约 2.3B 图文对),LAION-Aesthetics V2 5+ 筛选
核心参数:
性能数据(在 COCO 2017 验证集上):
| 指标 | SD 1.4 | SD 1.5 | 对比:DALL·E 2 | 对比:Imagen |
|---|---|---|---|---|
| FID ↓ | 12.63 | 12.22 | 10.39 | 7.27 |
| CLIP Score ↑ | 0.307 | 0.310 | 0.320 | 0.345 |
| 推理速度 (50步) | 1.5s (A100) | 1.5s (A100) | 10-15s (云端) | 60s+ (TPU) |
FID(Fréchet Inception Distance)越低表示生成图像与真实图像的分布越接近;CLIP Score 越高表示图像与文本描述的匹配度越好。
关键改进:
性能对比(SDXL Base + Refiner vs SD 1.5):
| 维度 | SD 1.5 (512×512) | SDXL (1024×1024) | 提升幅度 |
|---|---|---|---|
| 参数量 | 860M | 3.5B(Base) | 4× |
| 视觉质量 | 基础 | 显著更好 | 细节、构图、光照 |
| 文本理解 | 简单描述 | 复杂场景 | 处理多主体、关系 |
| 风格控制 | 有限 | 极好 | 水彩、油画、像素 |
| 提示词遵循 | 基础 | 优秀 | 更精确 |
| 最小 VRAM | 4GB | 8GB(fp16) | 2× |
| 推理时间 | 1.5s (A100, 50步) | 5s + 3s (Refiner) | 5-8× |
SDXL 特殊功能——微条件(Micro-Conditioning):
SDXL 在训练时注入额外信息:
这使 SDXL 理解不同分辨率和构图的语义,一个模型即可生成多种尺寸。
SDXL Turbo(2023.11):
SD 3.0(2024.02):
关键架构对比:
| 特性 | SD 1.5 | SDXL | SD 3 |
|---|---|---|---|
| 基础架构 | U-Net (CNN) | U-Net (CNN) | MMDiT (Transformer) |
| 文本编码器 | CLIP ViT-L | CLIP + OpenCLIP | CLIP + T5-XXL |
| 最大 token | 77 | 154 | 512 |
| 潜空间尺寸 | 64×64 | 128×128 | 128×128 |
| 分辨率 | 512×512 | 1024×1024 | 1024×1024 |
| 参数总量 | ~0.98B | ~6.6B (Base+Refiner) | ~8B |
| 训练数据 | LAION-5B | 内部数据集 | 内部数据集 |
| 开源协议 | CreativeML Open RAIL-M | Open RAIL++-M | Stability AI 许可 |
SD 3.5 是 SD 3 的改进版本,解决了 SD 3 的一些不足:
| 模型 | 最低 VRAM | 推荐 VRAM | 精度 | 典型速度 (RTX 4090) |
|---|---|---|---|---|
| SD 1.5 | 2GB | 4GB | fp16 | 10-15 img/min (50步) |
| SDXL Base | 4GB | 8GB | fp16 | 5-8 img/min (50步) |
| SDXL Base + Refiner | 6GB | 12GB | fp16 | 3-5 img/min |
| SDXL Turbo | 4GB | 8GB | fp16 | ~30 img/min (4步) |
| SD 3.5 Large | 8GB | 16GB | fp16 | 4-6 img/min (50步) |
不同采样器在生成质量、速度和多样性之间权衡:
| 采样器 | 步数范围 | 推荐步数 | 质量 | 速度 | 特点 |
|---|---|---|---|---|---|
| DDIM | 10-100 | 50 | ★★★★ | ★★★★ | 确定性,适合重绘 |
| PLMS | 10-100 | 50 | ★★★★ | ★★★★ | DDIM 优化版 |
| DPM++ 2M Karras | 10-50 | 20-30 | ★★★★★ | ★★★★★ | 综合推荐 |
| Euler | 10-100 | 20-30 | ★★★★ | ★★★★★ | 最快,质量不错 |
| Euler A | 10-100 | 30-40 | ★★★★ | ★★★★ | 更多多样性 |
| Heun | 10-50 | 20-30 | ★★★★★ | ★★★ | 高质量但慢 |
| LMS | 10-100 | 50 | ★★★ | ★★★★ | 早期采样器 |
| LCM | 1-8 | 4 | ★★★ | ★★★★★ | 极速推理 |
实际测试数据(同一 prompt,seed=42,512×512,RTX 4090):
| 采样器 | 步数 | 耗时 | FID (COCO) | CLIP Score |
|---|---|---|---|---|
| DPM++ 2M Karras | 20 | 0.4s | 14.8 | 0.312 |
| DPM++ 2M Karras | 30 | 0.6s | 12.1 | 0.318 |
| Euler | 20 | 0.35s | 16.3 | 0.305 |
| Euler | 30 | 0.5s | 14.5 | 0.310 |
| DDIM | 50 | 0.9s | 12.5 | 0.316 |
| LCM | 4 | 0.1s | 18.2 | 0.288 |
| 参数 | 取值范围 | 推荐值 | 效果说明 |
|---|---|---|---|
| CFG Scale | 1.0–20.0 | 7.0 | 越高越遵循 prompt,但可能过度饱和 |
| Steps | 1–150 | 20–30 (DPM++) / 50 (DDIM) | 越多质量越高,但收益递减 |
| Seed | 任意整数 | -1 (随机) | 固定 seed 可复现结果 |
| Width/Height | 64 倍数 | 512–1024 | 非正方形可能产生裁剪伪影 |
| Batch Size | 1–n | 根据 VRAM 调整 | SD 1.5:4GB → batch=1, 8GB → batch=4 |
| Negative Prompt | 文本 | "低质量, 模糊, 畸形" | 告诉模型不要生成什么 |
# pip install diffusers transformers accelerate torch
import torch
from diffusers import StableDiffusionPipeline
# 加载模型(首次下载约 2-4GB)
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16
)
pipe = pipe.to("cuda")
# 生成图像
prompt = "a majestic fantasy castle on a mountain peak, sunset, detailed painting"
negative_prompt = "low quality, blurry, distorted, ugly"
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
num_inference_steps=30,
guidance_scale=7.5,
height=512,
width=512,
seed=42
).images[0]
image.save("castle.png")
完整参数控制版本:
import torch
from diffusers import (
StableDiffusionPipeline,
DPMSolverMultistepScheduler,
)
from diffusers.utils import make_image_grid
# 使用 DPM++ 2M Karras 采样器
pipe = StableDiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-2-1",
torch_dtype=torch.float16,
safety_checker=None, # 对于研究目的可禁用安全检查器
)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(
pipe.scheduler.config,
use_karras_sigmas=True,
algorithm_type="dpmsolver++"
)
pipe = pipe.to("cuda")
# 文本编码器优化(降低显存)
pipe.enable_attention_slicing()
pipe.enable_vae_tiling()
# 批量生成多个变体
prompts = [
"a photo of a cute cat wearing a wizard hat",
"a beautiful landscape with mountains and lake",
"anime style portrait of a futuristic warrior",
]
generator = torch.Generator(device="cuda").manual_seed(42)
for i, prompt in enumerate(prompts):
image = pipe(
prompt=prompt,
negative_prompt="blurry, low quality",
num_inference_steps=25,
guidance_scale=7.0,
generator=generator,
).images[0]
image.save(f"output_{i}.png")
print(f"Generated output_{i}.png")
| 技术 | 说明 | VRAM 节省 | 速度影响 | 代码 |
|---|---|---|---|---|
| 注意力切片 | 分块计算注意力 | ~30% | 略慢 | pipe.enable_attention_slicing() |
| VAE 平铺 | 分块解码大图 | ~40% | 略慢 | pipe.enable_vae_tiling() |
| 模型级联 | 将模型移到 CPU | 可降至 2GB | 显著变慢 | pipe.enable_model_cpu_offload() |
| fp16 推理 | 半精度计算 | 50% | 略快 | torch_dtype=torch.float16 |
| Torch Compile | 编译优化 | 不变 | 30-50% 加速 | pipe.unet = torch.compile(pipe.unet) |
| 工具/平台 | 类型 | 特点 | 适用人群 |
|---|---|---|---|
| Automatic1111 WebUI | Web 界面 | 功能最全,500+ 扩展 | 高级用户、研究者 |
| ComfyUI | 节点式工作流 | 可视化编程,灵活组合 | 开发者、工作流设计 |
| InvokeAI | Web 界面 | 专业图像编辑,画布重绘 | 数字艺术家 |
| Fooocus | 极简 UI | 一键生成,预设风格 | 入门用户 |
| Diffusers | Python 库 | 官方实现,API 完善 | 开发者、ML 工程师 |
| SD.Next | Web 界面 | A1111 改进版,更多优化 | 高级用户 |
| Forge | Web 界面 | A1111 分支,优化显存 | 低显存用户 |
LoRA(Low-Rank Adaptation):
ControlNet:
IP-Adapter:
Textual Inversion:
常见技术组合示例:
prompt + ControlNet(Canny) + LoRA(Style) + IP-Adapter(Reference)
↓
生成结果:指定构图 + 特定画风 + 参考配色
| 场景 | 使用方式 | 代表工具 | 效果评估 |
|---|---|---|---|
| 概念设计 | prompt → 快速迭代 | Midjourney / SD + ControlNet | 30分钟产出 100+ 概念草图 |
| 游戏资产 | 生成 → 修复 → 后处理 | SD + Photoshop | 节省 60-80% 初期设计时间 |
| 电商展示 | 产品图 + 背景生成 | SD + Inpainting | 无需实拍场景,成本降低 90% |
| 建筑可视化 | 线稿 → SD ControlNet → 细化 | SD + ControlNet(Scribble) | 快速呈现多种设计风格 |
| 角色设计 | Textual Inversion + LoRA | SD + Kohya Trainer | 一致的角色外观 |
| 视频帧插值 | 关键帧 → SD 生成 → 插值 | Stable Video Diffusion | 初步动画制作 |
| 维度 | Stable Diffusion | Midjourney | DALL·E 3 | Adobe Firefly |
|---|---|---|---|---|
| 开源性 | ✅ 完全开源 | ❌ 闭源 | ❌ 闭源 | ❌ 闭源 |
| 本地运行 | ✅ 本地 GPU | ❌ 仅云端 | ❌ 仅 OpenAI | ❌ 仅 Adobe |
| 免费使用 | ✅ 完全免费 | ❌ $10-120/月 | ✅ 有限免费 | ✅ 有限免费 |
| 自定义训练 | ✅ LoRA/DreamBooth | ❌ | ❌ | ❌ |
| 插件生态 | ⭐⭐⭐⭐⭐ 极丰富 | ⭐⭐ 有限 | ⭐ 无 | ⭐⭐ 有限 |
| 文字生成 | ⭐⭐⭐ (SD3 改进) | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 人像质量 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Prompt 简洁性 | ⭐⭐⭐ 需详细 | ⭐⭐⭐⭐⭐ 简短即可 | ⭐⭐⭐⭐ 自然语言 | ⭐⭐⭐⭐ 自然语言 |
| 商业使用 | 视许可协议 | ✅ 付费版 | ✅ | ✅ |
| 生成速度 | 1-5 秒 (本地) | 30-60 秒 | 10-30 秒 | 5-15 秒 |
| 隐私 | ✅ 完全私有 | ❌ 数据上传 | ❌ 数据上传 | ❌ 数据上传 |
| 你的需求 | 推荐工具 | 理由 |
|---|---|---|
| "我要完全控制生成过程的每个细节" | Stable Diffusion (ComfyUI) | 节点式工作流,可精确控制每一步 |
| "我需要快速出高质量概念图,不想折腾" | Midjourney | 最短 prompt 出最好效果,但无法本地部署 |
| "我需要生成准确的文字或详细描述" | DALL·E 3 | 文本理解能力最好 |
| "我做的内容需要严格版权合规" | Adobe Firefly | 版权安全——商业使用无风险 |
| "我想自己微调模型,做专属风格" | Stable Diffusion | 唯一支持 LoRA/DreamBooth 的主流工具 |
| "我需要批量生成,用于自动化 pipeline" | Stable Diffusion (diffusers) | Python API 最完善 |
| 问题 | 表现 | 原因 | 缓解方案 |
|---|---|---|---|
| 手指畸形 | 手指数量、角度错误 | 训练数据中手部区域小、姿势多样 | ControlNet + 手部修复模型 |
| 文本渲染差 | 文字乱码/不准确 | CLIP 编码器对文字理解有限 | SD 3 使用 T5-XXL 改进显著 |
| 构图偏差 | 物体居中、对称 | 训练数据裁剪不均 | ControlNet 构图控制 |
| 风格泛化差 | 难以精确匹配特定风格 | 单一文本编码器无法编码复杂风格 | LoRA 风格训练 |
| 低分辨率细节 | 生成图像放大后模糊 | 在 512/1024 分辨率训练 | 超分辨率模型 (ESRGAN) |
| 方向 | 当前进展 | 预期影响 |
|---|---|---|
| 实时生成 | SDXL Turbo 1-4 步 | 视频实时生成成为可能 |
| 视频生成 | Stable Video Diffusion | 从静图到短片生成 |
| 3D 生成 | Stable Zero123, Magic3D | 从文生图到文生 3D 模型 |
| 更高分辨率 | SDXL 1024+, Cascade scaling | 原生 4K 生成 |
| 更轻量化 | 量化、蒸馏、剪枝 | 手机端运行 |
| 多模态融合 | SD 3 MMDiT | 一模型支持文字、图像、3D、视频 |