けやみぃアーカイブ

CV勉強中の大学生のアウトプットです

【論文紹介】Latent Image Animator

記事タイトルをクリックして記事ページに移動すると数式が正しく表示されます

【6/20追記】実装が公開されたので、実装から読み取れる情報を追記しました。

タイトル:Latent Image Animator: Learning to Animate Images via Latent Space Navigation
arXivリンク:https://arxiv.org/abs/2203.09043
プロジェクトページ:https://wyhsirius.github.io/LIA-project/

ICLR2022の論文です。

簡単にまとめ

どんなもの?

Driving動画に沿ってSource画像のImage animationを行うモデル。(プロジェクトページの動画を見ると一目でわかると思います)

何が新しい?

MotionをM個の直交基底の線形和で表すようにしたこと。

手法詳細

以下図はすべて論文からの引用になります。

モデル構成

モデルの概要図は以下のようになっています。本モデルはEncoder$ E $、Generator$ G $、Motion Dictionary$ D_{m} $から構成されます。

モデル概要
まず下側のSource画像の処理から見ていきましょう。$ E $はSource画像から特徴マップ$ x^{enc}_{1 ... N} $と潜在変数$ z_{s \to r} $を出力します。rはreferenceの意味で、$ z_{s \to r} $は平均化されたポーズ(真顔で正面を向いた)の画像を生成します。これは実際にAppendixに生成画像が掲載されています。
Reference画像の生成

次にDriving画像の処理の方です。Source画像と同じように$ E $(Source画像に用いたのと同じモデル)に通し$ z_{d \to r} $を得ます。そこから更にMLPに通し、$ A_{r \to d} \in \mathbb{R}^M $を得ます。この$ A_{r \to d} $の要素を係数として、学習パラメータとして用意しておいた$ M $個の列ベクトル$ D_m = (d_1, d_2, ... d_M) $の線形和をとります(ただし$ D_m $を直交化してからこの計算を行います)。こうして得られたベクトル$ w_{r \to d} $はDriving画像のポーズを表します。

こうして得られた$ z_{s \to r} $と$ w_{r \to d} $を足し合わせた$ z_{s \to d} $を潜在変数として$ G $に入力します。$ G $はStyleGAN-likeな構造です(なので$ G $の左にある青正方形は4×4の固定ノイズです)。ただしToRGBまでの処理が異なります。Generatorの構造は以下のようになっています。

Generatorの構造
StyleGANでは存在しなかったwarpingの処理が追加されています。ここではStyleConvが生成した特徴マップ$ x $をさらに3x3 Convにかけて、1チャネルと2チャネルの特徴マップを生成します。1チャネルの方はSigmoid関数に通し、$ m_i $とします。2チャネルの方はtanh関数に通し、$ \phi_i $とします。そしてSource画像を$ E $に通した時の特徴マップ$ x^{enc}_i $を$ \phi_i $によって関数$ \mathcal{T} $(pytorchだとgrid_sample?)でwarpし、また$ m_i $をマスクとし、$ m_i \odot \mathcal{T}(\phi_i, x^{enc}_i) $をToRGBへと渡します。マスクによって変更する箇所・しない箇所を選択できることになります。

【6/20追記】実装では$ m_i \odot \mathcal{T}(\phi_i, x^{enc}_i) $の部分が$ m_i \odot \mathcal{T}(\phi_i, x^{enc}_i) + (1-m_i) \odot x $として計算されていました。

Loss

動画データセットを用いる前提なので、学習時にはSource画像とDriving画像は同一動画・同一人物の別フレームの画像であり、Driving画像の再構成を学習させることに注意してください。

Reconstruction Loss

生成画像$ x_{s \to d} $とDriving画像$ x_d $のL1 loss。

Perceptual Loss

FOMMでも使用されていた、multi-scaleでのPerceptual Lossです。$ x_{s \to d} $と$ x_d $を256、128、64、32のそれぞれにリサイズしVGG19に入力し、中間層での特徴マップでL1 lossをとります。

Adversarial Loss

non-saturating adversarial lossです。

これらの重み付き和をGeneratorのLossとします。論文の実験では、Perceptual Lossの係数を10、他は1としたようです。

なお、Discriminatorについては詳しく書かれていませんでした。StyleGAN同様、Adversarial Lossに加えてR1正則化あたりも必要になるんでしょうか…?

【6/20追記】実装ではAdversarial Lossのみが使用されていました。

実験結果

VoxCeleb、TaichiHD、TED-talksのデータセットでそれぞれ学習させています。VoxCelebは顔、TaichiHD、TED-talksは全身の動画データになります。

他手法との比較では、おおむね本手法が最も良い結果を示しています。なお、評価値はすべて生成画像とGTとの比較であり、AKDは対応するキーポイントの座標の誤差、MKRはGTで検出されているのに生成画像では検出できなかったキーポイントの割合、AEDはIdentity Lossと同様のものです。

他手法比較

また、User studyでは20人に他手法での生成結果と本手法での生成結果を並べてどちらがよりリアルか?を選んでもらうという方法をとっていますが、特にVoxCelebでは圧倒的に本手法の方がリアルだと選ばれています。

User study

その他、Motion Dictionaryの可視化も行っています。デモページのMotion Dictionary Linear Manipulationの動画がわかりやすいです。(なお実験では$ M = 20 $としています。) 特にTalking head(256x256)の$ d_2 $は「視線を左から右に動かす」というかなり細かいMotionに対応していて面白いと思いました。

また、Motion Dictionaryの有無についても検証されています。w/o dictionaryでは、Driving画像の肌感などが生成画像に反映されてしまっています。逆にwith dictionaryでは、ポーズ情報だけを反映するという本来の目的を達成できていることがわかります。

Motion Dictionaryの有無

感想

本手法ではMotion情報を$ M $次元ベクトルというかなり少ないパラメータで表せるので、lip syncなど他の分野にも応用できそうと思いました。 また、multi-domain(写真→アニメとか)での生成もできたら面白そうです。

ちなみに実装は近いうちに公開されるみたいです。 github.com