扩散课程文档

第三单元:Stable Diffusion

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始

第三单元:Stable Diffusion

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

开始本单元 :rocket:

以下是本单元的步骤

  • 请确保您已注册本课程,以便在新材料发布时收到通知。
  • 阅读以下材料,了解本单元的主要思想概述。
  • 查看Stable Diffusion 介绍 notebook,了解 SD 在一些常见用例中的实际应用。
  • 使用 hackathon 文件夹 中的 Dreambooth notebook 微调您自己的自定义 Stable Diffusion 模型,并与社区分享,有机会赢取奖品和礼品。
  • (可选) 查看Stable Diffusion 深度解析视频 和配套的 notebook,深入探索不同的组件以及如何调整它们以获得不同的效果。这些材料是为新的 FastAI 课程 ‘Stable Diffusion from the Foundations’ 创建的 - 整个课程已发布,对于任何好奇从头开始构建这类模型的人来说,这是本课程的绝佳补充。

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

介绍

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

Stable Diffusion 是一个强大的文本条件潜在扩散模型。别担心,我们稍后会解释这些术语!它从文本描述中创建惊人图像的能力使其成为互联网上的轰动。在本单元中,我们将探索 SD 的工作原理,并了解它可以做的其他技巧。

潜在扩散

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

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

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

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

文本条件控制

在第二单元中,我们展示了如何向 UNet 提供额外信息,从而使我们能够对生成的图像类型进行一些额外的控制。我们称之为条件控制(conditioning)。给定图像的噪声版本,模型的任务是根据额外的线索(例如类别标签,或者在 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(从左到右)

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

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

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

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

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

使用 DreamBooth 进行微调

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

DreamBooth 是一种微调文本到图像模型的技术,旨在“教”它一个新概念,例如特定的对象或风格。该技术最初是为 Google 的 Imagen 模型开发的,但很快被调整为适用于 stable diffusion。结果可能非常令人印象深刻(如果您最近在社交媒体上看到任何带有 AI 头像的人,很可能它来自基于 dreambooth 的服务),但该技术也对使用的设置很敏感,因此请查看我们的 notebook 和这篇关于不同训练参数的精彩调查,以获取使其尽可能良好地工作的技巧。

实践 Notebook

章节 Colab Kaggle Gradient Studio Lab
Stable Diffusion 介绍 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab
DreamBooth 黑客松 Notebook Open In Colab Kaggle Gradient Open In SageMaker Studio Lab
Stable Diffusion 深度解析 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab

至此,您已经掌握了足够的知识来开始使用随附的 notebook!使用上面的链接在您选择的平台上打开它们。DreamBooth 需要相当大的计算能力,因此如果您使用 Kaggle 或 Google Colab,请确保将运行时类型设置为“GPU”以获得最佳效果。

“Stable Diffusion 介绍” notebook 是使用 🤗 Diffusers 库对 stable diffusion 的简短介绍,逐步介绍了使用 pipelines 生成和修改图像的一些基本用法示例。

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

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

项目时间

按照 DreamBooth notebook 中的说明,为您指定类别之一训练您自己的模型。请确保在您的提交中包含示例输出,以便我们可以选择每个类别中的最佳模型!有关奖品、GPU 积分等的详细信息,请参阅 hackathon 信息

一些额外的资源

找到更多优质资源?请告诉我们,我们会将其添加到此列表中。

< > 在 GitHub 上更新