前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >07:Euler?Karras?该如何选择stable diffusion的采样器

07:Euler?Karras?该如何选择stable diffusion的采样器

原创
作者头像
叫我阿柒啊
修改2024-07-08 02:21:05
250
修改2024-07-08 02:21:05
举报

前言

之前的两篇文章主要讲了在stable diffusion中,text prompt转换成conditioning以及被Noise pridictor消费的过程,然后又讲了前向扩散和逆向扩散去噪的过程。所以趁热打铁,就想从一个更为细致的角度,再来深入了解一下stable diffusion的工作流程。

工作流程

在很多stable diffusion的教程中,都会看到这张很“晦涩”的流程图。

刚开始看的时候,我直呼“看不懂”。后来经过一段时间的学习之后,知识碎片就与流程图的各个模块呼应上了。

conditioning

可以看到流程图最右侧的conditioning,里面包含文生图的text prompt和图生图的images。text prompt被clip转换成conditioning,然后进入Noise pridictor。

而图生图中,图片被VAE解码器(流程图左侧ε)转换成latent image,与text prompt以及controNet生成的depth map,一起作为conditioning进入到Noise pridictor。

正向扩散(加噪)

与此同时,stable diffusion会生成一个噪声图作为“基图”。文生图中,如果将seed设置为-1,则随机生成一个噪声图。图生图中,会将你输入的图片进行一个加噪,最后生成噪声图。

而加噪的过程被称为正向扩散(forward diffusion),也就是流程图最上方的diffusion process。那么,如何根据这个“基图”生成最后的图片呢?

逆向扩散(去噪)

噪声图在Noise pridictor中,通过逆向扩散一步步生成生成我们的目标图片。

那么,一个噪声图是如何结合我们输入的prompt和image等conditioning,一步步生成一张清晰图片的?

1. cross attention

conditioning进入Noise pridictor之后,会被cross attention(交叉注意力)机制消费,控制文本信息和图像信息的融合交互。在cross attention,conditioning与图片相遇,换句话说,就是控制Noise pridictor把噪声图中的某一块,与conditioning表达的特定信息相对应。

同时,cross attention帮助我们将联系度高的对象找出来。例如:让我们以“蓝眼睛的男人”prompt为例,cross attention将“蓝色”和“眼睛”这两个词配对在一起,这样它生成的是一个有蓝色眼睛的男人,而不是一个穿着蓝色衬衫的男人。

从流程图可以看出,在U-Net(Noise pridictor)的去噪(denoising)过程中,在cross attention与conditioning融合之后,开始迭代去噪,这个去噪的过程就叫做采样(Sampling)

2. 采样(Sampling)

还记得之前讲过Noise predictor的作用吗?Noise predictor用来估计加在每个step上的总噪声,从正向扩散得到的噪声图中减去Noise predictor预测的噪声,就得到了我们想要的图片。

我们不可能一步到位,直接从原噪声图减去预测的噪声,这样的误差很高。所以需要设置采样步数(sampling step),将预测的总噪声分布在每一步上,生成noise schedule,在每一步采样时根据noise schedule(噪声计划表)减去相应的noise即可。

当我们将采样步数设置为15时,生成的noise schedule:

当我们将采样步数设置为30时,生成的noise schedule:

从上面两张图片对比可知,每一步减去的noise是递减的,且step越大,noise schedule下降趋势越平滑,也说明每相邻的两个step之间noise的下降幅度越小,最终映射到结果图片的表现就是:图片更符合预期

使用相同的text prompt、seed,分别在step为10、20、25、30的情况下生成图片。

代码语言:javascript
复制
Street,cherry tree,train front in the middle of street,railway,spring,pink,outdoor,Vista,Sun,breeze,petals,illustration style,Shinkai Makoto style,Ultra High resolution,4k,

可以看到,step为10时,图片中没有出现prompt提到的火车,而当step为20时,图片就已经出现了火车。再看step为25和30时,细节刻画的更为细致,但总体来说差别不大。甚至在30 step时,prompt中提到的“火车在街道中央”,还没有20 step时生成的更为准确。所以说,step也不是设置越大越好。

3. 采样器(Sampling method)

那么,谁来依照noise schedule进行采样?Sampling method,被称作采样方法或采样器。不同的采样器,在同等的条件下,生成的图片是有差异的。

在stable diffusion中,提供了许多采样器。

当初我在学习这些采样器的时候,首先将采样器进行分类,然后再整理每个采样器的特点和使用场景,形成笔记。最后在实践的时候发现这么多东西,脑子里根本记不住。所以我在实践中进行总结:采样器最常用的就是Euler a、*DPM++ 2M Karras、DPM++ 2M/3M SDE Karras,其他的基本上了解一下就行。

  1. Euler:最简单的采样器
  2. 祖先采样器:后面都有一个a,它们是随机采样器,因为采样结果具有一定的随机性。
  3. DPM++ 2M Karra:适合快速、融合、新的、质量上乘的东西
  4. DPM++ 2M/3M SDE Karras:在极少的步数下生成高质量图片。

下面是使用相同的text prompt,在20的采样步长中,分别使用Euler、DPM++ 2M Karras、DPM++ 3M SDE Karras生成图片。

可以看到,在未进行像素放大的图片中,DPM++ 3M SDE Karras生成图片是细节最好的,但是不收敛,而且图像还会随着步数的变化而大幅波动,类似于祖先采样器。如果考虑收敛性,就选择DPM++ 2M Karras。如果喜欢稳定、可再现的图像,就不要使用任何祖先采样器。

下面就是用相同的text prompt,分别使用Euler a和DPM++ 2M Karras生成图片,来观测其收敛性。其实收敛性在生成过程中的step观测更为直观,但是stable diffusion webui中无法实现,所以就在结果图片中观测。

text prompt:

代码语言:javascript
复制
A female elementary school student in a sci-fi and futuristic world of the city,Hayao Miyazaki style,manga,2d,colorful.raincoat,pop style,glowing

使用Euler a生成六张图片:

使用DPM++ 2M Karras生成六张图片:

可以看到DPM++ 2M Karras生成的六张图片相似度更高。但是在使用别人的大模型的时候,都会给出建议使用的采样器,所以这一点也是无需担心的。

生成图片

在经过采样器的一步步迭代采样之后,基于噪声图去噪最后生成图片,这时候的图片还是在latent space中的,而我们肉眼只能看到像素空间(pixel space)图片,所以VEA编码器( 图中𝒟)就完成了转换,最后输出图片。

结语

至此,整个stable diffusion生成图片的流程就完成了,利用所学的clip、vae、采样器组件和正向扩散、逆向扩散以及采样原理这些知识碎片,映射在流程图之后,发现柳喑花明又一村。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 工作流程
    • conditioning
      • 正向扩散(加噪)
        • 逆向扩散(去噪)
          • 1. cross attention
          • 2. 采样(Sampling)
          • 3. 采样器(Sampling method)
        • 生成图片
        • 结语
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档