Stable diffusion生图原理

  1. 简介

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

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

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

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

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

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

  1.   前向扩散(forward diffusion)

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

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

                    ​​​​​​​

  1.   反向扩散(reverse diffusion)

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

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

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

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

      • 随机移动

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

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

  1.   模型训练过程

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

    1.     训练噪点预测模型流程:

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

      2. Step2:生成随机的噪点图

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

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

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

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

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

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

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

    • 采样

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

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

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

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

    1.     将图片压缩到潜空间

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

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

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

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

            所以就诞生了一个问题
    1.     为什么潜空间是合理的?

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

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

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

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

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

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

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

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

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

    1.     添加文本控制

            到目前为止,我们还没介绍文本是如何影响图片生成的。如果没有文本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)预期的图片。

  1. 示例

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

    1.   文生图

          文生图:

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

      1.     具体过程如下

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

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

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

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

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

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

    1.   图生图

          图生图:

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

      1.     具体流程如下:

        • 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,则等同于文本生成图了,因为初始的潜图片是完全随机的噪点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雄狮少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值