こんばんは、スタジオ真榊です。今夜はControlnetの実験をしていて偶然発見した生成手法についてご報告です。役に立つものなのかどうなのか、まだよくわかりませんが、とりあえずこういうことが起きたという事象報告としてお読みください。
タイトル画像で紹介したように、「元画像からスタイルを継承しながら線の重ならないガチャができる」という利点があり、さらに背景や表情などをプロンプトで変更しても、大きく構図が変化しないことが確認できました。「よく似ているけど違うイラスト」を作れるこのテクニック。まだ「なんか面白いけど何ができるのかはよくわからない」レベルのものですが、ご興味がある方は試してみて下さい。
実験の発端
さて、Controlnetには、元となる画像から表情や構図、ポーズなどを抽出して、それを継承したイラストを生成する技術が多数盛り込まれています。例えば「Lineart」のプリプロセッサとモデルを使えば、元画像からこのように線画を抽出することができ、同じ線画を継承したイラストを作ることが可能です。


このように、線画だけ継承しつつ、違う塗りになります。こちらは「simple background」を指示しているのであまり振れ幅はありませんが、これを「outdoor」に変えると…

線画の存在しない部分に、その都度違う屋外の背景を描いてもらうことができます。ある意味、「背景部分のジェネレーティブ塗りつぶし」のような効果と言えるかもしれません。
さて、どのイラストもきっちり同じ線画になるのは素晴らしいことなのですが、この構図のまま、もう少しだけ出力結果に「振れ幅」を与えることはできないだろうか?と考えたのが、今回の実験のきっかけです。例えば、Openposeを使えば、このように体の位置を抽出することはできます。(Openpose Faceはイラスト調の顔を認識しづらく、失敗しています)

ただ、これで同じプロンプトのイラストを生成すると…

このように、ポーズが同じではあるのですが、似たイラストを別の線画で描く感じにはならず、Seed値によるランダマイズが掛かってそれぞれ「別の子」というムードになってしまいます。
もちろん、以前紹介したVariation機能を使えば、完成イラストを「少しずらす」こと自体は可能です。

こちらは「バリエーションの強度:0.2」で元画像を生成した例。ところが、さきほどのようにプロンプトを変更して背景を変化させようとすると…

このように、プロンプト変化が構図にも影響して、全く違うイラストになってしまいます。
今回の実験で目指していたのはこちら。

構図やカラーといった全体の要素をしっかり引き継いでいながら、線の重ならない別のイラストにしたいんですね。いまとなってはReferenceOnlyで元画像を読み込ませ、同じプロンプトで生成すれば似たようなことができるのですが、この実験をしていた当時はまだCN1.1が登場したばかりで、Referenceシリーズは存在していなかったのです。そのへんはちょっと我慢していただいて、実験の経緯だけ先にざっとご説明するのでナナメ読みしてください。
最初に考えたのが、「Lineart animeの重み(weight)や掛けるステップ範囲を弱めることで、似ているけど違うイラストを生成できないか?」ということでした。
実験1:Lineartを弱めに掛けてみる
Lineartで元画像から線画を抽出する際、線画がぴったりそのままにならないよう、Controlnetの「重み」を弱めたり、影響がかかるステップ範囲を前半までに留めたりすることで、ちょうどいい振れ幅が出ないか試してみます。
X/Yプロットを使って実験してみたところ…

このように、かなり弱めても元画像そのままの画像が出てしまうことが分かりました。重み0.75、ステップの前半40%に掛けるだけで同じ線画になってしまうのは逆に驚きですね。そこで、もっともっと弱めてみると…

このような結果に。ステップの冒頭20%掛けただけでもう線画がほぼ固定されていることが分かります。Lineart、やはりとんでもないですね。10%にするとほぼControlnetを掛けた意味がなくなり、同じプロンプトでランダム生成しただけというムードになります。




