「Pix2pix」でイラストを変化!10種の実験で分かったこと【Controlnet1.1検証】 (Pixiv Fanbox)
Content
こんにちは、スタジオ真榊です。前回の記事に引き続き、今夜もControlnet1.1の新モデル検証の続きをお届けしたいと思います。
【Controlnet1.1検証】新モデル「Shuffle」でイラストを"再構成"しよう!
はいこんばんは、スタジオ真榊です。前回の「Controlnet1.1爆誕!顔抽出&アニメ主線抽出&線画塗りを試してみた」に引き続き、今回もControlonet1.1の検証記事をお届けします。 これから検証するのは、「Shuffle」「Pix2Pix」「Inpaint」の新顔3種モデル。前回紹介した「新Openpose」と「LineartAnime」はControlnet1....
今回検証するのは「Pix2pix」。前回はイラストの要素をばらばらにして再構成する「Shuffle」について研究しましたが、Pix2pixは再構成ではなく「変化」を扱う新技術です。Controlnetのアップデートに注意しながら、さっそく見ていきましょう。
目次
・元イラストを変化させられる「Pix2pix」
・代表的な指示プロンプト
・実験1:色を変える
・実験2:背景を変える
・実験3:表情を変える
・実験4:髪型を変える
・実験5:脱衣させる
・実験6:一部を置き換える
・実験7:時刻変化
・実験8:「put~on~」で着用させる
・実験9:タッチを変える
・実験10:複数の要素を同時に変更できる?
・終わりに
※今回の検証には一部、着衣状態の女の子を脱衣させる実験が含まれます。ご注意ください。
元イラストを変化させられる「Pix2pix」
Pix2pixは「ペア」になった画像を教師データとして大量学習させることで、AIに二つの画像の間の「関係性」を覚えさせ、ある入力画像を渡すと指示通りに変化させて出力させられるようにする技術のこと。例えば、赤いリンゴの絵と青いリンゴの絵をペアで学習したAIは「Aを青くしたものがB」という関係性を学びますので、「このイチゴを青くして」という要求に応えられるようになる・・・というわけです。
(https://www.timothybrooks.com/instruct-pix2pix より画像引用)
こちらの例では、「ひまわりをバラに取り替える」「空に花火を加える」「果物をケーキに置き換える」といった指示プロンプトによって、その通りに画像が変化していることが分かります。
「ある画像を入力して別の画像に変換する」という意味ではShuffleに似ていますが、Shuffleがあくまで元画像をピースとしてパズルをくみ上げる「再構成」のイメージなのに対して、Pix2pixはあるお題を任意の状態に「変化」させるイメージ。Shuffleと違って元イラストの色合いや要素を必ずしも継承しないので、入力画像と出力画像の雰囲気が似ないこともありますし、変化させる対象(上の例なら花や空、コートなど)を限定して置き換えることもできます。
代表的な指示プロンプト
Pix2pixに触る上でまず理解すべきなのは、このモデルは我々が普段使っているプロンプトではなく、「説明プロンプト」と「指示プロンプト」の組み合わせでトレーニングしているということ。例えば「beautiful fire works」は説明プロンプトであり、「add beautiful fireworks to the sky」が指示プロンプトです。公式の説明によると、「Y を X にする」よりも「X にする」といった単純な指示の方がうまくいくとのこと。
代表的なものを次にまとめてみましたが、単純な指示英文であればかなり広範に理解してくれるようです。
make it ~:~に変えて 例:make it miro painting
make it look like ~:こんなふうに変えて 例:make it look like summer
background to ~:背景を~に変えて
change A to B:AをBに変えて
動詞 A their B:例:絵の一部を動かす 例:Close their eyes
it is ~:これは~ですと指示 例:it is now midnight
add A in B:AをBに描き加えて
replace A with B:AをBに置き換えて
swap A to B:AをBに置き換えて
turn A into B:AをBに変化させて(置き換えより変化のイメージ)
put on ~:~を着せる 例:put on coat
convert to ~:媒体を変化させる 例:convert to realistic photo
face to ~:表情を変化させる 例:face to smile
(https://www.timothybrooks.com/instruct-pix2pix より画像引用)
基本的にはmake~やchangeを使うことが多くなると思います。
「どこを」変化させるかは書かない方がよい生成結果が出るとされているのですが、効かせたい場所以外に効果が漏れてしまうことが多いので、そこはinpaintや「人力マージ」(画像編集ソフトで元画像の取り入れたい部分だけを取捨選択して合成する)でカバーしましょう。
とはいえ、例えば室内にいるキャラの絵を入力して「背景を砂漠に」と指示したら、キャラクターへの光の当たり方にもその背景の影響が出てしかるべきなので、背景だけに効かせればいいというものでもありません。自然な変化をさせるためにはそれなりの工夫が必要となります。
実験1:色を変える
これを踏まえて、前にinpaintの記事で苦労した「女の子の髪の色を赤色に変える」を試してみましょう。モデルとして、こちらのイラストを用意しました。
プロンプト:1girl,blue hair,standing outdoor,bluesky,expressionless,(anime coloring:1.4),masterpiece,extremely detailed CG,official art,high resolusion
指示プロンプトは「change to red hair」もしくは「change her hair to red」。さきほどのプロンプトを全て消去し、text2textのプロンプト欄にこれだけを入力します。元画像は2倍の高解像度補助(バイキュービック)を掛けて1024✕1536サイズで生成したものですが、実験では高解像度補助はOFFで、サイズは768✕512にします。
Controlnet画面はこのようになります(▼)。まずは、ステップの前半だけにControlnetを影響させる設定としました。(Ending control step:0.5)
Controlnetや指示プロンプトの効果がわかりやすいよう、X/Y/Zプロットで以下のように設定。すると、このような生成結果となりました。
いずれも、髪の毛だけではなく背景や服装にも「赤」が漏れる結果となりました。公式の説明では「Y を X にする」よりも「X にする」の指示の方がうまくいく、ということでしたが、むしろ「彼女の髪を」と特に指定した右列は、背景の緑や全体のトーンが赤くなってしまう効果が一部抑えられているように見えます。
また、Seed値をランダムにしているので、controlnetの重みが弱いと同じ構図のイラストになりません。pix2pixは変化した部分だけでなく、絵柄全体についてコントロールしていることが分かると思います。
さきほどは前半ステップだけに効かせた結果ですが、こちらは全体ステップに効かせた場合。
「change her hair to red」(右列)と対象を特に強調指定した場合、背景への赤色変化が一部抑えられているように見えます。ただ、しっかりキレイに差別化できているかというと微妙なところ。
この「漏れ」はinpaintでマスクすることで防ぐことができるのですが、それは次回のControlnet1.1「inpaint」の検証で詳しくみていくとして、今回はpix2pix単体での実験をしていきましょう。
実験2:背景を変える
次は背景だけをリビングルームに変えてみます。プロンプトは「background to living room」もしくは「replace background to living room」。
プロンプトが「background to living room」だけなので、Controlnetが弱いとリビングルームだけが生じる結果となります。また、重みが強すぎると、緑がどんどん生じる結果となりました。やはり0.8-1.0くらいが良い結果になるようですが、女の子の容姿まで大胆に変化してしまっています。左右の差はあまり見られませんでした。
実験3:表情を変える
表情を変えてみます。プロンプトは「face to smile」もしくは「make her smile」。
こちらは前半ステップにのみ影響させたのですが、今回はカラーリングではなく細部の描写を変化させる指示だった(影響させたい範囲が顔面のみ)ので、そうした描写はSTEPの終盤に行われます。そこで、前半ステップだけではなくステップ全体に影響させるように設定を変え、もう一度実験しました。
ステップ全体に効かせたところ、0.8から元画像の形を再現することができました。後半に効かせないメリットが特になさそうなので、以降の実験では、すべてステップ全体に効かせることとしてみます。
実験4:髪型を変える
今度は女の子をロングヘアに変えてみます。
意外なことに「long hair」によって髪色もキャラクターデザインも大胆に変化しました。これは、long hairという概念が服装などにも漏れて学習していることが原因(ロングヘアキャラと言えばこういう服装、と学習している)と思われます。逆に、背景には変化が漏れていません。
どうも、さきほどまでの実験結果と見比べても、重み1.0より1.2に効かせた方が良い結果が出ているように見えますね。0.2など低weightを生成しても無駄なようなので、次からは0.8以降、1.4までで実験することにします。
実験5:脱衣させる
次に、色だけでなく大胆に被写体の様子を変化させてみます。せっかくなので(?)女の子のイラストを一発で脱衣させてみましょう。プロンプトは「change to nude」もしくは「change her cloth to nude」。
興味深い結果となりました。Controlnetの重みが強すぎると、元画像の絵柄・構図を意識する力が強すぎて、カラーが肌色に近づくものの着衣状態に戻ってしまいます。青髪が金髪に変化しているのは、nudeの肌色を意識したためかと思われます。「弱すぎると元画像から離れる」「強すぎるとうまく変化させられない」関係がわかりやすくなりました。やはり範囲指定が重要になることがわかります。
実験6:一部を置き換える
「replace bag to sword」で、彼女が持っているバッグを剣に取り替えてみます。
これはうまくいかず。おそらく、bagが小さすぎて置き換え元として認識できなかったのと、Swordが長モノで形状が違いすぎるので、うまく置き換えられなかったのではないかと思われます。バッグをぬいぐるみに置き換えようとしたところ…
やはりどこが「bag」か認識しておらず、「her」を置き換えてしまっています。イラストのモチーフとして小さすぎるもの(deepbooruでタグ解析してもぱっと出て来ないような下位の要素)を変化させるのは難しいようです。逆に、hairやeyes、1girlなどのメジャーな要素、または大きく描かれている要素は入れ替えやすいと思われます。
実験7:時刻変化
時刻を「midnight」に変化させてみます。
これは素晴らしい結果に。一つ分かるのは、pix2pixは自分で頑張って範囲指定して「変化」させることもできはしますが、このように全体を変化させる方が大得意だということ。一部だけを変化させたい場合は、人間がinpaintなどを使ってお手伝いしてあげる必要があることが分かりました。
ところで、特に「weight1.2」の出来がよかったので、これを高解像度補助でアップグレードしようとしてみましたが、このように失敗してしまいます。(▼)
こうなってしまうのは、Controlnetの効果が高解像度補助のステップには影響させられないため。この場合は「1024✕1536」サイズでt2i生成し、かつイラストが乱れないようにmulticontrolnetでlineart animeと併用するのが正しい方法となります。
こちらのツイートのように、高解像度化したイラストでも上手に変化させることができました。下図は、2つ目のタブでLineart animeを起動し、線画適用しているところのスクリーンショットです。
実験8:「put~on~」で着用させる
次は「put」の実験。まずは元イラストにメガネを着けさせてみます。
うーん、なかなかうまくいきませんでした。ごく細部の変更なので、やはり得意でないようですね。
次はコートを着せてみます。
こちらも上手にいきませんでした。put~はあまり得意でないのかもしれません。
セーラー服にチェンジ!はこちらの結果に。
首から上にも影響しているものの、こちらはinpaintなどで範囲指定を上手にして何度かガチャすればうまくいきそうな雰囲気がありますね!
実験9:タッチを変える
「comic」「line art」「flat color」「monochrome」などの変化を試してみました。
フラットカラー。良さそうな感じがします。線画部分をlineart animeで指定すれば、イラストの変化を防ぎながらうまくフラットカラー化させられそうですね。
白黒にはなったものの線画調にはなりませんでした。これなら、画像編集ソフトでやったほうが早い結果に。とはいえ我々は既にline art animeを入手しているので、わざわざ線画に「チェンジ」させる必要はありませんね。
これはユニーク。サイバーパンク / 浮世絵スタイルです。これは重みをどれくらいにするかで元絵とのバランスが図れるので、いろいろ面白い実験ができそうですね。
実験10:複数の要素を同時に変更できる?
さて、ここまでいろいろな実験をやってきましたが、複数組み合わせることは可能なのでしょうか?
「髪の色を赤にし、服をセーラー服にし、髪型をツインテールにし、ついでに深夜のイラストにして」と頼んでみましょう。
プロンプト:change red hair,turn her cloth into silor uniform,make her twintail hair,change to midnight
辛うじてレッドヘアーくらいは効いたようですが、それ以外はほぼ無視される結果となりました。pix2pixは2枚の画像の「関係性」を学んでそれを適用させる技術ですので、複数の関係性を同時に処理させるのはやはり難しいようですね。
終わりに
今回は「pix2pix」が何をできるのか、ということに重点を置いて研究したので、あえてinpaintやlineart animeといった他の技術をほとんど併用せずに検証を行いました。おおむね予想通りで、画像の一部を置き換えることはできるものの完璧ではなく、むしろキャンバス全体に影響するような変化を与えることが得意なモデルであることが確認できました。
このように、inpaintで人間が変えたい部分を範囲指定したり、lineart animeであくまでこのイラストの輪郭を維持したりといったお手伝いをしてあげると、pix2pix本来の実力が発揮できるかと思います。
また、今回はあくまでtext2textの画面で使用しましたが、元画像をimg2imgする際にpix2pixを効かせるという方法もあります。次回以降、今回のtext2textの検証結果とどう違うのかも示していきたいと思います。
いったんここでこの記事は終わりますが、このたび私はControlnet1.1有給を取得してしまったので、引き続き検証を続けたいと思います。
それでは、次回の検証でお会いしましょう!スタジオ真榊でした。