\( \def\sc#1{\dosc#1\csod} \def\dosc#1#2\csod{{\rm #1{\small #2}}} \)

 

キャラクター画像一枚で
より表情豊かなアニメーションを生成する
システムを作ってみた

プラムック・カンガーン

 


上の動画中のキャラクターはバーチャルYouTuberまたはそれに関連したキャラクターです。この記事中の画像や映像は彼らのファンアート・二次創作です。[footnote]

 

私は2019年に一枚のキャラクターの正面画像を動かすニューラルネットワークのシステムを作りました。しかし、顔を回転することを除くと、そのシステムは目と口を閉じることしか出来ませんでした。今回はそのシステムに新しいネットワークを追加することで、キャラクターが表現できる目と口の形を増やし、さらに眉毛と目の虹彩も動かせるようにしました。それにより出力される画像はより表情豊かになり、様々な感情も表せるようになりました。

入力画像 嬉び 悲しみ 怒り
うんざり 見下し/煽り 上目遣い ガンギマリ顔

新しいシステムでは、3Dモデル用のモーションデータを用いてキャラクターの2D画像を動かすことが出来ます。

自分の動きをリアルタイムにキャラクターに反映させるツールも作りました。

上述のツールを改造して、自分の動作を記録することで、後から複数のキャラクターに歌を歌わせたりもしました。

 

1   はじめに

簡単にバーチャルYouTuberになれることを目標に、私は2019年に一枚のキャラクターの正面画像を動かすニューラルネットワークのシステムを作りました。そのシステムでは6次元のポーズベクトルを指定することにより、キャラクターに6種類の動きをつけられます。しかし、これは実践的だとは言えません。システムが出力する画像は目と口を閉じることしか出来ないのに対し、企業様のバーチャルYouTuberは表情が豊かです。目や口をの様々な形に動かすこと出来て、眉毛や目の虹彩も動かせます。私はシステムを改善するべく2020年はそれらの動きに対応するための研究に励みました。この記事はその結果のレポートです。

2   手法の要約

一昨年に作ったシステムの入力は二つあります。一つはキャラクターの正面画像、もう一つはポーズを指定するための6次元のポーズベクトルです。それらを受け取り、システムは指定されたポーズを取ったキャラクターの画像を出力します。時間の経過と共にポーズベクトルを変更させることでアニメーションを生成することも出来ます。ポーズベクトルは6次元のベクトルなので、キャラクターは6種類の動きが出来ます。しかし、顔を回転させられることを除くと、口を目を閉じることしか出来ません。

キャラクターにポーズを取らせる過程は2つのステップに分解され、それぞれが個別のネットワークを用いて行われます。顔モーファー(face morpher)というネットワークはキャラクターの表情を変更し、顔ローテイター(face rotator)は顔を回転します。

図2―1:2019年に作ったシステムの構成。キャラクターはKizuna AI (© Kizuna AI)。

動きの種類を増やすためには、前に使ったデータセットより大きいものを準備しなければなりません。以前に収集した8000個の3Dモデルから、共通する顔の部分の動きを39種類特定し、それらが含まれるデータセットを作りました。(どういう動きなのかはこちらに書いてあります。)これは企業VTuberの顔の可動な部分(眉毛、虹彩、瞼、口)を網羅しており、結果的にポーズベクトルの次元数は6から42に変わりました

大きくなったポーズベクトルに対応するため、顔モーファーを作り直しました。新しい構成は以下の図の通りです。

図2―2:新しいフェイスモーファーは2つのステップで表情を変更させます。一番目のステップは眉毛を変形し、二番目は目と口を変形します。キャラクターはときのそら (© Tokino Sora Ch.)です。

新しい顔モーファーは眉毛モーファー(eyebrow morpher)と目と口モーファー(eye & mouth morpher)という2つのサブネットワークで構成されています。それぞれのサブネットワークは顔の特定の部分しか変形しません。ポーズベクトルは個々のサブネットワークに入力出来るように分解されます。

2.1   眉毛モーファー

眉毛モーファーは先ず眉毛セグメンター(eyebrow segmenter)というサブネットワークを用いて眉毛を入力画像から切り抜きます。次に眉毛ワーパー(eyebrow warper)という別のサブネットワークを使って、切り抜いた眉毛を変形し、その結果を顔の画像へ戻します。

図2―3:眉毛モーファーの構成。

その二つのサブネットワークは構成が似ています。エンコーダーデコーダーネットワーク(encoder-decoder network)を用いて入力画像と(ネットワークによってはなくてもよい)ポーズベクトルを特徴テンソルに変換し、それを使っていくつかのステップで入力画像を処理します。画像処理のステップは3種類あります。

  1. 部分的画像変更:特徴テンソルからアルファマスクと新しい画像を生成し、それらを使ったアルファブレンドで入力画像を変更させます。新しい画像は入力画像との差分を表し、アルファマスクはその差分を入力画像のどこへ適用するかを表します。Pumarolaらはこの画像処理の手法で写真に映った人間の表情を変更します[2018]
  2. 結合:特徴テンソルでアルファマスクを作り、アルファブレンドで二枚の画像を結合します。
  3. ワープ(warp):特徴テンソルはアピアランスフロー(appearance flow)という出力画像の各画素へ入力画像のどこからコピーするかを示すマップに変換し、それに従って入力画像から新しい画像を生成します[Zhou et al. 2016]

眉毛セグメンターは二種類の部分的画像変更を行い、眉毛ワーパーは切り抜いた眉をワープして、変形された眉毛を顔画像と結合させて再び顔へ戻します。ネットワークの構成は以下の図の通りです。


図2―4:眉毛セグメンターの構成。


図2―5:眉毛ワーパーの構成。

シャープな眉毛を生成するには、眉毛を他の顔の部分と別に処理することが重要だと発見しました。一つのネットワークで全部の顔の部分を変更させると眉毛はぼやけてしまいます。上述のネットワークを使用するのは眉毛の画素を保つバイアスを導入することであり、より鮮明な眉毛をもたらします。

図2―6:一つのネットワークで全部の顔の部分を変形する手法の効果とこの記事の別のネットワークで眉毛を処理する手法の効果の比較。

2.2   目と口モーファー

このネットワーク構成は上述の二つのネットワークに似ています。入力画像と目と口に該当するポーズベクトルの部分をエンコーダーデコーダへ渡して特徴テンソルを生成し、その結果を用いて以下のステップで画像処理を行います。

  1. 目と虹彩をワープします。
  2. 上のステップの結果を部分的画像変更でリタッチします。
  3. 再度、部分的画像変更で瞼を変形させます。


図2ー7:目と口モーファーの構成。

この複雑な構成は試行錯誤して調整を行った結果です。一番目のステップのワープは虹彩の模様を保存するのに欠かせません。部分的画像変更で虹彩を変形させると描かれた模様が失われます。

図2-8:部分的画像変更で虹彩を変形した結果とこの記事のワープで虹彩を変形した結果の比較。キャラクターはウェザーロイド Airi (© Weathernews Inc.)。

そして、閉じた瞼に「シミ」を生じさせないために、最後に部分的画像変更を使用して瞼を処理することが必要です。最後のステップを除けば、瞼は最初のステップのワープによって変形されることになり、目の近くにある細いラインが潰れ、結果として瞼が汚れる傾向にあります。

図2-9:ワープで瞼を変形した結果とこの記事の部分的画像変更で瞼を変形する結果の比較。ワープの結果では瞼にシミが出来ました。これはネットワークが正解画像の赤い枠にある短い線を下へと引っ張って形を壊した結果です。一方、この記事で提案する手法では単色で瞼が塗られ、汚れのない画像が出力されました。キャラクターはヤマトイオリ(©株式会社アップランド)。

3   結果

新しい顔モーファーを含んだシステムを使って、200名強のVTuberの顔アニメーションを生成しました。それらをアイキャッチャーにまとめましたが、以下でも視聴出来ます。

入力画像 アニメーション
図3ー1:システムで生成されたアニメーション。

以下は7つの表情をさせた一部のキャラクターの画像です。

図3ー2:システムで生成された表情。[copyright]

上の図はシステムの汎用性を証明していると思います。男性のキャラクターにも女性のキャラクターにも対応でき、大きくて丸い目から小さくて細い目まで処理出来ました。髪の毛に部分的に隠された目も眼鏡越しに透けて見える目も問題なく変形されています。入力画像の口が閉まってる場合、前のシステムでは口を開けられない仕様でしたが、今回はそれなりに適切な形で口が開いてくれました。

システムのもう一つの長所は柔軟性です。いかなるポーズベクトルを出力する装置やプロセスとでも繋げられます。そのお陰で、私はシステムを使っていくつかのコンテンツとツールを作りました。

先ず、スライダーでキャラクターの表情と顔向きを変更するツールを作りました。

次に、3Dモデル用のモーションをポーズベクトルのシーケンスに変換するプログラムを書き、3Dモーション通りに2Dイラストレーションを動かせるようにしました。さらにそのプログラムを使って、4本のミュージックビデオを制作しました。


TikTokの「ウィンク」


エイリアンエイリアン


おちゃめ機能


乙女解剖

自分の動きをリアルタイムにキャラクターへ反映するツールも開発しました。iFacialMocapというiOSのアプリを用いて、iPhoneのフロントカメラの映像から50のブレンドシェイプのパラメータを推理しPCへ送ります。それを受け取りポーズベクトルへと変換してネットワークに渡すことで、キャラクターにカメラへ映った人物のポーズを取らせることが出来ます。

上述のツールを改造して動きを記録出来るようにした後、外郎売を唱えたり、朗読したり、歌を口パクしたりするモーションを収録しました。そのモーションを複数のキャラクターに反映し、以下のデモンストレーションビデオを作りました。


外郎売を唱える。


芥川龍之介の「トロッコ」を朗読する。


委員長おめでとうの歌を口パクする


GOMIKASU-Original Mix-を口パクする


ばかみたい (龍が如くシリーズの楽曲)を口パクする

上の動画では、キャラクターが私の顔と口の動きをうまく模倣できていることが御覧いただけたかと思います。私のシステムは以下のツイートにある動画のような「だめだねミーム」でよく知られたSiarohinらのシステム[Siarohin et al. 2019]と違い、顔の形を歪めずにイラストの美しさを保ちます。

you can have it I just got even better idea pic.twitter.com/LnCkMZK51K

— Cakewalking 5555+1 (@Tortokhod) July 17, 2020

4   おわりに

アニメキャラクターの表情を変更するためのニューラルネットワークの新しい構成を紹介しました。この新しいネットワークは感情を表すのに欠かせない顔の部分(眉毛・瞼・虹彩・口)を全部変形させられ、キャラクターに様々な表情と質のいいリップシンクをさせることが出来ます。口と目を閉じさせることしか出来ない2019年のネットワークと比べ、機能が大幅に追加されました。新しいネットワークを含んだシステムは、前のシステムと同じく、どんなポーズベクトルのデータソースとでも組み合わせることができ、それを使って様々なコンテンツとツールを作ることが出来ました。

紹介した手法の制限といえば、3Dモデルが出来る動きしか画像に反映させない点です。そのため、まだ人間の顔の動き全てをアニメキャラクターの画像に模倣させられません。しかし、点の大きさまで虹彩を縮める等の人間には出来ない動きをさせることは可能です。

このプロジェクトは前のシステムをより実践的にしたいという動機から生まれました。表情の乏しさの問題は確かに解決しましたが、残っている問題はたくさんあります。正面画像では見えないが顔が回転して見えてくる部分はぼやけますし、入力画像には様々な制限があって使い勝手がよくありません。また、サブネットワークの数が増えてモデルのファイルサイズは360MBから600MBになりました。これらの問題は次回のプロジェクトで解決したいと思います。

最後に、この記事は簡潔さを重んじて書かれたため、文献レビュー、データセットの作り方、先行研究との比較等の詳細を大いに省いています。それらは記事の完全版に書いてありますので、ご興味ありましたら是非読んでみてください。(申し訳ございませんが、完全版は英語です。)

お断り

私自身はグーグル合同会社でソフトウェアエンジニアをやらせていただいてますが、このプロジェクトは仕事と全く関係ありません。会社のリソースを使わずに自由時間でやった趣味に過ぎません。グーグルに就職する前は大学院でコンピュータグラフィックスを研究したことはありますが、今は普通のソフトウェアエンジニアでグーグルマップのバックエンドを開発して生計を立てています。この記事に書いてある見解は私個人のものであり、会社の見解ではありません。

スペシャルサンクス

Yanghua Jin様、Alice Maruyama様、Cory Li様、Shinji Ogaki様、Panupong Pasupat様、Jamorn Sriwasansak様、Yingtao Tian様、Mamoru Uehara様、Jayakorn Vongkulbhisal様に感謝申し上げます。


更新

Project Bougainvillea