見出し画像

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

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


ご挨拶

皆さんイラストAIはお楽しみですか?
初めまして、御月望未みつきのぞみです。
イラストを生成してもらうのは楽しいですよね。僕はStableDiffusionくんに出会って初めて、描き込みの細かい絵や、鮮烈な色使いの絵が好きなんだなって気付けました。

「ウチくる?」 もしかしたら宇宙人かもしれない女の子が街中でこちらに手を差し伸べている画像(今回のテクニックは未使用)
情報量の多い絵がスキ♡

しかし、プロンプトだけでは描き込み量や色使いを制御するにも限界があります。
今回は描き込みや色彩の凄い画像を安定して出したいという欲望から始まり、「願わくは、もっともっと"凄い"量の描き込みをして欲しい!」という願望を叶えるために編み出された、ノイズを使うちょっと特殊なテクニック
ノイズ法と、
「画面中に特定の物を大量に出したい!」というニーズを実現する、(一部で反響を呼んだ)テクスチャを使うテクニック、
テクスチャ法(カムカム法)』のご紹介です。

今回使うのはおなじみ『ControlNet』です。ただ今回は、
「ControlNetとは、ポーズや輪郭線のデータを読み込ませることで、より目標に近い画像を……」という教科書的なお話ではなくて、
変なデータ流し込んだらControlNetくん壊せないかな?
というところからスタートしています。しっかり付いてきてくださいね。

結論から

ControlNetにノイズやテクスチャを流し込むことで、通常ではあり得ない密度の描き込みや色彩を誘導することができます。

ノイズ法を使ったファンシーな画像。屋内庭園に女の子が佇んでいる
見てくださいほら!こんなに描き込まれてる!うっとり!

【ポイント】
・ノイズを使うことで、描き込み量や色彩を調整することができます。
・テクスチャを使う事で、特定の要素(例えば雨の線や雷のエフェクトなど)を画像中にちりばめることができます。
・txt2imgで構図がランダムなまま生成することができます(ワイルドカードも使用できます)。
・img2imgやinpaintも可能です。
・仕組み的に、恐らくDiffusionモデルのAI全般に応用可能です。

【注意点】
・パラメータの設定がやや特殊です。


※以下、StableDiffusionの解説などが入りますが、全て個人の感想です。誤った事を真顔で断言している可能性もありますので、ご注意ください。

第一回では、StableDiffusionの仕組み事をざっくりと、僕の体験談を交えて振り返っていこうと思います。
「いきなり自分語りから書くんですか?」
という懸念はごもっともでございますが、今回のテクニックは行っている事が結構、というか、かなり特殊でして……
いきなりパラメータ設定や解説を読んでも、
「何をしているかはわかったけど、どうしてこうなったののかがわからない……」
と困惑してしまう人が多い気がしたため、したためました。
StableDiffusionの復習と思って、なんとかお付き合いください。

お急ぎの方は、『本編(ノイズ法)』または『応用編(テクスチャ法)』へどうぞ。

『どうしてそんなことしようと思ったんですか?』

色彩感覚の狂った森の中に得体の知れない女の子が座っている画像。ノイズ法の作例
君の色彩感覚を壊したい

StableDiffusionくんは様々な画風を出力することができますが、ことイラストにおいては「あっさり」になってしまう傾向があります(モデルによります)。

女の子二人が街中で立っている画像。フラットな色彩。
あっさりなアニメ塗りも大好きですが

僕はこってり細かく描き込まれている絵が好きなので、描き込みをより細かく、色味をより強調するためのプロンプトを探してあれこれ試していましたが、プロンプトだけで描き込みや色を誘導するのにはやはり限界がありました。
描き込み量はzentangleなどの単語で誘導できますが、模様や画風に影響が出てしまいますし、
色に至ってはLSDやpsychedelicなどの怪しげなプロンプトを入力しても、思うようには派手になってくれません。

数ヶ月前に出した画像。カラフルな羽根を持つ女の子の画像だが、極端に彩度が低い
このイラスト!配色は完璧なのに彩度が足りない……!

「どうにかしてもっと細かく、とびきりカラフルな画像を描いて欲しい!」
プロンプトの領分を飛び越えて、こんな無茶なお願いを聞いてもらう為には、
「Stable Diffusionくんはどうやって絵を描いているのか?」という所まで踏み込まなくてはなりません。
ひとまずざっと、おさらいしてみましょう。

StableDiffusionくんはノイズから絵を描いてる

心理学の領域に"ロールシャッハ・テスト"というものがあります。
絵の具を塗りたくっただけの紙も、じっと観察してみると「ここ人っぽくない?」と何かしら見いだす事ができる、というお話です。
Diffusionモデルも同じ様な動きをしています。最初にカラーノイズを生成し、そのノイズをじっと見て「ここ髪っぽくない?髪っぽいよね?」と連想し、神っぽくない部分を除去する事で画像を作り出しています。
SDくんはノイズまみれの画像をねじ曲げてイラストにするのは凄く得意なんですね。実際にimg2imgにノイズ画像を読み込ませても、問題なくイラストに描き変えてくれます。

一方で、SDくんは白背景に何かを描き足すような事が非常に苦手です。
背景が真っ白と言うのは、ピクセルの中に手がかりとなるノイズが一切無い事を意味するからです。
白背景に限らず、均一な色に収束してしまったイラストを描き直す事も同様に苦手です。一度「ここは肌!」と思い切って塗ってしまうと、下地になったノイズが塗りつぶされて消失してしまうからです。
なのでhires.fixやimg2imgでは、元になる画像をわざとぼかして、更にノイズを掛けることで画像を再解釈しているんですね。

白背景とノイズ

Diffusionモデルは白背景が苦手、というお話ですが、どれくらい苦手なのかというと、LoRAという追加学習法の"よくある失敗談"に
「データを全部白背景にしたら学習に失敗した」
というお話が必ずと言っていいほど出てくるくらいです。

LoRAは追加学習方法の一種で、既存のモデルに特定のキャラクター等を覚えさせる事ができる物なのですが、学習画像を白背景の切り抜き画像ばかりにすると、画像全体が白っぽくぼやけてしまう現象が起こるのです(SDは透明度に対応していません)。

SDくんは本質的には「"ノイズ" と "ノイズ以外"をふるい分けるフィルター」なので、学習時にはノイズ以外の全てを覚えてしまいます。
AIにとっては「ノイズ以外は全て特徴」なんですね。
LoRAも「学習画像に写っているキャラクターを覚えてくれる機能」なんて親切なものではなく、
「学習画像から共通点を抜き出したら、それがキャラクターだった」と言うくらいが適切な物です……たぶん。

そんな感じで、白背景の画像だけでLoRAを学習すると
「平均するとなんか全体に白っぽい」「ノイズをある程度白に塗り替えなきゃいけない」
という特徴を覚えてしまうのか、上手くいきません。
僕も以前キャラクター再現LoRAを作ってみた事があるのですが、見事にこの問題に引っかかって失敗してしまいました。
キャラクターは覚えてくれたものの、白ぼけた画像しか出せなくなってしまったんです。

せっかくがんばって白抜きしたのに……と、ふて寝しながらあれこれ考えていたとき
「ノイズ以外を学習するって事は……ノイズは学習しないんじゃない?」
僕が怪しげなことを口走りはじめました。
「そうだ!背景を白からノイズに差し替えたら、キャラクターだけ覚えてくれるんじゃない!?」
苦し紛れの逆転の発想です。


学習素材を白背景からカラーノイズに変えたときのイメージ画像。写ってるのは僕
これを → こうするってわけ

これが思わぬ成功を収めます。
出力画像を見てみると、白ぼけする事なくちゃんと学習対象のキャラクターが出力されていたのです。
苦し紛れの思いつきなんてそうそう上手くいくものではありませんが、
今回に限っては上手くいっちゃったんですね!

ノイズと描き込み量の関係の発見

実際のところ、前述のノイズ背景LoRAは半分成功で半分失敗といったところで、正確にはキャラクターと背景のノイズの両方を学習していました(それはそう)。

このLoRAを適用すると、キャラクターの特徴と一緒に"学習されたノイズ"も出力されます。
しかし前述の通り、SDくんはノイズをふるい分けることが得意なので、
「これはノイズだ、除外しよう」と、"学習されたノイズ"を消してくれるのです。
結果、ノイズ部分は毎回消される一方で、キャラクター部分はサンプリングされる度に鮮明化されていき、
「ノイズも出るけど、最終的には綺麗にキャラクターを描いてくれる」という、ややこしいLoRAになっていたのです。

一方で、ノイズ部分も完全に無視される訳ではありませんでした。
ノイズ自体は消されますが、SDくんも「何か細かい物が沢山あった」くらいには認識するようで、
ノイズのあった場所の描き込み量が上がるという現象が起こったんです。
そう、このLoRAには副作用があり――この副作用こそ、僕が追い求めていた"描き込み量を増加させる"聖杯だったんですね。

白羽の矢がControlNetくんに刺さるまで

ちょっと整理すると、僕は「描き込み量を高めたい」と願っていて、
別件で部分的にノイズを出力するLoRAを作ったら、「描き込み量が増える」という副作用が見つかった所です。

「念願叶うかもしれない!」と舞い上がった僕は"全体にノイズを出力するLoRA"を作り始めました。
つまりノイズだけを学習させたのです。

学習素材をただのノイズに変えたときのイメージ画像。もう僕は写っていない
これを →

狂気の沙汰。

これによって夢だった"描き込み量を大幅に増やす理想のLoRA"が完成する……と、思っていたのですが、できませんでした
SDくんは大変優秀で、ノイズの学習データからなんとか細かな特徴量を取り出して、模様を覚えてしまったのです。

特定のノイズAにランダムなノイズを掛けて差分を取り続けると、ノイズAを推測することは可能なんですね……
なんかセキュリティの失敗談みたいになってきましたが――いやこれはこれでLoRAの学習にも応用できるんじゃないかな……ブツブツ……

失礼。結局、ノイズLoRAは変な模様やただのノイズ、あるいは万華鏡みたいな画像を出力するだけの物にしかならず、
実験は失敗に終わってしまいました。
怪しい思いつきがそうそう上手くいくはずはありませんね。

ノイズLoRA(失敗作)が出力した画像
これはこれで綺麗ですが……

学習素材やパラメータを調整すれば改善できるかもしれない、という予感もあったのですが、使ってみて初めて「LoRAの効果量は途中で減らすことができない」という問題に直面していました。
(やりようあるのかもしれませんが、僕には見つけられなかった……)

最後までノイズたっぷりだと、"描き込み量が上がる"という作用が強くなりすぎて、画像として破綻してしまいます。
しかしノイズが弱いと、SDくんにバッサリ切り捨てられてしまい、何の効果も残せません
「最初の方に強くノイズを掛けて、後は流れで……」というのが最適だという事がわかりましたが、実現する手段がないのでは困ります。

これがプロンプトならばprompt edittingと呼ばれる機能を使う事で、
「最初だけこの単語を適用して、後半は使わない」という調整が可能です。
なのでLoRAもそんな感じで途中で効果を切れるだろう、と高をくくっていたのですが、LoRAは適用するだけで効果が出てしまうんですね。
トリガーワードだけをedittingしても影響は消しきれませんでした。

となると……困ってしまいました。

LoRAではこの通り上手くいきません。
プロンプトだけでは描き込み量を上げることは難しいですし、
img2imgにノイズを入力しても、ノイズは一瞬で消化されてしまいます。

うう、僕はただtxt2imgでひたすらガチャりたいだけなのに……
なんとかして、なんとかしてノイズを流し込みたい。
でもExtentionsを探したりする元気はもうなくて、全然動けなくてェ……

こう……
ちょうど良い感じにノイズ画像を流し込める機能があればよかったのに……
何でもいいから画像を読み込ませられる機能があったらよかったのに……
ん……?

、そうだ


ControlNetくん


      壊しちゃお……♡

ノイズ法の作例。色彩が狂った空間を女の子が闊歩している。
こうして僕はAIの色彩感覚を破壊するに到った

→to be continued...


#StableDiffusion #ControlNet #イラストAI #カムカム法


この記事が気に入ったらサポートをしてみませんか?