2023-05-03(更新)

ControlNet(v1.1)のLineartを極める!他機能との違いも!【Stable Diffusion】

ControlNet1.1のLineartの実験と解説!Lineartの種類や、他の推定法との違いなど深いところまで調査していく。

Article Image

2023/05/03:ラフに関しては未実験項目であることを明記して修正

2023/05/02:Lineartにしか出来ないことを「まとめ」に変更して加筆

はじめに

この記事はStableDiffusionのエクステンションであるControlNetに関する記事である。

その中でもLineartとそれに似た機能の比較を解説していく。

機能などを解説した記事は次。まだ読んでない方は次を先に読むことを推奨。

ControlNet(v1.1)の詳しい解説!輪郭やポーズから思い通りの絵を書かせる【Stable Diffusion】 | 謎の技術研究部

よってControlNetに関する基本的な内容は解説しないので注意。

用意しておくモデル

モデルのDL先は次

lllyasviel/ControlNet-v1-1 at main

次の2つのpthファイルをDLしておく(同名のyamlファイルもDLする)

  • control_v11p_sd15_lineart.pth
  • control_v11p_sd15s2_lineart_anime.pth

lineart_animeだけ別pthファイルになっている。

lineart_animeを使う時だけStable Diffusion本体のモデルにanything-v3-full.safetensorsのモデルを使いなさいと書かれている。

本記事ではモデルを揃えないと出力画像がバラバラになってしまうので使っていない。悪しからず。

Lineartってなにするもの?

公式に明確な解説はないが、おそらく

  • 元絵から「線画」を推定して抽出する
  • 線画で書かれたイラストを入力してAIに色を塗らせる

といった目的で使うものだと思われる。

もともと鉛筆で書いたような線画をスキャンして入れても良いし、元絵から線画だけを抽出するために使うのも良い。

いくつか実用例を出していく。

線画を抽出して色トレス

イラストレーションやアニメでは線画そのものに色を乗せる「色トレス」という手法があり、非常に重要。

しかしAI絵はすべて合成された絵しか出来ないので色トレスは非現実的。

そこでこのLineartを使って線画を抽出することができれば、この作業も可能となる。

次のようなデータが取れる。

元画像 抽出された線画 参考:黒の線画に変換
元画像 抽出された線画 黒線の線画

そしてそのデータを使った色トレス例が次

元画像 抽出した線画を使った色トレス例
元画像 色トレス

この作業はPhotoshopなどの別ソフトで行う

色トレスについて詳しくは別サイトに譲るが、どことなく柔らかい雰囲気になっているのがわかると思う。

特にこのケースでは窓側の光を受けて髪が透き通るような効果を与えられた。

色トレスなんて使うの?

最近のアニメの例だと、リコリスリコイルの髪が印象的だったので参考に公式ツイッター

喫茶リコリコさんはTwitterを使っています: 「ありがとう ミカ # 喫茶リコリコ https://t.co/62SlpzZvrZ」 / Twitter

画像右側(千束)の髪に色トレスが入っていて非常に柔らかく感じる。

こんな風に最近のイラストではよく使われる。

3DCGでも有用かも?

3DCGのような線画をつけるのが困難な素材に合成する目的でも大きな可能性がある。

元画像(3DCG) AIで出した線画を別ソフトで合成
元画像 合成

このケースだと抽出される線画そのものが細いので、更に太くするなどの加工も必要かと思う。

3DCG側のソフトでも線画をつけることはできるがコントロールが難しく、処理が重い。

とは言えこの方法もコントロールが難しく合成も大変。ベストとは言い難い。

色の塗り直しに

線画をControlNetに渡してやれば塗り絵するような動作をする。

つまり色の塗り直しができる

元画像 色系のpromptで再生成(Lineart)
元画像 ピンク色になった

このように殆ど同じキャラクター(線画)を維持しながらも色だけ塗り直すことができている。

やり方

  1. 好きな画像を生成
  2. 生成された画像をControlNetに入れてLineart系に設定(PreprocessorModel両方設定)
  3. Seedは固定していなくても良いが、絵が変わりすぎないか不安なら固定
  4. Promptに色が変化しそうな命令を追加して実行。またはガラっと変えても面白いかも。

全然変わらない場合はHires. Fixを併用すると良いかも。逆に想定以上に変わることもあるので注意。

デメリット

背景が変わってしまっているのがわかると思う。

あまり薄い線は拾えない(調整もできない)ため、Denoising Strengthを上げた状態だとこうなる。

この特徴は頭の片隅においておいたほうが良いかと思う。

書き足しに

フルカラーのAI絵に加筆するのは大変だが、線画を書き換えるぐらいなら可能な人も多いと思う。

例えば次。胸元にハートのアクセサリを書き足した。

書き足された線画 出力された画像
ハート足し ハートのアクセがついた

手書きはかなり雑だが、結果にハートのアクセサリが反映されている。

プロンプトにnecklessなどを入れないと消えることもある

これを応用すれば、比較的簡単に手指の補正も可能。

次の画像は私の作品。この手法で手を直した後、さらに加筆している。

元画像 指修正(+プロンプト変更、加筆)
元画像 修正後

太陽のない世界 | chichi-pui(ちちぷい)AIイラスト専用の投稿サイト

たくさん種類がある

Lineartだけでも次の5種類がある。

  • lineart_anime
  • lineart_anime_denoise ※特殊なので後述
  • lineart_coarse
  • lineart_realistic
  • lineart_standad(from white bg & black line)

これが混乱させる理由でもあるので比較してみる。

ここからはHires. fixはオフ。Seed固定で試している。

Hires. fixControlNetの適用が終わった後に走るので、拡大処理中に絵が変化してしまうため比較にならなくなる。

あえて変化を狙ってHires. Fixを併用するテクニックを私はよく使うので積極的にオンにしてみるのもおすすめ。

推定画像 出力画像
lineart_anime
Anime線画 anime出力
lineart_course
Course線画 course出力
lineart_realistic
Realistic線画 realistic出力
lineart_standard
Standard線画 standard出力

何が違う?

見てみると抽出される線画に明らかな違いがある。

  • Anime:鉛筆を走らせたような細く濃淡のある線、 全体の線の数は少なくなる。
  • Course:影のような細いラインも拾うが、線画で見ると傷のようになる
  • Realistic:最も均一な線が出る、 線に安定感がある。
  • Standard:線だけでなく色の濃淡まで入っている

線画そのものをなにか別ソフトで使う場合は上の画像一覧が参考になると思う。

出力されるイラストの違いはどうなる?

線画に明らかな違いが出たこと対して絵の出力に明確な違いはAnimeだけ。

Animeは90年代のアニメのような塗となったので非常に面白い。

念のため別画像でテスト。

lineart_anime lineart_standard
anime standard

やはりアニメのほうが色収差がついたような画風になる?

Animeはanything-v3-full.safetensorsをメインのモデルに設定する必要があると公式にある。

今回はそれを使用せず行ったからかもしれないので注意。

また、それ以外のケースでも書き出す対象に応じて様々な変化が出そう。現時点では断定するのが難しい。

あくまで予想だが、次のようなケースで使うと良い?

  • Anime:細かい線を無視し、アニメ塗りに近づけたい場合?鉛筆のかすれのような部分が影響して出力にクセが出る傾向がある。
  • Course:現時点で具体的な実用例は謎。スタイルを変化させたい場合?
  • Realistic:細い線も太い線も均一な線で拾いたい場合。安定しているので迷ったらコレ!
  • Standard:元となる絵をできるだけ維持したい時に使えるかも?加筆には不向き。別ソフトに線画を持っていく場合に濃淡がついている不思議な効果を狙える。

正直これは自信がないので今後の実験で要研究

lineart_anime_denoise

lineart_anime_denoiseだけ少し特殊。

黒背景の画像のような一部の画像はLineartを通した時に白いノイズのようなものが浮いてくることがある。

このノイズを軽減する処理が入っている。

Denoise「あり」 Denoise「なし」
推定画像 推定画像
Denoiseあり推定画像 Denoiseなし推定画像
1024サイズ生成 1024サイズ生成:ノイズが乗って画像が汚れてしまった
Denoiseあり出力画像 Denoiseなし出力画像
2048サイズ生成 2048サイズ生成:ノイズが味になった
Denoiseあり2048出力 Denoiseなし2048出力

1024サイズだとlineart_anime_denoiseを使わないと生成画像にもノイズが乗ってしまうことが分かった。

しかし逆に2048サイズにすると、このノイズがいい感じに水彩タッチに変化したので使わないほうが良いパターンもある。

具体的にどのようなものがノイズになるのかは今のところ明確にはわからない。

経験上、背景がベタ塗りになっている箇所に発生しやすい。

色の塗り直しはLineartでなくても良い

ControlNetには線画抽出に似た機能がいくつか入っているので混乱しやすい。

Lineart単体の解説とは外れるが、それぞれの特徴を比較する。

次のいずれを使っても塗り直しのような事は可能。

softedge(hed)

hed推定 hed出力

Lineartが拾わない線も拾う。非常に元絵に忠実。筆者が最もよく使う推定。

softとあるので線がぼやけるのではと思いがちだが、そうはならない。

あくまで線が通る道に余裕ができるといったイメージ。

softedge(hedsafe)

hedsafe推定 hedsafe出力

通常のhedだとグレースケールの曖昧さでエラーがでることがあるとのこと。

それを修正したものだが、精度にかける。

画像を見てわかるように前髪が壊れている。

softedge(pidinet)

pidinet推定 pidinet出力

hedよりも精度が高いとのこと。より忠実に元絵を再現できそう。今後試したい。

softedge(pidisafe)

pidisafe推定 pidisafe出力

safeはhedと同じで精度を下げてエラーを減らしたもの。

精度が下がったため、無駄な手が描かれてしまっている。

canny

canny推定 canny出力

線自体は綺麗に拾うが、線同士がぶつかるエリアで絵が迷う。

元絵から思ったより変化してしまうのでおすすめしない。

scribble(hed)

scribble(hed)推定 scribble(hed)出力

本来は手書きの落書きから取るモード。

Lineartよりも細かい線を無視するので塗りがベタっとなる。

手書きではないものから取る場合は「元絵から線が大きく動いてもOK」であるときに使うと良い。

線を無視する挙動を逆にメリットと捉えれば、アニメ塗りにできるかも(細い線を消してくれて、塗りを均一にする効果)

ただし、顔アップぐらいのズーム限定。

scribble(pidinet)

scribble(pidinet)推定 scribble(pidinet)出力

scribble(hed)よりもさらに細かい線を無視する。

手書きではない物を使う場合、上より少しカメラを引けるがバストアップぐらいまでが許容範囲。

こちらも「元絵から線が大きく動いてもOK」であるときに使う。

scribble(xdog)

scribble(xdog)推定 scribble(xdog)出力

実はLineartのように使える優れもの。

細筆を走らせたような美しく、細かいラインを描く。

線画としても使えそう。個人的に注目している。

どれでも塗り直しができる

これらはどれを使っても塗り直しができる。

塗り直しといっても、ディティールを再書き込みする動きもあるのでいろいろ試してみると良い。

Lineartを使うべきか、それ以外を使うべきか

基本的に「とにかく元絵に忠実な線を再現してリペイント」という場合はsoftedgeの方が良い(特にhed, pidinet)

なぜならLineartは背景のような薄いラインを無視するから。

逆にそれを加味して「背景は線画から書き直してOK」「細かいディティールは捨ててOK」ならLineartでも良い。

ある程度線がハッキリしているラフならLineartを使うと線がスッキリして使えるかもしれない(Preprocessorを通す場合)

ラフに関しては殆ど試してないのであくまで予想。Scribbleのほうが良い結果が出る可能性があるので両方試してみることを推奨。

抽出された線画に加筆して使いたい

元絵はAIでも、そこから抽出された線画に加筆して使うテクニックを使えばいくらでも絵は良くなるはずだ。

この場合はLineartを使った物が良いだろう(Realisticがおすすめ)

人が書く線に最も近くなるのがこれなので、加筆したあとも自然な線が浮いてくると思う。

ただ、これに関してはScribble(xdog)で出したものに加筆してもよいかもしれない(非常に繊細な線が出るため)

筆やペンのような「入抜き」が入った線を好んで使う人は試す価値あり。

どのLineartにしようか迷う

Lineartを使いたい時に種類があってどれにしたらいいかわからない。そんなときはAnimeではなくRealisticを選ぼう。

Animeは少し線にカスれ(ノイズ)が入るので個性派向け。Realisticは精度などを含め万能な優等生。

ただしlineart_anime_denoiseを使うと鉛筆のカスれているような模様が消えるのでRealisticと合わせて試して見る価値あり。

Scribbleも覚えておきたい

落書き程度の「線が太い」「線の濃淡に意味がない」ときはScribbleが良い。上で書いたようにラフ画ならこちらも試したい。

他にもアニメ塗り化したり、線がある程度動いても良いようなケースにもScribbleが可能性を秘めている。

Scribbleについては次の記事でも実際に生成して実験しているので合わせて読んでもらえたらと思う。

ControlNet(v1.1)の詳しい解説!輪郭やポーズから思い通りの絵を書かせる【Stable Diffusion】 | 謎の技術研究部

個人的な注目

あまり皆が使ってなさなのに実は面白そうなのがscribble_xdoglinart_standard

scribble_xdogは「線画を取ってよし、塗り直しに使ってよし」の万能選手かも。

linart_standardはLineartなのにhedに近い正確さがでる?出力結果に少し個性が出ているので積極的に試してみたい。

線画自体も個性があって面白いのでシンプルな色トレスの実験も追加で行った。

元絵 linart_standard 色トレス
元画像 lineartstandard 色トレス

広い範囲に柔らかなグラデーションになっている線画なので、重ねると発光しているような効果になった。

まとめ:Lineartを使うべきケース

というわけでLineart

  • AI絵から線を抜き出してそれを別ソフトで使う(クオリティアップガチ勢向け)
  • AI絵から線画を抜き出して加筆して戻す(加筆ガチ勢向け)
  • 線画を自分で1から書いて、塗りをAIに任せる場合(イラストガチ勢向け)

これらの用途で使うと最も良さそうだ(特にガチ勢)

現時点でツイッターを眺めていると、AI絵の塗り直しに積極的に使われているようだが、このケースなら私はSoftEdgeに軍配が上がると考えている。

ただ、無駄な線を無視して「ディティール書き直し+塗り直し」のケースではLineartのほうが使えるので違いを認識しておこう。

あえてLineartで塗り直す手法に関しては次の記事で具体例を掲載しているので合わせて読んでもらえたらと思う。

お昼の爽やかなイラストを、ダークな印象に塗り直す方法で使っている。

ControlNet(v1.1)を使ってャラを塗り直す方法【Stable Diffusion】 | 謎の技術研究部

おまけ:塗り直しの他の方法

塗り直しは1つ別の裏技的なやり方がある。

ControlNetinpaintを使う方法をメイン記事で紹介している。

こちらはあえてマスクを全く書かないという方法。

ControlNet(v1.1対応中)の詳しい解説!輪郭やポーズから思い通りの絵を書かせる【Stable Diffusion】 | 謎の技術研究部

元絵 出力後
元絵 髪の色変更

さいごに

ControlNetPreprocessorは種類が多すぎて混乱するのでこの記事を書いた。

正直この記事もある程度わたしの勝手な判断が多く含まれているので、あくまで参考にとらえてもらえればと思う。



この記事のタグ

この記事をシェア


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