論文まとめ：BANMo: Building Animatable 3D Neural Models from Many Casual Videos

# はじめに
CVPR2022にacceptされたらしき以下の論文
[1] G. Yang, et. al. BANMo: Building Animatable 3D Neural Models from Many Casual Videos. CVPR2022
のまとめ。

- 論文
https://arxiv.org/pdf/2112.12761.pdf

- project page
https://banmo-www.github.io

- githubコード
https://github.com/facebookresearch/banmo

<font color="blue">一部書きかけ</font>

# 概要
- NeRF的なしくみで新視点からのレンダリングを行う系の論文
- 複数の単眼ビデオから人や動物の3Dモデルを生成するが、SMPLモデルなどを明示的には使わない
- 他のdeformable な NeRF手法と同様、canonical spaceで色や密度を表現する

![スクリーンショット 2022-04-28 3.26.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/1d373640-acb5-e5c0-75ed-09ffc1e88398.png)

# 手法の全体像

![スクリーンショット 2022-04-18 22.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/2f10f2d8-4905-a7a3-889f-2d88b5f737f7.png)

# shape and appearance model
## canonical shape model
canonical spaceの座標
${\rm \bf X}^* \in \mathbb{R}^3$: カラー
に対し、NeRFと同様
${\rm \bf c}^t \in \mathbb{R}^3$: カラー
${\rm \bf \sigma} \in \mathbb{R}^1$: 密度
とし、これに加えて
${\rm \bf \psi} \in \mathbb{R}^{16}$: canonical embedding
を定義する。（詳細は後述）

このそれぞれをMLPから出力させる。

```math
\begin{eqnarray}
{\bf c}^t &=& {\rm \bf MLP}_{\rm \bf c}({\rm \bf X}^*,{\rm \bf v}^t, {\rm \bf \omega}^t_e), \tag{1} \\
\sigma &=& \Gamma_{\beta} ({\rm \bf MLP}_{\rm SDF}({\rm \bf X}^*)), \tag{2} \\
{\bf \psi} &=& \Gamma_{\bf \psi} ({\rm \bf MLP}({\rm \bf X}^*)), \tag{3} \\
\end{eqnarray}
```

ここで
${\rm \bf v}^t \in \mathbb{R}^2$: t時における向き
${\rm \bf \omega}^t\_{e} \in \mathbb{R}^{64}$: 環境コードで、学習対象
とする。環境コードはNeRF 原論文には無いが、今回は複数のビデオを使用するため、ビデオごとの環境を表す変数として導入する。また
${\rm \bf MLP}\_{\rm SDF}$: はsigned distance functionとするので、shape表面からの距離となり、これに平均０、スケールβの cumulative distribution function of the Laplace distribution Γ を作用させるので、shapeに近いほど大きな値となる。

以上は全体の中ではこの部分。

![スクリーンショット 2022-04-28 3.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/38520dc8-b6af-42b5-58fa-5c9f218875e3.png)


## space-time warping model
canonical spaceとcamera spaceとの変換を以下で定義する。

- forward warping function・・・canonical space から t frameのcamera space への変換
$\mathcal{W}^{t,\rightarrow} : {\rm \bf X}^* \rightarrow {\rm \bf X}^t$

- backward warping function・・・t frameのcamera space から canonical space への変換
$\mathcal{W}^{t,\leftarrow} : {\rm \bf X}^* \leftarrow {\rm \bf X}^t$

全体の中のこの部分。

![スクリーンショット 2022-04-28 3.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/9975681a-def6-60b0-19d3-2c50716d881c.png)

## Volume rendering
${\rm \bf x}^t \in \mathbb{R}^2$: tフレームにおける画像上の点
${\rm \bf X}^t\_i \in \mathbb{R}^3$: その点からの光線上における i 番目のサンプリング点
$o \in [0, 1]$: opacity
$\delta_i$: i番目のサンプリング点からその隣の点までの距離
$\sigma_i = \sigma \left( \mathcal{W}^{t, \leftarrow} \left( {\rm \bf x}^t \right) \right)$: i番目のサンプリング点に対応する密度
として、volume renderingはNeRFをdeformableなものに変形している。

```math
\begin{eqnarray}
{\rm \bf c}({\rm \bf x}^t) &=& \sum^N_{i=1} \tau_i {\rm \bf c}^t \left( \mathcal{W}^{t, \leftarrow} \left( {\rm \bf X}^t_i \right) \right) \\
 o({\rm \bf x}^t) &=& \sum^N_{i=1} \tau_i \\
\tau_i &=& \prod^{i-1}_{j=1} \exp{(-\sigma_i \delta_i)}_j (1-\exp{(-\sigma_i \delta_i)}_i) 
\end{eqnarray}
```

$\tau_i$ としてまとめているが、この値は i 番目のサンプリング点をcanonnical spaceに飛ばした点におけるカラーが画像上に反映される割合的な意味を持つだろう。

ここでcanonical spaceにおける期待値的な位置 ${\rm \bf X}^* ({\rm \bf x}^t)$ を求める。

```math
{\rm \bf X}^* ({\rm \bf x}^t) = \sum^N_{i=1} \tau_i \left( \mathcal{W}^{t, \leftarrow} \left( {\rm \bf X}^t_i \right) \right), \tag{4}
```

これに対して、別の時間 t' に

```math
{\rm \bf x}^{t'} = \Pi^{t'} \left( \mathcal{W}^{t, \rightarrow} \left( {\rm \bf X}^* ({\rm \bf x}^t) \right) \right), \tag{5}
```

とそれをforward warpingし、さらにpinholeカメラモデルで画像上にproject $\Pi^{t'}$ して画像上の点 x における位置を求める際に、予めcanonical space上で点になってるので計算が楽。

画像上のtからt'へのflowは

```math
\mathcal{F} ({\rm \bf x}^t, t \rightarrow t') = {\rm \bf x}^{t'} - {\rm \bf x}^t \tag{6}
```

これをlossで使用する。

## Blend skinning deformation
他のdeformableなNeRF手法と同様、任意の座標 x を近傍の関節の動きに付随させて変形する。そのときにどの関節に対してどれくらいの割合で付随するかを表す重み W を用いる。これら関節の動き、及び重み W はニューラルネットに学ばせる。


まず
$\omega\_r^t$: tフレームにおける root poseを表す latent code
$\omega\_b^t$: tフレームにおける body poseを表す latent code
${\omega}\_b^*$: tフレームにおける rest poseを表す latent code

として、これらからニューラルネットで

$G^t \in SE(3)$: tフレームにおける root pose の transformation。
$J\_b^t \in SE(3)$: tフレームにおける b 番目の bone の body pose の transformation
$J\_b^{*} \in SE(3)$: tフレームにおける b 番目の bone の rest pose の transformation

を推定する。

```math
\begin{eqnarray}
{\rm \bf G}^t &=& {\rm MLP}_{\rm \bf G}({\rm \bf \omega}^t_r) \\
{\rm \bf J}^t_b &=& {\rm MLP}_{\rm \bf J}({\rm \bf \omega}^t_b) \tag{10} \\
{\rm \bf J}^*_b &=& {\rm MLP}_{\rm \bf J}({\rm \bf \omega}^*_b) \\
\end{eqnarray}
```

${\rm \bf \omega}^t\_r, {\rm \bf \omega}^t\_b, {\rm \bf \omega}^*\_b$ は128次元で学習対象。

また重みは学習対象の latent code $\omega\_b$ を用いて

```math 
\mathcal{S} : ({\rm \bf X}, {\rm \bf \omega}_b) \rightarrow W \in \mathbb{R}^B
```

で求める。$\mathcal{S}$ に関しては後述。
${\rm \bf W}^{t, \rightarrow}$: canonical space から camera space へ transformする際の重み
${\rm \bf W}^{t, \leftarrow}$: camera space から canonical space へ transformする際の重み
とすると、

```math 
\begin{eqnarray}
{\rm \bf W}^{t, \rightarrow} &=& \mathcal{S} ({\rm \bf X}^*, {\rm \bf \omega}^*_b) \\
{\rm \bf W}^{t, \leftarrow} &=& \mathcal{S} ({\rm \bf X}^t, {\rm \bf \omega}^t_b)
\end{eqnarray}
```

となる。

この重み、及び点 x に関わる関節 b に対する transformation を用いると、連動する関節で加重平均した transformation は

```math
\begin{eqnarray}
{\rm \bf J}^{t, \rightarrow} &=& \sum^B_{b=1} {\rm \bf W}^{t, \rightarrow}_b \left( {\rm \bf J}^t_b \left({\rm \bf J}^{*}_b \right)^{-1}  \right) \\
{\rm \bf J}^{t, \leftarrow} &=& \sum^B_{b=1} {\rm \bf W}^{t, \leftarrow}_b \left( {\rm \bf J}^*_b \left({\rm \bf J}^{t}_b \right)^{-1}  \right) \tag{9}
\end{eqnarray}
```

となるので、canonical space から camera space への transform 及びその逆は

```math
\begin{eqnarray}
{\rm \bf X}^t &=& \mathcal{W}^{t, \rightarrow} ({\rm \bf X}^*) = {\rm \bf G}^t ({\rm \bf J}^{t, \rightarrow} {\rm \bf X}^*), \tag{7} \\
{\rm \bf X}^* &=& \mathcal{W}^{t, \leftarrow} ({\rm \bf X}^*) = {\rm \bf J}^{t, \leftarrow} \left( \left( {\rm \bf G}^t \right)^{-1} {\rm \bf X}^* \right), \tag{8}
\end{eqnarray}
```

となるだろう。

## skinning weights
ニューラルネットで直接重み $W$ を推定させようとすると、うまくいかないらしい。そこでデフォルトでそれらしい値を与え、そこからの差分を学習させるようにする。

デフォルトの値は、座標 x から近い関節に大きいものとしたい。実際には以下のような Mahalanobis 距離とする。

```math
{\rm \bf W}_{\sigma} = ({\rm \bf X} - {\rm \bf C}_b)^T {\rm \bf Q}_b ({\rm \bf X} - {\rm \bf C}_b) \tag{11}
```

${\rm \bf C}_b$ は bone の中央点。

ここで分散共分散行列の逆行列（precision matrix）を以下のように

```math
{\rm \bf Q}_b = {\rm \bf V}_b^T {\rm \bf \Lambda}_b^0 {\rm \bf V}_b
```

固有値分解する。boneの中央点と ${\rm \bf V}_b$ は画像ごとに位置が異なるので、transformさせる。

```math
({\rm \bf V}_b | {\rm \bf C}_b) = {\rm \bf J}_b ({\rm \bf V}_b^0 | {\rm \bf C}_b^0)
```

${\rm \bf V}_b^0, {\rm \bf C}_b^0, {\rm \bf \Lambda}_b^0$ も学習対象。

デフォルトの W にMLPから推定させた ${\rm \bf W}\_{\Delta} = {\rm \bf MLP}\_{\Delta} ({\rm \bf X}, {\rm \bf \omega}\_b)$ を加えて求める重みとする。

```math
{\rm \bf W} = \mathcal{S} ({\rm \bf W}, {\rm \bf \omega}_b) = \sigma_{softmax} = ({\rm \bf W}_{\sigma} + {\rm \bf W}_{\Delta}) \tag{12}
```



## registration via canonical embeddings

(3)式の $\psi({\rm \bf X}^*)$ は以下の図の上のように

![スクリーンショット 2022-05-07 4.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/cc320772-c677-4bfe-e989-dfb6a91291c2.png)

canonical space における位置をembeddingしたものと考える。

一方で図の下側のように学習済み DensePose (=CSE？) をfine-tuneしたものを使って Image space における対象物体の位置をembeddingしたもの $\psi\_I^{t} ({\rm \bf x}^t)$ を出力させる。

対応する点では $\psi({\rm \bf X}^*), \psi\_I^{t} ({\rm \bf x}^t)$ の２つが一致するように学習させる。これにより、両者の一致度で対応する点を判断できるようになる。具体的には以下の様にして image space 上の点に対する canonical space 上の点を求める。

```math
\begin{eqnarray}
\hat{{\rm \bf X}^*}({\rm \bf x}^t) &=& \sum_{{\rm \bf X} \in {\rm \bf V}^*} {\tilde{{s}^t}}({\rm \bf x}^t, {\rm \bf X}){\rm \bf X} \tag{13}\\
&=& \sum_{{\rm \bf X} \in {\rm \bf V}^*}{\sigma_{softmax} \left( \alpha_s \langle \psi^t_I \left( {\rm \bf x}^t \right), \psi \left( {\rm \bf X} \right)  \rangle \right){\rm \bf X}}
\end{eqnarray}
```

$\langle .,.  \rangle$ はコサイン類似度。この式は分かりにくいが、意味するところは以下のようなものか？

（１）image space上の点に対してcanonical spaceからグリッドでサンプリングする。その集合が ${\rm \bf V}^*$ 。
（２）サンプリングした各点に対してコサイン類似度を求め、ピークのコントロールのためそれを $\alpha\_s$ 倍する。
（３）サンプリングした点に関して softmax をかけ、各点ごとの確率を出す
（４）それにサンプリングした点をかけて足すので、それらしい点の加重平均値が出力される。

# loss
まず学習対象は以下のパラメータ。

![スクリーンショット 2022-05-08 23.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b714b1ed-4420-fcba-0dda-0f2daa1e856f.png)

## lossの全体像
lossの全体は以下。

```math
\mathcal{L} = \left( \mathcal{L}_{sil} + \mathcal{L}_{rgb} + \mathcal{L}_{OF} \right) + \left( \mathcal{L}_{match} + \mathcal{L}_{2D-cyc} \right) + \mathcal{L}_{3D-cyc}
```

右辺１つ目の括弧内が reconstruction 系 loss、２つ目の括弧内が feature registration 系 loss。

## reconstruction 系 loss
まず silhouete に関する loss。

```math
\mathcal{L}_{sil} = \sum_{{\rm \bf x}^t} \| {\rm \bf o}({\rm \bf x}^t) - \hat{{\rm \bf s}({\rm \bf x}^t)}  \|^2 \tag{14.a}
```

画像上の全ての点に関して加算する。

次に、$\mathcal{L}\_{rgb}$ はNeRFと同様。

```math
\mathcal{L}_{rgb} = \sum_{{\rm \bf x}^t} \| {\rm \bf c}({\rm \bf x}^t) - \hat{{\rm \bf c}({\rm \bf x}^t)}  \|^2 \tag{14.b}
```

次に、画像上での t から t + 1 への flow に関する loss。

```math
\mathcal{L}_{OF} = \sum_{{\rm \bf x}^t, (t, t')} \| \mathcal{F} ({\rm \bf x}^t, t \rightarrow t') - \hat{\mathcal{F}} ({\rm \bf x}^t, t \rightarrow t') \|^2 \tag{14.c}
```

ノルム内１項目は(6)式の推定したflow。２項目のtargetはよくあるflow networkで計算する。

## feature registration 系 loss
feature registration 系 loss の１つ目は画像上の座標 x に対して(4)式で推定した canonical space上の位置と、(13)式で推定した canonical space 上の位置との差を計算する。

```math
\mathcal{L}_{OF} = \sum_{{\rm \bf x}^t, (t, t')} \| \mathcal{F} ({\rm \bf x}^t, t \rightarrow t') - \hat{\mathcal{F}} ({\rm \bf x}^t, t \rightarrow t') \|^2_2 \tag{15}
```

２つ目は画像上の点と、それを通る光線の平均的な位置を(13)式で canonical space に飛ばし、さらに $\mathcal{W}^{t, \rightarrow}$ で再度 camera space に変換した点を画像上に projectしたもの、との差を計算する。

```math
\mathcal{L}_{2D-cyc} = \sum_{{\rm \bf x}^t} \| \Pi^t \left( \mathcal{W}^{t, \rightarrow}  \left( \hat{{\rm \bf X}^*} \left( {\rm \bf x}^t \right) \right) \right) - {\rm \bf x}^t \|^2_2 \tag{16}
```

## camera space 〜 canonical space 間の一貫性 loss
上記の $\mathcal{L}_{2D-cyc}$ はcamera space から canonical spaceへは embedding ψ 、その逆では forward warping function を使ったが、ここでは行きも帰りも warping function を用いる。

```math
\mathcal{L}_{3D-cyc} = \sum_i \tau_i \| \mathcal{W}^{t, \rightarrow}  \left( \mathcal{W}^{t, \leftarrow}  \left( {\rm \bf X}^t_i, t \right), t \right) - {\rm \bf X}^t_i \|^2_2 \tag{17}
```
$\tau_i$ を入れる事で、画像上の色に影響している点により多くの重みをかける。

## root pose initialization
これらlossの最適化は高次の非線形関数になるため、局所解に陥りやすい。そこで、各frameの root pose の初期値をPoseNetからおおよそ推定させる。

この root pose 初期値を ${\rm \bf G}\_0^t$ とすると、そこからの差分だけを MLPで推定する形とする。

```math
{\rm \bf G}^t = {\rm \bf MLP}_G ({\rm \bf \omega}^t_r) {\rm \bf G}^t_0 \tag{18}
```

## active sampling over
略

# 実験の設定
- surfaceを得るため 256 x 256 x 256 のグリッドに対して marching cubes algorithmを用いた
- 骨格モデルの boneの数は25

## dataset
「同じ物体をスマホ等の簡易的単眼カメラで撮影した複数のビデオ」という今回の問題設定に合うよう、独自データを作っている。具体的には、動物に関しては 同一猫を撮影した複数のビデオ（casual-cat）や、同一人物を撮影した複数のビデオ（casual-human）。

それぞれのビデオに対して、１）物体のmask（silhouette）はPointRendモデルを用いて抽出し、２）フレーム間のoptical flowは VCN-robust を用いて抽出する。

また定量的評価として、
- AMA human dataset
- animated objects dataset(TurboSquid から入手したシミュレーションモデル）
を用いる。

## 比較対象モデル
- Nerfies
- ViSER[3]・・・同じ著者がNeurIPS2021で発表したモデル

## メトリクス
推論とtargetとのメッシュの頂点の近さを計測する。

具体的には
${\rm \bf S}^*$: target のメッシュの頂点群
$\hat{\rm \bf S}$: 推論したメッシュの頂点群
として、推論shapeと target の shape を Iterative Closest Point というもので近づけた後に以下の Chamfer distances（<font color="blue">これの原論文は不明</font>）

```math
d_{\rm CD} \left( {\rm \bf S}^*, \hat{\rm \bf S} \right) = \left( \sum_{x \in {\rm \bf S}^*} {\min_{y \in \hat{\rm \bf S}}} \| x - y \|^2_2 \right) + \left( \sum_{y \in \hat{\rm \bf S}} {\min_{x \in {\rm \bf S}^*}} \| x - y \|^2_2 \right)
```

で求める。右辺第１項はtargetのある頂点に対して推論した頂点群の中から最も近いものを選び、その距離（L2の２乗）を求める。それを全てのtargetの頂点に対して足す。右辺第２項は推論とtargetを入れ替える。


# 定量的評価

![スクリーンショット 2022-05-09 1.47.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/f711bf17-d11c-015e-2624-c8b00a8957df.png)

いずれの比較モデルよりも精度がよい。またViSERもNerfiesも今回の問題設定に合わせてmaskを使用する等の前処理を行なっている。

# ablation study

# reference
[2] Natalia Neverova, David Novotny, Vasil Khalidov, Marc Szafraniec, Patrick Labatut, and Andrea Vedaldi. Continu- ous surface embeddings. In NeurIPS, 2020.

[3] GengshanYang,DeqingSun,VarunJampani,DanielVlasic, Forrester Cole, Ce Liu, and Deva Ramanan. Viser: Video- specific surface embeddings for articulated 3d shape recon- struction. In NeurIPS, 2021.