Stable Diffusion

Stable Diffusion

1 作用

原始论文为High-Resolution Image Synthesis with Latent Diffusion Models,2022年发表在CVPR上。代码仓https://github. com/CompVis/latent-diffusion

稳定扩散模型的原名是潜扩散模型(Latent Diffusion Model, LDM)。正如它的名字所指出的那样,扩散过程发生在潜在空间中。这就是为什么它比纯扩散模型更快。

2 解释

整体架构图

潜在空间

首先训练一个自编码器,学习将图像数据压缩为低维表示。

通过使用训练过的编码器E,可以将全尺寸图像编码为低维潜在数据(压缩数据)。然后通过使用经过训练的解码器D,将潜在数据解码回图像。
潜在空间的扩散

将图像编码后,在潜在空间中进行正向扩散和反向扩散过程。

条件作用/调节

稳定扩散模型的真正强大之处在于它可以从文本提示生成图像。这是通过修改内部扩散模型来接受条件输入来完成的。


通过使用交叉注意机制增强其去噪 U-Net,将内部扩散模型转变为条件图像生成器。

上图中的开关用于在不同类型的调节输入之间进行控制:

  • 对于文本输入,首先使用语言模型 𝜏θ(例如 BERT、CLIP)将它们转换为嵌入(向量),然后通过(多头)Attention(Q, K, V) 映射到 U-Net 层。
  • 对于其他空间对齐的输入(例如语义映射、图像、修复),可以使用连接来完成调节。
    训练

    训练目标(损失函数)与纯扩散模型中的训练目标非常相似。唯一的变化是:
  • 输入潜在数据zₜ而不是图像xₜ。
  • U-Net增加条件输入𝜏θ(y)。
    采样

    由于潜在数据的大小比原始图像小得多,所以去噪过程会快得多。

架构的比较

比较纯扩散模型和稳定扩散模型(潜在扩散模型)的整体架构。

Diffusion Model

Stable Diffusion (Latent Diffusion Model)

快速总结一下:

  • 扩散模型分为正向扩散和反向扩散两部分。
  • 正扩散可以用封闭形式的公式计算。
  • 反向扩散可以用训练好的神经网络来完成。
  • 为了近似所需的去噪步骤q,我们只需要使用神经网络εθ近似噪声εₜ。
  • 在简化损失函数上进行训练可以获得更好的样本质量。
  • 稳定扩散(潜扩散模型)是在潜空间中进行扩散过程,因此比纯扩散模型快得多。
  • 纯扩散模型被修改为接受条件输入,如文本、图像、语义等。
组件
组件 参数个数 文件大小 占比
CLIP 123,060,480 492 MB 12%
VAE 83,653,863 335 MB 8%
UNet 859,520,964 3.44 GB 80%
Total 1,066,235,307 4.27 GB 100%

Stable Diffusion是一种计算机生成图像的方法,它是Diffusion Model(扩散模型)的一种变体。扩散模型是一种深度学习模型,用于生成高质量、逼真的图像,同时保持一定的稳定性。Stable Diffusion的特点是能够生成高质量、多样化的图像,同时保持较低的计算成本和较快的生成速度。

Stable Diffusion的工作原理是通过对图像进行逐步的"去噪"和"重构",从随机噪声开始,逐步恢复出高质量的图像。在这个过程中,模型会不断地调整噪声和图像的混合程度,直到最终生成出高质量的图像。这种方法可以有效地利用计算资源,生成出高质量的图像。

最基本的原理是:根据文字指示,把一张随机生成的全是噪点的图片,一步步去掉噪点生成跟文字描述匹配的图片。

Latent Space & VAE

图片太大了,如果图片用像素数据表示,现在 iPhone 拍的一张照片有最小有 500w 像素,即使做常见的图片压缩(JPG/PNG),也有几百K的数据大小,如果用原图按上面的流程跑下来,计算量巨大,显然我们要针对图片做降维(或者理解为压缩),把一张图片的数据量降低,再进行后续的训练和使用。所以需要一个降维模型做这个事,这个模型需要满足:

  1. 有 encode 和 decode,需要能从 encode 和处理后的低维数据 decode 成高清图片。
  2. 要压缩得尽量小,方便低成本做上述海量的计算。
  3. 信息要能保留得足够多。
  4. 信息要有语义,不然训练过程中不同图片的信息无法交叉融合。
    VAE (Variational Autoencoders 变分自编码器)能做到这些,VAE 提供了 encoder 和 decoder,一张图片经过 VAE encode,可以压缩成仅有 64x64x4 的矩阵,这里经过 encode 后的数据空间,就称为隐空间(Latent Space),在这个空间里进行上述扩散模型的训练和生成流程,成本就非常低,这也是目前Stable Diffusion能跑在我们普通电脑上的原因。最后在隐空间里生成的图片数据,经过 VAE decoder,就能转换成高清图。
    那 VAE 为什么能做到这样?一张图片转成 64x64x4 这么小的数据量,为什么能保存图片的信息?通俗理解是 VAE 把图片内容转成了语义概率表示,相当于变成了这张图片的描述,比如描述这张图片有猫的概率、有猫爪子的概率,猫在左边的概率,绿色的概率,类似这样,更深入就不了解了,这篇文章 有讲解到一些,也只了解到这里了
CLIP

VAE 解决图片编码问题,再来看看文本的编码。在控制生成里,文本实际上是怎样参与到模型训练和生成的过程?如果文本只是随便编码进入模型,模型可能只认得一些特定字符,不认识语义,也就在后续的图片生成中没法比较好地通过自由的prompt文案控制。

SD 使用 OpenAI 训练的 CLIP 模型,把文本转为对应的向量,为什么用它,因为 CLIP 模型本身是一个文本到图片的映射模型,它对文本转出来的向量,更贴近图片的特征空间。

稍微展开说下原理:

  1. 有N张图片、以及它们对应的 N 个对图片的描述文本
  2. 对图像进行编码,得到I,下图中,I1/I2/.../IN 表示从第 1 到 N 张图片的编码表示。
  3. 对文本片段进行编码,得到T,下图中,T1/T2...TN 表示从第 1 到 N 张图片对应的文本描述。
  4. 模型的任务是训练 TextEncoder 和 ImageEncoder的 参数:
    1. 让图中蓝色部分Ti和Ii相似度变高,它们原本就是一一对应的文本-图片,属于正样本。(数学上是计算余弦相似度,越大表示相似度越高,最大化这个值)
    2. 让白色部分相似度最低,它们的文本和图片是没有关系的,属于负样本。(数学上是余弦相似度值最小化)
      这样训练后,最终使用这个模型时,TextEncoder出来的向量表示,就跟图片内容有很强的关系。比如下图第四行,猫的文字描述通过 TextEncode 出来的值,跟猫的图片的ImageEncode出来的值,相似度更高,跟其图片的encode相似度就低。

PS. 更细节的 CLIP 怎么跟 SD 生成过程结合,还没弄得很清楚,实际上SD 没有用 CLIP 里的 Image encoder,扩展模型训练过程中是用别的 Image Encoder,那就并没有用到文本和实际图片的对应映射关系,但可能CLIP出来的文本编码,语义和表现形式上已经是图片的模式,比如文字 cat,它能跟图片空间里猫所表示的形态(形状/位置)、视觉(眼睛/颜色/形状)、语义(宠物/动物)能比较接近地对应上,也能存储到相关信息,所以跟其他图片编码结合,也能起到很大作用?

采样器

编码和数据量的问题解决了,还有个问题没提到,就是上面流程里的步数太长了,最开始提出的扩散模型训练方案 DDPM(Denoising Diffusion Probabilistic Models 去噪扩散概率模型),正常需要 1000 步降噪过程(称为采样),才能生成一张不错的图片,即使上述隐空间已经降低了计算量,但生成一张图要1000步,还是达不到大规模可用。

为什么 DDPM 一定要这么多次采样?这篇文章说得比较清楚,不能直接减小步数(每次噪声加得很少,避免一步就破坏掉原图),不能跳步降噪(每一步状态都依赖前一步,号称马尔科夫性质)。

随后很快有人提出 DDIM(Denoising Diffusion Implicit Models 去噪扩散隐式模型) 方案,训练时还是 DDPM 一步步来,但生成时是可以做到跳步,同时还能让在步数变少的情况下保持生成的稳定。DDIM不是从头开始逐步去噪,而是选择几个关键的时间点,只在这些时间点上进行去噪操作,并且中间的步骤,比如从降噪100次的图片,下一步直接生成降噪90次的图片,跳10步,生成速度就快了10倍。为什么它能做到跳步,具体原因都是数学公式,就不展开了(还没全看懂),可以看回这篇文章

Stable Diffusion 的 WebUI 上有很多采样器,Eular a,Karras,DPM 等,在去噪过程中通过不同的方法,有不同的多样化程度、图像质量、速度、收敛性的区别。

Stable Diffusion UNet 结构

最初的 DDPM(去噪扩散概率模型),和后来改良的 LDM(潜在扩散模型),对 UNet 网络逐步做了一些改造,以适合扩散模型图生成的过程,SD 是基于 LDM 实现的。

最后 SD 里的 UNet,整体结构流程跟上述一致,改造大部分是在上采样和下采样的每一层的实现里,最大的改造是引入了 ResnetBlock(残差模块)和 Transformer 模块。ResnetBlock 提升网络表达能力(原 UNet 是简单卷积模块),而 Transformer 模块的交叉注意力机制,将文本提示(prompt)的嵌入与图像特征进行融合,实现基于文本条件的图像生成。

SD UNet 每个模块的组成如图(图片来源):

左边下采样每层由2个残差模块和2个Transformer模块连接组成,右边上采样是各3个,中间层是2个残差模块和1个Transformer模块。(高维的d4和u1没有接入Transformer模块,原因不明,可能是试过加入后效果不佳,在高维这里加入 Prompt 交叉注意机制,文字权重太大?)

细分模块结构

里面每一块具体的结构这篇文章画得很详细,摘录学习一下。我们拿其中一个下采样模块看看:

两个残差模块,两个Transformer模块。这图表示了 SD 生图的三个输入:input(噪声图)、prompt_embdding(文字 Prompt)、time_embdding(步数)在这几个模块的流转和处理。这里每一个小模块处理完后,输出的可以近似认为都是一个预测的噪声图的数据表示。

残差模块的输入输出 噪声图+步数 → 预测噪声图,Transformer 模块的输入输出是 噪声图+ Prompt → 预测噪声图。

Transformer 模块

再细看一下 Transformer 模块,Transformer 模块由下图所示好几个部分组成,最主要的是 自注意力模块(SelfAttention)和交叉注意力模块(CrossAttention):

展开看看这两个模块:

自注意力模块,Transformer 结构里的 QKV 输入都是图片特征(上一层的处理结果,就是降噪图的特征),这样做可以让模型获得包含整个输入图像的感受野,捕捉图片特征中不同位置之间的关系, 全局感受力是 Transformer 架构的特点。

交叉注意力模块,它的作用是融合不同模态的输入,在这里就是融合噪声图和文本特征,Q的输入是图片特征,KV的输入是文字 prompt_embedding,让图片特征可以关注到文字输入,根据注意力权重调整图片的生成方向。文字 prompt 在整个Transformer模块中只作用在交叉注意力这部分里。

Transformer 的机制原理、QKV的含义,是另一个比较大的话题,可以先看看网上其他相关讲解,比如这篇,后续再细拆深入。

回顾

关键几个模块的组成了解了,再回到整个UNet的构成:

现在通过这些结构图,可以大致看到 UNet 网络里的整体处理流程,以及关键模块的作用,经过这些模块的逐个叠加,组合成一个个采样模块,再组合成 UNet 网络架构,完成整个生图运算。

这里面还有很多需要深入学习的点,当前先了解到这个维度,已经可以帮助大致理解后续 ControlNet 等网络的机制原理。

Stable Diffusion总结

最后总结说下 Stable Diffusion。上面整个过程和概念,是一个个解决问题的方法,把它们组合起来,逐渐建立起基于扩散模型生成图片的方法大厦,谁都可以用这些公开的理论方法建一套自己的生图模型。

Stable Diffusion 就在这些基础上做一些改进,建立一套稳定的框架、训练出基础模型,开源让所有人可以用,整个 SD 就是多种能力的组合,这些能力可以分别不断升级替换,模型本身还有很多方式去做更强的控制干预(controlNet / LORA等),使得它可定制性可玩性很强,生态越来越繁荣。

最后让我们用一个图串起整个流程和讲解到的概念。

  1. Part1 是用 CLIP 模型对文本做编码。
  2. Part2 在模型训练过程中,图片经过 AutoencoderKL(VAE编码器的实现)生成隐空间下图片的表示,随机生成一个 noise 噪声,加到这个图片里,同时把通过 CLIP 模型编码的图片对应描述文本加入进来,一起进入 UNet 模型,训练预测加了多少 noise 噪声的能力。
  3. Part3 在模型推理过程中,输入一个完全随机噪点,在隐空间里通过不同的采样器,结合prompt 文本输入(图上没表示出来,文本数据会参与到降噪过程),在 UNet 模型里迭代多步做降噪预测,生成隐空间里的图片,再通过 VAE AutoencoderKL 解码出图片。

    了解整个基础流程和概念后,现在看 Stable Diffusion 论文中的这张架构图,应该也大致能理解是什么意思了。

总结

DiffusionModel VIT、DIT、UVIT与Stable Diffusion的联系与区别

特性 Diffusion Model ViT DiT U-ViT Stable Diffusion
目标 通用生成框架 图像分类、检测等任务 高质量图像生成 高分辨率图像生成 高效文本到图像生成
主干架构 通常基于 U-Net Transformer 基于 ViT 的扩散模型 ViT + U-Net U-Net + 条件模块(CLIP)
特征处理 局部特征为主 全局特征建模 全局特征建模 全局与局部结合 潜空间局部处理 + 条件控制
条件能力 基础条件控制 无条件 强条件(时间步、文本) 强条件(多模态任务) 强条件(文本、图像)
应用场景 图像生成、修复、去噪 分类、检测、多模态任务 条件和无条件生成 多模态、高分辨率生成 文本到图像、多模态生成

参考资料

  1. https://www.bilibili.com/video/BV1wZ421h7w7/?vd_source=9c2f477a97bce8e38909b83b89e244e2
    1. 详细介绍SD中相关技术
  2. # 手写stable-diffusion
    1. 源码手写SD
  3. https://zhuanlan.zhihu.com/p/639952809
    1. unet网络结构
      https://zhuanlan.zhihu.com/p/682706598
      https://openai.com/index/video-generation-models-as-world-simulators/

Sora
stablediffusion

SD相关资料
# Stable Diffusion 图片生成原理简述
# 理解 Stable Diffusion UNet 网络
# Stable diffusion --- High-Resolution Image Synthesis with Latent Diffusion Models
# Diffusion Models
# Stable Diffusion 原理 | 深度学习算法
# Stable Diffusion 原理介绍与源码分析(一)
# The Illustrated Stable Diffusion
# 零基础读懂Stable Diffusion(II):怎么训练
ICCV 2023 | 最全AIGC梳理,5w字30个diffusion扩散模型方向,近百篇论文!
【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果
# 技术神秘化的去魅:Sora关键技术逆向工程图解

相关推荐
灵魂画师向阳3 天前
AI绘画 Stable Diffusion【应用篇】【角色一致性】:如何从不同视角创造一致的人物角色?
人工智能·ai作画·stable diffusion·aigc·美女
灵魂画师向阳3 天前
【Stable Diffusion】用AI给老照片上色,岁月不改它模样
人工智能·学习·ai作画·stable diffusion·midjourney
procoder3383 天前
大模型微调技术: 从基于Stable Diffusion的绘画谈起
stable diffusion
普通网友3 天前
AI绘画 Stable Diffusion【进阶篇】:Recolor模型实现头发衣服换色
人工智能·ai作画·stable diffusion·aigc·音视频
AIGC安琪3 天前
秋叶大神中文版Stable Diffusion下载安装使用教程
计算机视觉·stable diffusion·设计·产品摄影·产品精修
浪潮行舟3 天前
AI绘画:Midjourney和stable diffusion到底有什么区别?
ai作画·stable diffusion·midjourney
普通网友3 天前
2024年最新Stable Diffusion 新手入门教程,安装使用及模型下载
人工智能·ai作画·stable diffusion·aigc·midjourney
灵魂画师向阳3 天前
【CSDN首发】Stable Diffusion从零到精通学习路线分享
人工智能·学习·计算机视觉·ai作画·stable diffusion·midjourney
电摇小人6 天前
Stable Diffusion的简单介绍
stable diffusion
LeeZhao@7 天前
【项目】基于趋动云平台的Stable Diffusion开发
面试·职场和发展·stable diffusion·aigc