高解像度の画像を生成する方法は色々あると思いますが、この記事ではTiled Diffusion with Tiled VAEの使い方について解説していきます。なお正しい情報を提供できるよう努めてはいますが技術屋ではないので、内部の処理などについての詳細な理解は不足しています。「Tiled Diffusion with Tiled VAEってこんな感じかふーん」程度の理解が得られるかもしれない記事と考えてください。
Tiled Diffusion with Tiled VAEとは
Tiled DiffusionはStable Diffusionで生成した画像を高解像度化する拡張機能です。旧称はMultiDissusion with Tiled VAEです。VRAMをそれほど使用せずに画像の高解像度化を行えるため、一般家庭用でも高解像度の画像を生成することができるようになります。Tiled Diffusion with Tiled VAEの中には拡張機能「Tiled Diffusion」と「Tiled VAE」の2つが入っています。
- Tiled Diffusion
-
画像を小さなタイルに分割し、各タイルを独立して拡大する手法です。通常のDiffusionモデルは大きな画像に対して計算コストが高くなりますが、この手法は大規模な画像のアップスケーリングに適しており、またタイルごとに異なる拡大率を適用することでより自然な拡大画像を生成することができるようです。
Mixture of Diffusers と MultiDiffusionというSOTA diffusion tiling algorithms(この分野において現時点において最先端のdiffusion技術)があり、これらのうちどちらを使用するかをweb UI上で選べるようになっています。詳しいことはリンク先を読んでください。難解で目がチカチカしますが。MultiDiffusionの方がタイル状に分割という言葉そのままの意味には近いのかな。
- Tiled VAE
-
VAEのエンコード、デコード時のVRAM使用量を大幅に削減するようです。Tiled VAEを使用すると画像が精細化するみたいな感じがありますが、おそらくVRAM使用量が抑えられたことで他の処理(何かはわからない)が動くための余白ができ、結果画像が精細化しているのではないかなと思ってます。
なおTiled VAEによってVRAMは抑えられますが、単純に処理が増えるため生成にかかる時間は伸びます。
またアップスケールを行う際にタイル分割を行うため分割領域ごとに別のプロンプトを適用させるといった機能もあります。「Tiled Diffusion」に含まれている「Region Prompt Control」を使用することでこれが行えます。
注意事項
以下はTiled DiffusionはStable DiffusionのGitHubに記載されている内容です。一部のWebサイトにてこの拡張機能が悪意ある何者かによって有償で提供されているようです。
Please be aware that the License of this repo has changed to prevent some web shops from deceiving the customers. This extension is licensed under CC BY-NC-SA, everyone is FREE of charge to access, use, modify and redistribute with the same license.
GitHub – pkuliyi2015/multidiffusion-upscaler-for-automatic1111: Tiled Diffusion and VAE optimize, licensed under CC BY-NC-SA 4.0
You cannot use versions after AOE 2023.3.28 for commercial sales (only refers to code of this repo, the derived artworks are NOT restricted).
これに関連してTiled Diffusion with Tiled VAEは2023.3.28以降CC BY-NC-SA 4.0が付与されています。CC BY-NC-SA 4.0は商用利用に制限が掛かるライセンスです。
しかし、作者曰くコードの販売や、商用サービスへの使用ができないだけで生成物には影響しないとのことです。
要点をまとめると、Tiled Diffusion with Tiled VAEは「コードの販売や、商用サービスへの使用」を行わなければ商用利用可能であるという感じです。
この点については書くかどうか迷いましたがライセンスが突然変更になりやすいこの界隈で、実際に変なライセンス変更をが起きた拡張機能ですので、記事を書く上で周知は必要かと思い記載しました。そもそもCCライセンスは、ソースコードやオブジェクトコードについては適用の対象として考慮されていないため、ソフトウェアにCCライセンスを付けることはお勧めされていません。
Tiled Diffusion with Tiled VAEの導入方法
Google Colaboratory版
%cd /content/stable-diffusion-webui/extensions/
!git clone https://github.com/pkuliyi2015/multidiffusion-upscaler-for-automatic1111 /content/stable-diffusion-webui/extensions/multidiffusion-upscaler-for-automatic1111
%cd /content/stable-diffusion-webui
ローカル版
web UIを起動 → 「Extensions」タブをクリック → 「Install from URL」タブをクリック → https://github.com/pkuliyi2015/multidiffusion-upscaler-for-automatic1111.git
と入力 → 「Install」
Tiled Diffusion with Tiled VAEの使い方
i2iで高解像度化
以下がi2iにおけるTiled Diffusionの設定項目です。このうち「Regional Prompt Control」については後述します。
【設定項目(必須)】
- 有効化
-
使用する場合は「
」。 - アップスケーラー
-
好みのものを選択してください。
- 倍率
-
解像度を上げる場合は必須です。
【設定項目】
- 入力画像のサイズを維持する
-
そのままの意味だと思います。
- MethodとLatentタイルの重なり具合
-
MultiDiffusion(デフォルト)とMixture of Diffusersを選択できます。Mixture of Diffusersはオーバーラップ(タイルの重なり幅)を小さくしなければいけない代わりに、高速な処理が行えるものです。公式からは「Latentタイルの重なり幅」はMultiDiffusionは32または48、Mixture of Diffusersは16または32をお勧めされています。
- ControlNetの画像をCPUに移動
-
正直よくわからないです。小規模計算であればCPUの方がGPUよりも早いため、これを利用してControlNetをCPUで処理するということだと思います。しかし、こうすると全体の処理が遅くなる気がします……。それとControlNetを使用するどのようなケースで有効化すればよいのか不明です。
- Latentタイルの幅と高さ
-
上限下限としては64~160、おすすめは96か128となっています。
- Latentタイルのバッチサイズ
-
バッチサイズなので1回に処理する件数かと思います。処理を早めたいか、精度を上げたいかでお好みで。
【設定項目 (Noise Inversion)】
公式の声明としてはキャラクターの顔を変えず、12Gあれば8k出力可能で、Ultimate SD Upscaleよりも優れたアップスケーラーだよとのことです。
おそらくアップスケールされた画像に対してノイズを加えた後にノイズ除去を行い元の画像を復元する感じのものです。アップスケールによって生じるノイズを除去してより自然な画像にしようというのが目的なんだと思います。なお、Noise Inversionを使用する場合は設定を細かく調整しないと画像の精度が落ちます。
- Enable Noise Inversion
-
使用する場合は「
」。 - Inversion Steps
-
処理の反復回数です。反復回数が多いほど精度が上がる。
- Retouch
-
ノイズ反転後の画像に対して行う最終的な微調整。
- Renoise strength
-
ノイズ反転後に再度加えるノイズの強度。
- Renoise kernel size
-
ノイズ反転後に再度加えるノイズのカーネルサイズ。処理に用いるフィルターサイズなのでサイズが小さいほど処理速度が上がり、大きいほど精度が上がる感じだと思います。
必須の設定項目を変更すれば、あとはデフォルトのままでも画像のアップスケールは可能です。また「Noise Inversion」は最近追加された機能なので有効化しなくてもTiled Diffusionは動作します。
より詳しく知りたいという方はGitHubの以下リンクをご覧ください。
Tiled Diffusionだけでも設定と環境によっては動きます。しかしほとんどの場合OutOfMemoryError: CUDA out of memory. Tried to ~
というエラーが出て停止すると思います。このような場合に使用するのが「Tiled VAE」です。では続いてTiled VAEの設定について解説します。
以下が「Tiled VAE」の設定項目です。Tiled Diffusionと異なりTiled VAEはi2iでもt2iでも設定項目に違いはありません。
【設定項目】
- 有効化
-
使用する場合は「
」。 - Move VAE to GPU
-
VAEをGPUに移行させるかどうか。GPUを使用する場合は処理が高速化されるようです。
- エンコーダのタイルサイズ
-
エンコーダで処理するタイルのサイズを指定。画像を複数のタイルに分割して処理しタイル単位で学習を行うことで、高解像度画像の生成が可能になるようです。
- デコーダのタイルサイズ
-
デコーダで処理するタイルのサイズを指定。エンコーダと同様に、画像を複数のタイルに分割して処理することができる。
- Reset
-
VAEの学習済みパラメータを初期化。
- 高速エンコーダ
-
高速なエンコーダを使用するかどうかを設定。高速なエンコーダを使用する場合は処理速度が向上しますが、画質は劣化する可能性があります。
- Encoder Color Fix
-
エンコーダで色の修正を行うかどうかを設定。色修正を行うことで、画像の色の歪みを矯正することができる。
- 高速デコーダ
-
高速なデコーダを使用するかどうかを設定。高速なデコーダを使用する場合は処理速度が向上しますが、画質は劣化する可能性があります。
Tiled VAEはTiled Diffusionと異なり基本的にOutOfMemoryError: CUDA out of memory. Tried to ~
が出ない限りはデフォルトの設定値のまま利用しても問題ないようです。「有効化」だけは忘れずに。
エラーが出た場合には環境に合わせてタイルサイズを小さくする必要があります(タイルバッチサイズを小さくしても良いかも)。これにより画像がグレーで不鮮明になる場合は、「Encoder Color Fix」を有効にすると良いようです。
より詳しく知りたいという方はGitHubの以下リンクをご覧ください。
i2iによる高解像度化は基本的に最後の仕上げかと思います。ですのでノイズ除去強度は低めに設定されているかと思いますが、万が一高め(0.5以上など)で設定されていた場合、1girl
にしているはずがハーレムですかというように沢山の人が表れる可能性があります。これはタイル状に分割しアップスケールすることによる弊害です。具体的にはタイル一つ一つにプロンプトが適用されている状態です。回避方法としてはノイズ除去強度を下げることで元画像からの乖離を抑える方法と、後述する「Regional Prompt Control」を使用する方法があります。が、i2iにおいてはノイズ除去強度を下げる方法が一番楽で確実ではないかと思います。
t2iで高解像度画像を生成
t2iを用いて高解像度の画像を生成する方法です。アップスケールを行うのではなく、初手で高解像度を生成する場合などに使用する感じでしょうか。
以下がt2iにおける「Tiled Diffusion」と「Tiled VAE」の設定項目です。基本的にi2iと同じですが一部異なっています。
【相違点】
i2iでは「入力画像のサイズを維持する」となっていますがt2iでは「現在の画像サイズで上書き」となっています。「
」を入れることでその下に「画像の幅」と「画像の高さ」が表れます。こちらで画像サイズを指定します。【注意点】
「Regional Prompt Control」を使わずにt2iすると、分割したタイルすべてにプロンプトが適用されるようです。そのため1girl
を生成する場合などにこの方法を使うと、本来の趣旨とは異なり1girl
が複数登場するイラストが描かれてしまいます。意味不明という方は一度上記設定で試してみると理解できるかと思います。
なお同様の現象はi2iでも起きますが、i2iではノイズ除去強度の値を下げることで元画像をベースから改変度を下げた画像が生成できるため、Regional Prompt Controlを使わずにこの現象を回避することができます。
Regional Prompt Controlで生成
Regional Prompt Controlを用いて領域分割を行う方法です。Regional Prompt Controlはi2iでもt2iでも同様の機能なので、ここではt2iをベースに解説します。
以下がRegional Prompt Controlの設定項目です。
【設定項目】
- Enable Control
-
使用する場合は「
」。 - Draw full canvas background
-
「
」を入れることで領域指定していない領域にも描画を行う設定と思われます。領域指定部分および未指定部分を合わせた画像全体の印象を均一に仕上げることができる機能のようです。なお、処理範囲が増えるため生成速度がかなり遅くなるようです。 - Create txt2img canvas
-
「Ref image」に独自画像を取り込むこともできますが、このボタンを押すことで空のキャンバスを作成することができます。注意点としてこのどちらかの方法でキャンバスを作成していないと、Region 1~8の設定値を弄ることができません。
- Custom Config File
-
領域指定の方法などをカスタマイズするための設定ファイルを指定するようです。
- Save
-
Custom Config Fileの保存を行う機能です。
- Load
-
stable-diffusion-webui\extensions\multidiffusion-upscaler-for-automatic1111\region_configs\
内にある.json
ファイルを読み込みます。 - Region 1
-
領域1の設定を指定します。
以下はRegion内の設定項目です。Region 1を例に解説しますが他のRegionも同じです。
【設定項目】
例えば、画像内の顔の部分に対して別のプロンプトを適用して画質を向上させたい場合に、Regionを使うことができます。領域の種類や位置、サイズを設定し、Prompt には顔の特徴を強調するようなプロンプトを指定します。Negative Prompt には背景や服などの顔以外の領域を強調するようなプロンプトを指定することができます。
- Enable Region 1
-
使用する場合は「
」。 - 種類
-
「Background」と「Foreground」があり、「Background」を選択すると領域指定の範囲外に影響を与え、「Foreground」を指定すると領域内に影響を与えます。
- x / y / w / h
-
Region 1 の位置とサイズを指定します。x と y は領域の座標で、w と h は領域の幅と高さです。
- Prompt / Negative Prompt
-
Region 1 に対して使用するプロンプトを指定します。このプロンプトは画像全体に適用されるプロンプトとは異なります。
Regional Prompt Controlは領域分割ができ、分割したタイルごとにプロンプトを適用することができます。
1girl
を出す方法ですがRegion 1にキャラクター用プロンプトを入れ(ネガで背景指定)、Region 2に背景用プロンプト(ネガでキャラ指定)のような形を取ると出せます。2girls
にするにはGitHubでは「Region 1」に背景を指定して「Region 2」に人物1を指定、「Region 3」に人物2を指定というようにしているようです。
なおRegional Prompt Controlを使用する場合にはメインのプロンプトは品質系を入れることになります。
タイル分割があることでこのような使い方ができるRegional Prompt Controlですが、前述した通りLatent Coupleには及ばないため、使い方に関しては考える必要があるかと思います。
最後に
生成AIを始めてAIや機械学習といわれるものに触れ始めましたが技術屋どころかプログラムすらろくに書けないため、日進月歩過ぎるこの界隈に少しでも食らいついていけるようブログを始めてからは技術記事?を書いてきましたが「Tiled Diffusion with Tiled VAE」は過去一重い記事でした。
「Tiled Diffusion with Tiled VAE」はGituHubのページで機能についてかなり詳しく解説されています。全文英語であるのと、非技術屋の私的には読むだけでは理解できない点が多々あったため記事を書きました。とはいえ、原文を読むと理解が深まるのは確かなので、時間がある方は一度読んでみると良いかもしれません。
「Tiled Diffusion with Tiled VAE」難しくて使いにくい、もっとシンプルで良いという場合には、こちらの記事で紹介しているUltimate SD Upscaleがおすすめです。
この記事がお役に立てば幸いです。
以上です。
コメント
コメント一覧 (2件)
これは良い記事だ。
丁度知りたい情報が載っていて助かりました!!
お役に立てたようで何よりです!