メインコンテンツへスキップ
見出し画像

【イラストAI】ノイズやテクスチャを使って描き込み量をめちゃくちゃに増やそう!2/4【ノイズ法】

    イラストのディテールを大幅に引き上げる、StableDiffusion向けの特殊なテクニックをご紹介します。(全4回)

    前回までのあらすじ

    前回の記事の経緯で、
    「ノイズをControlNetに流し込むことで、描き込み量や色彩を大幅に強調できる」事が判明しました。
    今回はその知見を使って、実際に画像を出力していきましょう!

    ※StableDiffusion1.5とStableDiffusionXLで設定等が一部異なります。
    SDXL向けノイズ法の記事も併せてどうぞ!

    【チュートリアル】ControlNetにノイズを流し込んで描き込み量を変更しよう!

    では早速、ControlNetを使って画像の描き込み量を増加させてみましょう!
    ひとまず、プロンプトは少なめで抽象的な絵を出してみましょう。

    ステップ1:ひとまず描き込み量を増やしてみよう!


    画像生成に使う為のノイズ画像。
    今回使うノイズ画像くん。彩度を強調してあります
    • ControlNetをインストールします。

    • サンプラーなどを通常通り設定します。cfgは4~7くらいにしてください。高いと効果が強く出過ぎる場合があります。

    • プロンプトやネガティブプロンプトを設定します(シンプルな方が影響がわかりやすいです)

    • 比較用にいったん画像を1枚生成しておきましょう。

    • ControlNetをEnableにし、Preprocessorに"None"を、Modelに"lineart_anime"を指定します。

    • ControlNetにノイズ画像を読み込ませます。

    • ControlNetのパラメータを、Weight0.5、Starting0.1、Ending0.6に指定します(パラメータに敏感なので、ひとまずそのままお試しください)

    • 生成!

    比較画像。左側はノイズ法を使っていない画像。右側はノイズ法を使った画像。
    ←ノイズ法適用前 | ノイズ法適用後→

    hyper detailed game cg, (highres:1.1),(absurdres:1.1), 1girl, solo, simple anime

    見事に描き込み量が増加しましたね。プロンプトもシードも同じなのに凄い変容です。

    モデルにもよると思いますが、コントラストが高くなって写真の様な絵になったり、星空の写った夜景のような絵が出ていると思います。
    これは単にノイズが星空に似ているというのもあるでしょうが、lineartに「線画っぽい」と判断されたノイズの境界面が、黒にされてしまってるせいではないかと思います。

    色使いも極端になっていますが、これはノイズの色がそのまま反映されているわけではなく、lineartくんが境界線で色を塗り分けるよう誘導している事に起因しています(たぶん)。
    他にもキャラクターの服に細かな模様やレースが生じる副作用が出ていると思いますが、これもlineartが「ここになんか細かい模様がある!」と認識している影響です。

    暗さやレース化の問題を解決する方法もあるのですが、とりあえず今は置いといて……もう一段階、絵を破壊していきましょう。
    CNくんの実力はまだまだこんなもんじゃないはずだ!

    補足:意味不明な画像やお花畑になってしまった場合は、何かプロンプトを足すか(outdoors辺りがオススメ)、Weightを下げてみてください。


    ステップ2:Multiple ControlNetで色味を大幅に強調しよう!

    • WebUIのsettingsからControlNetのオプション画面を開き、Multi Controlnet: Max models amountを2(か、それ以上)に設定します。

    • txt2imgを開き、ステップ1と同じように設定します。

    • Controlnet Unit 1(2つ目)が追加されていますので、Unit 1もEnableにし、プリプロセッサを"None"に、Modelを"tile"に指定します。

    • Unit 1のパラメータを、Weight1.0、Starting0.0 - Ending0.1に指定します。

    • サンプラーをEular系かDPM系に変更します(DDIM系はtileとの相性が非常に悪いためです)

    • ControlNet Unit0 と Unit1の両方に、ノイズ画像を読み込ませます。

    • 生成!


    ノイズ法(lineart&tile併用)の作例。キラキラした宇宙的色彩の画像。
    壊れた!
    1girl, solo, upper body,
    Negative prompt: (worst quality:1.4), (bad quality:1.3), (lowres:1.2), (poorly drawn:1.1), wip rough sketch, fanart, watermark, signature, craquelure, grainy, traditional media, deep-fried, 3D, simple background, white background, nose, parted lips,
    Steps: 25, Sampler: DPM++ 2M SDE Karras, CFG scale: 4, Seed: 30, Size: 768x768,
    ControlNet 0: "preprocessor: none, model: lineart_anime, weight: 0.5, starting/ending: (0, 0.6), 
    ControlNet 1: "preprocessor: none, model: tile, weight: 1, starting/ending: (0, 0.1),

    上手に壊せましたか?
    ステップ1より更に派手でめちゃくちゃな色彩で出力されていると思います。うーん(うっとり)。
    撮って出しの768x768の解像度とは思えない描き込み量になっています。
    "引き"の絵が出ると流石に顔は潰れがちですが、この手法はそのまま高解像度で出したりupscaleしても大丈夫、
    hires.fixやadetailerをかけることで、顔なども通常通り精細化する事が可能ですし、なんなら描き込み量を更に増やすこともできます。

    全体的に赤やオレンジの目立つインパクトの強い画像が出力されていると思いますが、
    これはtileが色の情報をSDに渡すので、カラーノイズに含まれるめちゃくちゃな色情報がそのまま渡されている影響です。
    色味はノイズ画像を差し替える事で調節できますのでご安心ください。
    (差し替え用のノイズ画像は『第三回』からダウンロードできます)

    ちなみにプロンプトに incoming attack, magic effectsやfireworksなどを追加すると絵面が更に賑やかになって楽しいです。

    ノイズ法作例。派手な魔法っぽいエフェクト
    楽しい

    逆に画を落ち着かせたい場合は outdoors を追加するだけでもOKです。

    ノイズ法の作例。ふわっとした絵柄は奇跡の一枚。夜の森を冒険する小さな女の子のイラスト。
    かわいい

    ふまえて

    スゴいけど、綺麗というにはちょっと厳しいかもしれない変化でしたね。
    がっかりしちゃいましたか? 大丈夫です、ここからはプロンプトの出番です。
    SDくんにとってノイズは画材です。画面がゴチャゴチャしているのは、SDくんが「沢山の色を使って沢山描くよ!」と張り切ってる状態の現れですから、後はそのやる気を何に向かわせるか、というお話になります。
    けっきょく最後に物を言うのはプロンプト!

    ほら見てください!この恥ずかしいくらいにファンシーな画像!
    プロンプトの力でノイズをお花やフリルに変換しているんです!
    うへへ綺麗だなぁ、見てるこっちが照れちゃうよ。ふふ、ふふふ……

    ノイズ法作例。屋内庭園で小首を傾げるお嬢様のイラスト。非常にファンシー
    ほんと、笑っちゃうくらいファンシーですよね。
    あの日……幼い頃あこがれたアリス像に、僕は少しでも近づく事はできたのかな……(真顔)

    解説

    それではパラメータの詳細や、何がどうなっているのかの解説をしていきます。
    なぜノイズで描き込み量が増えているかわからない方は、先に第一回の『経緯』をご一読いただければより理解がしやすく……ならないかも……
    先にテクスチャを使う例までやってしまいたい方は、第四回の『応用編』まで飛ばしても大丈夫です。

    頑張って書いてるからちゃんと戻ってきてね。

    ControlNetとは

    ControlNetとは、ポーズや輪郭線のデータを読み込ませることで、より目標に近い画像を出力するための機能です。
    本来は目標とする画像や、専用に調整したデータを入力して使用しますが、
    今回はその輪郭やポーズを指定するべき場所にノイズ画像を流し込んでいます。

    詳細は以下で説明しますが、今回はlineartにノイズ画像を読み込ませることで「描き込み量を増やしなさい」という情報に変換し、
    tileではノイズ画像を読み込ませることで「色の情報を増やしなさい」という情報に変換しています。

    ControlNetにはいくつかモデルがありますが、大体は事前準備の層(プリプロセッサ)と本番の層(コントロールモデル)に分かれています。
    例えばlineart_animeは「プリプロセッサが入力された画像から線画を抽出して」「その線画を参考にモデルがStable Diffusionを制御する」という挙動をします。
    今回は不適切なデータを、しかもプリプロセッサを通さず直接モデルに渡すことで、想定外の挙動を期待したものなんですね。
    結果として、異常な量の描き込みが発生し、こうしてControlNetを壊す事ができるわけです。
    ……壊すとまで言ったら、やっぱりちょっと大げさかもしれませんね!

    ControlNetの基本パラメータについて

    ControlNetのパラメータの設定にはWeight、Starting、Endingの3つがありますが、それぞれ

    • Weight:どのくらい強く干渉するか

    • Starting:どの時点から干渉を始めるか

    • Ending:いつになったら干渉を止めるか

    を意味します。StartingとEndingは普通のCNではあまり触らないかもしれませんが、今回の方式ではかなり重要なパラメータになります。

    ステップ1(lineartのみ)の解説

    lineartは線画からイラストを誘導するモデルです。
    「ここに輪郭線があるよ、しっかり守って描いてね」と、SDくんに伝える役割を持ちます。
    本来は線画からイラストを清書してもらうための機能ですが、今回はそこにノイズ画像を渡して、描き込み量を増やすために使用しています。
    黒背景に白い主線だけ描かれた線画を読み込むように作られているモデルに、無秩序な情報を流し込むわけですから、当然モデルは混乱します。
    lineartは入力された線画を元に「ここに何かを描き込むべき」とSDくんに指示する挙動をするわけですから、
    そこにノイズを流し込むという事は「無秩序に何か描き込むべき」と指示する事に他ならないわけで……
    結果として異常な量の描き込みが発生するんですね。

    パラメータについては、今回はWeight0.5、Starting0.1 - Ending0.6にしています。
    これは大雑把に言えば「SDの作画作業の内、全行程の1割が終わった時点から、6割が終わる時点まで、強度0.5で干渉する」という設定です。
    ノイズ法においては、lineartに限らず描き込み誘導系のモデル全般に適した設定です。

    ・Weight
    Weightはどれだけ影響の強さを決めるパラメータですが、今回は想定されていないデータを読み込ませているので、あまり強くしてしまうと絵がノイズに埋もれてしまいます。
    そのため0.5に弱めて使っています。

    ・Starting
    Startingはいつから干渉を始めるかを決めるパラメータです。今回は
    0.1(最初の10%は干渉しない)にしています。
    これは最初からあまりに細かい注文を出すと、SDくんが何を書いて良いのかわからなくなって作画を放棄してしまうので、それを防ぐためです。
    最初にある程度SDくんに構図を決めてもらってから「もっと細かく描いて!」とお願いしている感じですね。
    ただし、干渉が遅すぎると「いまさら直せませんよ!」と手遅れになってしまいます。
    "DPM++ 2M SDE Karras"等の強力なサンプラーでは、最初の2~3ステップも回せば構図が決まってきますので、総ステップ数が20~30なら0.1くらいが適切だと思います。

    ・Ending
    Endingはいつ干渉を止めるかを決めるパラメータです。
    早すぎると与えた情報が切り捨てられてしまいますし、遅すぎると最終生成物にノイズが残ってしまいます。
    SDくんはステップの数だけ絵を描き直して画像を仕上げていきますが、構図や模様などは最初の段階で決まってしまうため、
    最後まで執拗に「細かく描いて!」と言わなくても、途中からは自主的に細かな絵を描いてくれます。
    なので、SDくんの画力を活かすためにもできるだけ早めに切り上げて、仕上げはお任せしましょう。

    TIPS
    ・プリプロセッサについて
    実のところ、今回の手法はノイズ画像をモデルに届けさえできればいいので、プリプロセッサを通さなくても問題なく動作します(通すと描画が少しマイルドになると思います)。

    ・彩度について
    lineartは彩度情報を参照しないため、カラーノイズの色は無視されます。
    実際にノイズをモノクロに変換して読み込ませても結果はほぼ変わりません。

    まとめ
    まとめると「『無秩序に限界まで描き込みなさい』という指示を、全行程10%が終わったところから、60%が終わるところまで、やんわりと(0.5)伝え続けなさい」と設定している感じですね。
    あなた→ControlNet(lineart)→StableDiffusionという †権力† の構図なのでちょっとややこしいかもしれませんが、
    えー、次のステップで更にややこしくなるのでなんとか頑張って理解してください。

    ノイズ法作例。読者を励ますためだけに貼られた特に脈絡のない女の子の画像
    頑張るのです。理解した先にファンシーな世界が待ってるのです

    ステップ2(tile)の解説

    tileは入力された画像を拡大するためのモデルです。
    受け取った画像をそのままSDに渡し、拡大処理をする際に「オリジナルからかけ離れないようにしてね」と注意する感じの働きをします(たぶん)

    本来は拡大専用の機能ですが、入力された画像をそのままSDくんに入力する働きを利用して、今回はノイズの色を転写するためだけに利用しています。
    SDくんは作画するときに「forestってプロンプトがあるから、ここの赤色は消そう」というような挙動をしますが、tileを使って「ここは赤色です!」と強く伝える事で、SDくんの色彩感覚を攪乱して、無理矢理カラフルに描くように誘導しています。

    言ってしまえばキャンバスに先に大まかに色を塗ってしまうようなものです。
    キャンバス上で色を混ぜて絵を作るSDくんにとっては、とんでもない無茶振りですね。

    パラメータについては、Weight1.0, Starting0.0 - Ending0.1にしています。
    大雑把に説明すると「SDの作画作業が始まったらすぐに、キャンバスをノイズで塗りつぶして、全行程の10%が終わるまで色味を変えないように強く指示する」という感じです。

    ・Weight
    tileは色を転写する働きをメインに用いているため、Weightはきっちり1.0かけてしっかりと色を移していきます。
    ただし、Weightはあまり強くしてはいけません。前述の通り、SDくんはノイズからイラストを生みだしていますので、あまりに強くノイズを転写しすぎると、せっかく描いた物までかき消され、作画が進まずループしてしまうからです。

    ・Starting-Ending
    Startが0.0、Endingが0.1(最初の10%のみ干渉する)と極端に短くなっていますが、これは「色情報は最初の方に渡せればそれでいい」という事でこうなっています。
    SDくんは最初の方に出てきた色や模様を重視するので、Startは0.0にして最初から干渉を始めています。
    逆に言えば、色の指定が終わってしまえば後は絵を描く邪魔になってしまうだけなので、Endingを0.1かそれ以下に設定して、tileには早々に休んでもらいます。描き込み量の誘導などは、入れ替わりlineart他に任せましょう。

    今回はtileを色の転写機能として利用していますが、色を移すということはカラーノイズそのものを移すという事でもあります。
    つまりキャンバスの上に細々としたノイズがまき散らされる事になるため、描き込み量にも影響が出てきます。
    今回の設定では0.0-0.1の短時間の干渉なので影響は少ないと思いますが、応用する際は注意してください。
    特にEndingを遅くすると、lineartとtileが同時にかかるため、SDくんは二重にノイズの影響を受けることになります。

    ちなみにtileは色を転写しますが、SDくんの方でその上から更にカラーノイズを掛けられてしまうため、モノクロノイズをかけたとしてもプロンプトなしではモノクロ化はできません(彩度は少し下がるようです)。
    lineartの時とは逆のパターンです。ままならないですね……

    lineartとtileの組み合わせについて

    ControlNetについてごく個人的に語らせていただければ、「色に反応するモデル」と「色に反応しないモデル」の二種類に分けられます。
    lineartは「色に反応せず、描き込み量に影響するモデル」で、tileは「色に反応し、色をキャンバスに渡すモデル」です。

    今回の手法はこの点に着目して「lineartで描き込み量や輪郭を指定し」「tileで色を指定する」という使い分けを行っています。

    例えばステップ2では、lineartとtileの両方を適用しています。
    パラメータはそれぞれ
    lineart Weight0.5、Starting0.1、Ending0.6
    tile Weight1.0、Starting0.0、Ending0.1
    になっていますが、これは

    1. 最初にtileを影響させ、色の転写を始める。

    2. 全工程の1割が終わったところでtileは終了し、代わりにlineartがやや弱めに、"描き込み量"の干渉を始める。

    3. 全工程の6割が終わったらlineartも終了し、後はSDくんに任せる。

    という設定になっています。
    tileとlineartの動作する期間が被っていないのがポイントですね。
    最適な数値を探ったら自然とそうなっただけですが……
    活動期間が被るとノイズの影響が大きくなってしまうため、制御が難しくなってしまいます。

    つまりまとめると、
    lineartはじっくり長く、細かく描きなさいと命令し続け、
    tileは最初に強く、細かく配色を決めてしまう訳ですね。

    鬼かな?

    TIPS
    ・「異なるモデルに、同じ画像を読み込ませる」のがポイント
    ノイズの粒子をlineartが縁取って、tileがその中身をノイズの色で塗りつぶす、というような感じで、
    モデル同士の働きを連携させる事でよりノイズの色を際立たせているんですね。
    まあノイズの場合は別々の画像を読み込ませても大きな影響はない気もしますけど……今後の応用編『テクスチャ法』では重要なテクニックになります。

    読者を褒めるためのノイズ法作例。アリスドレスっぽいお姫様の写ったイラスト。
    今回はここまでです。よくがんばりました

    今回のまとめと応用方法について

    ControlNetを使って「描き込み量や輪郭の指定」と「色情報の転写」ができることがわかりましたね。

    それではチュートリアルで使った部分の解説はこれでようやくおしまいです。
    お疲れ様でした!

    ところで皆様お気づきでしょうか。今回は変更してきませんでしたが、
    "ノイズ"と一口に言ってもいくつも種類があり、
    またControlNetには"lineart"や"tile"以外にも沢山のモデルがあります。

    そう、まだ説明していない要素が山ほどあります。
    具体的には、あと7000字くらい解説が残ってます。

    というわけで、ここからは今まで変動させてこなかった部分、
    「ノイズ画像の影響」と「コントロールモデルごとの特徴」について、
    解説をしていこうと思います。

    もうお腹いっぱいですか?この辺にしときたいですか?

    ダメだね


    書き始めたのは僕だけど、読み始めたのは君だ。
    地獄の底まで付き合ってもらう。

    →to be continued...(第三回へ続く)



    御月望未(みつきのぞみ)でした!
    いちおう動画投稿者なので、ニコニコ動画とかもよろしくね!

    ・宣伝
    AIに興味のある人に比較的需要のありそうな動画です。よろしくどうぞ。

    ・よければ
    ログインとかしなくても押せるので、よかったら↓の「スキ♡」ボタンを押していってください。
    特に良い事はありませんが、特に悪い事も起こりません。ただ僕の寿命が1年延びるだけ……

    あなたへのおすすめ