# 制御された生成

拡散モデルによって生成される出力を制御することは、コミュニティによって長年追求されてきた課題であり、現在も活発な研究テーマです。多くの人気のある拡散モデルでは、画像やテキストプロンプトといった入力に対するわずかな変更が、出力に劇的な変化をもたらすことがあります。理想を言えば、セマンティクス（意味）がどのように保持され、どのように変化するのかを制御できることが望まれます。

意味を保持するほとんどの例は、入力の变化を出力の変化に正確にマッピングできるかどうかという問題に帰着します。つまり、プロンプト内の主語に形容詞を追加しても、画像全体は保持され、変更された主語のみが修正されます。また、特定の主語の画像バリエーション生成では、その主語のポーズが保持されます。

さらに、意味の保持を超えて、生成画像に影響を与えたい品質があります。つまり、一般的に、出力が良好な品質であり、特定のスタイルに準拠し、現実的であることを望みます。

`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 Panorama](#multidiffusion-panorama)
7. [DreamBooth](#dreambooth)
8. [Textual Inversion](#textual-inversion)
9. [ControlNet](#controlnet)
10. [プロンプト重み付け](#prompt-weighting)
11. [カスタム Diffusion](#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 Panorama](#multidiffusion-panorama) |         ✅         |                   ❌                    |                                                                                                 |
|              [DreamBooth](#dreambooth)              |         ❌         |                   ✅                    |                                                                                                 |
|       [Textual Inversion](#textual-inversion)       |         ❌         |                   ✅                    |                                                                                                 |
|              [ControlNet](#controlnet)              |         ✅         |                   ❌                    |             ControlNet は、カスタムの条件付けに対して学習/ファインチューニングを行うことができます。             |
|        [プロンプト重み付け](#prompt-weighting)        |         ✅         |                   ❌                    |                                                                                                 |
|        [カスタム Diffusion](#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 は、プロンプト内の被体が最終的な画像に忠実に表現されることを可能にします。

プロンプト内の、画像に存在させる必要がある対象に対応するトークンインデックスのセットが入力として与えられます。デノイジング（ノイズ除去）処理中、各トークンインデックスは、画像の少なくとも1つのパッチに対して最小限の注意（アテンション）閾値を確保することが保証されます。デノイジング処理の過程で中間潜在変数（intermediate latents）が反復的に最適化され、最も注意が不足している対象トークンのアテンションを強化し、すべての対象トークンについてアテンション閾値を達成するまで続行されます。

Pix2Pix Zeroと同様に、Attend and Exciteのパイプラインにはミニマルな最適化ループ（事前学習済み重みは変更しない）が含まれており、通常の[StableDiffusionPipeline](../api/pipelines/stable_diffusion/text2img)よりも多くのメモリを必要とする場合があります。

## セマンティックガイダンス（SEGA）

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

SEGAでは、画像から1つ以上の概念を適用または除去できます。また、概念の強度も制御可能です。例えば、笑顔の概念を使用することで、ポートレートにおける笑顔の強さを段階的に増減させることができます。

分類器なしガイダンスが空のプロンプト入力を通じてガイダンスを提供するのと同様に、SEGAは概念的プロンプトに対してガイダンスを提供します。これらの概念的プロンプトは複数同時に適用できます。各概念的プロンプトは、ガイダンスが正に適用されるか負に適用されるかによって、その概念を追加または削除します。

Pix2Pix ZeroやAttend and Exciteとは異なり、SEGAは明示的な勾配ベースの最適化を行うのではなく、拡散プロセスに直接作用します。

## 自己注意ガイダンス (SAG)

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

Self-attention Guidance は、画像の一般的な品質を向上させます。

SAGは、高周波数の詳細に条件付けられていない予測から、完全に条件付けられた画像へのガイダンスを提供します。高周波数の詳細は、UNetの自己注意マップから抽出されます。

## Depth2Image

[プロジェクト](https://huggingface.co/sd2-community/stable-diffusion-2-depth)

[Depth2Image](../api/pipelines/stable_diffusion/depth2img)は、テキストによる画像変形において意味をよりよく保持できるよう、Stable Diffusionからファインチューニングされています。

元の画像の単眼深度推定値を条件として使用します。

## MultiDiffusion Panorama

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

MultiDiffusion Panorama は、事前学習済みの拡散モデルに対して新しい生成プロセスを定義します。このプロセスは、高品質かつ多様な画像を生成するために容易に適用できる複数の拡散生成手法を統合します。結果は、ユーザーが指定した制御条件（例：望ましいアスペクト比（パノラマなど）や、厳密なセグメンテーションマスクからバウンディングボックスまでの空間的なガイド信号）に準拠します。MultiDiffusion Panorama を使用すると、任意のアスペクト比（例：パノラマ）で高品質な画像を生成できます。

## 独自のモデルのファインチューニング

事前学習済みモデルに加えて、Diffusersには、ユーザーが提供するデータでモデルをファインチューニングするための学習スクリプトが用意されています。

## DreamBooth

[プロジェクト](https://dreambooth.github.io/)

[DreamBooth](../training/dreambooth) は、モデルをファインチューニングして新しい被体を学習させます。つまり、ある人物の写真を数枚用意するだけで、その人物をさまざまなスタイルで描いた画像を生成できます。

## Textual Inversion

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

[Textual Inversion](../training/text_inversion)は、モデルに新しい概念を学習させるためにファインチューニングを行います。例えば、特定のスタイルの作品の画像を数枚用意することで、そのスタイルの画像を生成できるようになります。

## ControlNet

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

[ControlNet](../api/pipelines/controlnet)は、追加の条件を付加する補助ネットワークです。エッジ検出、落書き、深度マップ、セマンティックセグメンテーションなど、異なる条件付けで学習された8つの正規化された事前学習済みControlNetがあります。

## プロンプト重み付け

[Prompt weighting](../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)は、トレーニング不要で、多くの人気のある拡散モデルに適用可能なアプローチです。最も広く使用されているアーキテクチャに存在する自己アテンション層を活用し、フィードバック画像のセットに基づいて拡散プロセスを条件付けます。

