2024-09-21 05:46:46
Stable DIffusion原理卜原理
让每个人都看懂
AI绘画基本原理
01Stable Diffusion原理介绍
1.什么是扩散?
首先, 大家要明确(Stable Diffusion) 是一个算法, 我们说的StableD if uusi on webUI是基于这个算法的一个工具。
我们不妨先来学习一下英语:Stable Diffusion中的Stable是稳定的(adj.) , Diffusion是扩散(n.) , 所以Stable
Diffusion的简单理解就是一种稳定的扩散的算法。
在图像领域中,扩散算法是通过一定规则去噪(反向扩散)或加噪(正向扩散)的过程。
如下图演示的就是以prompt为**a red flower**做扩散的过程,从最开始的灰色噪点块、逐渐去噪到最终的清晰的过程:
2.扩散(Diffusion) 是怎么能被稳定(Stable) 控制的?
我们以文生图为例, 给大家看一下Stable Diffusion的原理:
这里的过程, 大家可以把它抽象理解为一个大函数Fsd
(prompt) , 即:我们输入一段自然语义prompt, 经过一系列函数运算和变化,最终输出一张图的过程。
3.CLIP:我们输入的文字prompt是如何起作用的?
我们先来看第一个部分,我们输入了一段咒语,这段咒语是如何起作用的?
让我们咒语起作用的是一段叫做CLIP的算法, CLIP是Text
Encoder算法的一种, Text Encoder大家从字面意思也能够理解,是把文字转化为代码的一种算法,他的主要功能是把自然
语义prompt转变为词特性向量(Embedding) 。
如下图所示, 我们举个例子, 比如我们输入了一个prompt:**可爱的女孩**, CLIP算法作自然语义处理的时候会根据之前被程序员调教的经验,大概感知到可爱的女孩可能具有哪些特征?
比如他们可能有”大大圆圆的眼睛“,可能有”白皙的肌肤“,可能有”可爱的神态“等等,然后这些可能得特征被转化为77个等长的token词向量(每个向量包含768个维度) , 这就是我们说的Embedding。
这里需要注意的是, UNET去噪的时候, 原理比上图描述的复杂很多,它其实并不是一步一步去噪就能得到对应效果的,如果仅仅是一步一步的去噪,效果往往很差,并不能精确得到描述文本的图片。
所以在这里我会稍微讲得深入一些, 介绍一下Classifier Free Guidance引导方法:
为了保证我们的prompt最终的精确性, 在UNET分步去噪的时候,比如我设置的去噪步长为20,他会在每一步都生成一个有prompt特征引导的图和一个没有prompt特征引导的图, 然后把两者相减,就得到了每一个去噪步骤中单纯由文字引导的特征信号,然后将这个特征信号大很多倍,这就加强了文本引导。
同时,在第N+1步去噪结束后,它还会用第N+1步去噪的信息特征减去第N部的特征,然后继续方法很多倍,这样保证
prompt在每一步都能有足够权重比参与运算。
上面那一段大家看不懂也没关系,用通俗的大白话来说,就是这个方法加强了prompt的权重。这个方法在Stable Diffusion webUI中被直译为提示词相关性, 是一个常用参数, 他的数值决定了生成的图与提示词的相关程度。
讲到这里你们会说,诶,不对啊,你看同样是关键词,你的为啥就这么好看,我的生成出来就很丑?那是因为,当我们输入同一个prompt, 我们的text encoder过程是一样, 也就是你得到的词向量是一致的,但是后面的去噪算法依赖模型不同,生成的效果千差万别。
那么接下来我们来讲一下SD里最重要的UNET算法。
4.UNET:扩散模型的工作原理
UNET他是一种根据词向量的扩散算法, 他的工作原理如下图所示, 在上面说到的Clip算法会根据我们输入的prompt输出对应机器能识别的词向量(Embedding) , 这个Embedding大家也只需要粗浅理解为他是一个函数,包含(Q、K、V)三个参数就好了。
这三个参数会根据我们输入的对应扩散步长, 作用于UNET去噪算法的每一步,比如下图中,我设置了去噪步长为20步,大家能看到这张图逐渐扩散生成的效果。
说完了文生图, 我们大概也说一下图生图, 咱们在使用Stable Diffusion webUI的时候用图生图的功能, 往往是给一张图,然后再输入一段prompt, 比如我们还是设置扩散步数N=20,这时候,它的原理是先把我们提供的图进行逐步加噪,逐步提取图片信息, 使它变成一张完全的噪点图, 再让prompt起作用, 结合上面的UNET算法逐步去噪, 得到既有素材图片特征也有prompt特征的最终效果图。
5.理解VAE的编解码过程
最后我们简单来理解一下CAE编解码的过程, VAE全称变分自编码器,这里大家不需要做太多理解,只需要知道他是一个先压缩后解压的算法就好了。
需要注意的是, 我们上面写的UNET算法不是直接在图片上进行的,而是在”负空间“进行的,大家理解为在代码层面即可。
VAE他的原理如下图所示, 假如我们要生成的图是512x 512的,VAE算法在一开始的时候, 会把它压缩到八分之一, 变成
64x 64, 然后走UNET算法的时候, 会把图形数据带在噪点图中, 这个过程叫Encoder, 然后再走完UNET算法后, 我们得到了一个带有所有图片特征的噪点图, 此时VAE再进行
Decoder过程, 把这张图解析并放大成512x 512, 知道到这里即可,不要深究。
1.机器是如何认识图片的?
首先,我们先来看看机器是如何认识图片的。相信大家都听说过,最初计算机视觉训练认识物体的时候,采用的是成对训练的方法,通过“图”+“对应描述”成对训练。运用图像识别、自然语义处理与卷积神经网络等一系列技术让计算机能够识别这个图形。
如上图所示,我们不停的给计算机喂成千上亿张狗的图,然后告诉他,你看这是狗,这也是狗,这还是狗,然后机器会不断归纳狗的特征,重复学习亿遍后,它就认识狗了。
2.可供调用的模型是如何训练的?
好了,假设这时候,机器已经能识别万物了,这时候机器由于学习的图片风格都不同,生成的图片有可能不满足我们的期望,举个例子:
假设程序员经过十年的努力后,让机器正确认识了小女孩的特征,不会出现三个眼睛两个嘴巴。
当我们输入一个**acute girl**, 生成的是图A, 这时候假如A 的风格与我们想要的完全不同,比如我们想要的是B这种,这时候程序员们就会不断调整函数中的各种算法和参数,使得产出的图形A无限接近图像B, 然后停止训练, 此时整个Fsd(x)函数的所有调整的参数, 就被保存为一个.ck pt的文件, 这个叫checkpoint的文件就是程序员训练好的可供调用的A I绘图大模型,他能保证我们每次生成的图偏向于某种特征集合。
整个过程如下图所示: