# 受控生成

控制扩散模型生成的输出一直是社区长期追求的目标，如今已成为一个活跃的研究课题。在许多流行的扩散模型中，输入（包括图像和文本提示）的细微变化都可能导致输出发生巨大改变。在理想情况下，我们希望能够控制语义如何被保留和改变。

大多数保持语义一致性的示例，本质上都可以归结为能够准确地将输入的变化映射到输出的变化。例如，在提示词中为主语添加一个形容词，会保留整张图像，仅修改所变更的主语。或者，对特定主体进行图像变体生成时，会保留该主体的姿态。

此外，除了语义保真之外，我们还希望影响生成图像的其他特性。也就是说，总体而言，我们希望输出图像具有高质量、符合特定风格或更加逼真。

我们将记录 `diffusers` 支持的用于控制扩散模型生成过程的一些技术。其中许多属于前沿研究，细节可能较为复杂。如果某些内容需要澄清，或者您有建议，请随时发起 [GitHub Discussion](https://github.com/huggingface/diffusers/discussions) 或 [GitHub issue](https://github.com/huggingface/diffusers/issues)。

我们提供了关于如何控制生成过程的高层说明，并附上了一段技术细节的示例。如需更深入的技术解释，从流水线中链接的原始论文始终是最好的参考资料。

根据具体用例，应选择合适的技术。在许多情况下，这些技术可以组合使用。例如，可以将 Textual Inversion 与 SEGA 结合，为使用 Textual Inversion 生成的输出提供更强的语义引导。

除非另有说明，这些技术适用于现有模型，且不需要它们自身的权重。

1. [InstructPix2Pix](#instructpix2pix)
2. [Attend and Excite](#attend-and-excite)
3. [语义引导](#semantic-guidance-sega)
4. [自注意力引导](#self-attention-guidance-sag)
5. [Depth2Image](#depth2image)
6. [MultiDiffusion 全景](#multidiffusion-panorama)
7. [DreamBooth](#dreambooth)
8. [文本反转](#textual-inversion)
9. [ControlNet](#controlnet)
10. [提示词加权](#prompt-weighting)
11. [自定义扩散](#custom-diffusion)
12. [DiffEdit](#diffedit)
13. [T2I-Adapter](#t2i-adapter)
14. [FABRIC](#fabric)

为了方便起见，我们提供了一张表格，用于说明哪些方法仅用于推理，哪些方法需要微调/训练。

|                     **方法**                      | **仅推理** | **需要训练 / 微调** |                                          **评论**                                           |
| :-------------------------------------------------: | :----------------: | :-------------------------------------: | :---------------------------------------------------------------------------------------------: |
|        [InstructPix2Pix](#instructpix2pix)        |         ✅         |                   ❌                    | 此外，还可以进行微调，以在特定的编辑指令上获得更好的性能。 |
|       [Attend and Excite](#attend-and-excite)       |         ✅         |                   ❌                    |                                                                                                 |
|       [语义引导](#semantic-guidance-sega)       |         ✅         |                   ❌                    |                                                                                                 |
| [自注意力引导](#self-attention-guidance-sag) |         ✅         |                   ❌                    |                                                                                                 |
|             [Depth2Image](#depth2image)             |         ✅         |                   ❌                    |                                                                                                 |
| [MultiDiffusion 全景](#multidiffusion-panorama) |         ✅         |                   ❌                    |                                                                                                 |
|              [DreamBooth](#dreambooth)              |         ❌         |                   ✅                    |                                                                                                 |
|       [文本反转](#textual-inversion)       |         ❌         |                   ✅                    |                                                                                                 |
|              [ControlNet](#controlnet)              |         ✅         |                   ❌                    |             ControlNet 可以针对自定义条件进行训练/微调。             |
|        [提示词加权](#prompt-weighting)        |         ✅         |                   ❌                    |                                                                                                 |
|        [自定义扩散](#custom-diffusion)        |         ❌         |                   ✅                    |                                                                                                 |
|                [DiffEdit](#diffedit)                |         ✅         |                   ❌                    |                                                                                                 |
|             [T2I-Adapter](#t2i-adapter)             |         ✅         |                   ❌                    |                                                                                                 |
|                [Fabric](#fabric)                    |         ✅         |                   ❌                    |                                                                                                 |
## InstructPix2Pix

[论文](https://huggingface.co/papers/2211.09800)

[InstructPix2Pix](../api/pipelines/pix2pix) 基于 Stable Diffusion 进行微调，以支持对输入图像进行编辑。它接收一张图像和一段描述编辑操作的提示词作为输入，并输出编辑后的图像。InstructPix2Pix 经过专门训练，能够很好地配合类似 [InstructGPT](https://openai.com/blog/instruction-following/) 风格的提示词使用。

## Attend and Excite

[论文](https://huggingface.co/papers/2301.13826)

Attend and Excite 能够确保提示词中的主体在最终图像中得到忠实呈现。

输入是一组 token 索引，对应于提示词中需要出现在图像里的主体。在去噪过程中，每个 token 索引都保证对图像中至少一个 patch 具有最低注意力阈值。在去噪过程中，中间潜变量会被迭代优化，以增强最被忽视的主体 token 的注意力，直到所有主体 token 的注意力都达到阈值。

与 Pix2Pix Zero 类似，Attend and Excite 的流程中也包含一个小型优化循环（保持预训练权重不变），因此可能需要比常规的 [StableDiffusionPipeline](../api/pipelines/stable_diffusion/text2img) 更多的内存。

## 语义引导（SEGA）

[论文](https://huggingface.co/papers/2301.12247)

SEGA 允许从图像中添加或移除一个或多个概念，并且可以控制概念的强度。例如，可以使用“微笑”概念来逐步增加或减少肖像中的微笑程度。

与分类器自由引导通过空提示输入提供引导类似，SEGA 通过概念提示提供引导。可以同时应用多个此类概念提示。根据引导是正向还是负向应用，每个概念提示可以添加或移除其对应的概念。

与 Pix2Pix Zero 或 Attend and Excite 不同，SEGA 直接作用于扩散过程，而非执行任何显式的基于梯度的优化。

## 自注意力引导（SAG）

[论文](https://huggingface.co/papers/2210.00939)

Self-attention Guidance 提升了图像的整体质量。

SAG 提供了从未经高频细节条件化的预测到完全条件化图像的引导。高频细节是从 UNet 自注意力图中提取出来的。

## Depth2Image

[项目](https://huggingface.co/stabilityai/stable-diffusion-2-depth)

[Depth2Image](../api/pipelines/stable_diffusion/depth2img) 基于 Stable Diffusion 进行微调，以更好地保留文本引导图像变化中的语义信息。

它以原始图像的独眼深度估计作为条件。

## MultiDiffusion 全景

[论文](https://huggingface.co/papers/2302.08113)

MultiDiffusion Panorama 在预训练扩散模型上定义了一种新的生成过程。该过程将多种扩散生成方法结合在一起，可直接用于生成高质量且多样化的图像。生成结果遵循用户提供的控制条件，例如期望的宽高比（如全景图）以及空间引导信号，范围从紧密的分割掩码到边界框。MultiDiffusion Panorama 允许您在任意宽高比（例如全景图）下生成高质量图像。

## 微调您自己的模型

除了预训练模型，Diffusers 还提供了训练脚本，用于在用户提供的数据上对模型进行微调。

## DreamBooth

[项目](https://dreambooth.github.io/)

[DreamBooth](../training/dreambooth) 通过微调模型来使其学习新的主题。例如，可以使用几张某人的照片来生成该人物在不同风格下的图像。

## 文本反转

[论文](https://huggingface.co/papers/2208.01618)

[Textual Inversion](../training/text_inversion) 通过微调模型来使其学习一个新概念。例如，可以使用几张特定艺术风格的图片来生成该风格下的图像。

## ControlNet

[论文](https://huggingface.co/papers/2302.05543)

[ControlNet](../api/pipelines/controlnet) 是一个辅助网络，用于添加额外的条件。共有 8 个标准的预训练 ControlNet，分别基于不同的条件进行训练，例如边缘检测、涂鸦、深度图和语义分割。

## 提示词加权

[提示词加权](../using-diffusers/weighted_prompts)是一种简单技术，用于对文本输入的某些部分赋予更高的注意力权重。

## Custom Diffusion

[论文](https://huggingface.co/papers/2212.04488)

[Custom Diffusion](../training/custom_diffusion) 仅对预训练文本到图像扩散模型的交叉注意力图进行微调。它还支持额外执行 Textual Inversion。其设计本身就支持多概念训练。与 DreamBooth 和 Textual Inversion 类似，Custom Diffusion 也用于让预训练的文本到图像扩散模型学习新概念，从而生成包含目标概念的输出。

## DiffEdit

[论文](https://huggingface.co/papers/2210.11427)

DiffEdit 允许根据输入提示对输入图像进行语义编辑，同时尽可能保留原始输入图像。

## T2I-Adapter

[论文](https://huggingface.co/papers/2302.08453)

[T2I-Adapter](../api/pipelines/stable_diffusion/adapter) 是一个辅助网络，用于添加额外的条件。共有 8 个标准的预训练适配器，分别在不同的条件上进行训练，例如边缘检测、草图、深度图和语义分割。

## Fabric

[论文](https://huggingface.co/papers/2307.10159)

[Fabric](https://github.com/huggingface/diffusers/tree/442017ccc877279bcf24fbe92f92d3d0def191b6/examples/community#stable-diffusion-fabric-pipeline) 是一种无需训练的方法，适用于多种流行的扩散模型。它利用最常用架构中存在的自注意力层，使扩散过程能够以一组反馈图像作为条件。

