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

前言

之前的两篇文章主要讲了在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的情况下生成图片。

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:

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、采样器组件和正向扩散、逆向扩散以及采样原理这些知识碎片,映射在流程图之后,发现柳喑花明又一村。

### Stable Diffusion 中的采样方法详解 #### 一、采样的概念 在 Stable Diffusion 中,每个步骤都会生成一张新的采样后的图像。整个去噪过程即是采样,在这一过程中所采用的技术被称为采样器或采样方法[^2]。 #### 二、主要采样方法介绍 ##### (一)DDIM (去噪扩散隐式模型) 作为最早期专为扩散模型设计的采样器之一,DDIM 提供了一种有效的方式来进行高质量图片合成。该算法通过控制噪声逐步减少来实现图像生成的目标。其特点在于能够提供更加平滑的结果过渡,并允许用户自定义生成路径中的某些参数设置[^3]。 ```python from diffusers import DDIMPipeline pipeline = DDIMPipeline.from_pretrained('model_name') image = pipeline(prompt="a photograph of an astronaut riding a horse").images[0] ``` ##### (二)PLMS (伪线性多步法) 这是基于 DDIM 进一步优化而来的版本,旨在提高计算效率的同时保持甚至提升最终输出的质量。相较于前者而言,它能够在更短时间内完成相同质量级别的渲染工作,因此成为许多应用场景下的首选方案。 ```python from diffusers import PNDMPipeline pipeline = PNDMPipeline.from_pretrained('model_name') image = pipeline(prompt="a photograph of an astronaut riding a horse", num_inference_steps=50).images[0] ``` 除了上述两种经典的方法之外,还有其他多种新型高效的采样技术不断涌现并被集成到最新的框架版本当中,比如 Euler A, Heun's method 等等,它们各自具有独特的优势适用于不同类型的任务需求。 #### 三、如何选择适合自己的采样方式? 当面对众多可选方案时,可以根据具体项目的要求和个人偏好做出决定: - 如果追求极致画质而不考虑速度因素,则可以选择较为保守但稳定的选项如 DDIM; - 对于实时交互类应用来说,优先考虑那些能在较短时间里给出满意成果的选择像 PLMS 或者更新颖快速收敛型别的采样策略; 总之,在实际操作前最好先尝试几种不同类型的配置组合进行对比测试,从而找到最适合自己场景的最佳实践模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值