跳转至

零基础读懂Stable Diffusion(I):怎么组成

AI 图像生成是最近引起人们注意的 AI 功能。从文本描述中创建引人注目的视觉效果的能力具有神奇的品质,并清楚地表明人类创造艺术的方式正在发生转变。Stable Diffusion的发布是这一发展中的一个明显里程碑,因为它为大众提供了一个高性能模型(在图像质量、速度和相对较低的资源/内存需求方面的性能)

由于原文篇幅较长,所以这里分为三篇文章进行讲解:

  1. 第一篇,也就是本篇,主要讲“ 是什么 ”的问题,包括Stable Diffusion是什么,里面的各个模块是什么
  2. 第二篇,主要讲“ 怎么办 ”的问题,也就是Diffusion怎么训练以及怎么使用的问题。
  3. 第三篇,主要讲“ 如何控制 ”的问题,具体阐述语义信息到底是怎么影响生成图片的过程的。

接下来正式进入第一篇的介绍,谈谈Stable Diffusion是什么,以及里面的一些模块是什么的问题。

原文链接:The Illustrated Stable Diffusion
作者:Jay Alammar

AI图像生成最近所展现出的潜力可谓是让人大开眼界,它能够从一些简单的文字描述开始,变魔法一般的变出高质量的图片。不用说,这已然深刻的拓宽了人类创作艺术的方式。而其中,Stable Diffusion的公布算是一个里程碑事件了,它的 开源 不仅仅意味着面向大众群体公开了一个极高质量的模型,与此同时这个模型甚至能保持很快的 运行速度 和较低的 显存需求 ,不可谓不厉害。

用过了Diffusion这个神奇的技术后,你可能会好奇它到底为什么能有如此好的效果,这里将给出一个尽量简单直白的解释。

Stable Diffusion模型确实是多才多艺的,它可以出色的完成很多任务,比如文生图,图生图,特定角色的刻画,甚至超分或者Inpainting,但作为最基础的一篇介绍,这里我们首先就着重讲解最基础的“ 文生图 ”模块,也就是txt2img部分。下图是一个基本的文生图展示,输入是“天堂(paradise)、广袤的(cosmic)、海滩(beach)”,可以看到最右边的生成图片很好的符合了输入的要求,图中不仅有蓝天白云,广阔的海滩也一望无际:

最最简单的txt2img示意图,之后我们会不断细化和分解这张图里txt2img的过程

虽然本文暂时还没讲到 图生图 模块(也就是所谓的img2img),但这个模块的示意图我们也暂时放一下,如下图所示,这次的输入从单纯的“文字”变成了“图片+文字”的形式,生成的结果是由原始图片和文字提示词共同决定的。这次输入是"海盗船(pirate ship)"和上面img2img生成的图片,最后输出的结果也确实把输入图片的帆船变成了海盗船

img2img示意图,输入是"海盗船(pirate ship)",最后输出的结果也确实把输入图片的帆船变成了海盗船

现在,让我们正式开始了解这项技术背后的原理吧。

一、组成模块

Stable Diffusion其实是个比较 杂合 的系统,里面有着各种各样的模型模块。那首先映入眼帘的问题是,怎么把人类理解的 文字 转换为机器理解的 数学语言 ,毕竟计算机是不懂英文的嘛。这个时候就需要一个text understander帮忙转化。在生成图像前,下图中 蓝蓝的text understander 先把文字转换成某种计算机能理解的数学表示:

蓝蓝的text understander(也就是一个文字的encoder编码器)把人类语言转换成计算机能理解的语义内容

我们后续在第三篇中会讲到这个text understander到底是怎么理解文字和怎么训练的,但现在暂时让我略过这一部分内容,我们只要知道这个text understander是个特别的Transformer语言模型就好了。它的输入是人类语言,输出是一系列的 向量 ,这些向量的语义对应着我们输入的文字。

那么现在,有了可以代表语义的向量(就比如下面的蓝色35方格),我们就把这个语义向量交给真正的图片生成器了,也即下图中 粉粉的Image Generator* 。

蓝色方格的语义向量被输入到粉色的图片生成器中,正式开始生成图片

这个粉色的图片生成器(Image Generator)可以分解成 两个子模块 来看

1,图片信息生成器

这个下图中粉色的模块是Stable Diffusion的秘密武器,也是Stable Diffusion和其他diffusion模型最大的区别,很多性能上的提升就来源于此。

首先,最需要明确的一点: 图片信息生成器不直接生成图片 ,而是生成的较低维度的 图片信息 ,也就是所谓的 隐空间信息 (information of latent space)。这个隐空间信息在下面的流程图中表现为那个粉色的43的方格,后续再将下图中这个隐空间信息输入到下图中黄色的Decoder里,就可以成功生成图片了。Stable Diffusion主要引用的论文“ latent diffusion”中的latent也是来源于隐变量中的 “隐”(latent)* 。

一般的diffusion模型都是直接生成图片,并不会有先生成隐变量的过程,所以普通的diffusion在这一步上需要生成的信息更多,负荷也更大。因而之前的diffusion模型在速度上和资源利用上都比不过Stable Diffusion。那技术上来说,这个图片隐变量到底是怎么生成的呢?这其实是由一个 Unet 和一个 Schedule算法 共同完成的。schedule算法 控制生成的进度 ,unet就具体去一步一步地 执行生成的过程 。Stable Diffusion中,整个unet的生成迭代过程大概要重复50~100次,隐变量的质量也在这个迭代的过程中不断的变得更好。下图中粉色的Image Information Creator左下角的循环标志也正是象征着这个迭代的过程。

2,图片解码器

图片解码器也就是我们上面说的decoder,它从图片信息生成器(Image Information Creator)中 接过图片信息的隐变量 ,将其升维放大(upscale),还原成一张完整的图片。图片解码器只在最后的阶段起作用,也是我们真正能获得一张图片的最终过程。

上面粗略的聊了一下Stable Diffusion每个模块的功能,下面我们来更具体的了解一下这个系统中输入输出的向量形状,这样的话对Stable Diffusion的工作原理应该能有更直观的认识:

  • Text Encoder (蓝色模块) 功能:将人类语言转换成机器能理解的数学向量 输入:人类语言 输出:语义向量(77,768)
  • Image Information Creator (粉色模块) 功能:结合语义向量,从纯噪声开始逐步去除噪声,生成图片信息隐变量 输入:噪声隐变量(4,64,64)+语义向量(77,768) 输出:去噪的隐变量(4,64,64)
  • Image Decoder 功能:将图片信息隐变量转换为一张真正的图片。 输入:去噪的隐变量(4,64,64) 输出:一张真正的图片(3,512,512)

大概流程中的向量形状变化就是这样,至于语义向量的形状为什么是奇怪的(77,768)的形状,我们后面讲到Text Encoder里面的CLIP模型的时候还会讲到,这里就暂且按下不表。

二、扩散(Diffusion)到底是什么意思?

Diffusion模型,翻译成中文也就是扩散模型,那这个扩散到底体现在什么地方呢?这就是我们这第二部分着重要描述的过程。首先我们先用random函数生成一个隐变量大小的 纯噪声 【下图中左下透明44】。而扩散的过程发生在Image Information Creator中,有了初始的 纯噪声 【下图中左下透明44】+ 语义向量 【下图左上蓝色35】后,unet会结合语义向量不断的 去除纯噪声隐变量中的噪声 ,重复50~100次左右就完全去除了噪声,同时不断的向隐变量中注入语义信息,我们就得到了一个有语义的隐变量【下图粉色44】。 别忘了我们还有一个scheduler,它就用来控制unet去噪的强度,以统筹整个去噪的过程。scheduler可以在去噪的不同阶段中动态地调整去噪强度,也可以在某些特殊的任务里,匀速地去除噪声,这都取决于我们一开始的设计。

这个扩散过程是一步一步迭代去噪的,每一步都向隐变量中注入语义信息,不断重复直到去噪完成为止。为了有个直观的认识,我们可以把初始的纯噪声【下图左上透明44】和最后的去噪隐变量【下图右上粉色44】 都通过最后的Image Decoder ,看看会出来什么样的图片。不出意料,纯噪声本身没有任何有效信息,解码出来的图片也会是纯噪声,如下图左侧所示。而最后的去噪隐变量由于已经耦合了语义信息,因此最后解码出来的也是一张包含语义信息的有效图片,如下图右侧图片所示。

刚才我们也提到过,扩散过程是一个 多次迭代 的过程。每一步迭代的输入都是一个隐变量,输出也是一个隐变量,只不过输出的这个隐变量噪声更少,并且语义信息更多。下图中4*4的隐变量不断从透明变粉的过程就代表了这个迭代的过程,颜色越粉,迭代次数越多,噪声也就越少。

这个时候我们再偷偷用Image Decoder提前看一下每一步所对应的图片,就会看到我们想要的图片一步一步地脱胎于噪声的全过程:

这是一个神奇的过程,下面的视频展示了迭代去噪的全过程,我们可以看一下视频的展示:

在本例中,第 2 步和第 4 步之间发生了一些特别有趣的事情。就好像轮廓从噪音中浮现出来

三、总结

至此,我们已经了解了Stable Diffusion是什么,以及其中的种种模块是什么,甚至还简单的窥视了一下它的工作过程。至于为什么Diffusion如何训练、如何控制,鉴于篇幅原因,就容我放到后文中再去细讲了。这里最后再简单做一下总结:

  1. 第一部分介绍了一些Stable Diffusion中的 主要模块 ——包括一个 Text Understander 处理语义信息,一个 Image Information Creator 生成图片的隐变量,一个 Image Decoder 利用隐变量生成真正的图片。
  2. 其次还介绍了一下Diffusion 生成图片的流程 ——包括 向量形状 在系统中经历的一系列变化,以及各个阶段图片隐变量解码后的 可视化

下篇文章可以点击这里阅读~

第二篇 Diffusion怎么训练以及怎么使用

凡本网注明"来源:XXX "的文/图/视频等稿件,本网转载出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如涉及作品内容、版权和其它问题,请与本网联系,我们将在第一时间删除内容!
作者: 曾飞飞 对人体及姿态问题感兴趣的大四在读生
来源: https://zhuanlan.zhihu.com/p/597247221