私は2019年に一枚のキャラクターの正面画像を動かすニューラルネットワークのシステムを作りました。しかし、顔を回転することを除くと、そのシステムは目と口を閉じることしか出来ませんでした。今回はそのシステムに新しいネットワークを追加することで、キャラクターが表現できる目と口の形を増やし、さらに眉毛と目の虹彩も動かせるようにしました。それにより出力される画像はより表情豊かになり、様々な感情も表せるようになりました。
入力画像 | 嬉び | 悲しみ | 怒り |
うんざり | 見下し/煽り | 上目遣い | ガンギマリ顔 |
新しいシステムでは、3Dモデル用のモーションデータを用いてキャラクターの2D画像を動かすことが出来ます。
自分の動きをリアルタイムにキャラクターに反映させるツールも作りました。
上述のツールを改造して、自分の動作を記録することで、後から複数のキャラクターに歌を歌わせたりもしました。
簡単にバーチャルYouTuberになれることを目標に、私は2019年に一枚のキャラクターの正面画像を動かすニューラルネットワークのシステムを作りました。そのシステムでは6次元のポーズベクトルを指定することにより、キャラクターに6種類の動きをつけられます。しかし、これは実践的だとは言えません。システムが出力する画像は目と口を閉じることしか出来ないのに対し、企業様のバーチャルYouTuberは表情が豊かです。目や口をの様々な形に動かすこと出来て、眉毛や目の虹彩も動かせます。私はシステムを改善するべく2020年はそれらの動きに対応するための研究に励みました。この記事はその結果のレポートです。
一昨年に作ったシステムの入力は二つあります。一つはキャラクターの正面画像、もう一つはポーズを指定するための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つのサブネットワークで構成されています。それぞれのサブネットワークは顔の特定の部分しか変形しません。ポーズベクトルは個々のサブネットワークに入力出来るように分解されます。
眉毛モーファーは先ず眉毛セグメンター(eyebrow segmenter)というサブネットワークを用いて眉毛を入力画像から切り抜きます。次に眉毛ワーパー(eyebrow warper)という別のサブネットワークを使って、切り抜いた眉毛を変形し、その結果を顔の画像へ戻します。
図2―3:眉毛モーファーの構成。 |
その二つのサブネットワークは構成が似ています。エンコーダーデコーダーネットワーク(encoder-decoder network)を用いて入力画像と(ネットワークによってはなくてもよい)ポーズベクトルを特徴テンソルに変換し、それを使っていくつかのステップで入力画像を処理します。画像処理のステップは3種類あります。
眉毛セグメンターは二種類の部分的画像変更を行い、眉毛ワーパーは切り抜いた眉をワープして、変形された眉毛を顔画像と結合させて再び顔へ戻します。ネットワークの構成は以下の図の通りです。
シャープな眉毛を生成するには、眉毛を他の顔の部分と別に処理することが重要だと発見しました。一つのネットワークで全部の顔の部分を変更させると眉毛はぼやけてしまいます。上述のネットワークを使用するのは眉毛の画素を保つバイアスを導入することであり、より鮮明な眉毛をもたらします。
正解画像 | 一つのネットワークで 全部の顔の部分を 変形する手法 | この記事の手法 |
このネットワーク構成は上述の二つのネットワークに似ています。入力画像と目と口に該当するポーズベクトルの部分をエンコーダーデコーダへ渡して特徴テンソルを生成し、その結果を用いて以下のステップで画像処理を行います。
この複雑な構成は試行錯誤して調整を行った結果です。一番目のステップのワープは虹彩の模様を保存するのに欠かせません。部分的画像変更で虹彩を変形させると描かれた模様が失われます。
正解画像 | 部分的画像変更で虹彩を変形する手法 | この記事の手法 |
そして、閉じた瞼に「シミ」を生じさせないために、最後に部分的画像変更を使用して瞼を処理することが必要です。最後のステップを除けば、瞼は最初のステップのワープによって変形されることになり、目の近くにある細いラインが潰れ、結果として瞼が汚れる傾向にあります。
正解画像 | ワープで 瞼を変形する手法 | この記事の手法 |
新しい顔モーファーを含んだシステムを使って、200名強のVTuberの顔アニメーションを生成しました。それらをアイキャッチャーにまとめましたが、以下でも視聴出来ます。
入力画像 | アニメーション |
以下は7つの表情をさせた一部のキャラクターの画像です。
上の図はシステムの汎用性を証明していると思います。男性のキャラクターにも女性のキャラクターにも対応でき、大きくて丸い目から小さくて細い目まで処理出来ました。髪の毛に部分的に隠された目も眼鏡越しに透けて見える目も問題なく変形されています。入力画像の口が閉まってる場合、前のシステムでは口を開けられない仕様でしたが、今回はそれなりに適切な形で口が開いてくれました。
システムのもう一つの長所は柔軟性です。いかなるポーズベクトルを出力する装置やプロセスとでも繋げられます。そのお陰で、私はシステムを使っていくつかのコンテンツとツールを作りました。
先ず、スライダーでキャラクターの表情と顔向きを変更するツールを作りました。
次に、3Dモデル用のモーションをポーズベクトルのシーケンスに変換するプログラムを書き、3Dモーション通りに2Dイラストレーションを動かせるようにしました。さらにそのプログラムを使って、4本のミュージックビデオを制作しました。
TikTokの「ウィンク」
エイリアンエイリアン
おちゃめ機能
乙女解剖
自分の動きをリアルタイムにキャラクターへ反映するツールも開発しました。iFacialMocapというiOSのアプリを用いて、iPhoneのフロントカメラの映像から50のブレンドシェイプのパラメータを推理しPCへ送ります。それを受け取りポーズベクトルへと変換してネットワークに渡すことで、キャラクターにカメラへ映った人物のポーズを取らせることが出来ます。
上述のツールを改造して動きを記録出来るようにした後、外郎売を唱えたり、朗読したり、歌を口パクしたりするモーションを収録しました。そのモーションを複数のキャラクターに反映し、以下のデモンストレーションビデオを作りました。
外郎売を唱える。
芥川龍之介の「トロッコ」を朗読する。
委員長おめでとうの歌を口パクする
GOMIKASU-Original Mix-を口パクする
ばかみたい (龍が如くシリーズの楽曲)を口パクする
上の動画では、キャラクターが私の顔と口の動きをうまく模倣できていることが御覧いただけたかと思います。私のシステムは以下のツイートにある動画のような「だめだねミーム」でよく知られたSiarohinらのシステム
アニメキャラクターの表情を変更するためのニューラルネットワークの新しい構成を紹介しました。この新しいネットワークは感情を表すのに欠かせない顔の部分(眉毛・瞼・虹彩・口)を全部変形させられ、キャラクターに様々な表情と質のいいリップシンクをさせることが出来ます。口と目を閉じさせることしか出来ない2019年のネットワークと比べ、機能が大幅に追加されました。新しいネットワークを含んだシステムは、前のシステムと同じく、どんなポーズベクトルのデータソースとでも組み合わせることができ、それを使って様々なコンテンツとツールを作ることが出来ました。
紹介した手法の制限といえば、3Dモデルが出来る動きしか画像に反映させない点です。そのため、まだ人間の顔の動き全てをアニメキャラクターの画像に模倣させられません。しかし、点の大きさまで虹彩を縮める等の人間には出来ない動きをさせることは可能です。
このプロジェクトは前のシステムをより実践的にしたいという動機から生まれました。表情の乏しさの問題は確かに解決しましたが、残っている問題はたくさんあります。正面画像では見えないが顔が回転して見えてくる部分はぼやけますし、入力画像には様々な制限があって使い勝手がよくありません。また、サブネットワークの数が増えてモデルのファイルサイズは360MBから600MBになりました。これらの問題は次回のプロジェクトで解決したいと思います。
最後に、この記事は簡潔さを重んじて書かれたため、文献レビュー、データセットの作り方、先行研究との比較等の詳細を大いに省いています。それらは記事の完全版に書いてありますので、ご興味ありましたら是非読んでみてください。(申し訳ございませんが、完全版は英語です。)
私自身はグーグル合同会社でソフトウェアエンジニアをやらせていただいてますが、このプロジェクトは仕事と全く関係ありません。会社のリソースを使わずに自由時間でやった趣味に過ぎません。グーグルに就職する前は大学院でコンピュータグラフィックスを研究したことはありますが、今は普通のソフトウェアエンジニアでグーグルマップのバックエンドを開発して生計を立てています。この記事に書いてある見解は私個人のものであり、会社の見解ではありません。
Yanghua Jin様、Alice Maruyama様、Cory Li様、Shinji Ogaki様、Panupong Pasupat様、Jamorn Sriwasansak様、Yingtao Tian様、Mamoru Uehara様、Jayakorn Vongkulbhisal様に感謝申し上げます。
Project Bougainvillea