Translation missing: ja.accessibility.skip_to_text

【画像生成AI】革新的!CG動画でリアルな顔入れ替え体験

CGチームの牛山です。
これまでこのブログで、画像生成AIを使って、CGのキャラクターをいかにしてリアルにするかという内容で検証を続けてきました。
まずは、これまでの内容をおさらいしていきましょう。

【画像生成AI】Stable DiffusionによるCGアバターの置き換え

ここでは、マスクとテキストプロンプトを使う事で、顔部分だけをリアルにする方法を解説しています。

【画像生成AI】アバターを色んな角度できっちり同一人物にする!

ここでは、Seed値だけではなく、ControlNetを使う事で色々な角度から人物の固定化を目指しています。

【画像生成AI】ディープフェイクを活用して同一人物をつくる!

ここでは、Roopという拡張機能を使って顔の入れ替えを行う事で、人物の固定化を行っています。近距離でも遠距離でも安定して顔を入れ替える事が出来るというのが強みでしたね。

これまでの検証結果としては、テキストや輪郭検出などによるリアル化よりも、顔を入れ替えてしまった方が汎用性が高い、という事になります。

今日やる事

今回もディープフェイクを使っていきます。今回はCGの動画を使って検証します。
ネットに上がっている様々な事例を見ると、すでに実写映像での顔の入れ替えは、かなりのレベルまで来ているように思います。
よりCGチームの実務を意識して、アパレル用のCG動画で顔だけを入れ替える、というシチュエーションを想定します。
特に、アパレル用のCGの縛りとして、服はCGを使う、という事にご留意ください。
服までAIで変わってしまうと、プロダクトと異なってしまう可能性があるので、制約しています。

今回の目標

  • 動画を作る際の一連のプロセスや工数を把握する
  • フレーム間でランダム要素やチラつきが入らないか検証する
  • AIが苦手とする部分を把握し、その対策を立てる

検証準備

ディープフェイクの仕組み

まずは画像生成AIにおける、ディープフェイクの仕組みを簡単に見てみましょう。ここは、ChatGPTに解説してもらいます。

  1. 画像から顔を検出する

    • AIは画像を分析して、人の顔を見つけ出します。
    • 顔の特徴(目、鼻、口など)や顔の向き、表情を検出し、これらのデータを取得します。
  2. 指定された画像の顔に置き換える

    • この段階では、別の画像の顔を元の顔に置き換えます。
    • AIは顔のサイズ、陰影、肌の色合いなどを調整して、置き換えられた顔が自然に見えるようにします。
    • 置き換えは、目や口の動きが元の画像と同期するように細かく調整されます。

つまり、「顔を検出できない」ケースでは、顔の入れ替えが失敗してしまうという事になります。
それを検証するために、様々なカメラワークで動画を作っていきます。

    素材の準備

    せっかく検証するなら、この後やろうと思っている弊社のaccelerando.AIのプロジェクトで使えるような素材にします。

    まずは、顔の入れ替え用の画像も準備します。
    Zepetoでaccelerando.AIとしてインフルエンサー的に使っているアバターをモチーフに、AIで実写化します。

     そして、CGの素材を準備します。

    今回の検証では、CGで作成されたキャラクターにAIを使用して、顔だけを変更します。AIによる髪の生成や衣装のリアル化などの複雑な変更は行わず、キャラクターのその他の部分はCGのレンダリングを使います。この方法を採ることで、検証プロセスをシンプルに保ちます。

    ウェアはaccelerando.AIの第一弾で展開したシルバーのものを使います。(”人とAIのコラボレーション”が形に 未来のファッションブランド「accelerando.Ai」より初となるアイテムが販売スタート)
    今回は髪を作り込む時間はなかったので、簡単にプリセットで似てるものを使います。

    手順と設定

    以下のような手順で行います。

    1. CGの歩行サイクルモーションを使う
    2. 仮説の項目ごとにカメラを設定してCGの動画をレンダリングする
    3. それぞれのレンダリング動画にStable Diffusionで顔を検出して入れ替える

    今回のAI生成の設定は、Denoise 0.1にしています。これは顔以外は何も置き換えを行わないという事になります。

    顔の入れ替えはRe Actorという拡張機能を使っています。
    前回はRoopという拡張機能を使っていましたが、より高性能という事で、現在はRe Actorが主流になっているようです。

    また、CGのレンダリングは速度を優先するために、BlenderのEeveeで行っています。最後の方に高品質なCyclesとの比較も行っています。

    検証結果

    カメラ固定

    ここでは、フレームごとに同一人物になるか?という要素を検証します。
    まずは顔の入れ替え結果を見てみましょう。

    ちゃんと入れ替え出来ていますね!「顔だけ」を入れ替えると思っていましたが、馴染ませるための過程で、周りの髪なども少しリアルにしてくれていますね。
    入力に使うCG素材をCyclesなどの高品質なものを使えば、もっとリアルな仕上がりになるはずです。

    それでは、動画を比較してみましょう。

    良さそうですね!
    途中で別の人の顔に置き換わってしまったり、陰影や明るさが変わるなどといった事を懸念していましたが、ちゃんと自然に見えます。

    一部気になる点を挙げるとすると…

    • 目線が安定しない
      • よーく見ると、目線が左右に振られています。そこまで気になるレベルではありませんが、もっとゆっくり移動していたり、目線に明確な意図がある場合は注意が必要そうですね。
    • 髪との境界線にノイズが出る
      • 埋め込んだ動画では分かり辛いかもしれませんが…。髪の境界線で動くたびにノイズが発生しています。
      • さきほど、顔の入れ替え後に馴染ませる処理をしている、という話がありましたが、その副作用として、ノイズが出てしまっているようです。
      • そこまで気になるレベルではありませんが、現時点ではこれの対処法が見つからない状況です

    カメラ移動

    画面の端から人物が出現する時など、顔が一部検出できない状況ではどのようになるのでしょうか。 

    速すぎて分かり辛いので、コマ送りで見てみましょう。

    やはり半分以下になると検出できないですね。

    対策を考える

    カットインで入ってくる時に顔を検出できるような余裕を持たせればよいので、解像度を横に広げるのが良いと思います。
    解像度が上がる分、レンダリング時間は増えるし、個別のカットで比率を変えると色々手間ですが…。
    今の所それくらいしかないように思えます。

    カメラ旋回

    こちらでは、どれくらいの角度まで顔を検出するか?を見ていきます。 

    こちらも細かくコマ送りで見てみましょう。

    カメラ移動の時と違って、顔は検出されていますね。
    ただし、後ろ顔に正面の顔を貼ろうとしているというエラー的な挙動が見られます。

    対策を考える

    この回避策は非常に難しいです…。手軽なもので言えば、エラーが起きているフレームはCGのものを使う…などがあります。
    速度が速ければ気付かれないと思いますが、ゆっくり振り返る、などの場合は違和感が出てしまうでしょう。
    AIで入れ替えをする場合は、演出的に回避しておくのがベストかもしれません。
    今後の精度向上に期待しましょう。

    カメラズーム

    実は、これが一番どうなるか予測できなかった検証です。
    プロンプトベースの画像生成では、シード値の固定やControlNetを使っても、被写体の大きさが変わるような生成で一貫性を持たせるのが難しいからです。

    前回のブログ記事では、最終的にRoopを使って顔の入れ替えでの固定化に成功していました。
    Re Actorはどうなのでしょうか。

    成功していますね!

    固定カメラの時と同じように、若干目が泳ぐ傾向がありますが、問題ないレベルだと思います。

    冒頭でお伝えしたように、顔はプロンプトで作るよりも、顔を指定して入れ替えてしまうのが最も汎用性が高い、という理由はここにあります。

    あとは、髪型などもこれと同じ方法で固定化できたら、もっと実用性が高くなりそうですね。

    その他:CGレンダリングエンジンの比較

    これまでEeveeでのレンダリングに対してのAI生成を見てきました。
    最後に、Cyclesでより時間をかけた高品質なレンダリングをした場合の結果を比較してみましょう。 

     

    いいですね!
    陰影がきちんとつくことで、一気にリアリティが増しましたね!
    AIで入れ替えるといっても、陰影はCGのものを引き継ぐので、きちんとライティング・レンダリングしておくと良いと思います。

    コスト

    それでは、生成時間などのコスト面を見ていきましょう。

    項目 1フレームあたり 合計(90フレーム)
    AI生成時間(顔のみ) 10秒 15分
    レンダリング時間(Eevee) 1秒 90秒
    レンダリング時間(Cycles) 10秒 15分

    検証機のスペックは、RTX2080, メモリ32GBです。数年前のハイエンド機で、現在ではそこまでハイスペックなマシンではないかと思います。
    レンダリング解像度は1024pxでやっています。
    一晩かけて生成しているわけではないので、こう見ると、かなりお手軽に試せそうですね。

    今回は、検証目的なので、レンダリング設定はかなり抑えめにしています。本番環境ではCyclesで1枚60秒以上はかかるかなと思います。

    Unreal Engineなどを使う事で、いかにしてレンダリングコストを下げるかという検証も面白そうですね。

    まとめ

    いかがでしたでしょうか。
    顔がリアルになるだけで、CGの他の部分は変わらないのに、クオリティが高くなったように見えますね。

    検証の結果、「顔だけ」を入れ替えような使い方であれば、現状のAI技術でも十分実務に使える事が分かりました。
    ただし、検証したようにAIが苦手なカメラアングルなどが存在します。
    特にAIが検出できないフレームで、対策を立てるのが難しい場合は、そのカメラワーク、カットそのものを見直す必要があるので、注意しましょう。

    また、この手法では顔以外はすべてCGのままになるので、CG側でも違和感ないように質感を向上させておく必要があります。
    髪型や人種はあらかじめターゲットに近いものを準備しなくてはいけないのが、少し手間ですね。
    動画としての整合性を保ったまま服や髪型まで全て入れ替えるのは、もう少し先になりそうです。

    いよいよ、AIも動画の時代になってきました。
    CGとAIを組み合わせて、リッチなコンテンツを作れるようになりたいですね!

    おすすめブックマークリスト

    最後に…

    まだStable Diffusionを導入していない、という方もいるかと思います。
    最近は年初に比べるとかなり導入しやすくなっているものの、情報が氾濫しているので、具体的に何のサイトを見れば良いか分からない事も多いかと思います。役立ちそうなチュートリアルをいくつか紹介します。

    AI is in wonderlandさんが最新のものを分かりやすく解説されていて、とても参考になりました! おすすめです!

     

     

    古い投稿
    直近の投稿

    お客様のカート