前篇回顾:
Stable Diffusion 是 一种基于潜空间扩散(Latent Diffusion)的深度学习模型,用于生成高质量图像。它由 CompVis于 2022 年发布,随后由 Stability AI 进行优化和推广。
Stable Diffusion 属于扩散模型(Diffusion Models)的范畴,其基本原理是:①训练阶段:给真实图像不断添加噪声,让模型学习如何逐步去噪恢复原图。②生成阶段:从纯噪声开始,逐步去噪生成符合文本描述的图像。与早期扩散模型(如 DDPM, DDIM)相比,Stable Diffusion 进行了多项优化,使其计算量大幅降低,能在消费级显卡上运行。
1.stable diffusion 发展及版本
Stable Diffusion (SD)是基于扩散模型的文生图模型
- 2021.12 早期由StabilityAI资助,CompVis与Runway ML联合研究,发布paperLDM
- 2022.08 CompVis发布SD1.1~SD1.4
- 2022.10 Runway ML发布SD1.5
- ·2022.11 StabilityAl发布SD2.0
- 至今此后发布便一直以Stability Al名义发布模型
2.整体架构
Stable Diffusion由三部分组成:
- VAE(变分自编码器):①编码器:将原始图像(Pixel Space)压缩到低维潜在空间(Latent Space),显著降低计算量(如512x512图像→64x64潜在表示)。②解码器:将去噪后的潜在变量还原为像素空间图像。
- 扩散模型:在潜在空间中执行正向(加噪)和反向(去噪)过程。
- 条件化U-Net:结合交叉注意力机制,通过文本、图像等条件引导生成过程。
简而言之,LDM与DDPM的关系:
- LDM=VAE + DDPM
- LDM在语义空间做difusion
- LDM有更多模态的融入: ①类别融入 ②文本融入
①VAE
VAE的具体过程可以参考这篇文章:VAE学习笔记-优快云博客
- 编码阶段:原始图像 x 经VAE编码器压缩为潜在变量 Z0,作为扩散过程的起点。
- 扩散过程:在潜在空间中对 Z0 逐步加噪,生成 Z1,Z2,…,ZT
- 生成阶段:去噪后的潜在变量 Z0 经VAE解码器还原为最终图像:
为什么要加VAE?
- 降低计算复杂度:直接在像素空间(如512×512图像)执行扩散过程需要处理百万级维度(3×512×512=786,432),计算量和内存消耗巨大。VAE将图像压缩到低维潜在空间(如64×64×4=16,384维)。
- 潜在空间的连续性与稳定性:问题:像素空间中高频噪声会导致扩散过程不稳定,生成图像细节模糊。VAE的潜在空间是连续且平滑的,更适合扩散模型逐步去噪。
- 数据分布建模的简化:直接建模高维像素空间的复杂分布极其困难。
- 高质量重建能力:普通自编码器(AE)的潜在空间缺乏概率约束,重建质量不稳定。VAE通过KL散度约束潜在空间分布。
②扩散过程
Stable Diffusion支持多种采样方法,包括DDPM和DDIM,默认常用DDIM以实现快速生成。扩散过程的具体内容可见之前的笔记,再次不做赘述
噪声预测目标:
无论使用DDPM或DDIM,U-Net的目标均为预测噪声 :
其中 ,
为噪声调度系数,xxx为条件。
③U-Net
(1) U-Net的输入与输出
-
输入:带噪潜在变量 Zt、时间步 t、条件嵌入(如文本向量)。
-
输出:预测的噪声 ϵθ。
(2) 核心组件
-
编码器(下采样):
-
由多个残差块(ResNet Block)组成,每块包含:
-
卷积层 + 组归一化(GroupNorm) + SiLU激活。
-
时间嵌入 t 通过MLP映射为向量,与特征相加。
-
-
时间嵌入公式:
(ω 为频率参数,用于编码时间步的周期性信息)
-
-
中间层(Bottleneck):
-
自注意力层:捕捉潜在变量内部的全局依赖(如物体间位置关系)。
-
交叉注意力层:条件信息(文本)与图像特征的交互。
-
公式:
-
Q:U-Net的中间特征(Query)。
-
K,V:条件嵌入(如CLIP文本编码的投影)。
-
-
-
-
解码器(上采样):
-
使用转置卷积或插值法逐步恢复分辨率。
-
跳跃连接:将编码器每层的特征与解码器对应层拼接,保留细节。
-
(3) 条件注入机制
-
文本条件:CLIP文本编码器生成的向量
,通过交叉注意力与U-Net特征交互。
-
其他条件:语义图、参考图像等可通过类似方式注入。
stable diffusion的大致训练和采样过程可以归纳为如下的图:
3.复现
最后尝试复现程序,这篇文章给了我很大的帮助
Stable-diffusion复现笔记_stable diffusion 复现-优快云博客
stablediffusion$ python txt2img.py --ckpt "sd-v1-4.ckpt" --prompt "a photograph of lolita girl in black" --plms --H 512 --W 512
这个stable diffusion也是被我给玩上了(笑)