当前位置:AIGC资讯 > AIGC > 正文

Stable diffusion生图原理

简介

  Stable diffusion 是一种基于扩散技术的深度学习模型,于2022年发布,是Stability AI公司推出的首要产品,它主要用于生成以文本描述为条件的详细图像,同时也可以进行补绘、外绘、重绘等任务,但原理都和文生图原理相似。

  Stable Diffusion是一种隐扩散模型(在扩散模型基础上进行了优化,后面会介绍)。

主要过程(以文生图为例)

  Stable Diffusion属于深度学习模型里的一个类别,称为diffusion models(扩散模型)。这类模型属于生成式模型,也就是说它们用于生成新的数据,而生成的这部分新数据类似于它们训练时的数据。对于SD来说,这类新数据便是图片,为什么叫扩散模型?这是因为它的数学公式看起来非常像物理上的扩散现象。

  假设我们训练了一个diffusion model,训练时只给了2类图片:猫与狗。如下图所示,左边便是送入训练的猫与狗的图片。

接下来要经过前向扩散和反向扩散两个过程,最终会生成一张我们想要的图片。

  前向扩散(forward diffusion)

前向扩散的过程是给训练图片添加噪点的过程,并逐渐将图片转为一个反常的噪点图。也就是会将任何猫或狗的图片转为一张噪点图,并最终无法辨认噪点图对应的初始图片是猫还是狗(可以调节噪点添加的多少),这个过程就像是滴入了一滴墨水到一杯水里,墨水在水里扩散,在几分钟后,墨水会随机分散并融入水中。且无法判断它最初是从水杯的中心滴入,还是从边缘滴入,所以叫做扩散模型。

前向扩散最后生成的随机噪点图如下:

                ​​​​​​​

  反向扩散(reverse diffusion)

在前向扩散之后是反向扩散过程,反向扩散过程最理想的效果是:

输入一张噪点图(毫无意义的图),反向扩散可以将这张噪点图恢复为一张猫或狗的图片。这就是反向扩散的主要目标。

    从技术角度来说,每个扩散过程分为2部:

漂移或定向运动(例如,所举的例子来说,噪点图要么偏向狗的方向,要么偏向于猫的方向)

随机移动

      反向扩散会朝着猫或狗的图片方向进行漂移,最后生成一张猫或狗的图片。

技术原理

具体过程已经了解了,那么怎么在技术层面实现这些过程,训练出这样一个模型呢?

  模型训练过程

    从反向扩散的角度来说,我们需要知道有多少“噪点”加入到了某张图片里,然后将这些噪点去除,便可以得到我们想要的图片。因此我们首先需要训练一个神经网络来预测添加的噪点有多少。这个模型在SD里称为噪点预测器(noise predicator)。

    训练噪点预测模型流程:

Step1:选择一张训练图(例如一张猫的图片)

Step2:生成随机的噪点图

Step3:给这张图继续增加多轮噪点

Step4:训练noise predictor,预测加入了多少噪点。通过神经网络训练权重,并展示其正确答案

      经过训练,便可得到一个noise predictor,它可以预测一张噪点图中,加入到图片的噪点信息。

    现在已经有了noise predictor(噪点预测器),应该如何使用呢?

    通过反向扩散过程生成图片

      我们首先生成一张完全随机的图片,并让noise predictor告诉我们噪点是什么。然后从原图中移除噪点。并重复此过程多次,最终遍得到一张猫或狗的图片,反向扩散通过逐步从图像中减去预测出的噪声来生成最终的图片。

    所以,通过前向扩散和反向扩散就可以生成一张猫和狗的图片,但现在距离我们所说的文生图还有一些差距,因为大家也注意到了,反向扩散去除噪点的过程是基于我们之前noise predictor 噪点预测器的训练数据的,所以只会生成猫或者狗的图片,那么如何生成符合我们输入文本的图像呢?这个篇幅比较多,后面会详细介绍,现在先介绍一下另一个重要的前置知识。

  重要的名词解释

采样

反向扩散中去除噪声过程被称为采样,在每一步都会生成一个新的样本图像。采样所用的方法称为采样器或采样方法。

下面是一个正在进行的采样过程。采样器逐渐产生越来越清晰的图像(经过多轮采样,噪声逐渐减少)

   通过前面的过程,我们可以看出,生成一张图片的过程包括前向扩散生成一张完全随机的噪点图,然后在反向扩散的过程中,预测噪声并去除,多轮采样(降噪)后生成最终的图片。。但实际上,生成一张随机的噪声图,然后通过反向扩散逐步预测并去除噪声图中的噪点,这个计算过程非常缓慢,基本上无法在单个GPU上处理,所以stable diffusion选择了先将图像降维,把图片压缩到一个“潜空间”(latent space)中,而不是在高维的图片空间里工作,因此,stable diffusion是一个潜扩散模型(latent diffusion model),潜空间比图片空间小了48倍,所以它可以节省大量计算,继而运行速度更快。

  在此基础上,我们就可以把之前介绍的前向扩散和反向扩散过程用SD采用的潜扩散原理来更准确的描述了。

  SD的潜扩散原理

    将图片压缩到潜空间

使用的技术是variational autoencoder(变分自动编码器),即VAE。

VAE神经网络包含2部分:Encoder与Decoder,Encoder将一张图片压缩到“潜空间”里的一个低维空间表示。Decoder从“潜空间”里的表示恢复为一张图片。

前面提到的前向与反向扩散都是在潜空间里完成。

所以在训练时,不再是生成一张噪点图,而是在潜空间里生成一个随机张量(tensor)。并且在给图片每一步增加噪点时,也不再是给图片增加噪点,而是给图片在潜空间里的张量增加潜噪点,潜空间更小,执行速度更快。

      所以就诞生了一个问题

    为什么潜空间是合理的?

      为什么VAE可以压缩一张图片到非常小的一个潜空间而不损失信息呢?

这是因为:自然图片并非是随机的,它们有很高的规律性。例如,一张脸上鼻子、脸颊和嘴巴之间有特定的空间关系;一只狗有4只腿并且有特定的形状。

换句话说,高维的图片是人为的。自然图像可以轻松地压缩到较小的潜空间中,而不会丢失任何信息。

    结合上面的前置知识介绍,SD模型工作流程可以概括如下:

Step1:生成随机的潜空间矩阵

Step2:Noise predictor预测潜矩阵的噪点

Step3:将预测的噪点从潜矩阵中去除

Step4:重复步骤2与3,直到特定的采样步数

Step5:VAE的decoder将潜矩阵转为最终图片

    添加文本控制

      到目前为止,我们还没介绍文本是如何影响图片生成的。如果没有文本prompt的影响,SD模型也不会是一个text-to-image模型。我们可以得到一张猫或狗的图片,但是没有方式来控制它。

这部分就是“条件”(conditioning)要做的事情。“条件”的目的便是引导noise predictor,让其知道:在抽取预测的噪点后,我们需要的是什么。

下面展示的是:文本提示(text prompt)如何处理并输入到noise predictor的过程:

Step1:首先,Tokenizer(分词器)将每个输入的单词转为一个数,称为token。

Step2:每个token然后转为一个768维的向量,称为词嵌入(embedding)。

Step3:词嵌入然后由Text Transformer处理,并可以被Noise predictor进行消费。

Step4:Noise predictor便可以通过文本提示(text prompt)转化成的词嵌入来预测添加的噪声,然后将其去除。

Step5:通过多轮采样(去噪)便可以得到文本提示(text prompt)预期的图片。

示例

  下面结合几个例子具体介绍一下SD工作的流程:

  文生图

    文生图:

即给SD模型输入一组文本提示词,它可以返回一张文本提示词对应的图片。

    具体过程如下

Step 1. Stable Diffusion在潜空间里生成一个随机张量。我们通过设置随机种子seed来控制这个张量的生成。如果我们设置这个随机种子为一个特定的值,则会得到相同的随机张量。这就是我们在潜空间里的图片。但是当前还全是噪点。

Step 2. Noise predictor 将潜噪点图以及文本提示词作为输入,并预测噪点,此噪点同样也在潜空间内

Step 3. 从潜图片中抽取潜噪点,并生成了新的潜图片。

        Step 2 与 Step 3 重复特定采样次数,例如20次。

Step 4. 最后,VAE的decoder将潜图片转回像素图片空间,这便是我们通过SD模型最终得到的图片。

现在再看这张图,就可以很容易理解了:

  图生图

    图生图:

即输入是一张输入图片以及一组文本提示词。生成的图片会由输入图片以及文本提示词两者共同调节。例如,使用下面的简笔画,以及提示词“带茎、水滴和戏剧性照明的完美绿色苹果照片”作为输入,图生图可以将其转换成专业绘画。

    具体流程如下:

Step 1. 输入图片编码到潜空间

Step 2. 加入噪点到潜图片。Denoising strength控制加入多少噪点。如果为0,则不会加入噪点。如果为1,则会加入最多的噪点,这样潜图片则转为一张完全随机的张量。

Step 3. Noise predictor U-Net使用潜噪点图以及文本提示词作为输入,并预测潜空间内的噪点

Step 4. 从潜图片中剔除潜噪点,并生成新的潜图片

Step 3 与 4 重复多次,直到特定采样步数,例如20次。

Step 5. 最后,VAE的解码器将潜图片转回像素空间,便得到了最终生成的图片。

图生图的原理,简单来说就是设置一个初始的、带噪点的潜图片,作为输入图片,然后经过多轮采样(去除噪点),最终得到预期的图片,如果denoising strength设置为1,则等同于文本生成图了,因为初始的潜图片是完全随机的噪点。

总结

Stable Diffusion是一种由Stability AI公司在2022年发布的深度学习模型,其核心基于隐扩散技术,专注于以文本描述为条件生成详细的图像。该模型不仅能进行文字到图像的生成(文生图),还支持补绘、外绘、重绘等多种图像编辑任务。
### 主要过程(以文生图为例)
**扩散模型**:Stable Diffusion采用扩散模型(Diffusion Models)的框架,这类模型通过生成新数据(如图像)来模仿学习过程中见到的数据集。扩散模型的核心分为两个步骤:前向扩散和反向扩散。
**前向扩散**:此过程将输入的图片逐渐添加噪点,最终转换成无法辨认的噪声图,类似于墨水在清水中的扩散。
**反向扩散**:反向过程则试图从噪声图中通过去除噪点恢复原始图片,或根据文本提示生成新图片。反向扩散包括漂移(向特定数据方向,如猫狗图片)和随机移动两个部分。
### 技术原理
**模型训练**:
- **训练噪点预测器**:模型首先训练一个神经网络来预测并学习在图片中添加的噪点量。这一过程包括选择训练图、生成随机噪点图、给图逐步添加噪点、并用神经网络预测这些噪点量。

- **反向扩散生成图片**:通过不断去除噪点预测器预测的噪声,最终生成符合期待的图像。这一过程通常会进行多轮采样,以保证图片质量。
**潜扩散模型**:为了提高效率和计算速度,Stable Diffusion将图片压缩到潜空间(Latent Space),使用变分自动编码器(VAE)的Encoder和Decoder结构来处理图片数据的压缩与恢复。前向和反向扩散均在潜空间内完成。
### 工作流程
1. **生成随机潜空间矩阵**:在潜空间中生成初始的随机张量,作为初始噪声图。
2. **噪声预测与去除**:噪点预测器(Noise Predictor)预测潜矩阵中的噪点,并逐步去除,这个过程会重复多次以达到预期的降噪效果。
3. **解码生成图片**:使用VAE的Decoder将优化后的潜矩阵转换回像素空间,生成最终的图像。
### 添加文本控制
Stable Diffusion通过文本提示(Text Prompt)来引导噪声预测过程,使生成的图像符合特定的文本描述。这一过程涉及分词器(Tokenizer)、词嵌入(Embedding)、Text Transformer等组件来处理和转换文本输入,进而指导噪声预测器的运行。
### 示例应用
- **文生图**:通过输入描述性文本,生成对应的图片场景或物品。
- **图生图**:在已有图片的基础上,结合文本提示进行改进或重新生成,如将简笔画转化为专业级的艺术作品。
Stable Diffusion通过独特的隐扩散技术和文本引导机制,实现了高度自由灵活的图像生成与编辑,极大地拓展了人工智能在创意领域的应用潜力。

更新时间 2024-09-24