2023-03-16(更新)

ControlNetの詳しい解説!輪郭やポーズから思い通りの絵を書かせる【Stable Diffusion】

AIイラストはPromptだけだと思い通りのポーズが出せない。そこで既存の線画やポーズから出力をコントロールする手法がControlNet。分かる範囲で細かいところまで設定を見ていく。

Article Image

2023/03/16:軽量化モデルのリンクを追記。binaryのモデルを追記しscribble系を調査して加筆。T2i Adapterの項を追加。その他細かい記事修正。

2023/03/04:古い情報を修正。推定モデルにDepth_leres,pidinetを追加。Allow detectmap auto savingの設定を追加。Guidance Start(End)を追加。

はじめに

この記事はStable DiffusionのExtensionであるControlNetより深い解説を目指す。

更新がとても頻繁に行われており、まだエクステンションの機能は網羅できていない。

逐一更新する予定。

なにをするもの?

例で見たほうが早いので紹介する。

まず先日自作したウマ娘の洋服を着せたCGモデルの画像を用意する。

※これは自作画像なのでAIは一切通していない(モデル素体はMD付属)

もととなるモデル

img2imgDenoising strength0.1に設定すると元のイメージを維持した絵が出てくる。

実際に作成したのが次。

i2i

確かに維持したまま絵が書かれたが、ほとんど同じものになるので手書き風エフェクトを加えた程度の変化といっても良い。

前回の作例ではむしろそれを狙って使用した。

つまり色を塗り替えたり、洋服のデザインを変更したりはできない。

線画やポーズからイラストを生成したい

もっとポーズを一致させた他のキャラにしたい場合や、線画だけの絵に色を付けたいなどのコントロールをしたい。

そこで登場するのがControlNet

私が試した例だと、次のような出力ができた。

赤い洋服

ポーズを維持したまま赤髪+赤い洋服になっている。いちばんよく出来た例。

茶色系

全く同じ設定で、茶色系が出力された。

白い髪型、同じ制服

表情がイマイチだが、背景に逆光が追加された。

黄色い洋服

制服が黄色になった。服のディティールがよく出ている。

部屋

部屋のような背景が浮き出した例。こちらもキャラクターのシルエットは高品質で維持されたままだ。

このように、もとのイラストのポーズや線画を維持したまま新しいイラストを生成できる。

つまりアウトプットされるイラストを思い通りにコントロールできる可能性が増えたといえる。

以前は白黒の線画を維持したまま色を付けるなどは難しかった。

ControlNet

このアルゴリズムを考えた大元は次のモデル。

GitHub - lllyasviel/ControlNet: Let us control diffusion models

そしてこれを使いやすくautomatic1111氏のweb UIに対応させたのが今回利用させていただいたもの。

GitHub - Mikubill/sd-webui-controlnet: WebUI extension for ControlNet

この場を借りて公開に感謝いたします。

導入メモ

恐らくここ以降の記事を読むユーザーはStable Diffusionのweb UIには詳しい人が多いだろうという想定なので冗長になりそうな箇所を省略している。

インストール

Web-UIのExtensionで導入する。

リポジトリのURLを貼り付けるだけでインストールできる。

Install From URL

URL: https://github.com/Mikubill/sd-webui-controlnet.git

2023/03/04時点ではExtensionのリストから検索してもインストールが出来る模様。

Google Colabに入れる場合

Web-UIからインストールするとエラーになる場合がある。

その場合は次のようにextensionsフォルダ下でgit cloneしてやれば完了。

opencv-pythonも別途必要らしく念のため入れている。

%cd stable-diffusion-webui/extensions/
!pip install opencv-python
!git clone https://github.com/Mikubill/sd-webui-controlnet.git

輪郭やポーズを推定するモデルが必要

ControlNetはインストールしただけでは動作しない。

輪郭やポーズを抽出するモデルを別途入れる必要がある。

次のサイトに抽出する手法別にデータが分かれているので欲しい物をDLする。

lllyasviel/ControlNet at main

上記モデルはフルサイズのようなので、サイズが大きいと思ったら軽量化の次でもよい。

webui/ControlNet-modules-safetensors at main

この追加のモデルに関しては次の項で解説する。

モデル選択設定

ここの設定で必要になる。

マップ抽出用モデル一覧

上で説明した推定するモデルについて、それぞれがどういうものかを一覧にしておく。

canny

ファイル名:control_sd15_canny.pth

cannyはイラストから輪郭を抽出して、それを線画として絵を書いていくモデル。今回利用したのはこれ。

線画に色を付けたい、元のイラストイメージをほとんど壊さず別の絵にしたい場合はこれかと思った。

線画

内部では上のようなラインを抽出し線画として処理しているようだ。

hed

ファイル名:control_sd15_hed.pth

上のcannyに似ているが、グレースケール全範囲を利用することによって線の強弱まで取っている?

このモデルは元の画像の細かい書き込みを変化させること無く新しい画像にしたい場合に有用そうに思う。

推定画像

hed推定

出力画像

hed出力画像

Denoising=0.75にも関わらずディティールを維持したかなり美しい画像となった。

今回は最初からこれを使うべきだったかもしれない。

リペイント目的なら個人的おすすめ。

openpose

ファイル名:control_sd15_openpose.pth

openposeはAIによるモーションキャプチャなどの類だと思われる。人物の四肢の位置を推定しCGのボーンのような棒人間のデータを出力する。

それをもとにイラストを書いていくのでポーズは維持して全く別のキャラクターを作りたい場合に有用。

ボーン

入力画像から人のポーズを取り出し、それに沿って画像を生成するので

出力結果openpose

このように全く別キャラだがポーズを維持した画像となる。

openpose_hand

2023/03/16:現在、推定モデルがうまく機能していない模様。大きな手を使ってテストしたがうまく指が拾えなかった。

hand専用のモデルが出てくるまでは使用不可能?

次は実際に試してうまくいかなかったものをそのまま掲載。

上の棒人間方式に「手」を加えたもの。

次のような画像が生成される。

openpose_handで生成

よく見ると手が追加されているのが分かる。

手をより正確に出したい場合に有用だとおもわれる。

出力結果hand

テストで出力したところ、残念ながら手はそこまで正確ではなかった。

depth

ファイル名:control_sd15_depth

画像の「奥行き」を推定するモデル。

これは3DCGで利用されるDepth Mapと概念的には同じ画像が利用されていると思われる(黒いほうが奥、白が手前)

奥行きなので、キャラが斜めになっていたり、背景と共存している画像に最も強い?

またcannyhedの場合は洋服のシワなどの細かい線も再現されるが、こちらはキャラのシルエットは残して内側は書き換えてしまう、といった場合に有用ではないだろうか。

テストで行った生成では次のようになった。

depth画像

出力画像

輪郭がはっきりと維持されている。

Depth_leres

Depthと同じマップだが内部アルゴリズムが違うようだ。

基本的にこれは使わないようにして、通常のDepthで生成したほうがおおよそ良いものが出来る模様。

ただ、こちらのメリットはより細かい設定が詰めれるようになっているので上級者向け。

次のフォーラムが参考になる。

"Depth_lres" ControlNet options : StableDiffusion

mlsd

ファイル名:control_sd15_mlsd.pth

こちらは建物や家具といった「直線」を抽出するモデル。

従ってキャラクターには全く無意味となるので注意。

3DCG的には「ハードサーフェス」に適用するとよさそうだ。

normal_map

ファイル名:control_sd15_normal.pth

ノーマルマップ(法線マップ)を生成し、それを元にするモード。

ノーマルマップは3DCGで使われる概念なので、簡易的に解説すると面の方向が入っている画像データ。

CGでは凹凸がないところ(ローポリな箇所)でライティングや影をコントロールするような使い方をするので恐らくこちらも同じだろう。

自作のノーマルマップを使う方法は後の項目に記載。

scribble

ファイル名:control_sd15_scribble.pth

手書きで白黒画像を作り、それをベースに画像を作るモード。

デジタルで書いたラフ画(白黒画像でなくてもよい)を使う場合は最適そうだ。

アナログで書いたラフをスキャンして入れると、線が薄いためうまく拾えない模様。

この場合はbinaryを使うと良さそう(後述)

アウトプットの画像をより元絵に忠実にしたい場合(ざっくり書いたラフではなく、本気で書かれてる線の場合)はhed推定のほうが良いと思う。

fake_scribble

モデルと動作は上とほぼ同じ。

こちらは手書きではない「画像」を一旦手書き風に変換して使う用途。

元画像から線だけ抽出して再描画させるイメージだと思う。

hedcannyと思うと線が太いものになるのでより曖昧な絵になるのではないだろうか。

binary

こちらもscribbleと基本は同じだが、色に対して線の抽出され方が若干違う。

画像データの数値から直接しきい値的に取っている?ようでscribbleと違ってBinary Thresholdというスライダを上下させて線の判定を変化させられる。

詳しくは分かっていないがscribbleでうまく線が拾えない場合はこちらで微調整するのが良いかもしれない。

つまり、アナログ線画のスキャン(線が薄い)や、白黒だけど濃淡がついているラフ絵を使うには効果的そうだ。

scribble系参考画像

scribbleなどのpreprocessorを通して白黒画像化した参考例一覧。

segmentation

ファイル名:control_sd15_seg.pth

画像を色でわけると、色分けされた箇所で別々のものが描画されるので、独自の構図を作ることができる。

txt2imgで1分で作った適当な画像を入れて実験。

セグメントわけされた画像

上の画像で想定した通りの構図で部屋が現れる。

部屋のような画像

「この平面は窓や、この箱はテーブルやな」のような推理を自動でやってくれている感じがすばらしい。

pidinet

hedに似た推定画像が出る。hedよりも輪郭がハッキリしている。

ギターをもったキャラクターから推定する例が次。

推定画像

ただし、これに対応した公式の推定モデルが存在しない模様。

一応hedのモデルを使えば生成はできるらしい...のだが全く良いものが作れなかった。

使っているユーザーも少なそうなので今現在はマニア向け。

次のフォーラムが参考になるので貼り付けておく(英語)

"Pidinet" ControlNet preprocessor options : StableDiffusion

推定用モデル(pth等)の保存先

上のモデル(pth)をDLしたらextensionmodelフォルダに保存する。

ここはStable Diffusion本体のmodelフォルダではないので注意。

従って次のようになるかと思う。

stable-diffusion-webui/extensions/sd-webui-controlnet/models/~~~~.pth

また、これ以外にも推定用のモデルがあれば使える模様。

起動メモ

起動する時にCOMMANDLINE_ARGS--xformersを指定することが求められている。

ローカルPCのCPUオンリーで動かした場合だけこのオプション無しでも動いた。CPUならいらないかもしれない。

Google Colabを使う場合はこれがなければそもそも起動しないケースを確認。参考まで。

ControlNetパネルの使い方

左下にツールが折りたたまれているのでそこからControlNetをオンにする。

設定例

txt2imgだけでなくimg2imgでも使用可能。

PreprocessorModelに先程DLしたポーズ等を抽出するアルゴリズムを指定する必要が有る。基本はどちらも同じもので揃える必要がある。

Preprocessorって何?

PreprocessorとはControlNetに放り込んだ画像から線などを抽出してくる処理を指している。

例えば、ここにdepthを指定するということは「元画像自体は何の処理もされていない生の画像」 であり、これのdepth画像を抽出して、ソレを元にAI絵を書いてね、ということ。

Preprocessornoneにする場合は、自前で(別ソフトで)depthなどの推定画像を自作している場合に利用する。

つまりmodelは基本的に何か指定しないといけないがPreprosessorは自前で推定画像を用意したときのみnoneでも良いことになる。

Invert Color

InvertColor外観

線を抽出する時にコンピュータは「白を線、黒を背景」として認識しているようなので、人間が手書きでよく使う「黒を線、白を背景」とした画像を入力したときに反転してしまう。

こういうときのための反転オプションだと思われる。

手書き画像(黒線、白背景)を入れる時以外は基本はオフで。

Blenderから出したDepthを使う時

BlendercompositeからDepthを出力すると白と黒が逆になるのでこのオプションをチェックすると良い。

Guess Mode

オリジナルの解説によるとプロンプトに何も入れないで、推定モデルをいくつか比較する時に使うらしい。

別名ノンプロンプトモードとも。

Sampling steps = 50, CFG Scale 3 ~ 5で使うことを推奨。

Guess Modeの実験

元画像(segment用)

seg画像

Guess Modeなし、Sampling steps = 50, CFG Scale = 4Preprocessor = none

よくある画像

よくある画像が出力。よくも悪くもない。

同じ条件でGuess Modeをオン

背景が消えてスッキリ

背景が消えてキャラクターがスッキリした。

なんというか曖昧な箇所を自動でハッキリする効果?

同様の設定のままPreprocessor = depthdepthモードでテスト(Guess Modeオフ)

Guess無しDepth

塗りが甘く、シミが出ている。

同じ条件でGuess Modeをオン

Guessオン+Depth

線がハッキリして、塗りも美しくなった。

とりあえず楽してきれいな画像を作りたい時にプロンプト無しでGuess Modeを使うと良い結果が得られる可能性がある。

とりあえず実験的に生成を試すときはコレを使う価値がありそうだ。

Weight

どれぐらいControlNet側の画像を優先するかの値。

入力サンプル(Depth)

入力

出力結果とWeightの値

結果

Weightは大きく上げると線は再現されるかもしれないが、絵としての質が落ちる印象。上の結果からもそれが分かる。

ControlNetを使っている限り、あえてこの数値を下げるということも珍しいと思うので基本は1で良い。

Guidance Start/End

ControlNetの適用を途中から注入(Start)/途中で適用をやめる(End)オプションだと思われる。

例えば次の画像をControlNetに入れて

元画像

デフォルトのStart=0,End=1だと

デフォルト

こちらはコレまで解説した通り、元映像のリペイント的な使い方。

これをStart=0.1にすることで、画像生成直後はControlNetを適用しない状態で開始して、少し遅らせてからControlNetが入るようになる。

するとどうなるかというと

Start=0.1

背景の書き込みが増えたのがわかるだろうか。

つまり、はじめはプロンプト通りの画像(背景的な何か)が生成されながらも後からControlNetが適用されて真ん中のキャラクターとなっているわけである。

Endはこれの逆で、1より低くすることで画像生成の途中でControlNetの画像が適用されなくなるのだと思われる。

画像生成順のレイヤー分けのようなイメージで画像を作る場合に役立つかもしれない。

おまけ:

上の画像がなんか好みだったのでアップスケールしてみた。

アップスケール後

ちなみにアップスケール(画像を拡大して、細かいところをより書き込む)方法はi2iで画像をいれた後、画面下部のScriptからSD upscaleを設定する。

RGB to BGR

自前ノーマルマップを使う場合にオンにする。後ほど解説。

normalなどを別ソフトで生成する場合

normalやopenposeなどなど殆どの推定画像は別ソフトと互換性がある形式なので自前で用意できる。

ただし設定を理解しないまま各データを入れても、そこからさらに再生性されてしまうので意味がない。

normalを利用する例でメモを残しておく。

まずは自前のノーマルマップをCGソフトで生成。

ノーマルのサンプル

次にPreprocessorNoneにしてModelをノーマルに設定する(重要)

設定画像

Normalの場合はRGB to BGRをチェック。

OpenGL形式とDirectX形式でノーマルマップの一部出力が逆になることへの対応?

これに関しては自信がないので、出力結果が変になる場合は切り替えて試したほうが良いかも。

txt2imgなら後は通常の流れで生成できる。

img2imgだけを使う場合

img2imgの場合は上記設定のままControlNetの画像に何も入れないようにしてimg2img側の画像にノーマルマップを入れても動作するようだ。

からでも動作

githubの議論をざっくり見ていた感じだと、バッチ処理で動画化する時用の措置だと思われる(ControlNetのUIだけだとバッチができないため)

従って、ノーマル画像を大量に用意しておいてこの方法でバッチにかけることができる。

このときノーマルマップはControlNetのみならずi2i用の参照としても使われるので、虹色の出力結果になってしまうことがある。

この解決は下の項で解説

i2i画像+自前ノーマルマップにする場合

こんどは自前ノーマルマップ+自前画像でリペイントのようなことを行うケース。

つまり1回の生成で2枚の入力画像を使うケース。

この場合はimg2img側に通常の画像を入れてControlNet側に自前のノーマルマップを入れれば良い。

この場合は現時点ではバッチ処理は不可能だと思われる。

issueに要望が上がっていたのは確認したので需要はありそうだ。

i2i+自前ノーマルマップのサンプル

i2i+自作ノーマルを使うと、かなり元画像に近い構造を維持しながらもリペイントできる。

実際にやってみる。

img2imgに入れる元画像

元画像

ノーマルマップは上で貼っているものを利用。これをControlNetの画像に入れる。

ノーマルのサンプル

この時Denoising strength0.3より小さいぐらいが良いかと思う。

ここを大きくすると出力画像が擦れてしまうような結果となった。

これで生成した画像が次

生成画像

ノーマルマップを使わずにDenoising strengthを下げただけで出力すると次。

ノーマルを使わない

顔の構造に大きく差が出ている。あきらかに上の方が良い。

何度か試したが、ノーマルを使ったほうが顔の構造が正確に表現される。

髪の塗りや、尾ひれの陰影のクオリティも上が高い。

ただ、ノーマルを使った場合でも手は崩れやすいようなので研究が必要。

あまりこだわりがない人にとっては微細な変化かもしれないが、個人的にはかなりの進化。

こだわったリペイントをしたい場合に有効かもしれない。

マップの色が出力に反映されてしまう

ControlNet側の画像は空白でi2i側にマップ画像を入れることによりバッチ処理が可能になるが、その画像自体もi2iの参照として使われるのでマップの色が出力に反映されてしまう。

例えば次のようなSegment用の画像をi2iに入れ、ControlNet側に画像をいれない方法で処理してみる。

元画像

(Denoising strength = 0.1)

この場合、ほぼそのままの色で出力されて次の画像となってしまう。

結果

そこでSettingsタブにあるSkip img2img processing when using img2img initial imageオンにすることそれが回避できる模様。

Setting

設定画像

この設定をオンにしてDenoising0.1(かなり元に近い画像になる)

同様のsegment画像で再出力すると

結果

構図を維持しながらも全く新しい色で画像が生成された。

この方法のデメリット

上の画像を見ると分かるが、この方法を使うと黒背景の入力画像でも出力に背景が挿入される。

現時点でどうしても背景を切り抜いて生成したい場合には使えない。

複数のControlNetを同時に適用する

Settingsタブ > ControlNetの設定にあるMulti ControlNetの数値を上げると、上げた数値だけControlNetのUIが増えて、複数適用できる。

設定画面

つまりDepth+Segmenetのような同時に複数のマップを利用して画像が生成できる。

パネルが増えている

設定をApplyした後、UIの再読み込みではなくAutomatic1111本体から再起動する必要あり。

Multi-ControlNetの実用例

次のツイートよりtoyxyzさんが面白い使い方を提唱している。

手とポーズを別々のControlNetで分けてやることで、今までAIが苦手だった手を正確に表現できることが発見されている。

テストしてみた

toyxyzさんがBlenderにて画像生成用プロジェクトを配布してくれている。

Character bones that look like Openpose for blender _ Ver_4 Depth+Canny

こちらを使用して次の画像を用意した(Canny + Pose)

Canny+Pose

このツールで生成した画像の場合CannyのときだけpreprocessorCannyに合わせる。それ以外はnoneとのこと。

結果

結果

確かに指と足のラインが出ている。

が、今回ちょっとアグレッシヴな格好にしすぎたかもしれない。ポーズが学習になさそう。

1回で画像が2枚生成される

ControlNetを使用すると推定に使用する画像が自動生成され、それと一緒に出力されるため画像は2枚になる。

これが邪魔な時にオフにできる。

上部のSettingタブ => 左側のタブからControlNet => Do not append detectmap to outputをチェック

最後に上部のApply settingsを押して保存。

これで生成された画像1枚だけの出力になる。

以前はこれをオンにしないとバッチ処理した時に落ちていたが、現在は落ちなくなっている?

もしバッチでトラブルがあるようならこの設定をオンにしてみると良いかもしれない。

推定画像も保存する

デフォルトでマップ画像(Depthなどのグレースケール画像)は生成はされるが保存されない。

これを保存したい場合はSettingsよりAllow detectmap auto savingをオンにする。

Google Colabでのエラー

いくつかエラーがあったのでメモしておく

メモリ問題

Google Colabを使う時グラボではなくメインメモリがオーバーしてしまって落ちるという現象が多々あった。

またローカルで起動しても落ちることがよくある。

かなりメモリを消費している模様。

Stable Diffusion本体のモデルを変更しようとするとメモリがオーバーしてしまいよく落ちるので、こちらはUI起動後変更しないほうがよろしいかと思う。

Generate時にPythonエラー

Generateボタンを押した跡にコンソールにpythonのエラーが出ることがある。

これは殆どの場合Google Driveからpthファイルが正しくコピーされてなかったことが原因だった。

手動でドライブにファイルを格納して、同期完了となっていてもGoogle Colabからアクセスした場合に不完全なファイルとしてコピーされているのではないかと思われる。

ドライブにpthファイルを入れた場合は同期完了後5分ほど待ってから実行すると問題なかった。

他にもこのエクステンションに限ったことではないが画像サイズを大きくしていると止まってしまうことがある。

まずは512*512で試してみよう。

実験的機能:T2I adapter

ControlNetとは似て非なる技術にT2I adapterというものがある。

現時点でなんとT2I adapterのモデルを読み込んで使用できる...のだが、画像が崩れてしまい殆ど実用には至らなかったので、メモ程度の情報。

使用方法

通常の推定モデルと同じく、次からDLしたモデルをsd-webui-controlnet/models/に入れて利用する。

TencentARC/T2I-Adapter at main

2023/03/16:現在現在できるのは次の2つ。

clip_vision

t2iadapter_style_sd14v1.pthと合わせて使用できた。

元絵の画風を反映させるもの?

試した限り画像が乱れるだけでうまく利用できなかった。

Guidance Startを少し上げてGuidance Endを少し下げた状態で使うのがコツとの情報あり。

color

t2iadapter_color_sd14v1.pthで利用する。

入力された絵からカラー入りのモザイク画像を作成し、出力に反映させる。

モザイクの色のみならずピクセルの位置も反映されるようなので、元絵を一旦モザイク画像にしてi2iに通したような効果が得られるようだ。

Tips

ControlNetのTips的な使い方を書いておく。

光と色味のコントロール

img2imgに光の元となる画像を入れて、ControlNetにメインのキャラクタのような画像を入れると

picture 43

img2img側の色味や光源が反映されるので光のイメージをコントロールできそうだ。

赤い光の作例1

赤い光の作例2

更に深い研究

こちらはDepth推定をつかった動画制作のテスト。

映像後半は使用したDepthの画像。

恐らくだがDepthは奥行きだけでなくシルエットを維持しやすいという特徴があるようで、活用方法がありそうだ。

こちらは蝶の作例。そもそもCGで私が自作アニメーションした蝶をベースにしているのでプロンプトの魔術は少なめでもいける。

こちらもDepthを使うことにより羽のシルエットを正確に捉え、アニメーションとして成立させるテスト。

背景を別で合成したほうが良いという知見や、撮影の角度によってはDepthであっても蝶の羽が消えてしまうなどの課題も見つかった。

Depthがシルエットを維持しやすいということは、模様を描かせるのが得意なのではという実験。

相変わらず背景のチラツキ課題はあるが、模様が入ったキューブが回転していることがハッキリと分かる。

後ろにも別の模様をいれているが、キューブ側の模様と後ろの模様が同一化するコマも多い。それもまた味とも捉えられる。

この場合はアナログノイズのような雰囲気も合わせてMVの1カットに十分使えそうに思える。

細かくスライスした3DCGをDepthにかけることで一貫性のあるアブストラクト動画にする例。

こちらもかなりMV風味。

CGで普通にレンダリングした人魚の画像をi2i側に入れて、自前で用意したSegment画像をControlNet側に入れて生成した動画例。

2枚の元画像を使った生成は現時点でバッチに対応していないので1コマずつ手作業で出力した。かなり大変。

上でも少し触れているが、この手法に限り指の再現度が極めて高い

i2i1枚だけで処理した場合、Denoising=0.1にしても指の描画が壊れることを確認済み。

このCGモデルに関してはむしろ表情のほうが課題。この手法はいずれバッチに対応したものが出てくると思う。

さいごに

この記事は暫く更新を続ける予定。

ControlNetの登場でクリエーター側の意図をAIに伝えるすごいツールになりそう。

イラストが書けるユーザーであれば、線画だけ書いて色塗りを自動化できるのでかなり強力かも。

また、クリスタの3Dデッサン人形でポーズだけ作ってイラストを書かせるという手法を使っているユーザーもいて面白い。

今後は動画化などでも役に立ちそうなので暫く研究したい。



この記事のタグ


謎の技術研究部 (謎技研)