【StableDiffusion】TiledDiffutionの動作について考察(6/27修正)
まず、私も手探りなので間違っている部分もあるかもなので、その時は優しく教えてください。
TiledDiffutionは画像を分割して作成することで、メモリの削減であったりいろいろな表現をすることができます。
各種設定について(ここだけは読んでお願い)
◆Keep input image size:出力イメージのサイズを入力画像と同じにします。
◆LatentTileWidth/Height:分割する画像(以下、タイル)の大きさの指定、
ここで設定した数値の8倍がStableDiffusionで指定するサイズになる。
アップスケールする場合は、アップスケール後の画像のサイズ基準。
◆LatentTileOverlap:タイルとタイルの重なりの指定
単純に画像をタイルに分割すると隣接するタイル間での相互関係がなくなり、全体のイラストが破綻するため、重なり部分をとる。
逆にこれをとらないことでモザイクアートを作成する記事も書きました。
オーバーラップ部分はできるだけ大きくとる方が良い?(要検証)
◆LatentTileBatchSize:i2iの処理を何タイル同時に行うかの設定
動作について
まず下の図①と図②をサクッとみてください。
図①の場合、二つのタイルの両方にgirlが入っているため、i2iした際に普通に動作すると思います。
図②の場合、赤枠にgirlが入っていないため、i2iした際にAIは赤枠内に新たにgirlを作成しようとします。これが人形化現象です。
じゃあどう設定するの?
人形化現象を起こさずにアップスケールしたい場合を考えます。
そのためには、分割するタイルを大きくして、すべての画像でgirlを認識できるようにするのが良いと思います。(図①のようになるように設定する)
【やり方】(ここだけ読んで)修正6/27
例えば1280×1280の画像を2倍にアップスケールする場合を考えます。
元画像を見て、3分割だと厳しいけど、2分割なら全部にgirl要素入るかな?と想定します。
↓
2分割するためのタイルサイズは、アップスケール後は2560×2560
↓
タイルサイズ換算するため8で割って320×320
↓
これを2分割するので必要なサイズは160×160
↓
オーバーラップを半分程度とるので160を2で割って【80】
↓
2分割するのに必要なサイズ+オーバーラップは160+80=240なのでTileW/Hを【240】
----
こう考えると、生成したい画像のサイズがずっと大きかった場合、問題が出てきます。
元画像5120×5120を2倍にしたい場合、必要な設定は
tileW/H:640 overlap:224
となりますが、tileW/Hの設定は256が最大ですし、GPUの能力の制限上、そんなに大きな画像生成は難しいです。
この場合は、RegionPromptControlでタイルごとのプロンプトを制御する、DSを小さくする等で人形化を抑える必要があると考えられます。
最後に
TiledVAEとNoiseInversionの動作がよくわかりません。
知ってる方がいれば教えてください。
経験上わかっていること
TiledVAEはメモリの容量を節約
→でも大きな画像を作る時メモリエラー出る
NoiseInversionはDSを下げたときのような効果がある?