浅浅速通一下Stable Diffusion
1. Stable Diffusion 介绍
Stable Diffusion(SD)是基于 扩散模型(Diffusion Models, DM) 的一种文本到图像(Text-to-Image)生成模型,采用 潜在扩散(Latent Diffusion Model, LDM) 以提高计算效率。它可以:
- 根据文本提示(Prompt) 生成图像
- 进行 图像到图像(img2img) 变换
- 结合 ControlNet、LoRA 进行微调和风格控制
Stable Diffusion vs. 传统扩散模型
- 传统扩散模型在 像素空间(Pixel Space) 进行去噪,计算量大
- Stable Diffusion 在 潜在空间(Latent Space) 进行去噪,计算更高效
2. Stable Diffusion 的核心架构
Stable Diffusion 由 四个核心组件 组成:
- 文本编码器(Text Encoder, CLIP / T5)
- 潜在扩散模型(Latent Diffusion Model, LDM)
- UNet 去噪网络
- VAE 变分自编码器
2.1 文本编码器(CLIP 或 DeepFloyd T5)
Stable Diffusion 使用 CLIP 文本编码器(SD 1.5 / 2.1) 或 DeepFloyd T5(SDXL) 来处理文本输入。
作用
- 将输入的文本
prompt
变成高维向量 文本嵌入(Text Embeddings) - 这些嵌入将指导扩散模型生成符合语义的图像
CLIP 文本编码器
- 采用 Transformer 结构
- 生成固定长度的 文本向量(Text Embedding)
- 提供 跨模态对比学习能力
DeepFloyd T5
- SDXL 采用 更强的文本编码器,能够解析更复杂的句子结构,提高 Prompt 理解能力
2.2 潜在扩散模型(Latent Diffusion Model, LDM)
扩散模型的基本原理
扩散模型(Diffusion Model, DM)是一种 概率生成模型,由两部分组成:
- 前向扩散(Forward Diffusion):将干净图像逐步添加噪声
- 逆向去噪(Reverse Denoising):学习去除噪声,重构原始图像
数学公式
-
前向过程:
\[q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t I)\]其中:
- $x_t$ 是时间步 的噪声图像
- $\beta_t$ 是噪声调节参数
- 经过多个时间步,最终 $x_T$ 接近标准高斯分布 $\mathcal{N}(0, I)$
-
逆向去噪过程:
\[p(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \sigma^2 I)\]- UNet 负责学习 $\mu_\theta(x_t, t)$,即如何从噪声恢复原图
为什么使用潜在扩散?
- 在像素空间扩散计算成本高
- Stable Diffusion 先用 VAE 压缩图像 到潜在空间,再进行扩散
2.3 UNet 生成网络
UNet 负责 去噪,从噪声中恢复图像。它的结构包括:
- 编码器(Encoder) 提取特征(ResNet + Self-Attention)
- 解码器(Decoder) 生成图像
- 跳跃连接(Skip Connection) 保持高分辨率信息
- 自注意力机制(Self-Attention) 处理远程依赖
2.4 VAE 变分自编码器
VAE 负责:
- 压缩 原始图像到潜在空间
- 解码 潜在表示为最终图像
Stable Diffusion 使用 预训练 VAE:
- 编码器 $E(x)$ 将 512×512 图像映射到 64×64 潜在空间
- 解码器 $D(z)$ 负责将潜在表示恢复为清晰的图像
3. Stable Diffusion 的推理流程
Stable Diffusion 生成图像的完整流程如下:
1️⃣ 文本编码
- 使用 CLIP / T5 文本编码器将
prompt
转换为 文本嵌入
2️⃣ 初始化噪声
- 在潜在空间初始化一个 随机高斯噪声
3️⃣ 去噪过程
- 采用 UNet 逐步去噪,使用 扩散采样器(如 Euler、DPM-Solver++)
4️⃣ VAE 解码
- 将去噪后的潜在表示 解码为最终图像
4. 扩展优化
4.1 采样算法
不同的采样器影响生成速度和质量:
- Euler A(速度快,适合创意生成)
- DPM-Solver++(高质量,最常用)
- DDIM(快但细节可能损失)
4.2 ControlNet
ControlNet 允许对 生成图像施加额外控制:
- Canny 边缘(保持物体形状)
- OpenPose(控制人物姿势)
- Depth Map(深度感知)
4.3 LoRA 低秩适配
LoRA 是一种轻量级微调方法:
- 允许用户训练个性化模型
- 计算成本低,可以在 普通 GPU 上训练
5. 代码实现
以下是一个基本的 Stable Diffusion 推理代码(基于 diffusers
库):
from diffusers import StableDiffusionPipeline
import torch
# 加载预训练 Stable Diffusion 模型
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
pipe.to("cuda")
# 设置 Prompt
prompt = "A futuristic cyberpunk city at night with neon lights"
# 生成图像
image = pipe(prompt).images[0]
# 显示图像
image.show()
加入 ControlNet
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny")
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", controlnet=controlnet
)
# 生成带有 Canny 约束的图像
image = pipe(prompt, image=processed_canny_image).images[0]
image.show()
总结
- Stable Diffusion 采用 潜在扩散模型(LDM),在 潜在空间 进行扩散,提高计算效率
- 主要组件包括 文本编码器(CLIP / T5)、UNet、VAE
- 采样器、ControlNet 和 LoRA 可以 优化和控制生成过程
- 可用于 文本生成、风格迁移、局部编辑