cedro-blog

First Order Motion Model で、モナリザをトランプ大統領のように動かす

1.はじめに

 8/28付けMIT Technology Reviewによれば、日本のビデオゲームの挿入歌「ばかみたい」をネタにしたディープフェイク動画が最近ネット界隈で流行っていて、その背景には作成ツールが誰でも簡単に使えるようになった事があるとのことです。

 その作成ツールに使われている技術は、2019年に発表された First Order Motion Model で、百聞は一見にしかず、こんなことが簡単に出来ます。

 左が有村架純さんの静止画 、中央がトランプ大統領の動画、そして右が生成した有村架純さんがトランプ大統領のように動く生成動画です。

2.First Oder Motion Model とは?

 これは、モデルの概要図で、大きく分けて Motion Module と Generation Module の2つで構成されています。入力は、静止画 source と、動画 Driving Frame です。

 Motion Module は、静止画と動画の各フレームそれぞれに対して、キーポイント位置(顔の場合なら目、鼻、口、顔の輪郭など)、キーポイントにおける勾配を、Refarence画像(図ではRと表示)を基準として計算します。

 そして、そのキーポイント計算とヤコビアンJk(静止画と動画フレームの大きさの比率)から、動画の各フレームの画素を静止画のどの画素から作れば良いかを示すマッピング関数を計算します。

 この様に静止画と動画の各フレームの差を計算するのではなく、Refarence画像という概念的な基準画像との差を計算することで静止画と動画の各フレームが独立に計算出来、両者の画像の差が大きくても上手く変換ができます。

 また、静止画を動かすとそもそも静止画に含まれていない部分が発生しますが、それを上手く処理するオクルージョン(Oで表示)という処理を行っています。

 Generation Module は、それらの結果と静止画から、画像を出力します。損失関数は、静止画と出力画像の誤差正則化項(マッピング関数が単純な変換に近くなるような拘束条件)です。

 学習時は、静止画と動画は同一の動画から任意のフレームを選択して行います。推論時は、学習時と同じカテゴリーであれば静止画と動画とも任意のもので行えます(これがこのモデルの素晴らしいところです)。

3.学習済みモデルを使ってみる

 今回のコードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。

 学習済みモデルが提供されていますので、それを使って試してみましょう。まず、コードとサンプルデータをダウンロードします。詳細はGoogle Colabを参照下さい。

 最初に、静止画、動画、生成動画をまとめて表示するための関数display()を定義します。

 この関数は、静止画、動画フレーム、生成動画フレームをconcatenate し、matplotlib の animation でアニメーション形式にしたものを返します。

4.モナリザをトランプ大統領のように動かす

 静止画と動画は、顔のキーポイント位置(目、鼻、口、顔の輪郭など)が検出できれば絵でも人形でもアニメでも構わないので、ここでは静止画はモナリザ、動画はトランプ大統領を使ってみます。

 この様に、モナリザをトランプ大統領の様に動かすことが簡単に出来ます。

5.オリジナル動画を使う

 今度は、事前に用意した動画ではなく、オリジナルの動画を作成してやってみましょう。

 サンプルにあるABCニュースの動画からキャスターの顔部分だけを切り出して、動画として使うことにしましょう。下記のコードを実行します。

 news.mp4から顔部分だけを切り出した200×200の動画をresult.mp4に保存します(動画は256×256以下にする必要があります)。result.mp4はこんなイメージです。

  ffmpeg を使えば、1行でこんな顔を切り出す動画(クロップ動画)が簡単に作れます。引数を簡単に説明すると、

-i: 動画パス
-ss: 動画のクロップスタート時刻(時間:分:秒:1/100秒)
-t: クロップ動画の長さ(時間:分:秒)
-filter:v “crop=XX:XX:XX:XX”:(クロップ画像の横サイズ:クロップ画像の縦サイズ:クロップ画像の左上角の横位置:クロップ画像の左上角の縦位置)
*クロップ画像の左上角の横位置・縦位置は、動画の左上角を(0,0)として計算した位置です。
-async 1:クロップ画像保存パス

 それでは、result.mp4 を動画にして5枚の静止画から、生成動画のフレームを作成します。

 これで、5枚の静止画の生成動画フレームが作成できました。後は、これらと動画を連結します。

 これで作成完了です。

 但し、作成した動画には元あった音声が消えていますので、QuickTimeなどでresult.mp4の音声を取り出し、作成した動画に追加してやると(これは手動で簡単にできます)。

https://cedro3.com/wp-content/uploads/2020/09/announce.mp4

 こんな風に、ABCニュースのキャスターに合わせて、他の5名も喋り出します。

 この様に、動画はWebからダウンロードした動画から顔部分を切り取ったものを使ってもOKですし、自分の顔動画をスマホで撮影してもOKです。

 また、題材はスピーチでも、ドラマでも、歌でも何でもOKです。コードは省略しますが、歌を題材に作ったものも参考に添付しておきます。

https://cedro3.com/wp-content/uploads/2020/09/final_out.mp4

 では、また。

 使いやすい改良版デモリンクの追加(2021.6.9): https://colab.research.google.com/github/AliaksandrSiarohin/first-order-model/blob/master/demo.ipynb

(Twiterへの投稿)