【画像生成AI】アバターを色んな角度できっちり同一人物にする!
Aug 05, 2023
CGチームの牛山です。前回は以下のブログを書きました。
【画像生成AI】Stable DiffusionによるCGアバターの置き換え
前回は、画像生成AIのStableDiffusionを使って、元のCG画像に似せたまま、リアルなアバターの画像を生成するということを見てきました。
今日やる事
今日はもう少し突っ込んだ実務的な話をしていきたいと思います。
一枚の静止画をリアルにするだけでなく、様々なアングルで生成される画像で同一人物のように見せるということをやっていきたいと思います。
デジタルサンプリングの現場を想定して、顔はAIでリアル化する一方、CGで作った服はそのままにしておきます。CGの服は、実際に生産されるものを想定しているので、勝手にAIが改変するわけにはいかないのです。
そして、最後はStableDiffusionのプラグインを利用してアバターの映像化にチャレンジしてみます。
今回の目標
- 様々な角度からの画像で、CGのアバターを同一人物のように見せる
- CGの服とAIの顔がうまくつながるように合成する
- その成果を使ってカメラワークのある映像にしてみる
それでは始めていきましょう。
検証1:Seed値+プロンプトを固定してみる
人物を固定化する上でネットでよく言われている手法があります。それがSeed値を固定するというものになります。なお、この検証では前回と違い、マスクをいったんOFFにしています。
今回は上の2枚を使います。左側が前回と同じ画像、右側が別の角度から撮ったものになります。
さっそく前回と同じプロンプト・Seed値を使ってみます。
おや?あまり似ていませんね…。それに右の画像はぼやけています。
人種や年齢を指定するプロンプトを増やしてみます。また、ネガティブプロンプトには画像のぼやけた感じをなくすためにblurなどを追加します。
顔立ちは似てきました!少しパーマのかかり具合に違いがありそうです。
髪型を指定するwavy hairを追加。
…あれ?少し男性的になってきましたね。そういえば、性別を指定するのを忘れていました!
Womanを追加します。ある程度は似てきた気がします。それでもパーマの大きさなどには若干の違いがみられますが、これ以上はテキストで指定するのが難しい気もします。
検証1まとめ:
前回のように、人物描写のプロンプトがない状態で偶然引いた「ガチャ」をSeed値だけで再現するのは難しいと思います。
プロンプトは少ない方がAIがいい感じに汲み取ってくれることがあります。しかしSeed値を固定したいのであれば、Seed値はプロンプトに結びつくものなので、なるべく詳細に人物をプロンプトで表現する必要があります。 同じSeed値でもプロンプトを増やすほど、印象が変わっていくので、最初に少ないプロンプトで良いモノが引けたとしても、後からプロンプトを増やした時にそれを再現できない可能性に注意が必要です。
人物を表すプロンプトとして、人種、年齢、性別、髪型などは最初に指定する事をお勧めします。
検証2:ControlNetで輪郭を抽出してみる
では次にStableDiffusionの拡張機能である、ControlNetを見ていきたいと思います。ControlNetでは画像から輪郭線や奥行、ポーズを抽出して、それを用いて別の画像を生成する事ができます。
テキストによるプロンプトでは表せない様々な指定を行うことができるStableDiffusionの強力な機能です。
今回ControlNetを使う目的は2つあります。
1つは人物の固定化のためです。同一のプロンプトやシード値を使っても、目鼻立ちが若干ずれたり、顔の向きがおかしくなってしまったりします。
もう1つは後から合成を行うためです。顔の部分だけをAIにして服はCGにするという制約のために服の境界できっちりと要素を分ける必要があります。
ControlNet ON/OFFの比較画像です。
使わない場合、髪型が変わってしまうのが分かるかと思います。目鼻の位置や首の向きも若干変わっています。
また、右側のオーバーレイの比較画像の首元に注目して頂きたいです。首の境界線が変わってしまうので、このままだとCGの服に顔の合成を行うのが難しくなってしまいます。
ControlNetで輪郭を抽出する手法をSoft edgeと呼びます。Soft edgeの中にもさらに抽出の仕方でカテゴリーが分かれています。HEDでは前髪のふんわりとした境界線も拾ってくれます。
それに対してpidinetという手法では、前髪が検知されなくなります。このケースでは元々パーマのため前髪の境界線がぼやけていたことが原因かと思います。 ただしpidinetの方が新しい手法でより綺麗な輪郭抽出が行われている事も確かです。
最後にSoft edgeとは違うCannyという輪郭抽出の手法です。細かい線の再現はできますが大きな前髪の境界線は見落としてしまっています。
検証2まとめ:
Stable DiffusionにControlNetが登場する以前は、ガチャの要素が多すぎて、画像生成AIはあくまでインスピレーションという立ち位置でした。
ControlNetを使うことで、テキストで言い表せない様々な指示を与えることによって文字通り画像をコントロールすることができます。画像の統一感などを担保する事で、インスピレーションではなく最終成果物として使えるクオリティになりました。
検証3:ControlNet+マスク併用時の問題点
コントロールネットを使っている時に気づいたことがあります。
マスクを併用した場合リアリティが下がってしまうという結果が判明しました。
左の画像ではマスクを使っていません。本来の目的とは外れますが、顔だけではなく服も背景も全て変わっていることに注目してください。 どうやらマスクの有無によってリアリティの差が出ているようです。
原因は分かりませんが、マスク単体での使用ではこのような問題は起こらないのですが、コントロールネットと併用した場合に発生します。
コントロールネットのPixel Perfectという補完機能をオンにしたところ少し改善しました。 それでもハイライトの部分などリアリティの差は出ていると思います。
検証3まとめ:
このようにコントロールネットとマスクの相性はあまり良くないように思います。
マスクを使うことができれば、そのまま最終成果物にできるのでとても楽ではあるのですが、マスクを使った場合であっても首元の境界線部分など少しガタガタしたジャギーが出てしまっているかと思います。
現在はどのみち最後にPhotoshopで若干の加工をする必要があるので、AI生成時にはマスクを使わず、生成後にPhotoshopでマスクを使って合成を行うという選択をしています。
検証4:人物固定後に映像化
それではここまでのテクニックを使って他の色々な角度でもCGからAIに置き換えてみましょう。
人物のアゴの先端が割れているところなど、かなり特徴の一致が出来ています。ただし、ホクロの位置、パーマの具合などはまだ異なっています。
それでも静止画であれば違和感のないレベルに到達しているのではないでしょうか。
最後に、これらを使って映像にしてみたいと思います。
…パーマがチカチカしていますね。やはり映像の場合は、角度だけでなく、フレームごとのつながりも大事になってくるので、より難易度が高そうです。この辺りは今後また検証していきます。
ちなみに動画作成は下の解説を参考にしております。設定次第では(おそらくDenoiseを下げたり)違和感のほとんどないクオリティにする事もできるはずです。
検証4まとめ:
いかがでしょうか。プロンプトとシード値を固定するだけでなく、コントロールネットを使って輪郭抽出する事で目鼻立ち、顔の向き、首のラインなどが一致するようになります。
静止画であれば、このような手法で様々な角度で人物を一致させることが出来ます。
ただし今回取り上げなかった部分で、角度だけでなく、カメラと被写体の距離の違いによっても人物を一致させるために別のテクニックが必要になってきます。
それはまた次回見ていきましょう。