标签
是否付费
描述
创建时间 4
收藏夹
原链接
创建时间 3
创建时间 5
收藏类型
Tags
简悦
创建时间 1
Origin
zhuanlan.zhihu.com
创建时间 2
Cubox 深度链接
更新时间

1. 原理简介与相关参数详解

Stable diffusion 是一个深度学习模型。我会简单介绍一下它的大概原理与结构,不会涉及数学,主要从概念出发,请各位放心食用。
为什么需要知道原理呢?如果你不想了解也是可以跳过的,但是了解原理可以让你更深入的理解各个参数的作用,这样你才能够更好的调整,以达到你需要的效果。

1.1. 结构

我们先从整体结构开始讲起,大家从整体上有个了解之后,我们再对各个部分详细展开进行讲解。
原理主要可以分成两部分,一是模型的训练,二是图片的生成(模型的使用)。这一篇主要对第二点进行说明,因为对于初学者来说,并没有必要去训练模型,所以也不必去纠结模型的训练原理。
结构图:
notion image
  • 生成图片,我们主要需要两个输入:1. 提示词(prompt),2. 种子(生成噪声图)。
    • 提示词(prompt)在提供给模型之前,需要进行一些处理,这是因为模型无法直接识别文本。第一步是使用 CLIP,其作用是将提示词(prompt)转换成 Tokenizer(也叫 token),也就是数字,一个词语转换成的 token 数量是不一定的。第二步是将 token 转换成 Embedding,Embedding 是一个 768 维的向量,简单理解就是 768 个数字。第三步是将 Embedding 通过 Text transformer 转换成模型的输入。这里术语比较多,大家不一定需要非常了解,只要简单记住大概的作用就可以了,想要详细了解的话后面也会详细一些展开讲解。
      种子的作用,是生成噪声图,一个固定的种子 + 固定的分辨率,生成的噪声图就是固定的。模型会以这个噪声图为基础进行图片生成。需要说明的是,噪声图并不是一张图片,它是在潜空间里的,你可以简单理解为是压缩后的噪声图。
  • 图片的生成过程,主要分成两步:1. 去噪,2. 从潜空间转换成真实的图片
    • 去噪是生成图片的主要过程,是 stable diffusion 的精华所在,但是这个过程我们不会讲的非常详细,因为讲的详细会涉及到很多的数学知识,不容易理解,我们主要看一下它的过程。去噪可以简单理解为,模型觉得噪声图像什么,就把图片往什么东西修改。这个像什么的判断,会受到提示词的影响,也会受到模型的影响。修改是分步进行的,前面会进行比较大的修改,后面的修改会越来越小。修改图片使用的是 U-Net,U-Net 就是模型的主要内容。
      去噪完成后,我们就得到我们的结果图了,但这是在潜空间里的,也就是说是被压缩过的,无法直接显示成图片。所以需要将其进行转换,变成我们能够看到的图片,这里就是用的 VAE 模型进行转换。需要说明的是,stable diffusion 的模型都是自带 VAE 模型的,但效果不一定好,我们也可以自己选择需要使用的 VAE 模型。
      参考:

1.2. Prompt 相关

1.2.2. Clip skip

face 作为 prompt,测试 clip skip 的影响
notion image
原理:prompt 最终在模型中使用时,是分层的,对于 stable diffusion 模型来说,分成了 12 层。clip skip 就是说,我不需要完整的使用这 12 层,而是跳过其中一些层。跳过的层越多,对细节的控制就越少。比如上面的图中,我们的描述词是 face,那么 face 会有一些细节:眼睛、鼻子、嘴巴的具体形状应该怎么样,肤色应该怎么样等等。我们对比高的 clip skip 和低的 clip skip,可以发现在 clip skip 较低时,基本都可以看到脸上的细节,而 clip skip 较高时,就比较随机,经常出现类似没有眼珠的这种情况,这是因为没有对细节进行控制,所以细节的随机性会更大。
如何调整 clip skip?在 settings 中找到 Quicksettings list,增加 CLIP_stop_at_last_layers:
notion image
再点击 Apply settings,再点击 Reload UI,即可在最上方看到
notion image

1.2.3. CFG scale

CFG scale 控制 prompt 对画面的控制强度,设的小会导致画面不容易生成你在 prompt 中描述的内容,设的大则会导致用力过猛,出现画面过饱和的现象。
我们看测试图:
过饱和的现象可以通过调高 steps 来略微缓解,下面左图是在 steps=20 时生成的,修改 steps=50,得到右图
notion image
notion image

1.3. 采样器 (sampler)

1.3.1. 是什么

先再次看下结构图:
notion image
图片的生成过程叫做 sampling,使用的方法叫采样器(sampler),也就是图中使用 U-Net 处理图片的部分。
sample 的过程是分步进行的,文生图界面中有一个 Sampling steps(采样步数)就是控制这里的步数,也就是会经过几次降噪。通常来说,采样步数越多,生成的效果越好,但是耗时会更长。采样步数到一定大小后,增加步数基本就没什么区别了。一般来说,使用默认的 20 步就够了。

1.3.2. Noise schedule(default/Karras)

每次降噪,都是对图片的一次修改,通常修改的强度是前面几步较强,越到后面修改强度越弱。对每一步降噪强度的控制,叫做 Noise schedule,这就是 sampler 的一部分功能,也就是说不同的 sampler 每一步的降噪强度可能是不同的。
普通的,以及名字中带 Karras 的 Noise schedule:
notion image

1.3.3. ancestral

sampler 有很多种(如右图),我们可以看到,其中有很多种 sampler 是带后缀 a 的(Euler a, DPM2 a…),这指的是 ancestral,从名字不太容易看出含义,它指的是在每次 sample 之后,会再给新生成的图片加一次噪声,这会造成什么影响呢?图片被增加了一些随机性,因为加入的噪声是随机的。具体来说,就是使用这些 sampler 时,生成的结果图片在其他条件不变时,修改 sampling steps,会导致生成的结果有比较大的变化。
对比图:
uler a Sampling steps 2~40
Euler Sampling steps 2-40
notion image

1.3.4. 不同 sampler 的效果对比

总览:
notion image
💭
通常来说,我们更关注图像的生成速度而不是质量,一般的采样方法质量相差不会太大,质量由模型、提示词来控制。
推荐(不绝对,可以自己多尝试): 如果你需要收敛性,那么选择 DPM++ 2M Karras, Euler 和 UniPC 也可以。 如果你需要比较高的质量,可以选择 DPM++ SDE Karras,Euler a。 如果你需要更快的速度,可以选择 UniqPC,并且把步数调的很低。
💭
淘汰速度比较慢的:
DMP2 DPM adaptive Heun DPM++ 2S

1.4. 模型

这里说的模型,是大模型 (也叫 checkpoint model),除了大模型之外还有 Lora、embedding、hypernetwork 等,暂不做介绍。
模型中包含了 CLIP、U-Net、VAE。
虽然有很多模型,但从基础模型来说,目前最常用的就只有 SD 1.5 和 SD 2.1,SD 1.5 是最多的。其他模型都是基于这两个模型去进一步训练的,也叫 fine tune。
SD1.5 和 SD2.1 的主要区别,是 SD1.5 的训练集是 512512 的图像,而 SD2.1 的训练集是 768768 的图像,所以相对来说 SD2.1 更擅长生成大图。不过 SD2.1 有一个缺点,就是无法生成 NSFW 的图片。还有一点区别,是 SD2.1 使用的是 OpenCLIP 而不是 CLIP,clip skip 参数是不生效的。
模型有两种格式,对应文件名后缀是. ckpt 和. safetensors,.ckpt 是旧版本,.safetensors 是为了解决安全问题而新出现的版本,对于本地部署使用来说都是没有问题的,如果要开放使用,那么最好只使用. safetensors。
模型按照精度,可以分为 fp16 和 fp32 两种。说精度可能不太理解,总之如果只是用来生成图片,那么 fp16 就够了,通常 fp16 大小更小、更省显存、生成速度更快,图片质量和 fp32 相差不大。如果你需要基于某个模型自己训练模型,那么可能 fp32 是更好的选择。
VAE 模型是包含在大模型当中的,但是你也可以自己指定要使用的 VAE 模型,可以从网络上获取。

2. 文生图使用方法

2.1. 基本使用,一图讲解参数

百文不如一图,基本的使用方法参考图片吧:
notion image

2.2. 高清修复

高清修复 (Hires fix) 单独再讲一下,是生成高质量图片的常用选项。开启高清修复后,生成图片的过程分成三步:
  1. 基本的文生图方法,生成配置的分辨率大小的图片。
  1. 使用指定的放大算法,将第一步中生成的图片放大到高清修复中指定的分辨率大小。
  1. 使用图生图,以放大后的图片为基础,重新生成图片。
为什么要分成三步,而不是直接生成大图呢?这是因为模型训练时使用的图片分辨率大小是 512512(SD1.5 是 512512,SD2.1 是 768768,目前使用的模型大部分是 512512),所以不擅长直接生成大图,直接生成大图容易出现奇怪的现象,例如两个头。所以需要先生成小图,再去放大,这样才能得到更高质量的图片。
使用:
notion image