2024/01/24:Tiled Diffusion
の設定項目について追記。
2023/06/21:わかりにくい箇所を修正。UI画像を追加。Tiled Vae
利用時にエラーで使用できない場合の回避策を追記。
2023/06/15:わかりにくい箇所を修正
2023/05/29:Preprocessor
にcolorfix系が追加されたため追記。
Stable Diffusion
のエクステンションであるControlNet
(1.1)が持っている機能の1つ。
小さい画像をアップスケール(拡大して再生成)する場合に、細部を書き込みながらも元画像を維持する働きをする。
つまり元絵のイメージを保ちつつも画像のディティールアップに貢献する補助機能といってよいかと思う。
小さい画像を | アップスケールする時にクオリティアップ! |
---|---|
ControlNet
本体の機能などを解説した記事は次。まだ読んでない方は次を先に読むことを推奨。
ControlNet(v1.1)の詳しい解説!輪郭やポーズから思い通りの絵を書かせる【Stable Diffusion】 | 謎の技術研究部
よってControlNet
に関する基本的な内容は解説しないので注意。
AIイラストでは大きいサイズの画像を生成しようとすると途端に処理時間が長くなってしまう。
そこで、まずある程度小さいサイズで何度か生成し目的に近い画像を作る。
次にそれを画像サイズを拡大しながらも細部をAIに加筆させることで良い画像に仕上げていくという作業が一般的。
この拡大する処理のことをアップスケールと呼ぶ。
また、AI絵はビデオカードのメモリに応じて生成できる画像サイズに限界がある。
この限界を突破する方法は後述。
では、実際にアップスケールはどうしたらいいのだろうか。
まずはStable Diffusionのデフォルト512 x 512
サイズで生成してみる。
この画像を大きくしながらも細部をより綺麗にしたい。
「画像サイズを大きくして生成すればいいじゃない」という考えが浮かぶが、そう単純ではない。
例えば上と同じプロンプト、シード固定で画像サイズを大きくして再生成すると
このように完全に違うイラストが描画されてしまう。
つまり同じキャラクターを同じ構図で「より細かく書いてほしい」という場合は画像サイズを上げるだけではダメ
Stable Diffusionには標準でアップスケーラー機能がついている。
画面上部のExtras
タブにScale by
というのがありこれが画像を大きくしてくれる。
しかし、これはあくまでAIが画像を引き伸ばしする機能である。
わずかにリファインされるが、新たな書き込みは殆ど追加されない。
あまりこだわりのないユーザーが見ると、この機能を使ったアップスケールは処理前も処理後も殆ど変わらず高解像度になっているようには見えない
なら、画像生成時にサイズを大きくしながらも細部を書き込んで高解像度化するHires. fix
機能を使えば良い、というのは1つの解だ。
つまりtile_sampler
など使わなくてもこれで良いのではないか?と思ったユーザーも多いだろう。
残念ながら、これにもデメリットがある。
では、実際にやってみて確認しよう。
元画像 | Hires. fix |
---|---|
明らかに右の画像のほうが良くなっているし、元画像の雰囲気も壊していない。
しかし、気づいた人が殆どだろう。洋服の形状は違うし左手のポーズも変わってしまった。
これはこれで良い絵がでているので一見「いいじゃん?」と思いがちだ。
しかし512
サイズで「これだ!」という画像ができた時にHires. fix
を通したことでせっかくのイメージが崩れてしまうことが実はよくある。
そうなってしまっては、そもそも画像を大きくしないほうが良かったということになりかねない。
前置きがかなり長くなったが、こういうときにTile Resample
が使える。
「元絵のイメージを崩さないで、細部を書き込む」機能だ。
次のサイトからcontrol_v11f1e_sd15_tile.pth
をDLし、モデルフォルダにいれておく。
lllyasviel/ControlNet-v1-1 at main
Preprocessorはtile_resample
、Modelは上記のものを入れる。
Pixel Perfect
のチェックはControlNet
側の画像サイズ指定を簡略化してくれるものなので、特に問題がなければオンにしておこう。
またDown Sampling Rate
というのもあるが、ここはデフォルトの1
のままにしておこう(後述)
tile_resample
を設定しておけば自動でアップスケールしてくれるものではない。あくまでそれらの補助ツールだ。
これを設定した上で画像サイズを大きくしたりHires. fix
を併用したりするもの。
ここからはそれらと組み合わせるにはどうすればいいかを実例で交えて紹介する。
tile_resample
を設定しておけば、単純に生成サイズを大きくするだけでもアップスケールができる。
元画像 | (比較用)Hires. Fixだけで1024にした例 | tile_resample+ 1024サイズに変更 |
---|---|---|
実際にtile_resample
を使ったものとHires.Fix
を並べてみた。
これを見てわかるようにtile_resample
でアップスケールしたほうが元画像に近い。
元画像のイメージはできるだけ壊さないように、より細部を書き込ませることが可能だ。
これを見るとtile_resample
だと色味が若干変わってしまった。これが最大のデメリットとも言える。
しかし、これを逆手に取って「色味をあえて変化させたり、エフェクトを追加する」というテクニックが使用可能だ。
これはエフェクトを追加するような使い方の項で解説する。
逆に色味は可能な限りオリジナルに近づけたい場合はtile_colorfix
等を選択することで回避できる。
こちらは3種類のtileの項で解説する
t2i
でtile_resample
を使うときは元画像をControlNet
に放り込むことを忘れないように。
プロンプトが同じでもこれを忘れてしまうと全く別の画像が生成されてしまう(筆者はけっこうやりがち)
上の例は生成サイズを変更しただけだがHires. fix
+ tile_resample
でも良い
tile_resample+1024サイズ | tile_resample+512サイズ+Hires. fixで2倍に |
---|---|
このケースだと右のほうがわずかに書き込みが増えている。
元画像のイメージを少し崩しても書き込み量を増やしたい場合にHires. fix
を併用する方法が有効だと思われる。
またHires. fix
のDenoising Strength
は0.5
よりも小さくすると画像が壊れがちなので0.6
ぐらいを推奨。
あえて大きくするのもおもしろい(書き込みは増えるが元絵から離れる)
Hires. fix
を使ったことない人向けに解説すると
Hires. fix
のチェックをON(隠れていた設定項目が現れる)Upscale by
に何倍に拡大するかを決めるControlNet
にtile_resample
と元画像を設定して生成開始ひとまずこれだけでOK。より詳しくは別サイト参考。
tile系には3種類のPreprocessorが
存在するので解説する。
こちらが基本のtile_resample
アップスケールしながらもプロンプトによって効果やカラーを載せていく場合はこちらを使う。
こちらは元絵に忠実なカラーを再現するモード。
通常のtile_resample
だと色が変わってしまう問題に対応したもの。
可能な限りオリジナルに描かれている塗りを維持するようになる。
ただしデメリットとしてプロンプトによる影響を受けにくくなるので効果を載せる等のコントロールの幅が無くなる。
tile_colorfix
だと線がすこし甘くなる印象があるが、それを補ってシャープにする。
tile_resample
とtile_colorfix
のいいとこ取りをしたイメージ。
ただし、パキっとした雰囲気に変わってしまうので好みが分かれる。
実際にサンプルを用意した。
オリジナル | tile_resample |
---|---|
tile_colorfix | tile_colorfix+sharp |
---|---|
上の例では、通常のtile_resample
でジャケットや肌の無駄な書き込みが少し多くなってしまった印象を受ける。
そこでcolorfixを使うとそれらがわずかに抑えられ、元絵に近くなっている。
今回の例ではあまり顕著な違いは見られないがtile_resample
で全体の色味が大きく変わってしまうときにはtile_colorfix
を使うと効果を実感できるはずだ。
また、そもそも元絵のようなベタっとした塗りのほうが良いのではというユーザーも多いだろう(表情の美しさはtileに軍配が上がるが)
好みや目的に応じて替えていくことを推奨する。
2024/01/24:Tiled Diffusion
の理解が間違っていたのでこの項目を大幅に更新
残念ながらアップスケールするときの限界サイズはVRAMの容量に依存する。
そこで、その限界を突破してより大きなサイズを使うことができるTiled Diffusion
というエクステンションを紹介する。
コレは画像をタイル状に分割して、小さく個別に生成したあと結合するエクステンション。
生成画像を分割するためVRAMが小さくても大丈夫というワケ。
超基本的な使い方だけ説明する(基本次の3つだけ設定すれば良い)
Tiled Diffusion
をオンにするLatent tile batch size
の数値を減らして再実行(重要)※Tiled Diffusion
がオンの場合2を使わないとSD側の画像サイズ変更スライダは効果なくなるので注意
もしかするとVAEエンコード時にメモリオーバーになっている可能性あり。
※生成した画像をAIが認識できるデータから実画像ファイルに落とし込む処理
Tiled Diffusion
にはもう一つ機能が備わっており、そちらのTiled VAE
をオンにすることでこちら側も対応可能。
今度はTiled VAE
側のタイルサイズが大きすぎる可能性もある。
実は筆者もこの部分についてはよく分かっていないがEncoder Tile Size
を小さくしてやると成功する時がある(より生成に時間がかかるようになるが)
次の画像はtile_resample
+ Hires. fix
で1536と2048サイズを生成した例。
1536サイズ | 2048サイズ |
---|---|
さすがに2048サイズだと書き込める余地が多く、逆にAIが迷っているようになのでほどほどに。
これまでの例の中でも、こちらの1536サイズは線も美しく一番好みな結果となった。
画像は大きければ大きいほどいいのでは?と思うかもしれないがtile_resample
なし(Tiled VAE
使用)で画像を生成すると次のようなものが出る。
そもそも大きすぎる画像はこのようにカオスな状態になりがちなので、こういうときにもtile_resample
の恩恵がある。
更に一歩踏み込んだ使い方。
元絵のキャラを維持したままエフェクト的な書き込みを増やすテクニック。
tile_resample
に放り込む画像を作る(今回は上の元画像)こうすることにより、元絵のキャラクターに別の効果を与えることが出来る。
いくつか例をだしてみる。
zentangle等のプロンプト | starry sky等のプロンプト |
---|---|
モデルを変えて花びら系プロンプト | モデルを変えて水や自然系プロンプト |
---|---|
このようにそもそもtile resample
を使うことでキャラクターに効果を乗せるような動きをする。
また、ここまで大きくプロンプトを変えなくても、カラー指定などを細かく変更する手法もおすすめだ。
tile resample
はデフォルトの512サイズよりも小さい画像からスタートしてもかなりうまく作用する。
160x160の小さいサイズを拡大したらどうなるのかをテストした。
160サイズでAI生成 | アップスケール(1040サイズ) |
---|---|
160サイズはかなり微妙な画像だがtile resample
が上手く作用してアップスケールに成功している。
小さいサイズの画像をいくつか選定して、好みのものだけアップスケールするというワークフローを経由すれば非力なPCでも好みの画像が作れそうだ。
ただし、あまり小さいサイズだと風景のような書き込みが多いイメージは作れないので、バストアップのキャラぐらいが精一杯になるかもしれないので参考までに。
ControlNet
の設定の中にDown Sampling Rate
というものがある。
こちらはシンプルに画像をボカす度合いになる。
この値を上げると、元画像がよりボケた印象になり、あまり上げ過ぎると生成される画像もボケた画像が出てきてしまう。
そしてこれが実際にどういう時に使うべきかはいまいち分かっていない。
安易に数値を上げてしまうとアップスケールどころか霞んだ効果になってしまうので基本はデフォルトの1のままで良い。
もしかすると逆に解像度が高すぎる画像をボカす時に使う?
個人的な実験では、フルhdサイズくらいの元画像にこのスライダを大きく上げることで印象が変わった。
実はこの機能Preprocessor
をnone
にしたままModel
側だけ設定してやっても正常に動作する。
出力結果は上のDown Sampling Rate
の設定1と変わらないので面倒なら設定しなくても良い。
このようにtile resample
はアップスケールする処理のサポートとして、元絵のイメージを壊さないまま細部を書き込むような挙動になる。
自分がイメージしたままの画像を維持し、さらに上のクオリティを目指すユーザーには必須の機能になるかもしれない。
アップスケールを使ってクオリティを上げていく作業にぜひとも併用してみてほしい。