Diffusers における ControlNet
Hugging Face は diffusers ライブラリに StableDiffusionControlNetPipeline を通じて ControlNet を統合し、深度マップ、セグメンテーションマップ、スクリブル、キーポイントなどの特定の空間コンテキストで画像生成を条件付けできるようにしました。この統合により、生成プロセスをカスタマイズするための最小限のインターフェースが提供され、スケッチを芸術的なイラストに変換したり、異なるキャラクター間で正確なポーズを維持したりするタスクが可能になります。
ControlNet のアーキテクチャとトレーニング
ControlNet は Lvmin Zhang と Maneesh Agrawala によって提案されたフレームワークで、テキストから画像への拡散モデルに条件付き制御を追加します。アーキテクチャは、拡散モデル(例: Stable Diffusion の潜在 UNet)の事前学習済みパラメータの「訓練可能なコピー」を作成し、元のパラメータの「ロックされたコピー」を保持することで動作します。
Key technical details of the training process include:
- パラメータ保存: ロックされたコピーは大規模データセットから学習した一般的な知識を保持し、訓練可能なコピーはタスク固有の空間条件を学習します。
- ゼロ畳み込み: 訓練可能なコピーとロックされたコピーは「ゼロ畳み込み」層で接続されます。これらの層はトレーニング中に最適化され、凍結されたモデルがすでに学習したセマンティクスが新しい条件と統合されても保持されるようにします。
- 条件付けの特異性: 新しい空間条件のタイプごとに別々の訓練済み ControlNet 重みが必要です。例えば、Canny エッジマップ用とセマンティックセグメンテーションマップ用の重みは別々です。
推論とメモリ管理
ControlNet を実行するには、事前学習済み拡散モデルの重みと特定の ControlNet 重みの両方が必要です。例えば、Stable Diffusion v1-5 に ControlNet のチェックポイントを使用すると、約 7 億の追加パラメータが加わり、標準の Stable Diffusion と比べてメモリ要件が増加します。
To optimize performance, Hugging Face recommends several techniques within the diffusers implementation:
- スマート CPU オフロード:
enable_model_cpu_offload()を使用すると、モデルコンポーネント(CLIP テキストエンコーダ、UNet、ControlNet、VAE デコーダ)が必要なときだけ GPU メモリにロードされ、VRAM 使用量を 大幅に 削減します。 - 高速スケジューラ: デフォルトの PNDMScheduler を
UniPCMultistepSchedulerに置き換えると、品質の大きな低下なしに推論ステップ数を 50 から 20 に削減できます。 - 注意機構の高速化:
xformersのメモリ効率の良い注意機構を有効にすると、速度とメモリがさらに最適化されます。
これらの最適化により、V100 GPU 上で約 4 GB の VRAM を使用して画像生成に約 3 秒かかります。
実装とユースケース
StableDiffusionControlNetPipeline は、テキストプロンプトと空間条件付けを組み合わせることで柔軟な画像生成を可能にします。
単一条件付けの例
- Canny エッジ検出: ユーザーは OpenCV を使用して画像の Canny エッジマップを生成でき、ControlNet はそれを用いて元画像の構図を正確に保ちつつ被写体を変更します(例: 古典的な絵画のポーズで異なる有名人を描く)。
- OpenPose:
controlnet_auxのOpenposeDetectorを使用して画像から人間のポーズを抽出し、その正確なポーズを新しく生成したキャラクターに適用できます(例: ヒーローがヨガをする)。 - DreamBooth 統合: ControlNet はファインチューニングされたモデルと組み合わせることができます。DreamBooth でファインチューニングされたモデル(例: ミスターポテトヘッドモデル)を
StableDiffusionControlNetPipeline内で使用し、特定の被写体を制御された空間構図に配置できます。
複数条件付けの組み合わせ
複数の ControlNet 条件付けを同時に単一画像に使用できます。ControlNetModel インスタンスのリストと対応する条件付けのリストをパイプラインに渡すことで、異なる空間制御を組み合わせることが可能です。
マルチ条件付けの結果を最適化するために、以下の戦略が推奨されます。
- マスキング: ある条件付けマップの領域をマスクして別のマップと重ならないようにします(例: Canny マップの中心をマスクし、OpenPose マップのためのスペースを確保)。
- 条件付けスケール:
controlnet_conditioning_scaleを調整して、ある空間条件を別の条件より優先させます。
サポートされている条件付けモデル
Diffusers でサポートされている条件付けモデルは以下の通りです:
- Depth (
sd-controlnet-depth) - HED (
sd-controlnet-hed) - Normal (
sd-controlnet-normal) - Scribble (
sd-controlnet-scribble) - Segmentation (
sd-controlnet-seg) - OpenPose (
sd-controlnet-openpose) - MLSD (
sd-controlnet-mlsd) - Canny (
sd-controlnet-canny)
Sources
- OriginalControlNet in 🧨 Diffusers