图像生成
Stable Diffusion 原理、LoRA/DreamBooth 模型微调、ComfyUI 工作流、ControlNet
图像生成技术概览
图像生成技术在过去十年间经历了多次范式跃迁。早期以生成对抗网络(GAN)为主导,由 Goodfellow 等人于 2014 年提出,通过生成器与判别器的对抗训练实现逼真图像合成。StyleGAN 系列将 GAN 在面部生成等领域的质量推至巅峰,但其训练不稳定、模式崩塌等问题始终存在。变分自编码器(VAE)作为另一条路线,提供了概率建模的框架,但生成图像的清晰度通常低于 GAN。
2020 年,扩散模型(Diffusion Models)由 DDPM(Denoising Diffusion Probabilistic Models)正式引入计算机视觉领域。与 GAN 不同,扩散模型通过学习逐步去噪的过程生成图像,训练稳定、覆盖模式完整。2022 年,Stable Diffusion 的发布将扩散模型从像素空间转移到潜在空间,大幅降低了计算成本,使得在消费级 GPU 上运行成为可能。此后,扩散模型迅速成为图像生成的主流范式,DALL-E 3、Midjourney、FLUX 等模型相继涌现。
下表对比了几代技术的核心特征:
| 技术路线 | 代表模型 | 优势 | 劣势 |
|---|---|---|---|
| GAN | StyleGAN, BigGAN, CycleGAN | 生成速度快,单步推理 | 训练不稳定,模式崩塌 |
| VAE | VQ-VAE, VQ-GAN | 概率建模,潜空间可插值 | 生成图像偏模糊 |
| 扩散模型 | DDPM, Stable Diffusion, DALL-E 3 | 训练稳定,覆盖完整,质量高 | 多步推理速度较慢 |
| 自回归模型 | DALL-E, Parti | 文本到图像对齐好 | 生成顺序受限,速度慢 |
Stable Diffusion 原理
Stable Diffusion 是目前开源社区影响力最大的图像生成模型,其核心创新在于将扩散过程从像素空间转移到潜在空间,从而大幅降低计算开销。
潜在扩散模型
标准扩散模型直接在像素空间操作,生成一张 512x512x3 的图像需要在高维空间中进行去噪,计算量极大。Stable Diffusion 引入潜在扩散模型(Latent Diffusion Model, LDM),先通过预训练的 VAE 将图像压缩到维度更低的潜在空间(如 64x64x4),在此空间中执行扩散过程,最后再通过 VAE 解码器将潜在表示恢复到像素空间。这一策略使得模型可以在消费级 GPU 上运行。
三组件架构
Stable Diffusion 由三个核心组件构成:
VAE Encoder / Decoder:将图像从像素空间编码到潜在空间,再从潜在空间解码回像素空间。编码过程是有损压缩,但经过训练后能在降维 48 倍的同时保留语义信息。VAE 的 KL 正则化项使得潜在空间具有规则的分布结构,便于扩散模型学习。
UNet(去噪网络):采用 U-Net 结构的神经网络,接收带噪的潜在变量和时间步编码,预测当前步添加的噪声。UNet 通过下采样-上采样路径和多层跳跃连接(Skip Connection)捕获多尺度特征。每个块中包含残差连接与自注意力机制,同时在跨注意力层(Cross-Attention)中注入文本条件。
CLIP Text Encoder:OpenAI 的 CLIP 模型将文本提示编码为高维语义向量。Stable Diffusion 使用 CLIP 的文本编码器(通常为 ViT-L/14 或类似结构),将用户输入的 prompt 转换成 768 维(SD 1.x)或 1024 维(SD 2.x, SDXL)的 token embedding,这些 embedding 通过 Cross-Attention 注入 UNet 的中间层。
前向扩散与反向去噪
前向扩散过程定义为逐步向数据添加高斯噪声的马尔可夫链。给定初始图像 $x_0$,经过 $T$ 步(通常 T=1000)的噪声添加后,最终图像 $x_T$ 趋近于标准正态分布。每一步的转移公式为:
$$q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t} x_{t-1}, \beta_t I)$$
其中 $\beta_t$ 是预设的噪声方差调度。
反向去噪过程是模型学习的核心:给定一个随机噪声 $x_T$,模型逐步预测并去除噪声,最终还原出清晰图像 $x_0$。模型实际上学习的是预测添加的噪声 $\epsilon_\theta(x_t, t, \text{condition})$,而不是直接预测图像本身。在推理时,从纯噪声出发,按照采样器的调度逐步去噪。
采样器对比
扩散模型的采样过程可以通过不同的采样器加速或改善质量,常用的采样器如下:
| 采样器 | 特点 | 推荐步数 | 适用场景 |
|---|---|---|---|
| DDIM | 确定性采样,可重现结果,支持 inversion | 20-50 | 需可重复的图像编辑 |
| DPM++ 2M | 快速收敛,二阶求解器 | 10-30 | 日常高质量生成,推荐默认 |
| DPM++ 2S Ancestral | 引入随机噪声,多样性好 | 10-30 | 需要多样化输出时 |
| Euler Ancestral | 一阶求解器 + 随机性,速度最快 | 10-30 | 快速预览草图 |
| Euler | 确定性的一阶求解器 | 20-50 | 追求简洁可重现 |
| LCM-LoRA | 极低步数(1-4步),需配合 LoRA | 1-8 | 实时生成或批量预览 |
CFG Scale
无分类器引导(Classifier-Free Guidance, CFG)是控制生成结果与提示之间一致性的关键参数。其核心思路是在采样过程中同时计算有条件预测(给定 prompt)和无条件预测(空文本 "")的噪声估计,然后通过以下方式外推:
$$\hat{\epsilon}\theta = \epsilon\theta(x_t, t, \varnothing) + \text{cfg_scale} \cdot (\epsilon_\theta(x_t, t, c) - \epsilon_\theta(x_t, t, \varnothing))$$
- cfg_scale = 1.0:不使用引导,生成质量低但多样性强。
- cfg_scale = 7.0:常用默认值,质量和一致性平衡良好。
- cfg_scale > 15:对提示的遵循度极高,但可能导致色彩过饱和或伪影。
LoRA / DreamBooth 模型微调
LoRA 在扩散模型中的应用
LoRA(Low-Rank Adaptation)最初为大语言模型设计,后被高效地引入扩散模型微调。其核心思想是在模型权重矩阵旁并联一个低秩分解矩阵 $W = W_0 + BA$,其中 $B \in \mathbb{R}^{d \times r}$,$A \in \mathbb{R}^{r \times k}$,且秩 $r \ll \min(d, k)$。训练时仅更新 $B$ 和 $A$,原始权重 $W_0$ 保持不变。
在 Stable Diffusion 中,LoRA 主要作用于 UNet 的 Cross-Attention 层的 QKV 投影矩阵和输出投影矩阵。以 SD 1.5 为例,LoRA 的典型配置为 rank=64 或 rank=128,训练参数量仅为完整模型的 0.1%-0.5%。一个训练好的 LoRA 权重文件通常只有 50-200 MB,便于分发和组合使用。
from diffusers import StableDiffusionPipeline
import torch
# 加载基础模型
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16,
)
pipe.to("cuda")
# 加载 LoRA 权重
pipe.load_lora_weights(
"lora-weights/pokemon-lora",
weight_name="pytorch_lora_weights.safetensors",
)
# 设置 LoRA 融合强度(可选,默认为 1.0)
pipe.fuse_lora(lora_scale=0.8)
# 生成图像
image = pipe(
"a cute pokemon in the style of oil painting",
num_inference_steps=30,
guidance_scale=7.5,
).images[0]
image.save("output.png")
# 也可以不融合 LoRA,在推理时动态合并
pipe.unfuse_lora()DreamBooth
DreamBooth 是 Google 提出的一种个性化微调方法,使用少量(通常 3-10 张)特定主题的图像微调完整的 UNet,使模型学会生成该主题在不同上下文中的图像。其关键机制包括:
- 独特令牌([V]):在文本编码器的词表中注册一个稀有令牌字符串(如 "sks"),将该令牌与目标主题绑定。
- 完整 UNet 微调:LoRA 只需训练少量参数,DreamBooth 则对整个 UNet 进行微调,因此效果更强但计算开销也更大。
- 先验保留损失:为防止过拟合导致灾难性遗忘,DreamBooth 额外引入一项损失,鼓励模型在同类对象上仍能保持先验知识。例如微调特定人物的肖像时,同时用 "a photo of person" 的提示保持模型对人物类别的泛化能力。
在实际应用中,DreamBooth 和 LoRA 常搭配使用:先通过 DreamBooth 流程训练一个 UNet,再将其权重蒸馏为 LoRA 格式,便于分享和加载。Hugging Face 的 diffusers 库提供了 DiffusionPipeline.from_pretrained() 结合 load_lora_weights() 的统一接口。
| 特性 | LoRA | DreamBooth |
|---|---|---|
| 训练参数量 | 0.1%-0.5% | 100% |
| 训练时间(A100) | 5-15 分钟 | 10-30 分钟 |
| 输出权重大小 | 50-200 MB | 2-7 GB |
| 适用场景 | 风格迁移、角色概念 | 高一致性主题生成 |
| 组合多条 LoRA | 支持 | 不支持 |
ComfyUI 工作流
ComfyUI 是基于节点图(Node Graph)的 Stable Diffusion 用户界面。与 WebUI(Automatic1111)的标签式操作不同,ComfyUI 将生成流程拆解为一系列可连接的节点,用户通过拖拽连线构建完整的推理流程。
与 WebUI 的对比
| 特性 | ComfyUI | WebUI |
|---|---|---|
| 交互方式 | 节点图可视化编程 | 标签页 + 参数表单 |
| 工作流可复用性 | 导出 JSON 完整恢复 | 需要脚本或截图 |
| 内存效率 | 极优,可串联复杂流程 | 较高 |
| 学习曲线 | 陡峭 | 平缓 |
| 扩展生态 | 社区节点丰富 | 插件市场成熟 |
| 批量处理能力 | 原生支持 | 需要额外脚本 |
常见节点
- Checkpoint Loader:加载 Stable Diffusion 主模型 checkpoint。
- CLIP Text Encode:接受用户输入的 prompt,调用 CLIP Text Encoder 输出条件 embedding。通常需要两个节点(正向 prompt + 负向 prompt)。
- KSampler:核心采样节点,配置采样器类型(DDIM/DPM++/Euler 等)、步数(steps)、CFG Scale、随机种子。其输出为潜在空间特征。
- VAE Decode:将 KSampler 输出的潜在表示解码为 RGB 图像。
- ControlNet Loader + Apply ControlNet:加载 ControlNet 模型并将条件图像注入 UNet。
- VAE Encode:在 img2img 模式中使用,将输入图像编码到潜在空间。
- Latent Upscale:在潜在空间放大图像尺寸后再解码,节省内存。
一个典型的文生图工作流为:Checkpoint Loader -> CLIP Text Encode -> KSampler -> VAE Decode -> Save Image。通过调整连接结构即可扩展为图生图、ControlNet、视频帧插值等复杂流程。
ControlNet
ControlNet 是 2023 年由张吕敏提出的条件生成控制技术,允许用户通过边缘图、深度图、姿态骨架等额外条件精确控制生成结果的结构。
控制条件类型
| 控制类型 | 输入条件 | 典型应用 |
|---|---|---|
| Canny Edge | Canny 边缘检测图 | 线稿上色、结构保持 |
| Depth | 深度图(MiDaS / ZoeDepth) | 保持三维空间布局 |
| OpenPose | 人体姿态骨架 | 角色姿势控制 |
| Scribble | 手绘涂鸦 | 创意草图到成品 |
| SoftEdge | 软边缘(HED 检测) | 温和结构控制 |
| Normal Map | 法线贴图 | 精细几何控制 |
| MLSD | 直线检测 | 室内设计、建筑 |
| Segmentation | 语义分割图 | 分区内容控制 |
| IP-Adapter | 参考图像 | 图像风格迁移 |
| Lineart | 线稿提取 | 漫画/线稿上色 |
ControlNet 架构
ControlNet 的设计充分考虑了与现有扩散模型的兼容性。其核心思路如下:
- 零卷积:ControlNet 的输入层和输出层使用权重和偏置均初始化为零的 1x1 卷积层。这使得在训练初期,ControlNet 不干扰原始 UNet 的输出,确保微调过程稳定。
- 训练冻结 UNet:在 ControlNet 训练过程中,原始 UNet 的权重被完全冻结。仅训练 ControlNet 的副本网络,该网络以与 UNet 相同的结构从中间层复制,并通过零卷积与原始 UNet 各层的输出相加。
- 条件注入:控制条件(如 Canny 边缘图)首先经过一个小型特征提取网络(由卷积层组成),转换为与 UNet 输入兼容的特征图,然后注入到 UNet 编码器各阶段的对应层中。
由于 ControlNet 训练时冻结了 UNet,其训练成本远低于完整微调,且一个 ControlNet 模型可适配多种 LoRA 和风格。目前 Hugging Face 已集成 ControlNet 到 diffusers,可通过 StableDiffusionControlNetPipeline 直接调用。
其他模型
DALL-E 3
OpenAI 开发的 DALL-E 3 是闭源商业模型,在文本理解能力上有重大突破。其核心改进是使用图像描述模型为训练数据自动生成详细 caption,使模型对复杂文本提示的遵循能力远超 DALL-E 2 和 Stable Diffusion 1.x。DALL-E 3 直接在 ChatGPT 生态中集成,用户可通过对话自然语言描述需求。
Midjourney
Midjourney 以强大的美学表现力著称,通过 Discord 提供服务。其模型版本迭代迅速(V1 到 V6),在艺术风格、光影质感、氛围营造方面表现突出。Midjourney 对 prompt engineering 依赖度高,高级用户常用参数(如 --ar, --s, --iw, --stylize)精细控制输出。其不提供本地部署选项,所有推理通过云端完成。
FLUX
FLUX 是 Black Forest Labs(由原 Stable Diffusion 核心团队创立)开发的下一代潜在扩散模型系列。FLUX.1 系列包含三个版本:
- FLUX.1-pro:闭源商业版,性能对标 Midjourney 和 DALL-E 3。
- FLUX.1-dev:开源版本,使用 Guidance Distillation 优化,推理步数从 50 降低到 28。
- FLUX.1-schnell:超高速开源版本,仅需 4 步采样即可产出高质量图像。
FLUX 在架构上的主要改进包括:使用双文本编码器(CLIP + T5-XXL)、引入流匹配(Flow Matching)替代传统扩散目标函数、采用 RoPE 位置编码增强长序列处理能力。FLUX.1-dev 和 FLUX.1-schnell 已可在 ComfyUI 和 diffusers 中使用。
能力对比
| 模型 | 开源 | 本地运行 | 文本理解 | 审美质量 | 速度 |
|---|---|---|---|---|---|
| Stable Diffusion 3.5 | 是 | 是 | 良 | 良 | 中等 |
| FLUX.1-dev | 是 | 是(需高显存) | 优 | 优 | 较慢 |
| DALL-E 3 | 否 | 否 | 优 | 优 | API 调用 |
| Midjourney V6 | 否 | 否 | 良 | 优 | API 调用 |
总结
图像生成技术已从学术研究走向广泛的应用落地。Stable Diffusion 凭借其开源生态和潜在扩散架构,成为了社区的核心基础设施;LoRA 和 DreamBooth 赋予了模型个性化定制能力;ComfyUI 提供了灵活的工作流编排平台;ControlNet 则让结构控制变得精确可靠。随着 FLUX 等新一代模型的开源和硬件效率的提升,图像生成正在向更高分辨率、更精准对齐和更低延迟的方向持续演进。