扩散课程文档

单元 3:稳定扩散

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

单元 3:稳定扩散

欢迎来到 Hugging Face 扩散模型课程的单元 3!在本单元中,您将遇到一个强大的扩散模型,称为稳定扩散 (SD),并探索它可以做什么。

开始本单元 🚀

以下是本单元的步骤

  • 确保您已注册本课程,以便在发布新内容时收到通知。
  • 阅读下面的材料,以概述本单元的关键概念。
  • 查看稳定扩散简介笔记本,以了解 SD 在实践中如何应用于一些常见用例。
  • 使用黑客马拉松文件夹中的Dreambooth笔记本微调您自己的自定义稳定扩散模型,并与社区分享,以有机会赢取一些奖品和礼品。
  • (可选) 查看稳定扩散深度解读视频和随附的笔记本,以更深入地了解不同的组件以及如何将其用于不同的效果。此材料是为新的 FastAI 课程“从基础开始学习稳定扩散”创建的 - 整个课程都已发布,对于任何想要从头开始构建此类模型的好奇者来说,这都是本课程的一个很好的补充。

📢 不要忘记加入Discord,您可以在 #diffusion-models-class 频道中讨论课程内容并分享您创作的作品。

简介

SD example images
使用稳定扩散生成的示例图像

稳定扩散是一个强大的文本条件潜在扩散模型。别担心,我们很快就会解释这些词!它能够根据文本描述创建令人惊叹的图像,使其成为互联网上的热门话题。在本单元中,我们将探索 SD 的工作原理,并了解它还能做哪些其他技巧。

潜在扩散

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

latent diffusion diagram
来自潜在扩散论文的图表

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

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

文本条件控制

在单元 2 中,我们展示了如何将额外信息提供给 UNet,从而使我们能够对生成的图像类型进行一些额外的控制。我们称之为条件控制。给定图像的噪声版本,模型的任务是**基于额外的线索**(例如类别标签,或者在稳定扩散的情况下,图像的文本描述)预测去噪后的版本。在推理时,我们可以输入我们想要看到的图像的描述和一些纯噪声作为起点,模型尽其所能将随机输入“去噪”成与标题相匹配的内容。

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

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

conditioning diagram

好的,那么我们如何将这些条件信息实际馈送到 UNet 以供其在进行预测时使用呢?答案是所谓的交叉注意力机制。UNet 中散布着交叉注意力层。UNet 中的每个空间位置都可以“关注”文本条件中的不同标记,从提示中引入相关信息。上图显示了这种文本条件(以及基于时间步长的条件)如何在不同点馈入。如您所见,在每一层,UNet 都有充分的机会利用这些条件!

分类器自由引导

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

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

为了解决这个问题,我们使用了一种称为分类器自由引导 (CGF) 的技巧。在训练期间,文本条件有时会被保留为空白,迫使模型学习在没有任何文本信息的情况下对图像进行去噪(无条件生成)。然后在推理时,我们进行两个单独的预测:一个使用文本提示作为条件,另一个不使用。然后,我们可以使用这两个预测之间的差异来创建一个最终的组合预测,根据某个比例因子(引导比例)将预测进一步推向文本条件预测指示的方向,从而有望生成更匹配提示的图像。上图显示了不同引导比例下提示的输出——如您所见,较高的值会导致图像更匹配描述。

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

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

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

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

使用 DreamBooth 进行微调

dreambooth diagram 来自基于 Imagen 模型的 dreambooth 项目页面 的图像

DreamBooth 是一种用于微调文本到图像模型的技术,以“教授”它一个新概念,例如特定的对象或风格。该技术最初是为 Google 的 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 的简要介绍,逐步介绍了一些使用管道生成和修改图像的基本用法示例。

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

最后,“Stable Diffusion 深入解读”笔记本和视频分解了典型生成管道中的每个步骤,并提出了一些修改每个阶段以获得更多创意控制的新颖方法。

项目时间

按照 **DreamBooth** 笔记本中的说明训练您自己的模型,用于指定类别之一。请务必在您的提交中包含示例输出,以便我们能够为每个类别选择最佳模型!有关奖品、GPU 积分等的详细信息,请参阅 黑客马拉松信息

一些其他资源

发现更多有用的资源了吗?请告诉我们,我们会将其添加到此列表中。