AIを使って「線画に色塗り」をしてもらおう! (Pixiv Fanbox)
Content
こんばんは、スタジオ真榊です。今夜はこちらのツリーでも紹介した、線画を使ったAIイラスト生成についての記事です!線画にAIで着色するために必要ないろいろなTIPSや、controlnetの各種設定の方法、線画をできるだけそのままにしながらリッチにスケールアップする方法など、実用的な技術について解説できればと思います。
今回の記事はControlnetを使いますので、まだインストールしていない方は「ControlNet徹底解説!プロンプト苦難の時代が終わる…」から、StableDiffusionWebUI自体が初めての方は「【StableDiffusion導入解説】NovelAI中級者がローカル環境を導入したら別世界に突入した件」からお読みいただけると、スムーズに入れるかと思います。
線画に色を塗ってみよう!
まずは入門編、線画に色を塗る方法です。これは、これまでのControlnet記事を読んでいる方なら解説せずとも分かると思いますが、何事もまずは基本から。こちらに用意した線画を基に着色していく方法を考えてみましょう。(※ちなみにこの線画は、次回紹介する線画LoRAを使って生成しています)
こちらの線画をControlnetに放り込み、preprosessor「canny」、モデルも「canny」で生成します。線画、つまり白い背景のイラストからcanny抽出する場合は、「invert Input color」(色調反転)にチェックを入れておきましょう。
設定は上の通り。ちなみにCanvasのサイズは参照画像(線画と)これから生成するもので比率が一致しているので、いちいち操作する必要はありません。気になるのはAnnotator resolusion(抽出処理)の値。極端に高かったり、低かったりすると失敗するのですが、最適な値がどれくらいなのかよくわかりません。
そこで、実際に実験してみました。こちら(▼)が、Annotator resolusionを100,200,300,400,500,600,700,800,900,1000,1200,1400,1600,1800,2000で生成したX/Yプロットです。ちなみにSEED値は-1(ランダム)としています。
恐らく800~1200くらいまでがちょうどよい値で、低いと輪郭線が十分に認識されず、高すぎると謎のドットが散りばめられてしまう結果になりました。安定値とみられる800~1200でも胸付近に手の破綻が見られますが、何度もガチャることである程度の修正を期待するか、controlnet拡張で手の描写を支配しよう!で紹介したdepthを使った方法で修正すると良いでしょう。
実際に生成した結果
何はともあれ、さきほどのCanny設定で生成すると、下図のような結果が得られます。いずれも768✕512サイズにHiresを強さ0.5で掛けて1.5倍サイズにしたものです。
※Cannyのweightがいずれも「1」なので、細部を見比べると当初の線画からは微妙に離れていることがわかります。より線画を忠実に塗りたい場合は、weightを強めていくことになります。(後述)
特に色を指定しないと、AIはこのように、自由な判断で色を塗ってくれます。プロンプト指定で「red hair」や「Black wear」などと色を指定して、塗りを傾向づけることもできますし、「shiny skin」「cloth reflecting light」「backlighting」「cinematic lighting」「flat color」といったタグで好みの塗り・露光に近づけることも当然可能です。「線画に色を塗る」と紹介しましたが、本質的には「輪郭を固定してイラストを生成する」なので、要するに線画を参照画像にして普段のcannyと同じことをやっているだけなのですよね。
こちらはプロンプト末尾に「flat color」「anime coloring」を追加したもの▼
こちらは「realistic」を追加したもの▼ といっても、あまり大きな変化はありませんでした。もともとフラットな塗りのアニメ調モデルなので、realisticにしてもいきなり人間らしくなったりしませんが、学習モデルを別のものに変えるともっとビビッドに絵柄が変化します。
線画をそのまま塗るためには?
ところで、上の4枚画像を見比べてもらうと、どれも線画を忠実に塗ったわけではなく、それなりに弾力を持ってAIが線を動かしていることが見て取れますね。特に背景のビルは、ほとんど線画を参照してくれていません。
できたイラストと参照元の線画を重ねると…
これくらい線が乖離していることがわかります。
これは、やはりhires.fix(高解像度補助)を掛けている影響が大きいと思われます。また、さきほどは線画をpreprosessor「canny」で検出して、モデル「canny」に読み込ませていたわけですが、よく考えるとpreprosessorで検出せずとも、参考画像は既に線画になっているのですよね。
そこで、「hires:OFF」「preprosessor:none」で生成してみると…
hiresなしなので高精細ではありませんが、線画にかなり忠実な塗りをすることができました。線画と重ねてみたGIF▼を見てみると、特にキャラクターについては線画にあったほとんどの主線が保存されていることがわかります。
せっかくの色塗りなので、前回の記事で紹介したwildcard機能を使って髪と服のカラーをランダムにしてみました。プロンプトによっては夜にしたり、夕焼けにしたりもできそうですね。
細部を細かく見ていくと、例えばビルの解釈が違っていたり、スカートのひだの位置が変わっているなどはありますが、hiresありに比べて遥かに線画のままに塗っている感じがします。
次に、i2iアップスケールをしてもこの主線が保たれるかを確かめます。左下の1枚をi2iに送り、さきほどと全く同じように線画cannyを掛けて、512✕768からノイズ除去強度「0.5」で1.5倍サイズにアップスケールするとこんな感じに。(※変なドットが散りばめられる場合は、cannyのweightを0.6くらいに下げるとうまくいきます)
さらにこれをノイズ除去強度0.5で2倍サイズにアップスケールするとこうなります。
塗りはかなりリッチになりますが、手が崩壊したり手すりの一部が肌色に塗られてしまったりと、絵柄そのものへの侵食も大きいですね。顔もほとんど別人になっていますし、画面右下にも謎の指が…
そもそもこれは線画辞典で背後のバルコニー(?)部分が構図崩壊しているので、どう塗っても完璧な出来にはならないのですが、こういった方法▼であっという間にレタッチすることもできます。
ほいっ!
ということで、クォリティーは多少アレですが、妙だった部分が軽率に直ってしまいました。なんで!?と思うかもしれませんが、種明かしをすれば単純な話。これは、アップスケール前のイラストとアップスケール後のイラストを同じサイズにして重ねて、部分部分を柔らかい消しゴムで消すことでマージする方法、名付けて「人力マージ」です…(笑)
肘から手首の下の謎空間など、マージでもなんとかならない部分は自分でささっと塗りました。所要時間2~3分です。
これはたったニ枚を合成したわけですが、i2iでほぼ同じ構図を大量にガチャっていると部分部分で良いところが出るので、破綻してしまったところを別の良質イラストとマージすることで、ある程度の破綻なら最小限の加筆で直すことができます。両方のイラストがちょっとでもズレるといけないので、線画がぴったり重なるほど強くControlnetが効いているときだけ使える裏技みたいなものですね。
このように、縦2048サイズまで上げてもほとんど主線が離れない結果となりました。
ここまで主線が保存できるとなると、例えば線画レベルで破綻を直したり、背景の線画を空白にしておいて、segmentationなどで好きなものに差し替えたりと、さまざまな活用法が期待できます。特に、画像生成AIをなんとなく「悪いもの」として忌避していた絵心のある人々に「すげぇ!」とか「面白そう!」と思ってもらえるような機能なのではないでしょうか。
おまけ:「weight実験」
さて、hiresを諦めればかなり忠実に塗れることはわかりましたが、hiresを掛けながら線を動かさないことはできないのでしょうか。controlnetには「weight」で影響を強める機能があるので、定番のX/Yプロット実験で試してみました。(※ちなみに大した結果は出ないので、cannyのweight影響が気になる方以外は読み飛ばしてもらっても結構です)
annotator resolusionは安定値とみられる「800」に固定。768✕512サイズにHiresを強さ0.5で掛けて1.5倍サイズにアップスケール指定し、cannyのweightを「0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5」で実験してみた結果が、下図です。
1.5まで強めましたが、どれも背景はまちまちで、線画に忠実になっているかどうかよくわかりません。最強の1.5に線画を重ねても、これだけ線が離れてしまっています。
ぐぬぬ。ではさらに強めてみます!weightはバーが2.0までしかないのですが、x/yプロット上で2以上にするとどうなるのか実験してみましょう。「wight:1.6,1.7,1.8,1.9,2.0,2.5,3.0」で生成したのがこちらです。
残念な結果となりました。色調がどんどん薄まり、かといって線画への忠実性が増すわけでもなく、ほぼほとんどが破綻状態となってしまいました(だからweight2.0が操作画面上では最大値なんですね)
hiresを掛けながら線画の主線を保持する方法は、他にも「Hed」を試してみるなどいろいろ実験しましたが、良い結果は出ませんでした。Controlnetは短時間でとんでもない進化を遂げているので、来月のいまごろにはこんなことに悩んでいるのがバカバカしくなっているかもしれませんが、3月6日の現在位置はここらへん…ということで、今日の記事は終えたいと思います。
終わりに
最初に紹介したツイートのツリーは、ふだんフォローしていただいている方からすると妙な説明口調で違和感があったと思うのですが、これは画像生成AIになんとなく忌避感のある一般の方向けにツイートしたものでした。露骨にバズり狙いの書き方をしてしまい、恥ずかしく思っています。
AIを使えば確かに他人の著作物のi2iパクリや実在人物のポルノ化など、モラルに反した行為も行えはしますが、本質的には多くの人がイラストを楽しめるようになったり、イラストを嗜んでいる人たちが更に創作性を発揮できるようになったりするための技術なはずです。何より、多くの優れた技術者の方々がControlnetやLoRAといったさまざまな最先端技術を切り拓いてくださっているのに、画像生成AI全体がモラルのない悪徳技術かのように思われてしまうのはとても悲しいことです。画像生成AIの仕組み自体が誤解され、「他人の著作物を無断でコラージュする盗作技術である」と認識されつつあることにも落胆していました。
ただ、絵心のある人がみなAIに敵対心を燃やしているかというと、そんなことはないのではないでしょうか。大部分の人は「よく知らないけどなんとなくダメなもの」とか「みんなが怒っているもの」というふんわりした忌避感を持っている程度なのではないかと思います。
今回紹介した線画着色テクニックは、そうした人たちにも「画像生成AIって他人の絵を盗むだけじゃないんだ」とか「一度くらいやってみたいな」と思ってもらえる内容ではないかなと思い、こうしたバズり狙いツイートをした次第です。AI術師というだけでチクチク言葉を投げられたり、批判されたりするような時代が早く終わればいいなと願っています。
そんなわけで、今日はAIを使って「線画に色塗り」をしてもらおう!でした。
それでは皆様、今週も頑張っていきましょう!スタジオ真榊でした。
ごめんなさいおじさん、ワイはおじさんよりたぶん絵が下手です…。