在我们使用SD web UI的过程中,有很多采样器可以选择,那么什么是采样器?它们是如何工作的?它们之间有什么区别?你应该使用哪一个?这篇文章将会给你想要的答案。

什么是采样?

Stable Diffusion模型通过一种称为“去噪”的过程来生成图像,这个过程涉及到在潜在空间中逐步从随机噪声中提取出有意义的图像特征。

  • 模型首先在潜在空间中生成一个完全随机的噪声图像。这个图像是随机的,不包含任何有意义的信息。
  • 噪声预测器(也称为去噪函数)估计这个随机图像中的噪声。这个预测器是模型的一部分,它学习如何从噪声中恢复出清晰的图像。
  • 模型从初始的随机噪声图像中减去预测的噪声,以便逐步揭示出隐藏在噪声下的图像内容。
  • 这个过程会重复多次(通常是十几次),每一步都会生成一个新的采样图像。这些采样图像逐渐从随机噪声转变为越来越清晰的图像。
  • 经过多次迭代后,最终得到的图像是一个干净的、去噪后的图像,它反映了文本提示中描述的内容。

下面是一个实际的采样过程。采样器逐渐产生越来越干净的图像。

Noise schedule

在Stable Diffusion模型的去噪过程中,噪声表(noise schedule)扮演着至关重要的角色。

噪声表是一个预先定义的计划,它决定了在每一步采样过程中应用的噪声水平。

  • 在去噪过程的第一步,图像充满了高噪声,这是因为初始图像是完全随机的噪声图像。在这个阶段,噪声水平最高,图像看起来是不连贯和随机的。
  • 随着去噪过程的进行,噪声表会逐步降低每个采样步骤中的噪声水平。这种降低是按照预定的计划进行的,旨在逐渐从噪声中提取出有意义的图像特征。
  • 在去噪过程的最后一步,噪声水平降低到零,此时图像应该是清晰且与文本提示相匹配的。理想情况下,最终图像应该几乎没有噪声,且细节丰富,准确地反映了文本描述的内容。

下面是一个Noise schedule的基本工作原理:

如果我们增加采样步骤数,那么每个步骤之间的降噪幅将会变小。这有助于减少采样的截断误差。

可以比较一下 15 个步骤和 30 个步骤的噪音时间表。

不同的采样器

webUI自带了很多不同的采样器,并且这个采样器的个数还在不停的增加,那么这些采样器都有些什么不同呢?

老式ODE solvers

让我们看一下最简单采样器。这些采样器算法已经被发明很久很久了。它们是常微分方程 (ODE) 的老式采样器。

Euler– 最简单的采样器。

Heun– 更准确但更慢的 Euler 版本。

LMS(线性多步法) – 与 Euler 的速度相同,但(据说)更准确。

Ancestral采样器

如果你注意观察的话,可以看到某些采样器的名称上带有一个字母'a'。 比如:

  • Euler a

  • DPM2 a

  • DPM++ 2S a

  • DPM++ 2S a Karras

他们是Ancestral采样器。Ancestral采样器在每个采样步骤中都会向图像添加噪声。它们是随机采样器,因为采样结果具有一定的随机性。

当然也有很多随机采样器的名字上是不带a的。

使用Ancestral采样器的缺点是图像不会收敛。也就是说你有可能不会得到相同的结果。

还是刚刚的例子,我们比较一下使用 Euler a 和 Euler 生成的图像。(为了便于对比,我们加入了另外一个收敛的采样器)

可以看到Euler和DMP++ 2M Karras最终生成的图片其实是大致一样的,但是他们两个跟Euler a的结果不太相同。

所以为了可重复性,那就用收敛采样器。如果要生成细微的变化,那么可以考虑使用随机采样器。

Karras noise schedule

带有“Karras”标签的采样器使用 Karras 文章中推荐的 noise schedule。和传统的采样器相比,你会发现噪声步长在接近尾声时变小了。这样的变化据说可以提高图像的质量。

DDIM 和 PLMS

DDIM(去噪扩散隐式模型)和 PLMS(伪线性多步法)是原始 Stable Diffusion v1 附带的采样器。DDIM是首批为扩散模型设计的采样器之一。PLMS 是 DDIM 的更新、更快的替代方案。

这两个采样器已经过时了,我们通常不会使用他们。

DPM 和 DPM++

DPM(扩散概率模型求解器)和 DPM++ 是专为 2022 年发布的扩散模型设计的新采样器。它们表示具有类似体系结构的求解器系列。DPM 和 DPM2 相似,但 DPM2 是二阶的(更准确但更慢)。DPM++ 是对 DPM 的改进。

DPM adaptive是自适应调整步长。所以它可能很慢,并且不能保证在采样步骤数内完成。

UniPC

UniPC(统一预测器校正器)是 2023 年发布的新采样器。受常微分方程求解器中预测变量-校正器方法的启发,它可以在 5-10 个步骤内实现高质量的图像生成。

怎么选择采样器

那么这么多的采样器,我们应该如何选择呢?我想我们可以从采样算法是否收敛,采样的速度和最终生成图片的质量这几个方面来具体考量需要使用什么样的采样器。

是否收敛

首先,对Euler、DDIM、PLMS、LMS Karras 和 Heun这些老式的常微分方程求解器或原始扩散求解器来说,PLMS和LMS Karras收敛效果不佳。Heun收敛得更快。

对于所有的Ancestral采样器来说,都是不收敛的。这些采样器有:Euler a, DPM2 a, DPM++ 2S a, DPM2 a Karras, DPM++ 2S a Karras。

DPM++ SDEDPM++ SDE Karras 与Ancestral采样器存在相同的缺点。它们不仅不会收敛,而且图像也会随着步数的变化而显着波动。

DPM++ 2MDPM++ 2M Karras 表现良好。当步数足够高时,karras变体收敛得更快。

UniPC 收敛速度比 Euler 慢一点,但还不错。

采样速度

下图是使用不同采样器的采样速度:

虽然 DPM adaptive在收敛方面表现良好,但它也是最慢的。

其余的渲染时间可以分为两组,第一组花费的时间大致相同(约 1 倍),另一组花费的时间大约是两倍(约 2 倍)。时间花费2倍的是因为他们用的是2阶求解器。

二阶求解器虽然更准确,但需要对去U-Net进行两次评估,所以它们花费的时间大概是2倍。

质量

当然,前面讲的收敛和速度都是次要的,如果最终生成的图片质量不好,那么收敛和速度也就无从谈起了。

我们比较一下常用的一些采样器的最终图片效果:

大家觉得哪幅图更好?事实上,哪幅图更好是一个主观上的标准,每个人的审美观点不同,最后可能选出来不同的结果。

所以......哪一个是最好的?

我不能说哪个是最好的,但是我可以给点我的建议。

如果您想快速、有创造力并且质量不错,那么可以这样选择:

  • DPM++ 2M Karras,20-30 步
  • UniPC,20-30 步。

如果您想要高质量的图像并且不关心收敛性,那么可以这样选择:

  • DPM++ SDE Karras,10-15 步(注意:这是一个较慢的采样器)

  • DDIM,10-15 步。

如果您喜欢稳定、可重现的图像,请避免使用任何Ancestral采样器。

EulerHeun也是不错的选择.

点我查看更多精彩内容:www.flydean.com

Stable diffusion采样器详解的更多相关文章

  1. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  2. CentOS Yum 命令详解

    总所周知,Redhat和Fedora的软件安装命令是rpm,但是用rpm安 装软件最大的麻烦就是需要手动寻找安装该软件所需要的一系列依赖关系,超级麻烦不说,要是软件不用了需要卸载的话由于卸载掉了某个依 ...

  3. redis配置详解

    ##redis配置详解 # Redis configuration file example. # # Note that in order to read the configuration fil ...

  4. 【大数据】Linux下安装Hadoop(2.7.1)详解及WordCount运行

    一.引言 在完成了Storm的环境配置之后,想着鼓捣一下Hadoop的安装,网上面的教程好多,但是没有一个特别切合的,所以在安装的过程中还是遇到了很多的麻烦,并且最后不断的查阅资料,终于解决了问题,感 ...

  5. 【OpenStack】OpenStack系列4之Glance详解

    下载安装 参考:http://www.linuxidc.com/Linux/2012-08/68964.htm http://www.it165.net/os/html/201402/7246.htm ...

  6. SVN组成中trunk,branches and tags功能用法详解

    SVN组成中trunk,branches and tags功能用法详解  我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说 ...

  7. [r]Ubuntu Linux系统下apt-get命令详解

    Ubuntu Linux系统下apt-get命令详解(via|via) 常用的APT命令参数: apt-cache search package 搜索包 apt-cache show package ...

  8. Python数据类型及其方法详解

    Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...

  9. 有了Openvswitch和Docker,终于可以做《TCP/IP详解》的实验了!

    所有做过网络编程的程序员,想必都会看<TCP/IP详解>卷一:协议 后来出了第二版,但是由于第一版才是Rechard Stevens的原版,本人还是多次看了第一版. 对这一版印象最深的就是 ...

  10. kubernetes系列07—Pod控制器详解

    本文收录在容器技术学习系列文章总目录 1.Pod控制器 1.1 介绍 Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无 ...

随机推荐

  1. # AssertionError: The `num_classes` (3) in Shared2FCBBoxHead of MMDataParallel does not matches the length of `CLASSES` 80) in CocoDataset

    我看很多人都遇到了这个问题,有很多解决了的.我就把这篇博文再完善一下,让大家对mmdetection使用得心应手. mmdetection训练自己的数据集时报错 ️ : # AssertionErro ...

  2. 升级Django项目过程中问题记录

    升级内容: python版本:3.8.4升到3.10.7 Django版本:2.2.13升到4.2 所遇问题: 1. error in anyjson setup command: use_2to3 ...

  3. Spring开发:动态代理的艺术与实践

    本文分享自华为云社区<Spring高手之路17--动态代理的艺术与实践>,作者: 砖业洋__. 1. 背景 动态代理是一种强大的设计模式,它允许开发者在运行时创建代理对象,用于拦截对真实对 ...

  4. 一文搞懂 SAE 日志采集架构

    简介: 本文将着重介绍了 SAE 提供了多种日志采集方案,以及相关的架构,场景使用特点,点击下文,立即查看吧- 作者:牛通(奇卫)   日志,对于一个程序的重要程度不言而喻.无论是作为排查问题的手段, ...

  5. 网易云音乐基于 Flink + Kafka 的实时数仓建设实践

    一.背景介绍 (一)流平台通用框架 目前流平台通用的架构一般来说包括消息队列.计算引擎和存储三部分,通用架构如下图所示.客户端或者 web 的 log 日志会被采集到消息队列:计算引擎实时计算消息队列 ...

  6. 21克:仅需3天,我们就用Quick BI搭建起数据驾驶舱

    ​简介:数智化并不仅仅是大型企业才需要去思考的课题,而是摆在所有企业面前的一个可选项.借助Quick BI搭建的数据分析体系,21克实现了销售.财务.供应链等多部门业务的数据化支撑,从一份份本地化的E ...

  7. C# - 自建 SDK 的 API 文档

    在代码中添加 API 文档 用户在使用类库时,通常需要通过 VS 的 Intellisense 或 F12 反编译查看 API 的注释,借助这些注释来了解如何使用 API.在 C# 源文件中,可以通过 ...

  8. .NET静态代码织入——肉夹馍(Rougamo)发布3.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...

  9. linux下的开机启动

    使用systemctl命令,systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 据说在CentOS7.0后,不再使用service, ...

  10. Threading Programming Guide:One

    苹果支持的产生线程的方式 Operation Object 使用OperationQueue,具体可以参考:Concurrency Programming Guide GCD 使用诸如dispatch ...