Dwango Media Villageの古澤です。この記事では、1枚のキャラクタの画像をもとに、キャラクタの表情や顔向きを変えられる技術について紹介します。デモでは、1枚の正面向きのキャラクタ顔画像から、3種類のモーションのアニメーションを生成します。よろしければ、まずは下のデモを使ってみてください。手法詳細を先に読まれたい方は、先にお進みください。
このデモの公開は終了しました
次の動画でデモの操作に必要な一連のステップを確認できます:
10~60秒ほどで、入力した画像のアニメーション動画が生成されます。結果の動画タグは『#TalkingHead』です。是非シェアしてみてください。ソーシャルメディアなどで共有する場合は、利用した画像の規約に抵触していないかご注意下さい。
手描きで精細に書かれたキャラクタから、手描きでゆるく描いたキャラクタ、3Dキャラクタモデルがあるキャラクタ(いわゆる正解があるキャラクタ)まで、ある程度綺麗な結果が出ると思います!以下は、作例です。2,3行目は本記事の著者が描いた絵を入力してみた結果ですが、気軽に描いた絵の割に良く動いています。
この記事および公開しているデモは、Talking Head Anime from a Single Image [Khugurn] の技術に基づき、作成しました。
上の記事では、この技術の背景からシステムのオーバービュー、実装の詳細をとても丁寧に説明されています。さらに、記事だけでなく技術に関する動画も公開されています。
また、技術紹介の記事を公開した少し後に、デモを動かすためのソースコードも公開されています。そちらのデモでは、顔のパラメータのスライダーを動かすと、入力したキャラクタの顔画像を動かしたり、人の顔の動きとシンクロさせてキャラクタを動かせます。ただし、インタラクティブに動作させるには、GPUが必要です。
本記事では、独自のデータセットを用いても結果を再現できるか追試しました。また、GPUをもたない環境でもこの技術に触れて楽しめるようにデモを提供しています。以下の説明では、もとにした[Khugurn] の実装についてを『Khungurnの実装』と記します。
今回この記事で紹介する技術は、たった1枚の画像を入力するだけで、キャラクタの表情や顔向きを変化させるられる技術です。『たった1枚』という言葉を用いたことからご想像いただけるように、画像という2次元の情報のみから顔向きの変化のような3次元の情報を変化させることは難しいテーマです。キャラクタ画像をもとに表情や顔向きを変化させる方法は、大きくわけると、2通りのやり方があります。ひとつは、3Dモデルや3Dの簡易プリミティブをもとにしてキャラクタを動かす3Dベースの方法と、もうひとつが、2次元画像のまま画像の構造を変化させることで動きを見せる、いわゆる2Dベースの方法です。
3Dベースの方法として分かりやすい方法が、言葉の通りキャラクタの立ち絵等から3Dモデルを作成してしまう方法です。しかし、他にも3Dの情報に基づいて画像を変化させる方法はあります。例えば、各パーツの動きを3Dの簡単なモデルに近似して、パーツの変化だけモーフィングや形状の切り替えを行う方法もあります[Rivers2010] 。
一方、2Dベースの方法として、有名なアプリケーションに Live2D があげられるでしょう。画像をメッシュ化し、形の変化の補間を行うというのは、画像処理やCG分野の研究テーマとしても代表的なものの1つです[Igarashi2005] 。
そして、本手法は、2Dベースの方法に分類されると思います。今回の手法では、大量のキャラクタの顔の2次元画像をもとに、変化と補間を学習する方法となっています。
この技術では、1枚のキャラクタ正面画像の、顔の表情および顔向きをコントロールするために、それらパーツや回転角度をパラメータとして表現し、そのパラメータとキャラクタ正面画像を用いて推論します。
Khungurnの実装では、表情に関して左目・右目・口の開閉、顔向きに関してX軸・Y軸・Z軸に関する回転を制御を行えるよう訓練を行うために、各3次元のパラメータを採用しています。今回の追試でも同様に、各3次元のパラメータを採用しました。次に、各パラメータの値の範囲と、制御できる内容です。Khungurnの実装では、表情に対して、パラメータは0~1を値の範囲として、各顔パーツが完全に開いてる状況から、完全に閉じてる状態を表現するように対応付けていました。回転角度の範囲は、-15°~+15°の顔向き変化を実現できるよう、それらの回転角度を-1~+1のパラメータに対応付けていました。追試でも同様に、表情および回転で同様の表現ができるようにしました。ただし、表情と回転で同じ値の範囲になるよう統一したかったので、表情について-1~+1で完全開眼・開口を示し、回転について各軸で-15°~+15°で-1~+1を取るようにしました。回転角度の範囲を、-15°~+15の範囲に制限している理由は、表情の変化に比べて、3次元の回転では、パーツの形状の変化に加え、回転角度が大きくなればなるほど、パーツの遮蔽などにより、パーツそのものの移動の軌道の予測などが難しいであろうと考えたため、まずはこの回転角度の範囲で十分に表現が行えるかを検証する目的で、Khungurnの実装と同様にこの角度範囲に定めました。
ネットワークは、全部で3つのネットワークを用いています。追試にあたっても同じネットワーク構造を採用しました。表情変化を実現するFace Morpher Network、顔向き変化を実現するFace Rotator Network、最後の調整を行うCombiner Networkです。入力のキャラクタ正面画像をFace Morpher Networkに入力し、表情変化を行わせ、その後、Face Morpher Networkの出力をFace Rotator Networkに入力し、表情変化を伴った顔向きの変化を行います。最後に、Combiner Networkにて、Face Rotator Networkの出力を微調整したのち、最終的な表情変化および顔向き変化を行った顔画像が生成されます。つまり、最終的な画像を得るために、3つの生成段階があり、各段階に対して、1つのネットワークおよび3次元のパラメータがあります。
Face Morpher Networkでは、Encorder-decorder Networkをベースとし、最終部分で表情変化領域を元画像に対してマスキングする構造になっています。
Sigmoidを掛けた側の出力がマスクになっており、Tanhをかけた側の出力が、マスクを使って合成する表情変化部分になっています。この構造はPumarolaらの手法[Pumarola2019] をもとにしています。
Face Rotator Networkは、Face Morpherとは異なり、2つの出力を得ます。
1つ目の出力は、上図でオレンジ色の破線で囲まれている過程からの出力です。これは、Face Mopher Networkと同じPumarolaらの手法を採用しており、変化部分をマスクで合成する処理を経ての出力になります。Face Rotator Networkで新たに加わるのが、上図で水色の破線で囲まれている過程です。これは、Zhouらの手法[Zhou2016] に基づいており、Appearance Flow と呼ばれる、画素の移動マップをもとにした合成方法を用いています。概念の簡易図を下に示します。
3次元の回転に伴う画像の変化は、2次元平面に射影してみると、「ある画素が別の場所に移動した」と解釈できます。この考えを元にAppearance Flowが設計されています。上図の場合、正面から回転した際に左目の座標が、X座標についてΔx、y座標について0移動したとして、各座標のマップに記録しています。回転により、X座標とY座標それぞれ何ピクセル移動したのかの表現したマップがAppearance Flowです。このマップにそって各画素を合成した結果がFace Rotator Networkの2つ目の出力となります。
最後がCombiner Networkです。Cominer Networkでは、Face Rotator Networkで得た2つの出力を1つに合わせます。出力画像の正解となるのは、表情も回転も伴った画像ですので、Face Rotator Netoworkと同じ画像です。パラメータもFace Rotator Netoworkと同様の各軸の回転角度に関する3次元のパラメータです。
ここで、Face Rotator Networkの出力は何故2つ必要だったのか、考えます。Face Morpher Networkと同様のPumarolaらの手法による出力のみでよかったのではないか、という疑問が浮かぶかもしれません。ところが、実際に結果を見てみるとPumarolaの手法だと、顔がぼやけていたり、髪の毛の細かな線など、高周波成分がぼやけていました。一方で、Face Rotator Networkで2つ目に採用しているZhouらの手法を用いた出力では、顔向き変化により遮蔽が発生する領域付近でのアーティファクトが目立つ半面、高周波成分が鮮明に残りました。そこで、Combinerでは、これら2つの手法の長所を取り入れていたのです。
上の図では、緑色の枠線内の目などの高周波成分が(a)ではぼやけ、(b)では鮮明になっており、組み合わせた出力(c)では高精細な表情を表現できています。赤色の枠線内は、顔の回転により遮蔽が発生する髪の毛と腕の領域ですが、(a)では腕と髪がふさわしく表現されているのに対し、(b)ではアーティファクトが発生し、組み合わせた最終出力(c)では(a)に近い正しい表現がされています。つまり、Pumarolaの手法のみでは表現できなかった高精細な表現を、完結に言うと『画素を再利用する』手法であるZhouらの手法で補うことにより、より良い表現を獲得できました。
データセットは、大量のキャラクタ画像を用います。ただし、データは3Dモデルを撮影した画像となります。最初のFace Morpher Networkに入力する、キャラクタ正面画像は、完全な開眼・開口をしている画像です。Khungurnの手法では、これをReset Imageと呼んでいます。
このReset Imageには完全開眼・開口以外にもう1つの条件があります。それは、頭の頂点~顎先の位置が画像の中央に位置し、かつ、画像の半分の割合を占める必要があるという条件です。
2次元のキャラクタは、3次元の実際の人間に比べて様々な色や形、線を用いて表現されており、各パーツの位置や大きさもバラバラです。そのような様々な表現がされるキャラクタ画像に対して、どのような表現でも品質を担保した表情・顔向き変化を実現するために、データセット作成の段階で正確な位置合わせを行います。具体的には、頭の頂点から、顎の先までが画像の半分の割合で、かつ、位置が中央に来るようにアラインメントを取る必要があります。その位置合わせを正確に行いたかったため、追試のデータセット作成にあたって、全てのキャラクタに対して手で顔の頂点位置と顎先位置を取り、Reset Imageを集めました。Khungurnの実装でも、同様にこの位置合わせを正確に行っています。
1人のキャラクタに対して、Reset Image、Face Morpher Networkの正解となる表情変化のみを行った画像、そして、Face Rotator NetworkおよびCombiner Networkの正解となる表情変化+顔向き変化を行った画像の3種類が必要となります。Khungurnの実装では以下の数の画像をトレーニングデータセットとしたようです。バリデーションデータセットおよびテストデータセットの数も、Khungurnによる記事の5.4にて開示されています。
Khungurnのトレーニングセット | 数 |
---|---|
キャラクタ数 | 7,881 |
表情および顔向きの組み合わせ数 | 500,000 |
Reset Imageの数 | 7,881 |
表情変化のみの画像(Morpherの正解)枚数 | 500,000 |
表情変化・顔向き変化の画像枚数 | 500,000 |
総画像枚数 | 1,007,881 |
追試のデータセットで用いる3Dキャラクタモデルは、ニコニ立体から収集しました。キャラクタモデルによって、体の関節のツリーの構造や数、顔の表情の制御のパラメータ、シェーダーなども異なっていたため、データセット作成に関する手作業を強いられる工程が多かったことと、データセットに使用可能なこれほどのモデル数を見つけることにまず苦労したので、モデルは357体と比較的少ないキャラクタ数に対し、1キャラクタあたりの撮影枚数を増やしたデータセットを作成しました。追試のデータセットの枚数は以下の通りです。
学習に用いた自分らのトレーニングセット | 数 |
---|---|
キャラクタ数 | 357 |
表情および顔向きの組み合わせ数 | 714,000 |
Reset Imageの数 | 357 |
表情変化のみの画像(Morpherの正解)枚数 | 714,000 |
表情変化・顔向き変化の画像枚数 | 714,000 |
総画像枚数 | 1,428,357 |
キャラクタ数が技術に元に比べて少なかった点を踏まえ、デモの結果を試したり作例を見ると、そのデータセットの相違があったにもかかわらず、ある程度の汎用性をもって追試ができたと言えないでしょうか。追試にあたって作成したデータセットと、Khungurnの手法のデータセットで異なる点として、Khungurnによる記事の5.3で取り上げられているレンダリングの際の照明環境が異なっていました。Khungurnの手法では、フォンのモデルだけを用いた照明環境で画像を収集したとあります。それは、各種照明モデルによるノイズを低減させ、手描き画像に寄ったデータを使いたかったため、と説明してありました。しかし、追試で用いたデータセットでは、キャラクタの撮影環境における点光源だけでなく、各キャラクタごとに元々設定されたシェーダーなどもそのまま用いて画像を収集しました。学習が収束しない可能性もありましたが、追試した限りでは、 Khungurnの実装の結果と大きく変わらず陰影の表現ができているようでした。以下が前髪によって影ができていたキャラクタ正面画像を入れた際の比較です。
Reset Image | ||||
---|---|---|---|---|
Khungurnの実装 | ||||
古澤の実装 |
Khungurnの実装では、入力画像および出力画像の画像サイズは、256pxです。追実装するにあたって、出力画像サイズがさらに大きくなれば、用途の幅も広がる可能性を考え、Talking Head Animeのモデルの出力に対し、超解像度モデルを通して512pxの画像を得る実験も行いました。
超解像度処理によって、アーティファクトが目立ってしまう部分もありますが、出力サイズが上がることによって解像感が上がるプラスの効果もあるように感じました。今回公開したデモでは、処理時間やユーザーへのデータ負荷の観点から出力サイズは256pxのままにしましたが、応用先によっては超解像度処理を掛けてもよいと思います。
昨今、virtual youtuberの文化の盛り上がりに応じて、誰でも簡単にキャラクタを動かす技術の需要は高まっていると思います。しかし、冒頭で紹介したように3Dモデルを思いのままに作成する技術は専門的で、知識の習得も容易ではないと思います。それに対して、今回の技術は落書き程度しか絵を描けない人でも、自分の描いたキャラクタを動かせるようになる大変興味深い技術だと思います。
そのうえ、落書き程度もかけない人でも、近年の画像処理技術・深層学習を用いれば、タグのような文字情報のみから自分の好きなキャラクタを生成したり、自分の好きなキャラクタを混ぜ合わせたようなキャラクタを生み出すことすら可能になってきています。つまり、もはや自分の好きなキャラクタを動かすのに、絵を描くことすら必要なくなってきている時代です。その中で、この技術は沢山の応用先が考えられる興味深い技術でした。これからさらに「誰でもキャラクタを作り、そのキャラクタを動かせる」技術が世間に浸透した時に、どのような新たな研究やエンターテインメントが生まれるのか楽しみです。
[Khugurn] Pramook Khungurn, 'Talking Head Anime from a Single Image', 紹介記事 https://pkhungurn.github.io/talking-head-anime/
[Rivers2010] Alec Rivers, Takeo Igarashi, Frédo Durand, '2.5D cartoon models', ACM Transactions on Graphics, July 2010 Article No.59 https://doi.org/10.1145/1778765.1778796
[Igarashi2005] Takeo Igarashi, Tomer Moscovich, John Forbes Hughes, 'As-Rigid-As-Possible Shape Manipulation', SIGGRAPH '05 ACM SIGGRAPH 2005 Papers, July 2005 Pages 1134–1141 https://dl.acm.org/doi/10.1145/1186822.1073323
[Pumarola2019] Albert Pumarola, Antonio Agudo, Aleix M. Martinez, Alberto Sanfeliu, Francesc Moreno-Noguer, 'GANimation: Anatomically-aware Facial Animation from a Single Image', International Journal of Computer Vision (IJCV), 2019 https://arxiv.org/abs/1807.09251
[Zhou2016] Tinghui Zhou, Shubham Tulsiani, Weilun Sun, Jitendra Malik, Alexei A. Efros, 'View Synthesis by Appearance Flow', European Conference on Computer Vision (ECCV), 2016 https://arxiv.org/abs/1605.03557