論文まとめ：Nerfies: Deformable Neural Radiance Fields

# はじめに
ICCV2021より以下の論文
[1] Keunhong Park, Utkarsh Sinha, Jonathan T. Barron, Sofien Bouaziz, Dan B. Goldman, Steven M. Seitz, and Ricardo Martin-Brualla. Nerfies: Deformable neural radiance fields. In ICCV, 2021.
のまとめ

- project page
https://nerfies.github.io

- arXiv:
https://arxiv.org/abs/2011.12948

- github:
https://github.com/google/nerfies
ライセンス：apache2.0

# 概要
- スマホなどの簡易な単眼カメラから撮影した動画・画像群から人などのdeformableな物体をリアルに再現し、新視点からのレンダリングを行うしくみ
- NeRFを改良してdeformableな物体に対応できるよう neural deformation fieldなるものを導入した
- corse-to-fineな正則化手法で細部まで詳細なモデリングを達成した
- 背景を分けるための segmentation model とカメラの内部パラメータ等推定のための COLMAPを使用する

以下の図（Fig1）は全体の流れ。

![スクリーンショット 2022-05-02 15.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/8f63800d-5d1c-1cf0-5aa5-94e66c5b1ebe.png)

(a) casual capture でスマホ等の簡易な単眼カメラで動画や連続画像を撮影する。

(b) input images が撮影した動画や連続画像。これをモデルに入力し、学習する。

(c) nerfie novel views で学習したモデルから新視点の画像を生成できる。髪もきれいに再現できている。

(d) novel view depth のようにdepthも推定できる

# 背景
- 人の3D形状を復元する常套手段は研究室内で多数のカメラを同時に撮映し、これを用いることである。スマホのようなハンディな単眼カメラを用いる場合は難易度が高い
- さらに人は撮影している間に微妙に動いているし、髪やメガネなど部位によっては特に難しい

# 手法
## 全体像
以下の図（Figure2）を概観する。

![スクリーンショット 2022-05-03 7.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/aefa76f8-6649-8a9c-2319-d2396dfd133f.png)

まず、左側に各画像ごとの observation frame（spaceの間違い？）があり、中央にpose変化を修正した canonical frame （spaceの間違い？）がある。

observation space の各点は deformation field を経て canonical space へ写像される。

その canonical space 上の座標と向き、latent appearance code からNeRFの仕組みで色と密度を推定する。

## neural deformation field
NeRFとの違いでいうと、以下の２点が異なる。

- 座標 x は canonical space のものであること
- frameごとの latent appearance code ${\rm \bf \psi}\_i$ を入力に加える

そうすると
$F$: neural deformation fieldで中身はMLP。当然学習対象。
${\rm \bf x}$: observation frame 上の座標
${\rm \bf \omega}\_i$: latent deformation codeで、frameごとの対象物体の変形を表す。学習対象。
$T:({\rm \bf x}, {\rm \bf \omega}\_i) \rightarrow {\rm \bf x}'$: observation space から canonical space へのTransform。
${\rm \bf d}$: 向き
${\rm \bf \psi}\_i$: latent appearance code で frame ごとの露出とホワイトバランスを表す。学習対象。
として

```math
G({\rm \bf x}, {\rm \bf d}, {\rm \bf \psi}_i, {\rm \bf \omega}_i) = F(T({\rm \bf x}, {\rm \bf \omega}_i), {\rm \bf d}, {\rm \bf \psi}_i) \tag{1}
```

で密度とカラーを推定する。

transform T のMLPに関しては、$({\rm \bf x}, {\rm \bf \omega}_i) \rightarrow ({\rm \bf r}, {\rm \bf v})$ と座標 x における rodriguesベクトル r と translation v を推定する。

## elastic regularization
上記の様に frame ごとの transform を学習させるが、制約が無いと過適合してしまう。そこで transform T のヤコビ行列 ${\rm \bf J}\_T$ に対して制約を加える。

まずヤコビ行列を特異値分解して

```math
{\rm \bf J}_T = {\rm \bf U}{\rm \bf \Sigma}{\rm \bf V}^T
```

としたときに ${\rm \bf \Sigma}$ の特異値を1に近づけることでヤコビ行列のスケール変化を無くす・・・つまりtransformは局所的に一定であるとする。

${\rm \bf \Sigma}$ の具体的には対数をとり、それを単位行列の対数に近づける。

```math
L_{elastic}({\rm \bf x}) = \| \log{{\rm \bf \Sigma}} - \log{{\rm \bf I}}\|^2_F = \| \log{{\rm \bf \Sigma}} \|^2_F \tag{4}
```

このままではtransformを均一化するだけなので、「口元が緩む」ような部分的な変化が十分に反映されていない。よって以下の様に Geman-McClure robust error function を導入して修正する。

```math
\begin{eqnarray}
L_{elastic}({\rm \bf x}) &=& \rho(  \| \log{{\rm \bf \Sigma}}\|^2_F, c) \tag{5} \\
\rho (x, c) &=& \frac{2(x/c)^2}{(x/c)^2 + 4} \tag{6} 
\end{eqnarray}
```

今回は $c = 0.03$ を用いているが、その場合以下の図の様な形状となる。

![g_c_graph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b4440cc3-5925-9291-809f-739bdbbc908c.png)

## background regularization
対象物以外の background を変化させないようにする正則化。

```math
L_{bg} = \frac{1}{K} \sum^K_{k=1} \| T({\rm \bf x}_k) - {\rm \bf x}_k \|_2
```
当然、事前に forground と backgroundを分けておく必要がある。今回はsegmentationモデルを用意してこれを実現する。

## coase-to-fine deformation regularization
neural deformation field に x, d を入力する際に、NeRF同様 sinusoidal positional encoding

```math
\gamma ({\rm \bf x}) = ({\rm \bf x}, \cdots, \sin{(2^k \pi {\rm \bf x})}, \cos{(2^k \pi {\rm \bf x})}, \cdots)
```

と γ により $\mathbb{R}^3 \rightarrow \mathbb{R}^{3+6m}$ へencodingするが、m をいくつにするかが悩みどころだそう。以下の図の様に

![スクリーンショット 2022-05-04 3.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/5127211e-3bfc-00ff-9f79-caa6ea48aaf4.png)

m=4 では笑顔の変化が捉えられてないし、 m=8 では顔の角度変化が捉えられてない。m が増えればより詳細な変化が捉えられるだろうが、過適合する可能性がある。

よって学習の初期には m を小さなものとして low-resolution に特化した学習を行い、学習の進行とともに m を上げていく手法をとる。

具体的にはencodeの各要素に対して重み $w$ を乗じて実現する。

## loss
上記２つのlossにNeRF的なレンダリングした画像のrgb値に関するlossを加える。

```math
L_{total} = L_{rgb} + \lambda L_{elastic-r} + \mu L_{bg}
```

今回は $\lambda = \mu = 0.001$ 。 

# 実験と結果
- 活性化関数を softplus に変えた以外は NeRF の学習方法に準拠
- 8個のV100で16時間かかった

## データの取得方法
- 顔の周囲を45度程度の範囲で様々な角度から撮影
- 背景は固定
- 20秒間で600フレーム程度の画像を取得
- ぼやけた画像は削除

本手法はスマホなどからの単眼動画から行うが、新視点からのレンダリングを評価するため、以下の画像の様なデータの取得方法を行なった。

![スクリーンショット 2022-05-04 4.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/23a0bc2e-574a-3625-0712-5b7179e0d25a.png)

## 定量的評価
他のモデルとのPSNR, LPIPSの比較は以下。

![スクリーンショット 2022-05-04 4.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/dd183d1f-aec6-407e-cad4-061d47c2aca8.png)

下の方の行は ablation study。

## 定性的評価
NSFFやNV, NeRFとの比較は以下。

![スクリーンショット 2022-05-04 4.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/d5fe5098-69ba-dda1-e087-1ab04d68f799.png)