Stable Diffusion XL の改善点
sdxl_report.pdf
ローカルでの実行方法
Automatic1111 WebUI
Web UI のバージョン 1.5 以降で使える。VRAM は 12 GB 以上が推奨されている。
ComfyUI
VRAM8GB なら ComfyUI が使える。ノードベースなので WebUI とは使用感が異なるが、ワークフローの柔軟性が高い。
概要
Stable Diffusion 2.1 比で UNet サイズが3倍になった。SDXL ではテキストエンコーダーを2つ使うので、 attention ブロックと cross-attention context のサイズが増加したのがその原因だ。
マルチアスペクト学習とクロップ位置の埋め込み等とによる学習を採用した。
潜在空間で画像を修正する refiner を追加した。
ユーザー投票による評価では旧 SD より圧倒的に好評だったが、FID や CLIP スコア基準では改善幅は小さかった。
PartiPrompts (P2) 基準によるユーザー投票で SDXL v0.9 と Midjourney v5.1 で対決したところ、SDXL v0.9 は 54.9% のユーザーに選択された。
U-Net 構造の変更
以前の Stable Diffusion では4層にそれぞれ1つずつ transformer ブロックが配置されていた。SDXL では最下層の1層を削除して3層になり、transformer は [0, 2, 10] と低い層に多くの transformer ブロックを配置した。
潜在空間サイズの拡大
旧 SD は潜在空間のサイズが 64x64 だったが、XL では 128x128 になっている。XL には潜在空間で img2img を行い画像を改善する Refiner が追加されている。VAE でピクセル空間の画像に戻すところは同じだが、XL ではデフォルト解像度が 1024x1024 になっている。
テキストエンコーダー
旧 SD はテキストエンコーダーに CLIP ViT-L/14 を使用していたが、XL のテキストエンコーダーは OpenCLIP ViT-bigG + CLIP ViT-L を使用する。
学習画像
解像度が低い(256x256未満)学習データを使わない場合、全学習データの 39% が使われなくなる。しかしそれでは教師データが不足するのでアップスケーリングして使用したが、その不自然さも学習してしまった。そこでアップスケーリング前の解像度を embedding として条件付けして、画像生成時に高いアップスケーリング前解像度を指定すると画像の品質が向上した。
ランダムクロップの弊害
学習画像の長辺をランダムクロップして水増しした結果、旧 SD では頭部がクロップされた画像がよく生成されていた。そこで上部クロップピクセル数と左クロップピクセル数を embedding として条件付けして学習させた。画像生成時に上部クロップピクセル数と左クロップピクセル数をそれぞれ0として画像を生成すると、頭部がクロップされていない画像を生成するようになった。
この方法は学習画像の水増しができるため有用性が高いと考えている。同時に Aspect Ratio Bucketing を使用したマルチアスペクトの学習も実施している。
Autoencoder
Autoencoder のバッチサイズを 256 に上げて(旧SDは9)学習させることで、画像の細部描写の性能が向上した。
Refiner
ベースの学習が終了したら、Refiner を学習する。Refiner は潜在空間で低品質な細部の修正を行う。
学習
1. VAE
まず VAE を作成する。
2. ベースモデル
- 256 x 256 の画像をアップスケールして、バッチサイズ 2,048 で 60 万ステップ。クロップされた画像はクロップ位置を embedding にして埋め込む。
- 512 x512 を同様に 20 万ステップ
- 最大ピクセルサイズを 1,024 x 1,024 にしてマルチアスペクト学習+ランダムクロップ
3. Refiner
Refiner は潜在空間で image2image を実行する。ベースモデルとは別にモデルを訓練する。訓練方法やモデルの詳細は論文には書かれていない。
欠点
- 手が上手く描けない。おそらく手は形が多様すぎてうまく特徴が抽出できていない
- ライティングが不自然なことがある。暖炉や間接照明のライティングがうまくできない
- 社会的バイアスが含まれる
- 複数のオブジェクトが融合することがある
- 色移りする
- 長文を描かせると文章が崩壊しがち
Ensemble of Expert Denoisers
画像生成の初期部分のノイズの多い部分をベースモデルでデノイズして、ノイズの少ない部分を Refiner でデノイズすることでステップ数を節約する。
Fourier embedding
アップスケール前解像度やクロップピクセル数の embedding を作成するのに Fourier embedding が使われている。論文内の cat_along_channel_dim と concat_embeddings で embedding の埋め込み方法が解説されている。
論文では以下のようなコメントがついている。
def fourier_embedding (inputs , outdim =256 , max_period =10000) : """ Classical sinusoidal timestep embedding as commonly used in diffusion models : param inputs : batch of integer scalars shape [b ,] : param outdim : embedding dimension : param max_period : max freq added return : batch of embeddings of shape [b, outdim ] ”””