首页教程
【Stable Diffusion进阶教程】Stable Diffusion如何发挥作用?
14

【Stable Diffusion进阶教程】Stable Diffusion如何发挥作用?

AI知识学习小助手
AI知识学习小助手
2023-08-03 10:52

Stable Diffusion是一种深度学习模型。我们将深入了解它的底层工作原理。

为什么你需要知道?除了其本身是一个令人着迷的主题之外,对内部机制的一些了解将使您成为一名更好的艺术家。你可以正确使用该工具来获得更高精度的结果。

文本到图像与图像到图像有什么不同?CFG值是多少?什么是降噪强度?你会在这篇文章中找到答案。

让我们来深入了解一下。

Stable Diffusion能做什么?

最简单的解释是,Stable Diffusion是一种文本到图像模型。给它一个文字提示。它将返回与文本匹配的图像。

扩散模型

Stable Diffusion属于一类称为扩散模型的深度学习模型。它们是生成模型,这意味着它们旨在生成与训练中看到的类似的新数据。对于Stable Diffusion,数据是图像。

为什么叫扩散模型?因为它的数学看起来很像物理学中的扩散。让我们来看看这个想法。

假设我只用两种图像训练了一个扩散模型:猫和狗。在下图中,左边的两个峰代表猫和狗图像组。

  • 前向扩散

前向扩散过程向训练图像添加噪声,逐渐将其变成不典型的噪声图像。前向过程会将任何猫或狗图像变成噪声图像。最终,你将无法分辨它们最初是狗还是猫。(这一点很重要)

就像一滴墨水掉进一杯水中一样。墨滴在水中扩散。几分钟后,它随机分布在水中。你无法再分辨它最初是落在中心还是边缘附近。

下面是进行前向扩散的图像的示例。猫的图像变成了随机噪声。

  • 反向扩散

现在到了令人兴奋的部分。如果我们可以逆转扩散呢?就像倒放视频一样。时间倒退。我们将看到最初添加墨滴的位置。

从嘈杂、无意义的图像开始,反向扩散恢复猫或狗的图像。这是主要思想。

从技术上讲,每个扩散过程都有两个部分:(1)漂移和(2)随机运动。反向扩散会偏向猫或狗图像,但不会偏向于两者之间。这就是为什么结果可能是一只猫或一只狗。

训练是如何进行的

反向扩散的想法无疑是巧妙而优雅的。但价值百万美元的问题是:“如何才能做到这一点?”

为了反转扩散,我们需要知道图像中添加了多少噪声。答案是训练神经网络模型来预测添加的噪声。它被称为稳定扩散中的噪声预测器。它是一个U-Net模型。训练过程如下:

  1. 选择一张训练图像,例如猫的照片。
  2. 生成随机噪声图像。
  3. 通过将噪声图像添加到一定数量的步骤来破坏训练图像。
  4. 训练噪声预测器告诉我们添加了多少噪声。这是通过调整其权重并向其显示正确答案来完成的。

经过训练,我们有了一个噪声预测器,能够估计添加到图像中的噪声。

  • 反向扩散

现在我们有了噪声预测器。怎么使用呢?

我们首先生成一个完全随机的图像,并要求噪声预测器告诉我们噪声。然后我们从原始图像中减去估计的噪声。重复这个过程几次。你将得到一只猫或一只狗的图像。

你可能会注意到我们无法控制生成猫或狗的图像。当我们谈论调节时,我们将解决这个问题。目前,图像生成是不受条件限制的。

Stable Diffusion模型

现在我要告诉你一些坏消息:我们刚才讨论的不是Stable Diffusion的工作原理!原因是上述扩散过程是在图像空间中进行的。它的计算速度非常非常慢。你将无法在任何单个 GPU 上运行,更不用说笔记本电脑上的蹩脚 GPU 了。

图像空间非常巨大。想想看:具有三个颜色通道(红、绿、蓝)的 512×512 图像是一个 786,432 维的空间!(你需要为一张图像指定这么多值。)

像 Google 的 Imagen 和 Open AI 的 DALL-E 这样的扩散模型都在像素空间中。他们使用了一些技巧来使模型更快,但仍然不够。

  • 潜在扩散模型

Stable Diffusion旨在解决速度问题。方法如下。

Stable Diffusion是一种潜在扩散模型。它不是在高维图像空间中操作,而是首先将图像压缩到潜在空间中。潜在空间小了 48 倍,因此它获得了处理更少数字的好处。这就是为什么它的速度要快得多。

  • 变分自动编码器

它是使用一种称为变分自动编码器的技术来完成的。是的,VAE 文件正是如此,但稍后我会讲得非常清楚。

变分自动编码器 (VAE) 神经网络有两部分:(1) 编码器和 (2) 解码器。编码器将图像压缩为潜在空间中的较低维表示。解码器从潜在空间恢复图像。

Stable Diffusion模型的潜在空间为4x64x64,比图像像素空间小48倍。我们谈到的所有前向和反向扩散实际上都是在潜在空间中完成的。

因此,在训练过程中,它不会生成噪声图像,而是在潜在空间(潜在噪声)中生成随机张量。它不是用噪声破坏图像,而是用潜在噪声破坏图像在潜在空间中的表示。这样做的原因是它的速度要快得多,因为潜在空间更小。

  • 图像分辨率

图像分辨率反映在潜像张量的大小上。仅对于 512×512 图像,潜在图像的大小为 4x64x64。768×512 肖像图像的尺寸为 4x96x64。这就是为什么需要更长、更多的 VRAM 才能生成更大的图像。

由于Stable Diffusion v1 在 512×512 图像上进行了微调,因此生成大于 512×512 的图像可能会导致重复的对象,例如臭名昭著的两个头。如果必须这么做,请至少将一侧保留为 512 像素,并使用 AI 升级器以获得更高分辨率。

  • 为什么潜在空间可能存在?

你可能想知道为什么 VAE 可以将图像压缩到更小的潜在空间而不丢失信息。毫不奇怪,原因是自然图像不是随机的。它们具有高度的规律性:面部遵循眼睛、鼻子、脸颊和嘴巴之间的特定空间关系。狗有4条腿,并且具有特殊的形状。

换句话说,图像的高维性是人为的。自然图像可以很容易地压缩到更小的潜在空间中,而不会丢失任何信息。这在机器学习中被称为流形假设。

  • 潜在空间中的反向扩散

以下是Stable Diffusion中潜在反向扩散的工作原理。

  1. 生成随机潜在空间矩阵。
  2. 噪声预测器估计潜在矩阵的噪声。
  3. 然后从潜在矩阵中减去估计的噪声。
  4. 重复步骤 2 和 3 直至达到特定的采样步骤。
  5. VAE 的解码器将潜在矩阵转换为最终图像。
  • 什么是 VAE 文件?

Stable Diffusion v1 中使用 VAE 文件来改善眼睛和面部。它们就是我们刚才谈到的自动编码器的解码器。通过进一步微调解码器,模型可以绘制更精细的细节。

你可能意识到我之前提到的并不完全正确。将图像压缩到潜在空间确实会丢失信息,因为原始 VAE 无法恢复精细细节。相反,VAE 解码器负责绘制精细细节。

调节作用

我们的理解不完整:文字提示在哪里进入图片?没有它,Stable Diffusion就不是文本到图像的模型。你要么会得到一只猫或一只狗的图像,但没有任何办法控制它。

这就是条件作用的用武之地。条件作用的目的是引导噪声预测器,以便预测的噪声在从图像中减去后能够为我们提供我们想要的结果。

  • 文本调节(文本到图像)

下面概述了如何处理文本提示并将其输入噪声预测器。分词器首先将提示中的每个单词转换为称为标记的数字。然后,每个标记都会转换为 768 个值的向量,称为嵌入。(是的,这与你在 AUTOMATIC1111 中使用的嵌入相同)嵌入随后由文本转换器进行处理,并准备好供噪声预测器使用。

现在让我们仔细研究一下每个部分。如果上述高级概述对您来说足够好,你可以跳到下一部分。

使用此笔记本检查任何提示的标记和嵌入。

  • 分词器

文本提示首先由 CLIP 标记器进行标记。CLIP 是 Open AI 开发的深度学习模型,用于生成任何图像的文本描述。Stable Diffusion v1 使用 CLIP 的分词器。

标记化是计算机理解单词的方式。我们人类可以读取文字,但计算机只能读取数字。这就是文本提示中的单词首先转换为数字的原因。

分词器只能对训练期间看到的单词进行分词。例如,CLIP模型中有“dream”和“beach”,但没有“dreambeach”。分词器会将“dreambeach”一词分解为两个标记“dream”和“beach”。因此,一个词并不总是意味着一个标记!

另一个细节是空格字符也是标记的一部分。在上面的例子中,短语“dream beach”产生两个标记“dream”和“[space]beach”。这些标记与“dreambeach”生成的标记不同,“dreambeach”是“dream”和“beach”(海滩之前没有空格)。

Stable Diffusion模型仅限于在提示中使用 75 个标记。(现在你知道它和 75 个单词不一样了!)

  • 嵌入

Stable Diffusion v1 使用 Open AI 的 ViT-L/14 Clip 模型。嵌入是一个 768 值向量。每个标记都有自己独特的嵌入向量。嵌入由 CLIP 模型固定,该模型是在训练过程中学习的。

为什么我们需要嵌入?这是因为有些词彼此之间密切相关。我们想利用这些信息。例如,man、gentleman 和 Guy 的嵌入几乎相同,因为它们可以互换使用。莫奈、马奈和德加都以印象派风格作画,但方式不同。这些名称具有接近但不相同的嵌入。

这与我们讨论的使用关键字触发样式的嵌入相同。嵌入可以发挥神奇作用。科学家们已经证明,找到正确的嵌入可以触发任意对象和样式,这是一种称为文本反转的微调技术。

  • 将嵌入馈送到噪声预测器

在输入噪声预测器之前,嵌入需要由文本转换器进一步处理。变压器就像一个用于调节的通用适配器。在这种情况下,它的输入是文本嵌入向量,但它也可以是其他东西,例如类标签、图像和深度图。变压器不仅进一步处理数据,而且提供了一种包含不同调节模式的机制。

  • 交叉注意力

整个 U-Net 中的噪声预测器多次使用文本转换器的输出。U-Net 通过交叉注意力机制来消耗它。这就是提示与图像的结合处。

我们以提示“A man with blue eyes”为例。Stable Diffusion将“blue”和“eyes”这两个词配对在一起(提示中的自我注意),这样它就会生成一个蓝眼睛的男人,而不是一个穿蓝色衬衫的男人。然后,它使用此信息将反向漫反射转向包含蓝眼睛的图像。(提示和图像之间的交叉注意力)

附注:超网络是一种微调稳定扩散模型的技术,它劫持交叉注意力网络来插入样式。LoRA模型修改交叉注意力模块的权重来改变风格。单独修改这个模块就可以微调 Stable Diffusion 模型,这一事实告诉你这个模块有多么重要。

  • 其他条件

文本提示并不是调节Stable Diffusion模型的唯一方法。

文本提示和深度图像都用于调节深度到图像模型。

ControlNet 使用检测到的轮廓、人体姿势等来调节噪声预测器,并实现对图像生成的出色控制。

逐步Stable Diffusion

现在您已经了解了Stable Diffusion的所有内部机制,让我们通过一些示例来了解幕后发生的情况。

文本转图像

在文本到图像中,您为Stable Diffusion提供文本提示,它会返回图像。

步骤 1. Stable Diffusion在潜在空间中生成随机张量。 您可以通过设置随机数生成器的种子来控制该张量。 如果将种子设置为某个值,您将始终获得相同的随机张量。 这是你在潜在空间中的图像。 但目前这都是噪音。

步骤 2. 噪声预测器 U-Net 将潜在噪声图像和文本提示作为输入,并在潜在空间(4x64x64 张量)中预测噪声。

步骤 3. 从潜在图像中减去潜在噪声。 这成为你新的潜像。

重复步骤2和3一定数量的采样步骤,例如20次。

步骤4.最后,VAE的解码器将潜在图像转换回像素空间。

这是运行稳定扩散后获得的图像。

以下是图像在每个采样步骤中的演变方式。

  • 噪音表

图像从嘈杂变为干净。 您是否想知道噪声预测器在最初的步骤中是否工作得不好? 事实上,这只是部分正确。 真正的原因是我们试图在每个采样步骤中获得预期的噪声。 这称为噪声表。 下面是一个例子。

噪音时间表是我们定义的。 我们可以选择在每一步减去相同数量的噪声。 或者我们可以在开始时减去更多,就像上面一样。 采样器在每一步中减去足够的噪声,以达到下一步中的预期噪声。 这就是您在分步图像中看到的内容。

  • 图像到图像

Image-to-image是SDEdit方法中首次提出的方法。 SDEdit 可应用于任何扩散模型。 因此,我们有用于Stable Diffusion的图像到图像(潜在扩散模型)。

输入图像和文本提示作为图像到图像的输入提供。 生成的图像将受到输入图像和文本提示的限制。 例如,使用这张业余绘画和提示“带有茎、水滴、戏剧性灯光的完美青苹果照片”作为输入,图像到图像可以将其变成专业绘画:

现在这是分步过程。

步骤 1. 输入图像被编码到潜在空间。

步骤 2. 将噪声添加到潜像中。 去噪强度控制添加的噪声量。 如果为0,则不添加噪声。 如果为1,则添加最大量的噪声,使潜像成为完全随机的张量。

步骤 3. 噪声预测器 U-Net 将潜在噪声图像和文本提示作为输入,并预测潜在空间(4x64x64 张量)中的噪声。

步骤 4. 从潜在图像中减去潜在噪声。 这成为你新的潜像。

重复步骤3和4一定数量的采样步骤,例如20次。

步骤5.最后,VAE的解码器将潜在图像转换回像素空间。 这是运行 image-to-image 后得到的图像。

现在您知道什么是图像到图像了:它所做的就是设置带有一点噪声和一点输入图像的初始潜在图像。 将去噪强度设置为 1 相当于文本转图像,因为初始潜在图像完全是随机噪声。

  • 修复

修复实际上只是图像到图像的一种特殊情况。 噪点会添加到您想要修复的图像部分。 噪声量同样由降噪强度控制。

  • 图像深度

深度到图像是图像到图像的增强; 它使用深度图生成带有附加条件的新图像。

步骤 1. 输入图像被编码为潜在状态

步骤 2.MiDaS(AI 深度模型)根据输入图像估计深度图。

步骤 3. 将噪声添加到潜像中。 去噪强度控制添加的噪声量。 如果去噪强度为0,则不添加噪声。 如果去噪强度为1,则添加最大噪声,使得潜像变成随机张量。

步骤 4. 噪声预测器根据文本提示和深度图估计潜在空间的噪声。

步骤 5. 从潜在图像中减去潜在噪声。 这成为你新的潜像。

重复步骤 4 和 5 的采样步骤数。

步骤6.VAE的解码器对潜像进行解码。 现在您可以获得从深度到图像的最终图像。

CFG值是什么?

如果不解释无分类器指导(CFG),这篇文章就不完整,这是人工智能艺术家每天都在修改的一个价值。 要了解它是什么,我们需要首先了解它的前身:分类器指导……

  • 分类器指导

分类器引导是一种将图像标签合并到扩散模型中的方法。 您可以使用标签来指导扩散过程。 例如,标签“猫”引导反向扩散过程来生成猫的照片。

分类器指导尺度是控制扩散过程遵循标签的程度的参数。

下面是我从这篇论文中偷来的一个例子。 假设有 3 组图像,标签为“猫”、“狗”和“人”。 如果扩散是无引导的,模型将从每个组的总人口中抽取样本,但有时它可能会抽取适合两个标签的图像,例如 一个男孩在抚摸一只狗。

在高分类器指导下,扩散模型生成的图像将偏向极端或明确的示例。 如果你向模型询问一只猫,它会返回一张明确是猫的图像,除此之外别无其他。

分类器指导尺度控制指导的遵循程度。 上图中,右边的采样比中间的采样具有更高的分类器指导尺度。 实际上,该比例值只是带有该标签的数据的漂移项的乘数。

  • 无分类器指导

尽管分类器指导取得了破纪录的性能,但它需要一个额外的模型来提供该指导。 这给训练带来了一些困难。

用作者的话来说,无分类器指导是实现“没有分类器的分类器指导”的一种方法。 他们没有使用类标签和单独的模型进行指导,而是建议使用图像标题并训练条件扩散模型,就像我们在文本到图像中讨论的模型一样。

他们将分类器部分作为噪声预测器 U-Net 的调节,实现了图像生成中所谓的“无分类器”(即没有单独的图像分类器)指导。

文本提示提供了文本到图像的指导。

  • CFG值

现在我们通过调节得到了一个无分类器的扩散过程,我们如何控制应该遵循多少指导?

无分类器引导 (CFG) 比例是一个控制文本提示对扩散过程的影响程度的值。 当设置为 0 时,图像生成是无条件的(即忽略提示)。较高的值会将扩散引导至提示。

Stable Diffusion v1 与 v2

这已经是一篇很长的文章了,但如果不比较 v1 和 v2 模型之间的差异,它就不完整。

  • 型号差异

Stable Diffusion v2 使用 OpenClip 进行文本嵌入。 Stable Diffusion v1 使用 Open AI 的 CLIP ViT-L/14 进行文本嵌入。 这一变化的原因是

  1. OpenClip 扩大了五倍。 更大的文本编码器模型可以提高图像质量。
  2. 尽管 Open AI 的 CLIP 模型是开源的,但这些模型是使用专有数据进行训练的。 切换到 OpenClip 模型使研究人员在研究和优化模型时更加透明。 这样更有利于长远发展。
  • 训练数据差异

Stable Diffusion v1.4 经过训练

  1. laion2B-en 数据集上分辨率 256×256 的 237k 步。
  2. 在 laion 高分辨率上,分辨率为 512×512 时为 194k 步。
  3. “laion-aesthetics v2 5+”上 512×512 的 225k 步,

文本调节下降 10%。

  • Stable Diffusion v2 的训练方式为
  1. 使用 punsafe=0.1 且审美分数 >= 4.5 的 LAION-NSFW 分类器,在 LAION-5B 的子集上以 256x256 的分辨率执行 550k 步,过滤明确的色情材料。
  2. 在分辨率 >= 512x512 的图像上的同一数据集上,在分辨率 512x512 下执行 850k 步。
  3. 在同一数据集上使用 v 目标的 150k 步骤。
  4. 在 768x768 图像上恢复另外 140k 步。
  • Stable Diffusion v2.1 在 v2.0 上进行了微调
  1. 在同一数据集上额外执行 55k 步(punsafe=0.1)
  2. 另外 155k 额外步骤, punsafe=0.98

所以基本上,他们在最后的训练步骤中关闭了 NSFW 过滤器。

结果差异

用户通常发现使用 Stable Diffusion v2 来控制风格和生成名人更困难。 尽管 Stability AI 没有明确过滤掉艺术家和名人的名字,但它们的效果在 v2 中要弱得多。 这可能是由于训练数据的差异造成的。 Open AI 的专有数据可能有更多艺术品和名人照片。 他们的数据可能经过高度过滤,因此一切和每个人看起来都很好。

转载自查看原文
合集导航
合集
# 1 【Stable Diffusion进阶教程】After Detailer:自动修复面面部
# 2 【Stable Diffusion进阶教程】如何运行 SDXL 模型
# 3 【Stable Diffusion进阶教程】加速Stable Diffusion
# 4 【Stable Diffusion进阶教程】Stable Diffusion中控制光照的 3 种方法
# 5 【Stable Diffusion进阶教程】在Stable Diffusion中放大图像的 3 种方法(ControlNet 平铺放大、SD 放大、AI 放大)
# 6 【Stable Diffusion进阶教程】负面提示如何发挥作用?
# 7 【Stable Diffusion进阶教程】Stable Diffusion如何发挥作用?
# 8 【Stable Diffusion进阶教程】Stable Diffusion工作流程(分步示例)
# 9 【Stable Diffusion进阶教程】Stable Diffusion2中的图像深度:您需要了解的一切
# 10 【Stable Diffusion进阶教程】区域提示器:控制Stable Diffusion中的图像合成
# 11 【Stable Diffusion进阶教程】如何使用Stable Diffusion (Deforum) 制作视频
# 12 【Stable Diffusion进阶教程】Stable Diffusion SDXL Beta 模型
# 13 【Stable Diffusion进阶教程】Stable Diffusion采样器:综合指南
# 14 【Stable Diffusion进阶教程】Midjourney 与 Stable Diffusion您应该选择哪一个?
# 15 【Stable Diffusion进阶教程】什么是超网络以及您应该了解的超网络
# 16 【Stable Diffusion进阶教程】如何在Stable Diffusion中使用嵌入
# 17 【Stable Diffusion进阶教程】如何使用Stable Diffusion将照片卡通化
# 18 【Stable Diffusion进阶教程】如何使用 Dreambooth 将任何东西放入Stable Diffusion(Colab 笔记本)
# 19 【Stable Diffusion进阶教程】如何使用AI图像放大器来改善细节
# 20 【Stable Diffusion进阶教程】WebUI AUTOMATIC1111:初学者指南
# 21 【Stable Diffusion进阶教程】什么是 LoRA 模型以及如何在 AUTOMATIC1111 中使用它们
# 22 【Stable Diffusion进阶教程】ControlNet v1.1:完整指南
# 23 【Stable Diffusion进阶教程】如何使用 Stable Diffusion AI 对图像进行风格化
# 24 【Stable Diffusion进阶教程】利用图像 AI 生成时尚创意的 4 种方法
# 25 【Stable Diffusion进阶教程】使用Stable Diffusion制作动画 GIF(分步)
# 26 【Stable Diffusion进阶教程】AI 图像中的常见问题及其解决方法
# 27 【Stable Diffusion进阶教程】使用这些简单的提示技巧微调您的 AI 图像
# 28 【Stable Diffusion进阶教程】如何通过Stable Diffusion修复去除多余的肢体
# 29 【Stable Diffusion进阶教程】如何使用outpainting来扩展图像
# 30 【Stable Diffusion进阶教程】如何在 Google Colab 上运行稳定扩散 (AUTOMATIC1111)
 

全部讨论

no data来都来了,坐下聊聊