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)。
1.

  #### 训练噪点预测模型流程:

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

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

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

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

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

  ![](https://i-blog.csdnimg.cn/direct/cf5e977850c64d5ab2ac7a780b855431.png)

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

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

  我们首先生成一张完全随机的图片,并让noise predictor告诉我们噪点是什么。然后从原图中移除噪点。并重复此过程多次,最终遍得到一张猫或狗的图片,反向扩散通过逐步从图像中减去预测出的噪声来生成最终的图片。
  ![](https://i-blog.csdnimg.cn/direct/f1dec04c9a364ad79dbf2c0a07874b41.png)
所以,通过前向扩散和反向扩散就可以生成一张猫和狗的图片,但现在距离我们所说的文生图还有一些差距,因为大家也注意到了,反向扩散去除噪点的过程是基于我们之前noise predictor 噪点预测器的训练数据的,所以只会生成猫或者狗的图片,那么如何生成符合我们输入文本的图像呢?这个篇幅比较多,后面会详细介绍,现在先介绍一下另一个重要的前置知识。

重要的名词解释

  • 采样

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

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

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

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

SD的潜扩散原理

  #### 将图片压缩到潜空间

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

  * VAE神经网络包含2部分:Encoder与Decoder,Encoder将一张图片压缩到"潜空间"里的一个低维空间表示。Decoder从"潜空间"里的表示恢复为一张图片。![](https://i-blog.csdnimg.cn/direct/5f0eefa13ffa402496a9dbcd0a7ae23d.png)

  <!-- -->

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

  * 所以在训练时,不再是生成一张噪点图,而是在潜空间里生成一个随机张量(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工作的流程:
1.

  ### 文生图

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

  1.

     #### 具体过程如下

     * **Step 1.** Stable Diffusion在潜空间里生成一个随机张量。我们通过设置随机种子[seed](https://stable-diffusion-art.com/know-these-important-parameters-for-stunning-ai-images/#Seed "seed")来控制这个张量的生成。如果我们设置这个随机种子为一个特定的值,则会得到相同的随机张量。这就是我们在潜空间里的图片。但是当前还全是噪点。

       ![](https://i-blog.csdnimg.cn/direct/19459a8b9d0b4b96a3dfde6a0639d3ae.png)
     * **Step 2.** Noise predictor 将潜噪点图以及文本提示词作为输入,并预测噪点,此噪点同样也在潜空间内

       ![](https://i-blog.csdnimg.cn/direct/21408c3a50c94cac93817bcf52cb2601.png)
     * **Step 3.** 从潜图片中抽取潜噪点,并生成了新的潜图片。

       ![](https://i-blog.csdnimg.cn/direct/0b7739e7b8ee48bd8a24ed071a523560.png)

       Step 2 与 Step 3 重复特定采样次数,例如20次。
     * **Step 4.** 最后,VAE的decoder将潜图片转回像素图片空间,这便是我们通过SD模型最终得到的图片。

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

  ![](https://i-blog.csdnimg.cn/direct/9834965ff3b64f069eb07ba0e533888b.gif)
  ### 图生图

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

  ![](https://i-blog.csdnimg.cn/direct/64e891101b2f4658a60d73635b00c399.png)
  1.

     #### 具体流程如下:

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

     ![](https://i-blog.csdnimg.cn/direct/fbc6cfb100164659988e341e940bdc2f.png)
     * **Step 2.** 加入噪点到潜图片。**[Denoising strength](https://stable-diffusion-art.com/inpainting_basics/#Denoising_strength "Denoising strength")**控制加入多少噪点。如果为0,则不会加入噪点。如果为1,则会加入最多的噪点,这样潜图片则转为一张完全随机的张量。

       ![](https://i-blog.csdnimg.cn/direct/1428fa0ee04a42d18d34d9ce17a744a0.png)
     * **Step 3.** Noise predictor U-Net使用潜噪点图以及文本提示词作为输入,并预测潜空间内的噪点

     ![](https://i-blog.csdnimg.cn/direct/66ba5e9bc9354765b593fcc1fc5e8e99.png)
     * **Step 4.** 从潜图片中剔除潜噪点,并生成新的潜图片

     ![](https://i-blog.csdnimg.cn/direct/8ed77ff425e942cf9060bbd886322b75.png)
     * Step 3 与 4 重复多次,直到特定采样步数,例如20次。

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

     ![](https://i-blog.csdnimg.cn/direct/23fd1718620e46d89026e363d1ccd13b.png)
     * 图生图的原理,简单来说就是设置一个初始的、带噪点的潜图片,作为输入图片,然后经过多轮采样(去除噪点),最终得到预期的图片,如果denoising strength设置为1,则等同于文本生成图了,因为初始的潜图片是完全随机的噪点。
相关推荐
靴子学长20 分钟前
基于字节大模型的论文翻译(含免费源码)
人工智能·深度学习·nlp
AI_NEW_COME1 小时前
知识库管理系统可扩展性深度测评
人工智能
海棠AI实验室2 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
hunteritself2 小时前
AI Weekly『12月16-22日』:OpenAI公布o3,谷歌发布首个推理模型,GitHub Copilot免费版上线!
人工智能·gpt·chatgpt·github·openai·copilot
IT古董2 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
centurysee2 小时前
【最佳实践】Anthropic:Agentic系统实践案例
人工智能
mahuifa2 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
四口鲸鱼爱吃盐2 小时前
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
人工智能·pytorch·分类
蓝天星空3 小时前
Python调用open ai接口
人工智能·python
睡觉狂魔er3 小时前
自动驾驶控制与规划——Project 3: LQR车辆横向控制
人工智能·机器学习·自动驾驶