SDXL:高解像度画像合成のための潜在拡散モデルの改善

ヴィンセント グラフ モデルの SDXL - Zhihu の以前の記事「ヴィンセント グラフ モデルの安定拡散」では、比較的人気のあるヴィンセント グラフ モデルの安定拡散を紹介しましたが、最近、Stability AI が新しいアップグレード バージョン SDXL をリリースしました。現在、SDXL コード、モデル、技術レポートはすべてオープンソースです: 公式コード: https://github.… https://zhuanlan.zhihu.com/p/642496862 GitHub - Stability-AI/generative-models: Generative Stability AI によるモデルStability AI による生成モデル。GitHub でアカウントを作成して、Stability-AI/generative-models の開発に貢献します。https: //github.com/Stability-AI/generative-modelsトレーニングとモデルの重みはオープンソースです。 sdxl を読む , プロジェクトに取り組んでいるときに、モデルが効果的ではないと感じたときにデータを追加することは、必ずしも良い方法ではありません。より良い方法は、データの使用とその問題点を分析して、さらなる改良と改善を行うことです。上記の資料の著者は非常によく分析しており、読むと非常に明確になります。現在、sdxl は、stable_diffusion_webui のバージョン 1.5 でも試用でき、さらにディフューザーにも統合されています。

1.はじめに

3 つの主な改善点: 1. sdxl のモデル パラメーター サイズが 2.3B に増加し、テキスト特徴を抽出するために 2 つのクリップ テキスト エンコーダーが使用されます; 2. sdxl は追加の条件付き注入を使用してトレーニング時のデータ処理の問題を改善し、複数のスケールを採用します微調整; 3. sdxl は、画質を向上させるために間引きモデルをカスケードします (詳細を強調するために間引きモデルを単独で使用することもできます)。

2.安定拡散の向上

最初の写真は手動で採点されており、sdxl がはるかに上回っています。 

2.1 アーキテクチャと規模

sdxl は、より大きなバージョンの unet を使用しており、2.6B は以前のバージョンの 3 倍です。

        上の 2 つの図を組み合わせて、トランス ブロックとチャネル マルチを表で説明します。最初の図は sdxl の unet 構造図、2 つ目は sd の unet です。sdxl の最初の段は通常の downblock2d であり、Crossattndownblock2d はありませんsdxl は最終的に 1024x1024 の画像を直接生成し、対応する潜在は 128x128x4 であるため、最初の段階で注意 (自己注意を含む) を使用すると、ビデオ メモリと計算の量が非常に多くなります。 3 段階。表では、sdxl のリストには 3 つの値があり、sd には 4 つのモジュールに対応する 4 つの値があることがわかります。3 段階とは、前の sd が使用した 2x ダウンサンプリングが 2 回だけ実行されていることを意味します。 3 つの 2x ダウンサンプリングを含む 4 ステージ; sdxl のネットワーク幅機能チャネルの数は以前と比べて変わっておらず、3 つのステージはそれぞれ 320、640、および 1280 です。sdxl の主なパラメーターの増加は、より多くのトランスフォーマー ブロックの使用によってもたらされます。sd では、アテンションを含む各ブロックは 1 つのトランスフォーマー ブロックのみを使用します (セルフ アテンション -> クロス アテンション -> ffn)。しかし、sdxl のステージ 2 のトランスフォーマー ブロックは、ステージ 3 の 2 つのcrossattndownblock2d モジュールはそれぞれ 2 と 10 で、中央のmidblock2dcrossattn のトランスフォーマー ブロックも 10 で、これは最後のステージと一致しています。これはテーブルの 2 行目に対応し、sdxl は 0,2 です。 、10、sdはすべて1で、3行目の1、2、4は320の倍数です。

        sdxl のもう 1 つの変更点はテキスト エンコーダーです。sd 1.x は 123m のテキスト エンコーダーを備えた openai Clip vit-l/14 を使用し、sd 2.x はテキスト エンコーダーを 354m openclip vit-h/14 にアップグレードします (openclip はlaion out)、sdxl は、パラメーター量 694m で openclip vit-bigG および openai Clip vit-l/14 を使用し、ここで 2 つのテキスト エンコーダーの最後から 2 番目のレイヤー特徴を抽出します。そのうち、openclip vit-bigG 特徴の次元は 1280 です。クリップ vit -l/14 のフィーチャー次元は 768 で、連結後の次元は 2048 次元になります。これは sdxl のコンテキスト次元です。

上記の調整後、sdxl の unet の合計パラメータ量は 2.6b となり、sdxl の unet は変更されていますが、拡散モデルの設定は元の sd と同じで、ddpm の 1000 ステップを使用し、ノイズ スケジューラは変更されません。

2.2 マイクロコンディショニング

        sdxl の 2 番目の最適化ポイントは、追加の条件付き注入を使用して、データ利用効率や画像トリミングの問題など、トレーニング プロセス中のデータ処理の問題を解決することです。

最初の質問、SD のトレーニングは 256x256 で事前トレーニングされ、その後 512x512 でトレーニングを継続することがよくあります。256x256 を使用する場合、幅と高さが 256 未満の画像をフィルタリングする必要があります。これは次の場合にのみ使用できます。 512x512 サイズでのトレーニング 512x512 を超える画像については、データをフィルター処理する必要があるため、実際のトレーニング データのサンプルが減少します。上図に示すように、256 未満の画像はフィルターで除外され、39% を占めます。直接的な解決策は、最初に元のデータに対して超解像度を実行することですが、場合によっては超解像度で問題が発生することがあります (通常、元の画像が鮮明でない場合、トレーニング データに対して画像修復も実行します)。sdxl では元の画像が使用されます。サイズの幅と高さを条件として unet に埋め込みます。これは、モデルに画像解像度パラメータを学習させるのと同じです。トレーニング プロセス中に、データをフィルタリングせずに画像を直接サイズ変更できます。推論中は、ターゲット解像度のみを入力する必要があります。生成された画像の品質を確保するため、画像の元のサイズが埋め込まれます タイムステップの埋め込みと同様に、幅と高さがフーリエ特徴エンコードでエンコードされ、特徴が連結されて時間埋め込みにロードされます。下図では、512x512のモデルを取得した場合、入力が低解像度の場合は画像がぼやけますが、高解像度の場合は画質が向上します。

2 番目の問題は、学習プロセスにおける画像のトリミングの問題です。現在、ビンセント グラフ モデルの事前学習では固定画像サイズがよく使用され、元の画像を前処理する必要があります。一般に、最も短い辺は、画像のサイズがターゲット サイズに変更され、画像の最も長い辺がトリミングされます (ランダム クロップまたは中央クロップ)。ただし、画像のトリミングにより画像が失われることがよくあります。                

sdxl は、学習プロセス中に切り取られた左上の頂点の座標を条件として unet に挿入し、それをフーリエ エンコードによる時間埋め込みに追加します。推論中に、中央に配置された画像を取得するには、座標を 0,0 に設定するだけで済みます。 、これは非常に良いです。トレーニング中に、トリミングされた画像の左上隅の座標情報がモデルによって学習されますが、これは不完全な画像であることを理解してください。

sdxl トレーニングでは、元の幅/高さと画像クロップの左上隅の座標が追加で保存されている限り、2 つの条件付き注入を一緒に使用できます。sdxl は 256x256 サイズで 600,000 ステップ (bs=2048) でトレーニングされます。この条件付き注入に基づいて、次に 512x512 サイズを使用して 200,000 ステップのトレーニングを継続します。これは約 16 億サンプルのサンプリングに相当し、最後に 1024x1024 でマルチスケール微調整を使用します。

2.3 マルチアスペクトトレーニング

        事前トレーニング後、sdxl はマルチスケール微調整を採用し、novelAI のスキームを採用し、データセット内の画像を異なるアスペクト比に従って異なるバケットに分割し、トレーニング プロセス中に各ステップを異なるバケットに切り替えることができます。各バッチのデータは同じバケットからサンプリングされますが、sdxl はこれまでと同様にバケット サイズ、つまりターゲット サイズも条件として unet に注入します。

2.4 改良されたオートエンコーダー

        sdxl と sd も潜在拡散アーキテクチャに基づいています。潜在拡散アーキテクチャでは、最初にオートエンコーダ モデルを使用して画像を潜在に圧縮し、次に拡散モデルを使用して潜在を生成します。生成された潜在は再構築に使用できます。オートエンコーダのデコーダを通した画像. これはピクセル空間で行われたわけではなく、実際には潜在空間で行われたことに注意してください。sdxl のオートエンコーダで使用される kl は vq ではありません。同じアーキテクチャに基づいて、より大きな bs (256vs9) が再トレーニングに使用されます。下の表の vae モデル構造は同じですが、sd-vae 2.x は sd にのみあります-vae 1.x に基づいて、デコーダー部分は微調整され、エンコーダー部分は同じであるため、2 つの潜在的な分布は一貫しており、汎用的に使用できます。ただし、sdxl は再トレーニングされ、潜在的な分布が変更されており、混合することはできません。拡散モデルに潜在を送信する前に,潜在の標準偏差ができる限り1になるように潜在をスケーリングする必要があります.重みが変更されているため,sdxlのスケーリング係数はsdとは異なります.sdは0.18215, sdxlは0.13025,および sdxl- vae 推論に float16 を使用するとオーバーフローし、推論に float32 を使用し、webui で --no-half-vae を選択します。

2.5 すべてをまとめる

sdxl にはリファインメント段階もあります。最初のモデルは sdxl ベース モデルを結合し、2 番目のモデルはリファイナー モデルで、ベース モデルに基づいて画像の細部を改善し続けます。リファイナー モデルとベース モデルの共有同じ値ですが、リファイナー モデルはより低いノイズ レベル (最初の 200 タイムステップ) でのみトレーニングし、推論中にリファイナー モデルのグラフ生成機能のみを使用します。リファイナー モデルとベース モデルの構造は多少異なります。UNet の構造は次の図に示されています。リファイナー モデルは 4 つのステージを使用します。最初のステージも注目せずに DownBlock2D を使用します。ネットワークのフィーチャー次元は 384、一方、ベースモデルは320です。また、リファイナー モデルの注目モジュールのトランスブロックの数は 4 に設定されます。リファイナーモデルのパラメータ量は2.3Bで、ベースモデルより若干小さいです。

さらに、リファイナー モデルのテキスト エンコーダーは OpenCLIP ViT-bigG のみを使用し、最後から 2 番目のレイヤー フィーチャとプールされたテキスト埋め込みも抽出します。リファイナーモデルもベースモデルと同様にサイズとクロップコンディショニングを使用し、さらに画像の美的スコアを条件として追加し、処理方法は従来と同じです。リファイナー モデルではマルチスケール微調整を使用しないでください。そのため、ターゲット サイズは条件として導入されません (リファイナー モデルはグラフの生成にのみ使用され、さまざまなスケールに直接適応できます)。 

3.今後の取り組み

手動で生成された構造は適切ではなく、ライティングやテクスチャは真実から逸脱しており、生成された画像に複数のエンティティが含まれている場合、属性が混乱し、属性がにじみたりあふれたりします。

シングルステージ: シングルステージモデル;

テキスト合成: より優れたテキスト エンコーダを使用します。imgen もテキスト エンコーダは非常に重要だと述べています。

アーキテクチャ: dit などの一部の純粋なトランスフォーマ アーキテクチャが使用されますが、これは効果がありません。

蒸留:サンプリングステップの数を減らします。

拡散モデル: より優れた拡散アーキテクチャを採用する

おすすめ

転載: blog.csdn.net/u012193416/article/details/132390358
おすすめ