Home Artists Posts Import Register

Content

こんばんは、スタジオ真榊です。このところAIと著作権をめぐる投稿が続いてしまったので、しばらくは本題に戻って、いつものStableDiffusionを使ったAIイラスト術について紹介していきたいと思います。今回はControlnet機能の一つ「Segmentation」の活用法についてです!


「ControlNet徹底解説!プロンプト苦難の時代が終わる…」でControlNetの各種機能については解説したところなのですが、前回は「Segmentation」だけ賢木の環境にうまく導入できず、説明を飛ばしてしまったんですよね。その後無事に活用できるようになったのですが、使えば使うほどに「Segmentationこそが構図を支配する聖杯…!」との思いを強くしたので、今回はじっくりその実力を確かめていきたいと思います。


Segmentationを導入しよう!


さて、まずは前回のおさらいから。ControlNetは参考画像をもとにさまざまな情報を抽出して、それをもとに新たな絵を生成してもらうi2iの進化版のような機能でした。「Canny」は輪郭抽出、「Openpose」はボーン抽出、「Depth」は深度情報抽出、「Scribble」でラフ読み込み、「Fake scribble」はcannyよりおおまかな輪郭抽出…などなどが前回紹介した機能でしたが、今回紹介する「Segmentation」はこちらの画像のように、画面上のどこに何が描かれているかを自動認識して色分け指定する画期的な機能です!



▼導入方法

前回説明したのと同様、ControlNet-modules-safetensorsから「control_seg-fp16.safetensors」をダウンロードし、「stable-diffusion-webui\extensions\sd-webui-controlnet\models」フォルダに放り込めばOK。Controlnetの画面上で適当な画像を読み込ませ、Enableをオン、preprosessorを「segmentation」、モデルを「control_seg-fp16」にして画像生成してみましょう。他の学習セットと同様、初回生成時だけ読み込みに時間が掛かりますが、上の「塗り絵」のような画像が表示されれば成功です。


※うまくいかないときはcontrolnetをアップデートしてみましょう。初めてsegmentationを使う際、初回の画像生成前に「preview annotator result」ボタンを押すとエラー表示になるかもしれません。構わず一度画像生成してみてください。


実際の操作画面


さて、導入がうまくいった前提で話を進めますが、実際の操作画面がこちらです。




さてこれ、一体何をしているのかといいますと、ADE20Kという規格で「イラスト上のどこに何が描かれているのか」を塗り絵にして抽出しています。それぞれの色には例えば「sky」「wall」「chair」といった情報が対応しており、AIはそれを基にして「この色で塗られているところには空を描けってことね」と理解できるんですね。



色と被写体の対応表はこちら。150種類の概念を各々振り分けられたカラーで塗り分けることができます。おりこう~!(実際にはここからさらに細分化され、もっと多くの概念を塗り分けられるようです)



こちらのリビングのイラストから構図を抽出したのが下図です。



ここまでどこに何が描かれているのかを理解させられるんですね。

controlnetでこの情報を入力してイラストを生成すると…



それぞれは違うイラストでありながら、完璧にそれぞれの被写体の配置を固定することができています。さきほどの色分け画像と見比べてみると、壁の写真や本、クッション、ラグ、開いたドアなど、全ての位置関係を非常に詳細に理解してくれていることが分かると思います。



キャラクターイラストで実験


さきほどは人物のいないイラストでしたが、キャラクターイラストだとどうでしょうか。こちらの素敵な百合イラストを読み込むと…



キャラクターや空、緑の位置が読み込まれていますね。プロンプトで「制服姿の二人の少女が遊園地の観覧車の前で笑顔で立っている」と指定し、seed値を固定せずに、こちらの塗り絵をsegmentationで読み込んで生成させると…



構図を保存したまま、新しいイラストを無数に生成することができます。素晴らしい…!


このイラストを見ると分かりやすいですが、色で塗り分けられるのは対象物のおおまかなシルエットにとどまるので、Cannyやdepthのような詳細なポーズ指定はできません。AIは「2girlsをこの臙脂色のとこに描けばいいのね、了解!」とは理解してくれますが、シルエットの中にどうキャラクターがおさまるのかはランダム性が高くなってしまいます。でも、上のイラストは2人で手を握ってくれたり、腕を組んでくれたりと、AIなりに学習した「2girls」のありさまをよく描いてくれていますね…本気(マジ)有難(アザ)ッス!


もっと正確に抽出するには?


さきほどのリビングの塗り絵で、あれっと思った人がいるかもしれません。最初のWebUI画面のスクショ上で抽出されていた画像はこんな感じでしたが…



実際に生成に利用した画像はこちらでした。




さきほどのWebUI上で抽出した画像と比べると、WebUIのほうはやや縁取りが直線的でなく、どこに何があるかの認識が甘いように感じられますね。後者の画像は「OneFormer」というSegmentation専用UIで抽出したものです。



使い方は簡単で、抽出したい元画像を画面左側からアップロード。「the task is semantic」「ADE20K」、最後は「DiNAT-L」を選んで送信すればOKです。最後の一つは「Swin-L」でもさほど変わらない結果になるので、DiNAT-Lを使った抽出結果が気に入らなかった場合に使い分けてみるとよいでしょう。


生成できると画面右側に2種類の画像が出てくるので、テキスト説明が描き込まれていない塗り絵の方を右クリックして「画像をコピー」します。WebUI画面を開き、ControlNetの操作パネルを開いた状態でそのまま「Ctrl+V」すると、ダウンロードをいちいちしなくても貼り付けられます。(※うまくいかない場合は適当な場所にDLして読み込ませればOK)


このとき、既存イラストから色分けを抽出するのではなく、既に抽出した後の塗り絵を読み込ませるので、「preprosessor」(事前処理)を「none」にするのを忘れないようにしましょう。


間違った被写体情報が抽出されてしまったら?


ただ、OneFormerを使っても、参照画像によっては完璧に色を塗り分けられないこともあります。さきほどの百合イラストを読み込ませると…



「person(人物)」の位置は完璧でも、髪や背景の一部を窓やカーテンと誤認識していますし、観覧車の概念も理解できていません。さきほどWebUIで抽出したのと見比べてみても…



大差ありませんでした。(抜き出され方はAnnotator Resolutionの設定値にもよります)

塗り絵上で「観覧車」と認識はされていなくても、プロンプトで指定すれば、さきほどのようにちゃんと観覧車が描かれますが、せめてキャラクター二人を区別して塗り分けてもらうことはできないのでしょうか。


複数の登場人物が重なって一つのシルエットになってしまうのを防ぐには、「the task is semantic」ではなく、「the task is panoptic」でOneFormerに読み込ませてみる方法があります。他の設定はさきほどと同様、「ADE20K」と「DiNAT-L」で構いません。すると…



このように、左右のキャラクターで微妙に別々の「person」として認識されました。境界線が区別され、それぞれのキャラを塗りつぶしているピンク色もわずかに異なる色になっていますね。ただ、それぞれのキャラの髪の毛に注目すると、ピンク色ではなく黒で塗りつぶされているところが多いのが分かります。さきほどの方法ではちゃんと髪まで抽出されていたので、こちらはキャラの境界線などが区別できる代わりに、やや甘い判別結果になるようです。


ともあれ、これを基に画像生成すると…


さきほどのようにキャラ同士が手を握ったり、腕を組んだりすることがなくなり、中央で境界線がはっきりしたイラストが生成されます。(ちょっと寂しい気もする)


どちらの抽出方法も一長一短ありますが、3人以上のキャラが重なっていたり、複雑なポージングだったりしているイラストの場合、こうした方法でキャラ別にシルエットを抜き出すと生成ミスを防ぐことができるかもしれません。


こうした使い分けをしても意図した形に塗り分けてもらえず、間違った被写体が表示されてしまう場合は、画像編集ソフトを使ってその部分を別の色で塗りつぶしてしまう方法があります。さきほども説明したように、各々のカラーそのものに被写体の情報が対応しているので、スポイト機能を使って塗り拡げれば良いのです。何が描かれているか指定しない場合は黒で塗りつぶしましょう(RGB:0,0,0の黒です)


ということはもちろん、先ほどの150種類のカラーチャートを参考に、描いて欲しい構図を自分で指定することも可能です。リビングのイラストのように複雑なものを手書きするのは大変な作業になってしまいますが、例えば手前の人物はそのままに背景だけを変えたい場合は、人物以外の部分を黒や別の色で塗り潰してしまいましょう。


背景にキャラクターを描き足してみよう


さて、ここからは中級編です。さきほどのリビングは無人の状態でしたが、ここにperson(キャラクター)を書き足してみましょう。百合イラストから「person」に当たる臙脂色のカラーをスポイトで持ってきて、ペイントソフトで塗り込むだけです。ほりゃ。



あとはプロンプトに「1girl,sitting on sofa」を加えて生成すると…



ちゃんと理解してくれました!


ただ、人物がここまで小さいと、768✕512サイズでは拡大したときに辛いですね。latent(バイキュービック法)のHiresを掛けて拡大したくても、Hiresの過程にはControlnetがうまく効きにくく、狙った結果にならないことが多いです。実際にHires処理をやってみたのがこちら。



このように、Hiresだと「なんか変」になってしまうのですね。キャラクターも妙な感じですし、ラグの上に本が散らかってしまったり、テレビの柱が2本になってしまったりと、思ったような拡大ができません。「スケールアップすると画質はよくなるけど、意図しない絵柄の変更が行われてしまう」…この問題、以前もTwitterで取り上げたことがありました。




そう、ControlNetをフルに使って「これからこの絵をスケールアップしてもらうけど、ここにはちゃんとこんな感じで描いてね」と指示してしまえばよいのです。ある方法を使えば…



このように、人物の破綻を防ぎながら室内の様子を維持することができました!


これは、先週実装されたばかりの新機能「Multi Controlnet」を応用したスケールアップの方法です。今回は記事が長くなってきたので次回に譲りますが、本当にControlNetが切り拓いた表現の地平はものすごいものがありますね!




お約束の自己防衛お姉さんを貼って、今夜はお開きです。次回はSegmentation以外の機能やMulti Controlnetの紹介を含めた実践編を紹介していきますよ!


それでは皆様、素晴らしきControlライフを!スタジオ真榊でした。

Files

Comments

z-kumagon

いつも助かってます。 「スケールアップすると画質はよくなるけど、意図しない絵柄の変更が行われてしまう」…問題も期待しています。 拡大時に男が女に変更されてしまう問題も解決出来るといいのですが。 PS.novelのアップの方は試されましたか?

スタジオ真榊

男が女になる問題、ほんとに難しいですよね。男のキャラのまま胸が膨らむことも多いですし。controlnetだけだとなかなか難しく、latent coupleでなんとかするしかないかなと思ってますわ。 novelのアップとはnovel AIのアップデートの件でしょうか?スケールアップは試してみましたが、anlasコストにあまり見合わない結果になってしまいましたね…