扩散模型课程文档

第三单元:Stable Diffusion

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

第三单元:Stable Diffusion

欢迎来到 Hugging Face Diffusion 模型课程的第三单元!在本单元中,你将认识一个名为 Stable Diffusion(SD)的强大 Diffusion 模型,并探索它的功能。

开始本单元 :rocket:

以下是本单元的步骤:

  • 请确保你已注册本课程,以便在新材料发布时收到通知。
  • 请阅读以下材料,了解本单元的核心概念。
  • 查看 Stable Diffusion 简介 笔记本,了解 SD 在一些常见用例中的实际应用。
  • 使用 hackathon 文件夹 中的 Dreambooth 笔记本,微调你自己的定制 Stable Diffusion 模型,并与社区分享,就有机会赢得奖品和周边。
  • (可选)查看 Stable Diffusion 深度解析视频 和配套的 笔记本,深入探索其不同组件以及如何调整它们以实现不同效果。这些材料是为新的 FastAI 课程 ‘从基础开始学习 Stable Diffusion’ 创作的 —— 整个课程已经发布,对于任何想完全从零开始构建这类模型的人来说,这是一个很好的补充材料。

:loudspeaker: 别忘了加入 Discord,你可以在 #diffusion-models-class 频道中讨论材料并分享你的作品。

简介

SD example images
使用 Stable Diffusion 生成的示例图片

Stable Diffusion 是一个强大的文本条件潜在扩散模型。别担心,我们很快会解释这些术语!它能根据文本描述创造出令人惊叹的图像,这让它在互联网上引起了轰动。在本单元中,我们将探讨 SD 的工作原理,并看看它还能做些什么。

潜在扩散

随着图像尺寸的增大,处理这些图像所需的计算能力也随之增加。这在一种称为自注意力(self-attention)的操作中尤为明显,其操作量随输入数量呈二次方增长。一张 128px 的方形图像的像素数量是一张 64px 方形图像的 4 倍,因此在自注意力层中需要 16 倍(即 42)的内存和计算量。这对于任何想生成高分辨率图像的人来说都是一个问题!

latent diffusion diagram
图表来自 Latent Diffusion 论文

潜在扩散通过使用一个名为变分自编码器(VAE)的独立模型将图像 压缩 到一个更小的空间维度来缓解这个问题。其背后的原理是,图像通常包含大量冗余信息——给定足够的训练数据,VAE 有望学会生成一个输入图像的更小表示,然后基于这个小的 潜在 表示以高保真度重建图像。SD 中使用的 VAE 接收 3 通道图像,并生成一个 4 通道的潜在表示,每个空间维度的缩减因子为 8。也就是说,一张 512px 的方形输入图像将被压缩成一个 4x64x64 的潜在表示。

通过在这些 潜在表示 而非全分辨率图像上应用扩散过程,我们可以获得许多使用较小图像带来的好处(更低的内存使用、UNet 中需要的层数更少、更快的生成时间……),并且在我们准备查看最终结果时,仍然可以将结果解码回高分辨率图像。这项创新显著降低了训练和运行这些模型的成本。

文本条件

在第二单元中,我们展示了如何通过向 UNet 提供额外信息来对生成的图像类型进行额外控制。我们称之为条件化。给定一个图像的噪声版本,模型的任务是 根据额外的线索(如类别标签,或者在 Stable Diffusion 的情况下是图像的文本描述)来预测去噪后的版本。在推理时,我们可以输入我们想看到的图像的描述和一些纯噪声作为起点,模型会尽力将随机输入“去噪”成与描述相匹配的东西。

text encoder diagram
图表展示了文本编码过程,该过程将输入提示转换为一组文本嵌入(encoder_hidden_states),然后可以作为条件输入到 UNet 中。

为了实现这一点,我们需要创建一个文本的数字表示,以捕获有关其描述的相关信息。为此,SD 利用了一个基于 CLIP 的预训练 Transformer 模型。CLIP 的文本编码器旨在将图像标题处理成一种可用于比较图像和文本的形式,因此它非常适合从图像描述中创建有用的表示。输入提示首先被分词(基于一个大的词汇表,其中每个词或子词都被分配一个特定的词元),然后通过 CLIP 文本编码器,为每个词元生成一个 768 维(在 SD 1.X 中)或 1024 维(在 SD 2.X 中)的向量。为了保持一致,提示总是被填充/截断到 77 个词元长,因此我们用作条件的最终表示是每个提示形状为 77x1024 的张量。

conditioning diagram

好的,那么我们实际上是如何将这些条件信息输入到 UNet 中,让它在进行预测时使用的呢?答案是一种叫做交叉注意力(cross-attention)的东西。在整个 UNet 中散布着交叉注意力层。UNet 中的每个空间位置都可以“关注”文本条件中的不同词元,从而从提示中引入相关信息。上图展示了这种文本条件(以及基于时间步的条件)是如何在不同点输入的。如你所见,UNet 在每个层级都有充分的机会利用这种条件!

无分类器引导

事实证明,即使我们付出了所有努力使文本条件尽可能有用,模型在进行预测时仍然倾向于主要依赖噪声图像输入而不是提示。在某种程度上,这是有道理的——许多标题与其相关图像的关联性很松散,因此模型学会了不过分依赖描述!然而,这在生成新图像时是不可取的——如果模型不遵循提示,我们可能会得到与我们的描述完全无关的图像。

CFG scale demo grid
使用提示“一幅戴着高帽的柯利犬的油画”在 CFG 比例为 0、1、2 和 10(从左到右)时生成的图像

为了解决这个问题,我们使用一种称为无分类器引导(CFG)的技巧。在训练期间,文本条件有时会留空,迫使模型学会在没有任何文本信息的情况下对图像进行去噪(无条件生成)。然后在推理时,我们进行两次独立的预测:一次使用文本提示作为条件,一次不使用。然后我们可以利用这两个预测之间的差异,根据某个缩放因子(引导尺度),创建一个最终的组合预测,该预测在文本条件预测指示的方向上 更进一步,希望从而得到一个更符合提示的图像。上图显示了在不同引导尺度下对一个提示的输出——如你所见,更高的值会产生更符合描述的图像。

其他类型的条件:超分辨率、修复和深度图到图像

可以创建接受其他类型条件的 Stable Diffusion 版本。例如,深度图到图像模型 具有额外的输入通道,可以接收有关正在去噪的图像的深度信息,在推理时,我们可以输入目标图像的深度图(使用另一个模型估计),以期生成具有相似整体结构的图像。

depth to image example
深度条件 SD 能够生成具有相同整体结构的不同图像(示例来自 StabilityAI)

以类似的方式,我们可以输入一张低分辨率图像作为条件,让模型生成高分辨率版本(如 Stable Diffusion 放大器所使用的)。最后,我们可以输入一个显示图像中需要重新生成区域的掩码,作为“图像修复”任务的一部分,其中非掩码区域需要保持不变,而为掩码区域生成新内容。

使用 DreamBooth 进行微调

dreambooth diagram 图片来自 dreambooth 项目页面,基于 Imagen 模型

DreamBooth 是一种微调文生图模型的技术,用于“教”它一个新概念,例如特定的物体或风格。该技术最初是为谷歌的 Imagen 模型开发的,但很快被改编以用于 stable diffusion。效果可能非常惊人(如果你最近在社交媒体上看到有人用 AI 头像,很可能它来自基于 dreambooth 的服务),但该技术对所用设置也很敏感,所以请查看我们的笔记本和这篇关于不同训练参数的精彩研究,以获取使其尽可能好地工作的技巧。

动手实践笔记本

章节 Colab Kaggle Gradient Studio Lab
Stable Diffusion 简介 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab
DreamBooth 黑客松笔记本 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab
Stable Diffusion 深度解析 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab

到这里,你已经了解了足够多的知识,可以开始使用附带的笔记本了!使用上面的链接在你选择的平台上打开它们。DreamBooth 需要相当大的计算能力,所以如果你正在使用 Kaggle 或 Google Colab,请确保将运行时类型设置为“GPU”以获得最佳效果。

“Stable Diffusion 简介”笔记本是对使用 🤗 Diffusers 库进行 stable diffusion 的简短介绍,通过一些基本的使用示例,使用 pipeline 来生成和修改图像。

在 DreamBooth 黑客松笔记本中(位于 hackathon 文件夹),我们展示了如何在你自己的图像上微调 SD,以创建一个涵盖新风格或概念的自定义模型版本。

最后,“Stable Diffusion 深度解析”笔记本和视频分解了典型生成流程中的每一步,并提出了一些新颖的方法来修改每个阶段以获得额外的创意控制。

项目时间

按照 DreamBooth 笔记本中的说明,为你自己选择的特定类别训练一个模型。确保在你的提交中包含示例输出,以便我们能选出每个类别中的最佳模型!有关奖品、GPU 额度等详细信息,请参见黑客松信息

一些额外资源

发现了更多优质资源?告诉我们,我们会将它们添加到此列表中。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.