テキストから画像への拡散モデルへの条件付き制御の追加の公式実装。
ControlNetは、条件を追加することで拡散モデルを制御するニューラルネットワーク構造です。
ニューラルネットワークブロックの重みを「ロックされた」コピーと「トレーニング可能な」コピーにコピーします。
「訓練可能な」人はあなたの状態を学びます。「ロックされた」ものはあなたのモデルを保持します。
このおかげで、画像ペアの小さなデータセットでトレーニングしても、本番環境に対応した拡散モデルが破壊されることはありません。
「ゼロ畳み込み」は、重みとバイアスの両方がゼロとして初期化された1×1畳み込みです。
トレーニング前は、すべてのゼロ畳み込みがゼロを出力し、ControlNetは歪みを引き起こしません。
ゼロからトレーニングされるレイヤーはありません。あなたはまだ微調整中です。元のモデルは安全です。
これにより、小規模または個人用デバイスでのトレーニングが可能になります。
これは、モデル/ウェイト/ブロック/レイヤーのマージ/置換/オフセットにも適しています。
質問:ただし、convレイヤーの重みがゼロの場合、勾配もゼロになり、ネットワークは何も学習しません。なぜ「ゼロ畳み込み」が機能するのですか?
ある:本当じゃない。こちらの説明を参照してください。
上記の単純な構造を14回繰り返すことで、このように安定した拡散を制御することができます。
レイヤーを接続する方法は計算効率が高いことに注意してください。元のSDエンコーダーは、勾配(ロックされた元のSDエンコーダーブロック1234およびミドル)を保存する必要はありません。必要なGPUメモリは、多くのレイヤーが追加されていますが、元のSDよりもはるかに大きくはありません。すごい!
まず、新しいコンマ環境を作成します
conda env create -f environment.yaml conda activate control
すべてのモデルと検出器は、ハギングフェイスページからダウンロードできます。SD モデルが "ControlNet/models" に、ディテクタが "ControlNet/annotator/ckpts" に配置されていることを確認してください。HEDエッジ検出モデル、Midas深度推定モデル、Openposeなど、そのハギングフェイスページから必要なすべての事前トレーニング済みの重みと検出器モデルをダウンロードしてください。
これらのモデルには9つのGradioアプリがあります。
すべてのテスト画像はフォルダ「test_imgs」にあります。
2023/02/12 - ControlNetを転送することで、どのコミュニティモデルでもプレイできるようになりました。
2023/02/11 - 低VRAMモードを追加。8GBのGPUを使用している場合、またはより大きなバッチサイズが必要な場合は、このモードを使用してください。
安定した拡散1.5 + コントロールネット(単純なキャニーエッジ検出を使用)
python gradio_canny2image.py
Gradioアプリでは、キャニーエッジのしきい値を変更することもできます。詳細については、試してみてください。
安定拡散1.5+コントロールネット(簡易M-LSD直線検出使用)
python gradio_hough2image.py
Gradioアプリでは、M-LSDしきい値を変更することもできます。詳細については、試してみてください。
安定した拡散 1.5 + コントロールネット (ソフト HED 境界を使用)
python gradio_hed2image.py
ソフトHED境界は、入力画像の多くの詳細を保持し、このアプリを色の変更やスタイル設定に適したものにします。詳細については、試してみてください。
安定拡散1.5+コントロールネット(落書きを使用)
python gradio_scribble2image.py
UIはGradioに基づいており、Gradioはカスタマイズがやや難しいことに注意してください。今、UIの外側で(MSペイントなどのお気に入りの描画ソフトウェアを使用して)落書きを描画してから、落書き画像をGradioにインポートする必要があります。
私たちは実際にインタラクティブなインターフェースを提供します
python gradio_scribble2image_interactive.py
ただし、gradioは非常にバグが多く、カスタマイズが難しいため、現時点では、ユーザーは最初にキャンバスの幅と高さを設定してから、[描画キャンバスを開く]をクリックして描画領域を取得する必要があります。その描画キャンバスに画像をアップロードしないでください。また、描画領域は非常に小さいです。もっと大きくする必要があります。しかし、私はそれを大きくする方法を見つけることができませんでした。繰り返しますが、グラジオは本当にバグがあります。
下の犬のスケッチは私が描いたものです。おそらく、ショーケースのためにより良い犬を描く必要があります。
安定した拡散1.5 + コントロールネット(偽の落書きを使用)
python gradio_fake_scribble2image.py
時々私たちは怠惰であり、落書きを描きたくありません。このスクリプトは、まったく同じ落書きベースのモデルを使用しますが、単純なアルゴリズムを使用して入力画像から落書きを合成します。
プロンプト: "shose" ("shose" はタイプミスであり、"shoes" であることに注意してください。しかし、それはまだうまくいくようです。
安定拡散1.5+コントロールネット(人間のポーズを使用)
python gradio_pose2image.py
どうやら、このモデルはポーズのスケルトンを直接操作するためのより良いUIに値するようです。ただし、繰り返しになりますが、Gradioはカスタマイズがやや困難です。今、あなたは画像を入力する必要があり、それからOpenposeはあなたのためにポーズを検出します。
安定拡散1.5 + コントロールネット(セマンティックセグメンテーションを使用)
python gradio_seg2image.py
このモデルは、ADE20Kのセグメンテーションプロトコルを使用しています。繰り返しになりますが、このモデルは、セグメンテーションを直接描画するためのより優れたUIに値します。ただし、繰り返しになりますが、Gradioはカスタマイズがやや困難です。今、あなたは画像を入力する必要があり、それからUniformerと呼ばれるモデルがあなたのためにセグメンテーションを検出します。詳細については、試してみてください。
安定拡散1.5+コントロールネット(深度マップを使用)
python gradio_depth2image.py
すごい!SD 1.5には深度制御もあります。最終的に。非常に多くの可能性があります(SD1.5にはSD2よりもはるかに多くのコミュニティモデルがあることを考えると)。
Stabilityのモデルとは異なり、ControlNetは512×512の深さではなく、64×64の深さマップ全体を受け取ることに注意してください。安定性のSD2深度モデルは64 * 64深度マップを使用することに注意してください。これは、ControlNetが深度マップの詳細を保持することを意味します。
ユーザーが詳細を保持したくない場合は、別のSDを使用してi2iを後処理できるため、これは常に強みです。しかし、より多くの詳細を保持したい場合は、ControlNetが唯一の選択肢になります。ここでも、SD2は64×64の深さを使用し、512×512を使用します。
安定拡散1.5+コントロールネット(法線図使用)
python gradio_normal2image.py
このモデルは法線マップを使用します。現在、APPでは、法線はミダス深度マップとユーザーしきい値から計算されます(視聴者に通常の顔を識別して背景の領域の数を決定するには、gradioアプリの「通常の背景しきい値」を調整して感覚を得ます)。
深度モデルと比較して、このモデルはジオメトリの保存に少し優れているようです。これは直感的です:細部は深度マップでは顕著ではありませんが、法線マップでは顕著です。以下は、同じ入力での深度結果です。入力画像の男性の髪型は深度モデルによって修正されていますが、通常のモデルでは保存されていることがわかります。
また、アニメの線画用に比較的単純なControlNetをトレーニングしました。このツールは芸術作品に役立つかもしれません。(結果の画像の詳細は少し変更されていますが、それでも潜伏画像が拡散するためです。
このモデルは現在ご利用いただけません。このモデルをリリースする前に、潜在的なリスクを評価する必要があります。それでも、ControlNetを任意のコミュニティモデルに転送することに興味があるかもしれません。
画像を処理するための簡単なPythonスクリプトを提供します。
コントロールネットのトレーニングは、単純なpix2pixのトレーニングと同じくらい簡単です(またはそれよりも簡単です)。
@misc{zhang2023adding, title={Adding Conditional Control to Text-to-Image Diffusion Models}, author={Lvmin Zhang and Maneesh Agrawala}, year={2023}, eprint={2302.05543}, archivePrefix={arXiv}, primaryClass={cs.CV} }