見出し画像

LivePortraitの論文を読む

LivePortrait の論文を読んで、内部の仕組みがどうなっているかを解説します。使ってみた的な内容ではないです。


LivePortraitとは

LivePortrait は、ソースとなる静止画のPortrait画像を、参照Portraitアニメーションに合わせて、動かすことができるAI技術です。(ちなみにPortrait 画像とは顔写真のことです。モナリザの絵画の写真も主に顔が写っているのでPortrait画像と言えます。)
ソース画像と参照アニメーションは別人物でも動かすことができます。つまり、人間の表情の動きでアニメ画像を動かしたりもできます。
実写のアニメーションで、アニメキャラクターや動物のソースPortrait画像を動かすこともできます。

今研究の貢献はこれらの内容になります。

  • 高品質なアニメーション生成能力

    • 拡散モデルベースの手法よりも良い品質を実現。

  • 高効率な処理速度

    • 拡散モデルを採用していないので、高速な処理が可能。

  • 優れた制御可能性

    • スティッチングやリターゲティングモジュールにより、細かい制御も可能。

既存技術の課題

  • 拡散モデルベースの手法における課題

    • 高品質なアニメーションを生成できるが、計算コストが高く、細かい制御が難しい。

  • 陰的キーポイントベースの手法における課題

    • 計算効率は良いが、生成されるアニメーションの品質や汎化性能に限界がある。

補足:

  • 陰的キーポイントベースとは、顔の特徴点の位置ではなく、画像全体から得られる情報のことです。

  • 陰的キーポイントベースの手法では、複雑な状況でも、機械学習で柔軟に陰的キーポイントを抽出して、生成する手法となります。

データセット

LivePortrait の学習で用いられたデータセットについて説明します。

LivePortrait では、高品質で多様なアニメーションを生成するために、公開のものと独自で収集したデータセットを組み合わせたデータセットを使っています。

公開データセット

使用されているデータセットの特徴はこのようになっています。

$$
\begin{array}{|c|c|c|c|}\hline
データセット名 & 説明 & 特徴 & データの種類 \\ \hline
VoxCeleb & 大規模な話者識別データセット & 様々な話者の顔の動画、表情や頭部の動きのバリエーションが豊富 & 顔の動画 \\ \hline
MEAD & 感情的な表情生成のための音声-視覚データセット & 様々な感情表現の顔の動画 & 顔の動画, 音声 \\ \hline
RAVDESS & 感情的な音声と歌のデータセット & 音声と顔の表情の動画 & 顔の動画, 音声, 歌 \\ \hline
AAHQ & 高品質なスタイル画像データセット & アニメや漫画のキャラクターなど、様々なスタイルの顔画像 & 顔画像 \\ \hline
\end{array}
$$

独自にデータセット

研究で独自に収集したデータセットについて説明します。データセットの特徴は以下のようになっていました。

  • 4K解像度の Portrait 動画

    • 高解像度で撮影された Portrait 動画。詳細な顔の特徴を捉えるために使用。

  • 200時間のトークヘッド動画

    • 人物が話している様子を撮影した動画。口の動きの学習に利用。

  • LightStageデータセット

    • 高精度な3D顔モデルを構築するためのデータセット。顔の形状やテクスチャの学習に利用。

  • スタイル画像

    • アニメや漫画のキャラクターなど、様々なスタイルの顔画像。AAHQデータセットを補完するために使用。

収集したデータセットの前処理も行なっています

  • 顔の検出と位置の正規化

    • 顔の位置を検出し、顔が中心に映るように処理

まとめ:

LivePortraitでは、高品質で多様なアニメーションを生成するために、大規模で高品質、多様なデータセットを組み合わせることで、モデルの汎化性能と表現力を向上させています。

モデルと学習

LivePortraitでは2段階に分けていつくかのモデルモジュール群を学習させています

学習: Stage1

1段階目の学習では、同一人物のPortrait画像の顔の動きを編集するための学習を行います

https://arxiv.org/pdf/2407.03168

1段階目で学習されたモデルは以下の4つのモジュールから成ります

  • Appearance Feature Extractor ($${\mathcal{F}}$$)

    • ソース画像 $${I_{s}$$ から3次元の顔を再現する情報 ($${f_{s}}$$) を作成するモデル

  • Motion Extractor ($${\mathcal{M}}$$)

    • 参照画像 $${I_{d}}$$ の表情の特徴を抽出します

    • 顔のキーポイント検出モデル ($${x_{c}}$$)

    • 頭部姿勢推定モデル ($${R}$$)

    • 表情変形推定モデル ($${s, \delta, t}$$)

  • Warping Module ($${\mathcal{W}}$$)

    • $${\mathcal{M}}$$ と $${\mathcal{F}}$$ の結果をもとに入力画像をどの程度動かすか決定するモデル

    • $${f_{s}}$$ をMotion Extractor $${\mathcal{M}}$$ の結果に合わせて変換

  • Decoder ($${\mathcal{G}}$$)

    • $${\mathcal{W}}$$の結果から最終的な出力画像 $${I_{p}}$$ を構築するモデル

    • 高品質な画像生成ができるように既存研究を使っています

学習

$${I_{s}}$$ と $${I_{d}}$$ は同一人物の異なる表情をした画像です。
表情の特徴をもとに変換して、 $${I_{s}}$$を$${I_{d}}$$に似せた画像を出力せるようにモデルを学習させます。

損失関数はモデルの出力画像 $${I_{p}}$$ と目標の画像 $${I_{d}}$$ の表情のキーポイント位置の差やGANによる損失と設定しています。

学習: Stage2

2段階目の学習では、異なる人物の画像から表情・顔の動きを再現するための学習を行います。

https://arxiv.org/pdf/2407.03168

この学習では新しい モジュールを導入して、異なるソースと参照画像をうまくブレンドできるように、キーポイントなどの特徴を補正します。
これらのモジュールは小さい MLP になっているので計算負荷を大きく増やさずに機能してくれます。

  • スティッチングモジュール ($${\mathcal{S}}$$)

    • ソース画像を異なる参照画像の特徴をそのまま使って、動かすと肩の部分などがズレたり微妙なノイズが入ってしまったりします。

    • このモジュールでは最終的な画像の肩が大きく動いたり、ノイズが入らないように特徴量を補正します

    • これにより、異なる大きな画像サイズや複数顔の同時アニメーションが可能になります

  • 目のリターゲティングモジュール ($${\mathcal{R_{eyes}}}$$)

    • 目が閉じているか・開いているかを補正します

    • 大きな目を持つ人物の動きで小さい目の人物を動かそうとすると、完全に目を閉じるように動かすことができないという問題を緩和しています

  • 口のリターゲティングモジュール ($${\mathcal{R_{lip}}}$$)

    • こちらは、目のリターゲティングモジュールの機能と似ています

    • 大きな口・小さい口のキャラクター間の差を補正します

学習

新しく追加したモジュールのみのパラメータを学習で更新します。State1で学習させたモデルモジュールのパラメータは固定化します。

それぞれのモジュールは異なる損失関数で学習を進めます

スティッチングモジュール ($${\mathcal{S}}$$)

  • スティッチングモジュールを使用した時と使用しなかった時の最終画像の肩領域の差を小さくするように学習を行います

目のリターゲティングモジュール ($${\mathcal{R_{eyes}}}$$)

  • 複数の点を合算して損失を計算します

  • 1: 目のリターゲティングモジュールを使用した時と使用しなかった時の最終画像の「目の領域以外」の差を小さくするように学習を行います

  • 2: 目の開き具合のパラメータをランダムに設定して、最終的な画像そのパラメータ通りに目が開いているかを評価する損失関数を設定します

    • 最終的な画像の目の開き具合はどのように取得しているか論文から読み取れませんでした。キーポイントなどから取得していると思われます。

ソースの画像(左)を目の開き具合のパラメータを変えて動かした時の例
パラメータを小さくするほど目が閉じていって、大きくするほど目が開いている

口のリターゲティングモジュール ($${\mathcal{R_{lip}}}$$)

  • 目のリターゲティングの損失と同じように計算します

  • 1: 口のリターゲティングモジュールを使用した時と使用しなかった時の最終画像の「口の領域以外」の差を小さくするように学習を行います

  • 2: 口の開き具合のパラメータをランダムに設定して、最終的な画像そのパラメータ通りに口が開いているかを評価する損失関数を設定します

実装

研究では Stage1 の学習に A100 GPUを8枚使って、10日間の学習を行っています。Stage2 の学習は2日間で学習をさせたようです。

データセットの利用方法もStageによって異なります.
Stage1 では全てのデータセットを使用し、Stage2 ではリアルな人物の動画データを中心に使用しています。

結果

ソースと参照アニメーション画像が同じ時のタスクで比較すると、全指標でこれまでの提案手法の結果を上回り、SOTAを達成できています。

ソースと参照アニメーション画像が異なる場合でも1つを除いたすべての指標で最も良い結果が得られていて、今提案手法の有効性が確認できました。

実行結果の例を見てもソース画像を参照アニメーションに合わせてかなり自然に動かせていることがわかります。

今手法は拡散モデルを使う手法ではなく、一回のforwardプロセスで画像を生成できます。実際に、RTX4090を使うと1枚の生成が12.8msで完了したと書いてありました。これは FPS 78.125 に相当しますので 、GPUさえあればリアルタイムで使用しても滑らかに画像を動かすことができそうです。

ソースの画像(左の一枚)を参照画像アニメ(上の画像連番)で動かした時の結果(最も下の画像連番)

まとめ

今回は、参照アニメーションに合わせてPortrait 画像を動かすことができる技術 LivePortrait の内部技術についてまとめました。
巨大で高品質なデータセットを構築しているのが最近の研究らしいなと感じました。
結果もかなりクオリティが高く、自分も実際に使ってみましたがうまくソース画像がアニメや絵画であっても問題なく動かすことができていて素晴らしいなと思いました。
DiffusionModel を使わずに、キーポイントの抽出とその補正を機械学習で行っている点も最近では珍しく興味深かったです。

最後まで読んでいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?