本页面记录了 Stable Diffusion 代码库中实现的采样方法。采样方法是决定如何逐步去噪潜在噪声以生成图像的算法。采样器的选择会影响图像质量和生成速度,为不同的用例提供不同的权衡。
有关扩散模型整体架构的信息,请参阅潜在扩散模型。
来源:ldm/models/diffusion/ddim.py1-3 ldm/models/diffusion/dpm_solver/sampler.py1-3
Stable Diffusion 实现多种采样策略,每种策略都有其独特的特性。
该存储库提供了三种主要采样器。
来源:ldm/models/diffusion/ddim.py ldm/models/diffusion/dpm_solver/sampler.py
每个采样器都遵循通用的接口模式,以集成到潜在扩散模型中。
所有采样器都遵循类似的模式。
alphas_cumprod 类的模型参数注册为缓冲区。sample() 方法。来源:ldm/models/diffusion/ddim.py12-24 ldm/models/diffusion/dpm_solver/sampler.py8-19
DDIM(去噪扩散隐式模型)采样器是一种确定性采样方法,与原始的 DDPM(去噪扩散概率模型)方法相比,它能够实现显著更少的采样步数。
DDIMSampler 在ldm/models/diffusion/ddim.py 中定义,并提供了:
调度:make_schedule 方法创建采样过程的时间步长序列,在完整的扩散时间步长和缩减的子集之间进行转换,以实现更快的采样。
采样过程:
sample 方法是主要入口点。ddim_sampling。p_sample_ddim。单步去噪:
p_sample_ddim 执行单个去噪步骤。unconditional_guidance_scale 参数支持无分类器自由引导。eta 控制随机性 - 当 eta=0.0 时,过程是确定性的。| 参数 | 描述 | 效果 |
|---|---|---|
步数 | 采样步数 | 步数越少速度越快,但可能会降低质量。 |
eta | 控制随机性。 | 0.0 表示确定性,1.0 表示随机性。 |
unconditional_guidance_scale | 引导强度。 | 值越高,越贴近提示词。 |
来源:ldm/models/diffusion/ddim.py56-111 ldm/models/diffusion/ddim.py166-204
DPM-Solver 是一种先进的快速采样器,为扩散模型提供了高阶收敛性,能够以非常少的步数获得高质量的结果。
DPM-Solver 由多个组件组成。
DPMSolverSampler (ldm/models/diffusion/dpm_solver/sampler.py8-82)
sample 方法。NoiseScheduleVP (ldm/models/diffusion/dpm_solver/dpm_solver.py6-174)
DPM_Solver (ldm/models/diffusion/dpm_solver/dpm_solver.py351-1300)
高阶求解器:
求解方法:
求解器类型:
dpm_solver:默认求解器类型。taylor:替代实现,具有略微不同的特性。| 参数 | 描述 | 典型值 |
|---|---|---|
steps (S) | 求解器步数。 | 10-50(比 DDIM 少)。 |
skip_type | 时间步长间隔的方法。 | 'time_uniform'(高分辨率默认值)。 |
method | 求解方法。 | 'multistep' 或 'singlestep'。 |
order | 求解器的阶数。 | 1、2 或 3。 |
来源:ldm/models/diffusion/dpm_solver/sampler.py21-82 ldm/models/diffusion/dpm_solver/dpm_solver.py351-450
| 采样器 | 速度 | 质量 | 推荐步数 | 用例 |
|---|---|---|---|---|
| DDIM | 中等 | 良好 | 50-100 | 速度和质量的良好平衡。 |
| PLMS | 中等 | 更好 | 50-70 | 当质量比速度更重要时。 |
| DPM-Solver | 快 | 优秀 | 15-30 | 大多数用例的最佳选择。 |
使用 Stable Diffusion 时,请根据您的优先事项选择采样器。
eta=0.0 的 DDIM。在入口脚本 (txt2img.py/img2img.py) 中使用采样器时,采样器选择和配置如下:
来源:ldm/models/diffusion/dpm_solver/sampler.py21-82 ldm/models/diffusion/ddim.py56-111
所有采样器都依赖于“噪声调度”,该调度决定了噪声在扩散过程中如何添加和移除。Stable Diffusion 支持多种噪声调度。
噪声调度在模型训练期间定义,是模型配置的一部分。对于预训练的 Stable Diffusion 模型,使用了从 alphas_cumprod 参数派生的离散调度。
来源:ldm/modules/diffusionmodules/util.py21-43 ldm/models/diffusion/dpm_solver/dpm_solver.py6-124