前篇回顾:
DDPM学习笔记-CSDN博客
DDIM学习笔记_ddim网络参数有哪些-CSDN博客
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),显著降低计算量(如512×512图像→64×64潜在表示)。②解码器:将去噪后的潜在变量还原为像素空间图像。
扩散模型:在潜在空间中执行正向(加噪)和反向(去噪)过程。
条件化U-Net:结合交叉注意力机制,通过文本、图像等条件引导生成过程。
简而言之,LDM与DDPM的关系:
LDM=VAE + DDPM
LDM在语义空间做difusion
LDM有更多模态的融入: ①类别融入 ②文本融入
①VAE
VAE的具体过程可以参考这篇文章:VAE学习笔记-CSDN博客
编码阶段:原始图像 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的输入与 输出
(2) 核心组件
编码器(下采样):
中间层(Bottleneck):
解码器(上采样):
(3) 条件注入机制
stable diffusion的大致训练和采样过程可以归纳为如下的图:
3.复现
最后尝试复现程序,这篇文章给了我很大的帮助
Stable-diffusion复现笔记_stable diffusion 复现-CSDN博客
stablediffusion$ python txt2img.py –ckpt “sd-v1-4.ckpt” –prompt “a photograph of lolita girl in black” –plms –H 512 –W 512
这个stable diffusion也是被我给玩上了(笑)
文章来源于互联网:Stable Diffusion 学习笔记
目录
1. 扩散模型
2. DDPM 和 DDIM
3. Latent Diffusion Models
4. Stable Diffusion Models
参考链接
1. 扩散模型
扩散模型包括两个过程:前向过程和反向过程,其中前向过程即扩散过程。前向过程和反向过程都是一个参数化的马尔可夫链(Markov chai n),其中反向过程可以用来生成数据。
扩散过程
扩散过程即对数据逐渐增加高斯噪音 直至数据变成随机噪音的过程。
, 即每一步采用的方差,variance schedule或noise schedule,介于0-1之间,满足 。所以在一个设计好的variance schedule下,如果T足够大,则 将完全丢失原始数据从而变成一个随机噪声(DDPM采用的是一个线性的variance schedule)。整个扩散过程即一个马尔可夫链:
扩散过程可以对原始数据 任意t步的 进行采样,即 。
定义 和 ,通过重参数技巧,得到:
注: merges two Gaussians (*),以此类推。该推导过程利用了两个方差不同的高斯分布 和 相加等于一个新的高斯分布 。
反向过程
反向过程即去噪过程,也定义为马尔可夫链,有一系列用神经网络参数化的高斯分布 组成。
其中 , 是参数化的高斯分布,其均值和方差由训练网络得到,即扩散模型的训练目标(用神经网络 拟合真实分布 )。
对于DDPM,前向过程(扩散过程)和反向过程(生成过程)都是一个马尔可夫链。前向即不断增加高斯噪声,控制噪声的权重随着迭代越来越大,最后在T时刻近似于随机噪声。反向过程即不断去噪,其马尔可夫链与前向的主要区别是,其t-1时刻的高斯分布的均值和方差由训练模型获得。
优化目标
基于变分推断 来得到variational lower bound (VLB) 作为最大化优化目标。最终得到的优化目标即让网络预测的噪音和真实的噪音一致。
2. DDPM 和 DDIM
DDPM (Denoising Diffusion Probabilistic Models) 采用的模型是一个基于残差模块和注意力模块的UNet模型。U-Net属于encoder-decoder架构,其中encoder分成不同的stages,每个stage都包含下采样模块来降低特征的空间大小,然后decoder和encoder相反,是将encoder压缩的特征逐渐恢复。
U-Net在decoder模块中还引入了skip connection,即concat了encoder中间得到的同维度特征,利于网络优化。DDPM所采用的U-Net每个stage包含2个residual block,而且部分stage还加入了self-attention模块增加网络的全局建模能力。
另外,扩散模型其实需要的是T个噪声预测模型,实际处理时,我们可以增加一个time embedding(类似transformer中的position embedding)来将timestep编码到网络中,从而只需要训练一个共享的U-Net模型。具体地,DDPM在各个residual block都引入了time embedding。
DDIM (Denoising Diffusion Implicit Models) 和DDPM训练目标相同,特点之一是不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪声生成样本的过程是一个确定的过程(中间没有加入随机噪声)。
分析DDPM的优化目标会发现其只依赖于边缘分布 ,而不是直接作用于联合分布 。即DDPM这个隐变量模型可以有很多推理分布来选择,只要推理分布满足边缘分布条件(扩散过程的特性)即可,而且这些推理过程并不一定要是马尔卡夫链。但值得注意的一个点是,要得到DDPM的优化目标,还需要知道分布 ,之前在根据贝叶斯公式推导这个分布时是知道分布 的,而且依赖了前向过程的马尔卡夫链特性。如果要解除对前向过程的依赖,那么就需要直接定义这个分布 。 基于上述分析,DDIM论文中将推理分布定义为:
具体参考:
扩散模型之DDPM – 知乎“What I cannot create, I do not understand.” — Richard Feynman 近段时间最火的方向无疑是 基于文本用AI生成图像,继OpenAI 在2021提出的文本转图像模型DALLE之后,越来越多的大公司卷入这个方向,如谷歌在今…https ://zhuanlan.zhihu.com/p/563661713 https://zhuanlan.zhihu.com/p/563661713扩散模型之DDIM – 知乎“What I cannot create, I do not understand.” — Richard Feynman 上一篇文章 扩散模型之DDPM介绍了经典扩散模型DDPM的原理和实现,对于扩散模型来说,一个最大的缺点是需要设置较长的扩散步数才能得到好的效…https://zhuanlan.zhihu.com/p/565698027 https://zhuanlan.zhihu.com/p/565698027
3. Latent Diffusion Models
High-Resolution Image Synthesis with Latent Diffusion Models
项目路径:GitHub – CompVis/latent-diffusion: High-Resolution Image Synthesis with Latent Diffusion Models
背景
GANs的良好结果大多局限于变异性相对有限的数据,因为它们的对抗学习过程不容易扩展到建模复杂的多模态分布。而扩散模型是基于似然的模型,不像GANs那样会表现出模式崩溃和训练不稳定性,而且通过大量利用参数共享,它们可以对自然图像的高度复杂分布建模。
DM训练和推理需要强大的机器资源(训练DM通常需要数百个GPU天,例如在《Diffusion Models Beat GANs on Image Synthesis》中提及模型需要使用V100训练150 – 1000天,同样推理也耗费时间,在单个A100 GPU上生成50k个样本大约需要5天)。为了在有限的计算资源上进行DM训练,同时保持其质量和灵活性,该论文提出将DM应用于强大的预训练自编码器的潜在空间,在复杂性降低和细节保留之间达到一个近乎最佳的点,极大地提高了视觉保真度。且通过在模型架构中引入交叉注意层,将DM转化为强大而灵活的生成器,用于一般条件输入,如文本或边界框,并以卷积方式实现高分辨率合成。
模型结构
Figure 1. LDMs模型结构
Latent Diffusion Models首先需要一个训练好的自编码模型实现编解码操作(感知压缩),利用编码器将图片压缩到潜在空间进行diffusion操作 ,最后再用解码器恢复到原始像素空间。扩散模型具体为time-conditional UNet结构,并引入条件机制,通过cross-attention的方式实现多模态训练。
1. Perceptual Image Compression
感知压缩模型由一个通过结合感知损失和基于patch的对抗目标来训练得到的自动编码器组成。其中编码器 将输入图片编码到潜在空间 ,解码器从潜在编码重构图片 (在 分布空间采样并解码到图像空间)。基于该压缩模型可以得到一个高效低维的潜在空间,其中高频的难以察觉的细节被抽象出来,只保留重要基础的特征。与高维像素空间相比,这个空间更适合基于似然的生成模型,因为它们现在可以专注于数据的重要语义,且在低维、计算效率更高的空间中训练。
避免任意高方差的潜在空间(避免潜在表示空间出现高度的异化),使用两种正则化方式:KL-reg和VQ-reg(Stable Diffusion 主要采用KL方法)。
2. Latent Diffusion Models
扩散模型是通过逐步去噪正态分布变量来学习数据分布p(x)的概率模型,对应于学习长度为T的固定马尔可夫链的反向过程: 。
潜在表征的生成建模(降噪过程)利用特定于图像的归纳偏差,从2D卷积层构建底层UNet,并使用重加权界限进一步将目标集中在感知上最相关的位置上。相比之前的工作依赖于学习空间z的任意1维顺序来对其分布进行自回归建模,导致忽略了z的大部分固有结构,该论文的压缩模型更好地保留了x的细节。对应的目标函数改为: 。
UNet噪声预测器基本操作:转换latents;每层都是基于之前层的输出进行操作;某些输出(通过残差连接)将其馈送到网络后面的处理中。
带文本的UNet噪声预测器主要修改部分就是新增文本信息输入,在ResNet块之间增加一个注意力层。ResNet块没有直接看到文本内容,而是通过注意力层将文本在latents中的表征合并起来,然后下一个ResNet就可以在这一过程中利用上一模块的文本信息。
3. Conditioning Mechanisms
与其他类型的生成模型相似,扩散模型原则上能够建模形式为 的条件分布,通过条件去噪自动编码器 实现,并为通过输入y(如文本、语义映射或其他图像到图像的翻译任务等)控制合成过程铺平了道路。
论文通过使用交叉注意机制来增强DMs的底层UNet主干,从而使其成为更灵活的条件图像生成器。具体为引入一个特定领域的编码器 来预处理各种模态的条件输入y,再通过交叉注意层(即Q和KV分别来自不同的序列, 和 )将y的编码映射到UNet的中间层, 。
在图像条件对的基础上,LDMs损失: 。
4. Stable Diffusion Models
项目路径v1版本:https://github.com/CompVis/stable-diffusion
项目路径v2版本:https://github.com/Stability-AI/stablediffusion
Stable Diffusion是潜在空间的文图扩散模型(即LDMs的y输入为文本条件)。
Stable Diffusion v1 refers to a specific configuration of the model architecture that uses a downsampling-factor 8 autoencoder with an 860M UNet and CLIP ViT-L/14 text encoder for the diffusion model. The model was pretrained on 256×256 images and then finetuned on 512×512 images.
Stable Diffusion v2以上为在之前模型的基础上finetune到更大分辨率768×768。
代码理解
1. pad输入pair (原图和mask),使其长、宽为32的整数倍,在图片下方及右侧填充pad_h和pad_w像素,填充值为0。
def pad_image(input_image):
pad_w, pad_h = np.max(((2, 2), np.ceil(
np.array(input_image.size) / 64).astype(int)), axis=0) * 64 - input_image.size
im_padded = Image.fromarray(
np.pad(np.array(input_image), ((0, pad_h), (0, pad_w), (0, 0)), mode='edge'))
return im_padded
2. 初始化随机输入编码size = (num_sample, 4, h // 8, w // 8),预处理image、mask和prompt。
start_code = prng.randn(num_samples, 4, h // 8, w // 8)
start_code = torch.from_numpy(start_code).to(
device=device, dtype=torch.float32)
with torch.no_grad(),
torch.autocast("cuda"):
batch = make_batch_sd(image, mask, txt=prompt,
device=device, num_samples=num_samples)
c = model.cond_stage_model.encode(batch["txt"])
注:downsampling factor f选择数值8为根据实验经验所得。LDMs论文提到了选取不同的下采样因子{1, 2, 4, 8, 16, 32}进行实验 (single NVIDIA A100 and 2M steps),证明:1) 小下采样因子LDM-{1,2}会导致训练进展缓慢,2) 过大的f值又会导致在相对较少的训练step后保真度停滞。论文将此归因于 1) 将大部分感知压缩留给了扩散模型和 2) 第一阶段过强的压缩导致信息丢失,从而限制了可达到的模型质量。最终根据实验结果选择8作为下采样参数最佳。
参考链接
Stable Diffusion原理解读 – 知乎
Jay Alammar再发新作:超高质量图解Stable Diffusion,看完彻底搞懂「图像生成」原理-51CTO.COM
文章来源于互联网:Stable Diffusion学习笔记