私たちは、テキストから画像への生成条件で 10 種類以上のコントロール タイプをサポートし、視覚的にミッドジャーニーと同等の高解像度画像を生成できる新しいアーキテクチャを設計します。ネットワークはオリジナルの ControlNet アーキテクチャに基づいており、次の 2 つの新しいモジュールを提案します。 1 同じネットワーク パラメータを使用して異なる画像条件をサポートするようにオリジナルの ControlNet を拡張します。 2 計算オフロードを増やすことなく複数の条件入力をサポートします。これは画像を詳細に編集したいデザイナーにとって特に重要です。追加の計算やパラメーターを追加することなく、異なる条件で同じ条件エンコーダーを使用します。 SDXLでは徹底的な実験を行い、コントロール性能と美観スコアの両方で優れたパフォーマンスを実現しました。誰もが楽しめるようにメソッドとモデルをオープンソースコミュニティに公開します。
役に立ったと思ったら、スターを付けてください、ありがとうございます!!
SDXL ProMax バージョンがリリースされました!!!,お楽しみください!!!
申し訳ありませんが、プロジェクトの収益と支出のバランスが難しいため、GPU リソースは収益性の高い他のプロジェクトに割り当てられ、十分な GPU サポートが見つかるまで SD3 トレーニングは停止されます。最善を尽くします。トレーニングを続けるための GPU を見つけます。ご迷惑をおかけした場合は、誠に申し訳ございません。このプロジェクトを気に入ってくださった皆さんに感謝します。皆さんのサポートが私を前進させる原動力です
注: promax サフィックスが付いた promax モデルを同じ Huggingface モデル リポジトリに配置しました。詳細な手順は後で追加されます。
次の例は、1M 解像度 --> 9M 解像度を示しています。
Novelai のようなバケット トレーニングを使用して、任意のアスペクト比の高解像度画像を生成できます
大量の高品質データ(1000万枚以上)を使用し、さまざまな状況をカバーするデータセット
DALLE.3 のような再キャプション付きプロンプトを使用し、CogVLM を使用して詳細な説明を生成し、プロンプトに従う能力が優れています。
トレーニング中に多くの便利なトリックを使用してください。日付の拡張、多重損失、多重解像度を含みますが、これらに限定されません。
オリジナルの ControlNet とほぼ同じパラメータを使用します。ネットワークパラメータや計算量の明らかな増加はありません。
10 以上の制御条件をサポートし、個別にトレーニングする場合と比較して、単一の条件でも明らかなパフォーマンスの低下はありません
複数の条件の生成をサポートし、条件の融合はトレーニング中に学習されます。ハイパーパラメータを設定したり、プロンプトを設計したりする必要はありません。
BluePencilXL、CounterfeitXL など、他のオープンソース SDXL モデルと互換性があります。他のLoraモデルと互換性があります。
https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0
https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0
https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0
https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0
[2024/07/06] ControlNet++
と事前トレーニング済みモデルをリリース。
[2024/07/06] 推論コード(単一条件&複数条件)を公開しました。
[2024/07/13] 高度な編集機能を備えたProMax ControlNet++
リリースしました。
グラデーション用の ControlNet++
ControlNet++ for Comfyui
トレーニング コードとトレーニング ガイダンスをリリースします。
arxiv ペーパーをリリースします。
最も重要なコントロールネット モデルの 1 つであり、このモデルのトレーニングには多くのトリックが使用されており、ポーズ制御における SOTA パフォーマンスは https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0 と同等です。 openpose モデルを最高のパフォーマンスにするには、controlnet_aux パッケージのdraw_pose 関数を置き換える必要があります (comfyui には独自の controlnet_aux パッケージがあります)。詳細については、推論スクリプトを参照してください。
最も重要なコントロールネット モデルの 1 つである canny は、lineart、anime lineart、mlsd との混合トレーニングです。あらゆる細い線に対応する堅牢な性能。変形率を下げる鍵となるモデルです。手や足の再描画には細い線を使用することをお勧めします。
最も重要なコントロールネット モデルの 1 つであるスクリブル モデルは、あらゆる線幅とあらゆる線種をサポートできます。 https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0 と同じくらい優れており、誰もがソウル ペインターになれます。
注: ポーズ スケルトンを使用して人間のポーズを制御し、変形を避けるために細い線を使用して手/足の詳細を描画します。
注: 深度画像には詳細情報が含まれています。背景には深度を使用し、前景にはポーズ スケルトンを使用するのが一般的です。
注: Scribble は強い線モデルです。厳密でない輪郭で何かを描きたい場合は、それを使用できます。 Openpose + Scribble を使用すると、初期イメージをより自由に生成でき、その後、細い線を使用して詳細を編集できます。
高画質な画像を大量に収集しています。画像は真剣にフィルタリングされ、注釈が付けられています。画像は、写真、アニメ、自然、旅の途中など、幅広い主題をカバーしています。
私たちは、ControlNet++ に、それぞれ Condition Transformer と Control Encoder という名前の 2 つの新しいモジュールを提案します。古いモジュールをわずかに変更して、表現能力を強化しました。さらに、単一および複数の制御を1つの段階で実現するための統合されたトレーニング戦略を提案します。
条件ごとに、コントロール タイプ ID を割り当てます。たとえば、openpose--(1, 0, 0, 0, 0, 0)、 Depth--(0, 1, 0, 0, 0, 0)、マルチ条件は (openpose, Depth) --(1, 1, 0, 0, 0, 0) のようになります。コントロール エンコーダーでは、コントロール タイプ ID がコントロール タイプ エンベディング (正弦波位置エンベディングを使用) に変換され、その後、単一の線形レイヤーを使用して、時間エンベディングと同じディムを持つようにコントロール タイプ エンベディングを投影します。制御タイプ機能は、さまざまな制御タイプを示すために時間埋め込みに追加されます。時間埋め込みはネットワーク全体にグローバルな影響を与える傾向があるため、この簡単な設定は、ControlNet がさまざまな制御タイプを区別するのに役立ちます。単一条件または複数条件に関係なく、それに対応する一意のコントロール タイプ ID が存在します。
ControlNet を拡張して、同じネットワークを使用して複数の制御入力を同時にサポートします。条件トランスフォーマーは、さまざまな画像条件特徴を組み合わせるために使用されます。私たちの方法には 2 つの大きな革新があります。1 つは、異なる条件が同じ条件エンコーダーを共有することで、ネットワークがよりシンプルかつ軽量になります。これは、T2I や UniControlNet などの他の主流の方法とは異なります。次に、トランスフォーマーの出力を直接使用する代わりに、元の画像と条件画像の情報を交換するためのトランスフォーマー層を追加します。これを使用して、元の条件特徴に対する条件バイアスを予測します。これは ResNet に似ており、この設定によりネットワークのパフォーマンスが明らかに向上することが実験的にわかりました。
ControlNet の元の条件エンコーダは、conv 層と Silu アクティベーションのスタックです。エンコーダのアーキテクチャは変更せず、conv チャネルを増やして「ファット」エンコーダを取得するだけです。これにより、ネットワークのパフォーマンスが明らかに向上します。その理由は、すべての映像条件に対して同じエンコーダーを共有するため、エンコーダーにはより高い表現能力が求められるからです。元の設定は 1 つの条件では良好ですが、10 を超える条件ではそれほど良くありません。画像生成の品質を多少犠牲にするだけで、元の設定を使用しても問題ないことに注意してください。
単一の条件を使用したトレーニングは、データの多様性によって制限される場合があります。たとえば、openpose では人物が含まれる画像でトレーニングする必要があり、mlsd では線が含まれる画像でトレーニングする必要があるため、目に見えないオブジェクトを生成するときにパフォーマンスに影響を与える可能性があります。さらに、異なる条件をトレーニングすることの難しさは異なります。すべての条件を同時に収束させ、それぞれの単一条件で最高のパフォーマンスに到達するのは困難です。最後に、同時に 2 つ以上の条件を使用する傾向があります。複数の条件のトレーニングにより、異なる条件の融合がよりスムーズになり、ネットワークの堅牢性が向上します (単一の条件は限られた知識を学習するため)。単一条件の最適収束と複数条件の融合を同時に実現するための統合トレーニングステージを提案します。
ControlNet++ では、コントロール タイプ ID をネットワークに渡す必要があります。 10 以上のコントロールを 6 つのコントロール タイプにマージします。各タイプの意味は次のとおりです。
0 -- オープンポーズ
1 -- 深さ
2 -- 太い線(落書き/hed/softedge/ted-512)
3 -- 細い線(canny/mlsd/lineart/animelineart/ted-1280)
4 -- 通常
5 -- セグメント
Python バージョン 3.8 以上を推奨します。次のコマンドを使用して仮想環境を設定できます。
conda create -n controlplus python=3.8 conda はコントロールプラスをアクティブ化します pip install -r 要件.txt
モデルの重みは https://huggingface.co/xinsir/controlnet-union-sdxl-1.0 でダウンロードします。新しいモデルのリリースはすべてhuggingfaceに掲載されます。https://huggingface.co/xinsirをフォローして最新モデルの情報を入手してください。
制御条件ごとに推論スクリプトを提供します。詳しくはこちらをご参照ください。
プリプロセスの違いがいくつかあります。openpose-control のパフォーマンスを最高にするには、次の手順を実行してください。 controlnet_aux パッケージ内の util.py を見つけて、draw_bodypose 関数を次のコードに置き換えます。
defdraw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ 指定されたキャンバス上に体のポーズを表すキーポイントと手足を描画します。 引数: Canvas (np.ndarray): 3D numpy 配列体のキーポイントを描画するキャンバス (画像) を表します (List[Keypoint]): 体のキーポイントを表す Keypoint オブジェクトのリスト。戻り値: np.ndarray: 描画された体のポーズを持つ変更されたキャンバスを表す 3D numpy 配列 注: この関数は、キーポイントの x 座標と y 座標が 0 から 1 の間で正規化されることを期待します。 、C = キャンバス.シェイプ max(W, H) < 500 の場合: 比率 = 1.0 elif max(W, H) >= 500 および max(W, H) < 1000: 比率 = 2.0 elif max(W, H) >= 1000 および max(W 、H) < 2000: 比率 = 3.0 elif max(W, H) >= 2000 および max(W, H) < 3000: 比率 = 4.0 elif max(W, H) >= 3000 および max(W, H) < 4000: 比率 = 5.0 elif max(W, H) >= 4000 および max(W, H) < 5000: 比率 = 6.0 その他: 比率 = 7.0 スティック幅 = 4 limbSeq = [ [2、3]、[2、6]、[3、4]、[4、5]、 [6、7]、[7、8]、[2、9]、[9、10]、 [10、11]、[2、12]、[12、13]、[13、14]、 [2, 1]、[1, 15]、[15, 17]、[1, 16]、 [16、18]、 ] 色 = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0] ]、[0、255、0]、 [0, 255, 85]、[0, 255, 170]、[0, 255, 255]、[0, 170, 255]、[0, 85, 255]、[0, 0, 255]、[85] 、0、255]、 [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] for (k1_index, k2_index)、zip の色(limbSeq, Colors): keypoint1 = keypoint1 が次の場合、keypoints[k1_index - 1] keypoint2 = keypoints[k2_index - 1]なし、または keypoint2 が None の場合: 続行 Y = np.array([keypoint1.x, keypoint2.x]) * float(W) X = np.array([keypoint1.y, keypoint2.y]) * float(H) mX = np.mean(X) mY = np.mean(Y) 長さ = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5 角度 = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) ポリゴン = cv2.ellipse2Poly((int(mY), int(mX) ), (int(長さ / 2), int(スティック幅 * 比率)), int(角度), 0, 360, 1) cv2.fillConvexPoly(canvas, Polygon, [int(float(c) * 0.6) for c in color]) キーポイントの場合、zip のカラー(keypoints, Colors): キーポイントが None の場合: 続行 x, y = keypoint.x, keypoint.y x = int(x * W) y = int(y * H) cv2.circle(canvas, (int(x), int(y)), int(4 * 比率)、色、厚さ=-1) キャンバスを返します
単一条件の推論の場合、プロンプトと制御イメージを提供し、Python ファイル内の対応する行を変更する必要があります。
python controlnet_union_test_openpose.py
複数条件の推論の場合、入力 image_list が control_type と互換性があることを確認する必要があります。たとえば、openpose と深度制御を使用する場合は、image_list --> [controlnet_img_pose, controlnet_img_ Depth, 0, 0, 0, 0], control_type -- > [1、1、0、0、0、0]。詳細については、controlnet_union_test_multi_control.py を参照してください。
理論的には、さまざまな条件に対して条件スケールを設定する必要はありません。ネットワークは、さまざまな条件を自然に融合するように設計およびトレーニングされています。デフォルト設定は各条件入力に対して 1.0 であり、複数条件トレーニングでも同様です。ただし、特定の入力条件の効果を高めたい場合は、条件トランスフォーマー モジュールで条件スケールを調整できます。そのモジュールでは、入力条件がバイアス予測とともにソース画像の特徴に追加されます。特定のスケールで乗算すると、多くの影響が生じます (ただし、未知の結果が生じる可能性があります)。
python controlnet_union_test_multi_control.py