一、前言(可跳过)
二、stable diffusion
1.clip
2.diffusion model
forward diffusion (前向扩散)
首先是forward diffusion (前向扩散),也就是加噪过程,最后就快变成了个纯噪声 每一个时刻都要添加高斯噪声,后一时刻都是由前一刻是增加噪声得到
如果X(u,σ2),那么X可以写成X=μ十σZ的形式,其中Z~Ν(0,1)。这就是重参数化技巧。
逆向扩散(reverse diffusion)
前向扩散完毕,接下来是逆向扩散(reverse diffusion),这个可能比上面那个难点,如何根据一个噪声图像一步步得到原图呢,这才是关键,
逆向开始,我们目标是Xt噪声图像得到无噪声的X0,先从Xt求Xt-1开始,这里我们先假设X0是已知(先忽略为什么假设已知),后面会替换它,至于怎么替换,前向扩散不是已知Xt和X0的关系吗,现在我们已知的是Xt,反过来用Xt来表示X0,但是还有一个Z噪声是未知的,这个时候就要Unet上场了,它需要把噪声预测出来。 这里借助贝叶斯公式(就是条件概率),我们借助贝叶斯公式结果,以前写过一个文档 (https://tianfeng.space/279.html)
Zt其实就是我们要估计的每个时刻的噪声
- 这里我们使用Unet模型预测
- 模型的输入参数有三个,分别是当前时刻的分布Xt和时刻t,还有之前的文本向量,然后输出预测的噪声,这就是整个过程了,
上面的Algorithm 1是训练过程,
下面我们来到Algorithm2采样过程
不就是说Xt符合高斯分布嘛 执行T次,依次求Xt-1到X0,不是T个时刻嘛 Xt-1不就是我们逆向扩散推出的公式,Xt-1=μ+σZ,均值和方差都是已知的,唯一的未知噪声Z被Unet模型预测出来,εθ这个是指已经训练好的Unet,
采样图
为了方便理解,我分别画出文生图和图生图,如果使用stable diffusion webui画图的人一定觉得很熟悉,如果是文生图就是直接初始化一个噪声,进行采样, 图生图则是在你原有的基础上加噪声,噪声权重自己控制,webui界面是不是有个重绘幅度,就是这个, 迭代次数就是我们webui界面的采样步数, 随机种子seed就是我们初始随机得到的一个噪声图,所以如果想要复刻得到一样的图,seed要保持一致
阶段小结
3.Unet model
timestep_embedding采用正余弦编码
三、stable diffusion webui扩展
扫描二维码添加小助手微信