Home Artists Posts Import Register

Content

こんばんは、スタジオ真榊です。今夜は2023年4月25日付で完成したばかりのControlnet1.1用モデル「Tile」についての報告です。Controlnet1.1で使えるものの中でもひときわ異質なこのモデル。アップスケール用なのか?それともCannyやDepthのように構図を写し取るためのものなのか?いろいろと検証してみました。


※Controlnet全体についての基本的な使い方や各モデル紹介については、こちらの記事(▼)をご参照ください。

Controlnetが理解る!SD1.5系向けモデル15種&プリプロセッサ35種を徹底解説

こんばんは、スタジオ真榊です。こちらはStableDiffusionwebUIに大きな革命をもたらした拡張機能群「Controlnet」の大型解説記事です。2023年春に登場した「ver1.1」について、2023年4月27日時点で使用できるモデル14種とプリプロセッサ全35種のそれぞれの特徴とできることを検証しました。 「Controlnet」はひと言でい...


Tileってどんなモデル?

Controlnet1.1が公開された当初、Tileは「未完成」という注釈つきのモデルでした。モデル一覧では「control_v11u_sd15_tile」が公開され、プリプロセッサ一覧には入力画像にガウスぼかしを掛ける「Tile gaussian」というものが掲載されていました。その後、2023年4月25日に「完成」がアナウンスされ、新たなモデルとして「control_v11f1e_sd15_tile」が公開。「Tile gaussian」は「tile resample」に姿を変えた…という経緯があります。


一体、何ができるモデルなのか?公式に書かれている説明は下記のようなものです。


・このモデルはさまざまな方法で使用できますが、大きく分けて、次のような2 つの動作をします。


1.入力画像の細部を無視して、新しいディティールを生成する

2.分割したタイルのsemantics(データが意味するもの)とプロンプトが一致しない場合、プロンプトを無視して生成を行う


入力画像の細部を無視できるため、低品質なディティールを洗練されたものに置き換えることができます。


わかるような、わからないような。

例えば、64×64の小さな犬のアイコンをそのまま8倍の512×512にズームすると、




このようにぼやけてしまいます。これは元画像のディティールが画像縮小の影響で失われてしまっているためですね。これを入力画像にしてi2iで高品質にしようとしても…



元画像の「低品質な細部」にひっぱられて、このように低品質な画像ができてしまいます。Tileはこうした「低品質な細部」を無視しつつ、もとのアイコンの犬の全体の形を保ちながら、アイコンに存在しない詳細な毛並みに置き換えてくれるというものです。


こちらの画像をご覧ください。


これは、i2iではなくt2iで、先程の64x64pxの画像をTileで読み込ませて512x512で生成したもの。元画像になかったディティールが追加されていることが分かると思います。


「おお、じゃあこれ、アップスケール用のモデルなんですね?」と思うところですが、公式はあくまで「アップスケールもできるが、本来はディティールの置き換え(または追加)を行うモデル」だと念を押しています。


公式が提案する「Tileの使い方」は次の5つ。


①2倍、4倍、または8倍のアップスケールができる

②入力した画像のディティールを追加、変更、または再生成できる

③RealESRGANなどのアップスケーラーによって崩壊してしまったディテールを修正、改良、改善できる

④ノイズ除去強度を最強の「1」にしても、タイルごとに別の絵になることを防げる

⑤簡単に色分けされた下書きイラストを完成させられる


このうち、①のアップスケールについては、ほかのアップスケーラーのようにイラストを高解像度化するのではなく、「イラストに描かれたものを認識し、より高い解像度でゼロから描き直す」のだというのです。一体どういうことなのか?それを今回検証していきたいと思います。


インストール上の注意

他のモデルと同じように、こちらの一覧から「control_v11f1e_sd15_tile」をダウンロードして、「stable-diffusion-webui\models\ControlNet」もしくは「stable-diffusion-webui\extensions\sd-webui-controlnet\models」に格納すればOK。


もし未完成品の「control_v11u_sd15_tile」がcontrolnetのフォルダに入っている人は削除しましょう。また「control_v11u_sd15_tile.yaml」がフォルダ内にある場合は、「control_v11f1e_sd15_tile.yaml」をダウンロードして置き換えます。Tileを使っても入力した画像と似ても似つかない画像が生成されてしまう場合は、モデルと同名のyamlファイルが同じフォルダにあるかどうかをまず確かめてください。


置き換えとは何か

さて、ここまででわかったことは、Tileが「画像の全体構造を維持しながら、ディティールを置き換える」ことができる、入力した画像の「詳細描き直し」とでも言うべき機能だということです。i2iやSDUpscaleとどう違うのかといえば、それらで8倍サイズに拡大するときは、ノイズ除去強度を低くしないと崩壊してしまうわけですが、Tileは全体像を守りながら「似たものを詳細に」描けるというのです。


Tileという名前から思いつくように、これまでも入力した画像をタイルのようにいったんバラバラにして、それぞれを高解像度化し、再び同じように接着する試みが行われてきました。「SD Upscale」や、拡張機能の「TiledDiffusion」などがそうですね。入力した画像をタイルのように分割し、おのおののタイルの細部を高精細に置き換えてから、また元の形にくっつける。通常、これをノイズ除去強度高めで行うと、こちらの右側の画像のようにプロンプト指示がそれぞれのタイルに個別作用して、イラストがバラバラになってしまいます。



これは「2girls,maid,cith,sky」で生成した絵を横4つ✕縦6つのタイルに分割し、それぞれ高精細化しようとしたとき、プロンプトにある「2girls」が効きすぎてしまい、それぞれのタイルが2girlsに化けてしまっています。ノイズ除去強度が控えめならこうした問題は起こりませんが、0.5を超えるとすぐにこうした不都合が起きてしまうのが難点です。


「Tile」が独特なのは、分割されたタイルそれぞれに何が描かれているかを自分で認識して、指示されたプロンプトと異なる場合はその影響を弱めてくれる点。さきほどの失敗例で言えば、「ここを2girlにしちゃだめだな」と空気を読み、プロンプトを意図的に無視して「化け」を防いでくれるというのです。


この「タイル式アップスケール+プロンプト取捨選択」が可能になったことで、元画像から2倍~8倍サイズにアップスケール&高精細化しても全体の構図が崩壊しないで済むわけです。ただ、入力イラストと全く同じサイズで生成しても「詳細の置き換え」は行われるので、厳密にはアップスケーラーというわけではありません。


また、開発者であるlllyasviel氏「理由がわからないが、このモデルは基本的にcfgスケールが15以上で利用する必要があるようだ。とても不思議」とも書いています。実際には15未満でもうまくいくのですが、学習モデルによるのかもしれません。ヒントとして覚えておきましょう。


プリプロセッサ「Tile resample」の意味

ところで、Tile完成時に「Tile resample」というプリプロセッサが新たに公開されたので、これが専用なのかと思っていましたが、公式によると「Tile」はpix2pixに続くプリプロセッサ「なし」で動作するcontrolnetモデルとのこと。「Tile resample」は入力画像を小さくするためのプリプロセッサで、Tileによる生成結果のバリエーションを増やす目的で追加されたそうです。



「tile_resample」を選ぶと、このように「Down sampling rate」というパラメータが表示されます。デフォルトの「1」になっていると元画像がほぼそのまま読み込まれるのですが、これを上げると…


このようにダウンサンプリング(低解像度化)されます。ぼかしを掛けているわけではなく、実際はキャンバスの大きさ自体が小さくなっています。この犬のアイコンはもともと低画質な画像なので低画質化する必要がないのですが、既にディティールが描き込まれている高精細な画像のディティールをあえていろいろなものに置き換えたいときは、この機能を使ってディティールを「潰す」必要が出てきます。(後で実験します)


ただ、そうした明確な目的がない場合は、基本的に「なし(none)」で使ってOK。「tile_resample」を選んで「1」にしてもほぼ同じです。



検証スタート

というわけで、説明が長くなったわりに非常にわかりにくいモデルなので、いろいろと実験を行いました。


こちらの元画像(768✕512px)を「ディティールを無視して」描き込み量を増やしてみます。


▼設定

今回は「なし」ではなくtile_resample✕tileを選びましたが、ダウンサンプリングレートは1なので、そのままの画像が入力されます。(ほぼ「なし」と一緒)



これを入力画像として、このように1.5倍の1152✕768サイズで生成します。



生成できたのがこちらの画像。わかりやすいように元画像と並べてみました。


全体の構図をほぼ継承しており、まるでi2iしたかのように見えますが、あくまでこれはt2iです。細部を見てみると、アクセサリーや花束、ドレスの細部が違うものに置き換えられて形状・質感・色ともにリッチになっていることが分かります。線画や深度情報の継承ではこのように全体は維持されませんし、i2iではあくまで元画像に引っ張られてしまうので、このようにはなりません。


実際にi2iで1.5倍(ノイズ除去強度0.4)にしてみますと…

それぞれの花の色に至るまで、基本的に細部が維持された上で詳細化されるのが分かると思います。最初に試した犬の絵と同じことが起きています。


次に、さらに大きい2048✕1360pxサイズに挑戦しました。

さらに細部がリッチに書き加えられていますが、全体の構図は同じです。ただ、よく見るとさきほどのイラストもこちらも、左の銀髪の子の手が崩壊していることが分かります。入力画像の手がそもそも崩壊しているので、詳細化しても勝手にキレイにしてくれるほど都合がよくはないということですね。


本来、左の女の子4人の画像(768✕512px)を同じSeed値・パラメータのまま2048✕1360pxで生成しようとしても、Controlnetなしでは右側のように大崩壊した画像が生成されてしまいます。

こうした現象を避けるため、私たちはこれまで「小さく出して大きくアップスケールする」という手法をとってきました。つまり、大きなサイズで生成するときには、どんな構図で何を描くか特定できる「指針」となるような情報をi2iやControlnet、各種アップスケーラーを使って送り込む必要があったのです。


ところがTileの登場によって、今後はいきなりt2iで巨大なサイズの画像生成ができるわけですから、非常に画期的なモデルと言えるでしょう。


こちらはアップスケーラー「R-ESRGAN 4x+anime6B」を使って解像度を3倍に拡大したものですが、拡大するとこのような「溶け」が目立ちます。


「Tile」はこうしたアップスケーラー独特の不自然さを取り除き、「小さく出して大きくアップスケールする」画像生成AIの仕組みをアップデートしようとする試みということができます。


Tiled Diffusionと組み合わせてみる

さて、ここでちょっと別のアップスケール機能について紹介します。「Tiled Diffusion」は、VRAM使用量の制限を回避しながら非常に大きい画像を生成できるようにする拡張機能です。




例えば、私の使用しているRTX3060ではVRAM12GBという限界があるので、768x512pxの4倍に当たる3072x2048pxの画像を生成しようとしても、このように「CUDA out of memory」(VRAM不足のエラー)が出てしまいます。

そこで、このTiled Diffusionを使うと、入力画像をタイル化しておのおのアップスケールしてくれるので、VRAMの限界を超えて高解像度が画像を作れるようになるという仕組み。


インストール方法については、いつもどおり拡張機能欄から「MultiDiffusion with Tiled VAE」を探してインストールしてもらえればOK。UIを再読み込みすると、t2iやi2iの画面に以下のようなメニューが追加されます。



設定は上の画像のように、「現在の画像サイズで上書き」にチェックを入れると最終的なキャンバスサイズをこの画面で設定できます。「Method」欄からMultiDiffusionもしくはMixture of Diffusersによるアップスケールが利用できるのですが、今回は「MultiDiffusion」を選びます。Latentタイルというのが、アップスケールの際に分割されるタイルの大きさや重なりを設定するもの。


下にある「Tiled VAE」を有効化すると、アップスケールの際に画像をタイル状に分割して個別にエンコードすることで、CUDA out of memoryエラーを起こりにくくしてくれます。設定値はデフォルトのままで大丈夫ですが、CUDAエラーが起こる場合はそれぞれのタイルサイズを落としましょう。


Controlnet画面ではさきほどのようにTileで元画像を入力するだけでOK。この設定で生成すると…


このように、3072x2048pxの画像が生成できました。さらに描き込みが精細化してリッチになっており、左の子の手も修正されているように見えます。ただ、髪の毛の質感は髪というよりテクスチャのようになっており、これは恐らくアニメイラストを中心に学習したモデルの限界と思われます。ここまで高精細にする場合は、よりリアルよりの学習モデルでないと細部が活かせないのかもしれません。


Tile_Resampleの使い方

さきほどは内容の説明だけだったTileResampleについて、詳しく触れておきたいと思います。Tileは詳細部分を捨て去り、上書きすることができるモデルなわけですが、入力画像が詳細だと、ディティールを捨て去りきれず引っ張られてしまうことがあります。より自由に描き直してもらいたい場合は、元画像をわざと低画質化させて読み込ませると逆に良い結果が生まれます。


TileResampleの設定にXYZプロットが使えなかったので、手動で実験しました。768x512pxを2倍にアップスケールするのですが、その際Down Sampling Rateを上げるとどうなるか見比べてみます。


▽Down Sampling Rate:1(元画像のまま)


▽Down Sampling Rate:4




▽Down Sampling Rate:8(最小サイズ)



ぼかしが強くなる(正確には、入力画像が低解像度になる)につれて、細部の変化が強まっているのが分かります。特に花束の形状を見ると、「花束である」というところは維持しつつ、元画像から離れた形状になっていますね。アップスケール時に、どのようなものに仕上げるか幅を持たせたいときにこの機能を使うと良いようです。


プロンプト書き替えで何が起こる?

入力した画像と矛盾するプロンプトを使って、構図はそのままに別のものを描き込ませることもできるようです。しかし、「1girl」を「1boy」に変えられるかというと、「構図をできるかぎりそのまま写し取ろうとする」Tile自身の機能によって阻まれてしまいます。


最も入力画像を小さくするDown Sampling Rate:8で、「4boys」のプロンプトに変えて生成しても…


赤いドレスの子の顔立ちがちょっぴり変わった?くらいで大きな変化は起きません。Tileで書き換えられるのは、もっと小さな要素です。


今度は「happy smile,open mouth」を「angry」「closed mouth」に変えてみます。


こちらは「全体の構図」ではなく「詳細」に分類されるようで、怒り顔にすることができました。ただ、こちらのダウンサンプリングした入力画像では、まだ口が開いているように見えるため、銀髪の子を除いて口は開いたままになってしまいました。



これを書き換えるためには、新たに追加された「Control機能」を使います。

こちらの「My prompt is more important」にすることで、入力画像よりもプロンプトにより重点を置いた生成ができるようになります。


こちらがその結果。しっかりプロンプトに従わせることができましたが、そのかわり入力画像への忠実度(再現度)が下がっています。入力画像か、プロンプトか。この2つのバランスをうまく調整することで、望む画像を出すことができるようになりそうですね。


まとめ


開発者のlllyasviel氏は「Tileは生成画像にアップスケールっぽい特徴を出さず、その解像度で描かれたもののように生成できる最初の手段だ」としています。ただ、この概念は理解するのが難しく、上級者向けだとも書いていて、やはり難解な機能であることは確かです。


実験で気づいたことのうち、記事で紹介しきれなかったものを箇条書きします。


・「Tile」をimage2imageで使用すると、より元画像のエッセンスを残しながらアップスケールできる。ノイズ除去強度を「1」にするとt2iしたのとほとんど同じになるが、0.5くらいにすると元画像の色合いやディティールを半々で混ぜたような画像にできる。

・手の崩壊はかなり苦手な模様。Depthなどを使った修正が必要と思われる。ただ、手が崩壊した元画像を非常に小さくダウンサンプリングして手が判読できないレベルにした場合、大きくアップスケールした際に直されることがある。

・行われているのは細部の書き替えなので、キャラクターの維持とはトレードオフの関係。漫画のキャラクターに使うと、「リボンなどのディティールがコマごとに変わってしまう」といった不都合が生じてしまう。

・巨大な画像を生成すると、書き込みが細かすぎて逆にディティールが不自然になることがある。幸いTileを使えば基本的に生成画像の構図は重なるので、数枚同じサイズのものを出しておいて、「人力マージ」で取捨選択してあげると良い。


▽参考画像

一枚目に出した画像(左)は銀髪の子の髪の毛が一部緑になっていたり、赤いドレスの子の眉が二重になっていたり、胸元の肌に謎のレース模様が描き込まれている。そこで、同じ設定でもう一枚の高画質画像(右)を出しておいて、クリスタでレイヤーとして重ね、不自然な部分は消しゴムで消して置き換え、リッチな部分を選択的に残す。すると…

2つの画像の「いいとこ取り」ができるというわけ。かなり強引ですが、別モデルで生成した画像と人力マージすると、顔だけアニメ調にすることもできます。



「輪郭」を継承する「Lineart」や「Canny」、色やトーンを継承する「Shuffle」、表情やポーズを継承する「Openpose」に対し、Tileがやっているのは「細部を破棄して全体の構図を継承する」というところでしょうか。皆様、それぞれに自分なりのアップスケール方法があると思いますが、それにこのTileを組み合わせることで、よりリッチな描き込みを実現できるかもしれません。ぜひ試してみてくださいね!



それでは長くなりましたが、本日の検証はここまで。「アップスケール?描き直し?新モデル"Tile"ができること」でした。


それではまた!スタジオ真榊でした。


Files

Comments

AkiColi

アップスケールの方法は色々ありますが、これはとても参考になります。ありがとうございます。

スタジオ真榊

こちらこそ、読んでくださってありがとうございました!これ、理解するまで時間がかかったんですが、すごく画期的な取り組みなんですよ!すでに完成してますが、もっと進化の余地がありそうなので、たぶんどんどん研ぎ澄まされていくんじゃないかしら…

金柑

私史上最強のアップスケール方法でした。 いつも良記事ありがとうございます!!

take2

技術を評価して、特性を掴み言語化する能力、そしてそれをワークフローに取り込むセンスが素晴らしいです😀

2次元の杜ーAI閣下

とても素晴らしい記事でした。 私も使用したいと思いさっそくダウンロードしてきました。 しかし、ControlNet欄のモデルにはtileは出てきましたが プリプロセッサ欄にはTile_Resampleが出てこないのですが、モデルをフォルダに入れる以外に他に設定があるんでしょうか?

スタジオ真榊

それはおかしいですね、アプデで削除されたのかと思い手元で見てみたのですが、こちらの環境ではTile_Resampleが表示されます。あまり使う機会のないプリプロセッサなので、記事のとおり「なし(none)」で利用いただければ問題ないかとは思いますが、表示されないこと自体がやはり気になります。「アップデートを確認」でControlnetが「最新版」と表示されることを確認し、いったんsdwebuiのコマンドプロンプト画面を閉じて再起動してみることをおすすめしますわ。

スタジオ真榊

過分なお褒めをいただいて恐縮ですわ~。先週から体調を崩してしまい返信が遅れてしまい失礼しました。

スタジオ真榊

こちらこそ、記事を読んでくださって嬉しい限りです。お返事が遅れてしまって失礼しましたm(_ _;)m

2次元の杜ーAI閣下

返信ありがとうございます。確認しましたところ、最新版ではありませんでした。更新をし一覧を再度確認しましたら、無事にresampleが出てきました。迅速な対応ありがとうございました。これからも支援しつづけたいと思います。

まさとし

後半は複雑で理解できませんでしたがTile_Resampleはすごいことができますね。とても素晴らしい内容でした。