論文まとめ：Neural Body: Implicit Neural Representations with Structured Latent Codes for Novel View Synthesis of Dynamic Humans

# はじめに
CVPR2021より以下の論文
[1] S. Peng, et. al. Neural Body: Implicit Neural Representations with Structured Latent Codes for Novel View Synthesis of Dynamic Humans. CVPR2021
のまとめ

- CVF open access
https://openaccess.thecvf.com/content/CVPR2021/html/Peng_Neural_Body_Implicit_Neural_Representations_With_Structured_Latent_Codes_for_CVPR_2021_paper.html

- github
https://github.com/zju3dv/neuralbody
git clone して学習させるまで一苦労

# 概要
- 複数視点からの画像から人の３次元再構成を行うしくみ
- 人のポリゴンモデル SMPL を用いる
- フレームにわたってパラメータを共有するところが特長的


# 手法
## 全体像

![スクリーンショット 2022-04-09 2.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/d552bc72-48d8-d064-66ea-c2667a42df86.png)

外観すると、複数方向の画像からSMPLモデルの頂点群を生成し、それをvoxel的に拡散させる。そこから線形な内挿で点をサンプリングし、そこにおける密度とカラーを推定する。それらから画像上にレンダリングする。

$c \in N\_c$: カメラのindex。
$t\in N\_t$: フレームのindex。
として、ビデオの各フレームを
```math
\{ \mathcal{I}^c_t | c = 1, \ldots, N_c, t=1, \ldots, N_t \}
```
とする。

## step1 Structured latent codeの作成

まずあるフレーム t の複数カメラからの画像を用いて、[2]のSMPLモデルを推定する。以下は複数カメラの様子。（著者らのproject page[4]より）

![スクリーンショット 2022-04-10 4.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/2a139b6a-4896-2b8f-91db-cf0e4e2017a5.png)

この推定には[3]のTotal Captureの仕組みを使っている。以下は[3]のFigure2。

![スクリーンショット 2022-04-09 3.17.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/72c6f258-cf32-1372-e03c-dff51c78182d.png)

論文ざっくりしか読んで無いので推測だが、複数カメラからの画像から、まず(a)のキーポイント、(b)のpoint cloudを推定する。次にそれらから最適化手法でSMPLを推定する。ちなみにこの論文の最大のテーマはbodyのみならず、手や顔の詳細なモデルを同時に推定するところだが、本論文[1]ではbodyのみ利用している（ハズ）。

この推定によってSMPLのパラメータ（$S\_t$）であるshape, pose, rootのtransformが求まる。

SMPLモデルにおいてはメッシュの頂点は6,890個存在する。

```math
\mathcal{Z} = \{ {\bf \mathcal{z}}_1, {\bf \mathcal{z}}_2, \cdots, {\bf \mathcal{z}}_{6890} \}
```

これらはpose, shape, transformからの演算で求まる。

以上をまとめると、こんな感じか。

![スクリーンショット 2022-04-10 1.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/4b28c5e3-5970-a9b8-ceb3-4a62ed2c835d.png)

## step2 code diffusion
上記で生成されたSMPLモデルのポリゴン頂点群を 5mm x 5mm x 5mm voxelに変換する。voxelの中に頂点があればその値、複数あれば平均値とする処理を行う。

そうすると、かなりスパースなものができあがるので、3D系のconv層でたたみ込んで値を拡散させる。このときにSparse-convolutionを用いる。

たたみ込んだvoxelはlatent code $\psi ({\rm x}, \mathcal{Z}, S\_t)$ を持つようにする。図にするとこんな感じか。

![スクリーンショット 2022-04-10 2.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/321866cd-df19-e45f-7395-d632220ec7b3.png)

空間上の任意の点におけるlatent codeの値は３次元で線形に内挿して求める。

## step3 Density and color regression
latent code $\psi ({\rm x}, \mathcal{Z}, S\_t)$ から密度とカラーの推定をニューラルネットで行う。

まず密度は４層のMLP $M\_{\sigma}$ を使う。

```math
\sigma_t ({\rm \bf x}) = M_{\sigma} (\psi ({\rm \bf x}, \mathcal{Z}, S_t)) \tag{1}
```

$\mathcal{r}\_{\rm \bf d} ({\rm \bf d})$: directionをエンコードしたもの
$\mathcal{r}\_{\rm \bf x} ({\rm \bf x})$: 位置をエンコードしたもの
${l}\_t$: フレーム t 特有の情報を128次元にエンコードしたもの
として、カラーは２層のMLP $M\_{c}$ を使う。

```math
{\rm \bf c}_t ({\rm \bf x}) = M_c (\psi ({\rm \bf x}, \mathcal{Z}, S_t), \mathcal{r}_{\rm \bf d} ({\rm \bf d}), \mathcal{r}_{\rm \bf x} ({\rm \bf x}), l_t) \tag{2}
```

![スクリーンショット 2022-04-10 5.03.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/4178940e-55c4-9908-76b4-3e7eed026372.png)

## step4 rendering
NeRF論文と同様に、サンプリングしてレンダリングする。

```math
\begin{eqnarray}
\hat{C}_t({\rm r}) &=& \sum^{N_i}_{k=1} T_k (1- \exp{(-\sigma_t({\rm \bf x}_k)\delta_k)) {\rm \bf c}_t ({\rm \bf x}_k)} \tag{3} \\
&where& \ T_k = \exp{\left(- \sum^{k-1}_{j-1} \sigma_t({\rm \bf x}_j) \delta_j \right)} \tag{4}

\end{eqnarray}
```

各変数はNeRF論文と同様。

# loss
lossはレンダリングした画像上のRGB値に関するもののみ。

```math
L = \sum_{{\rm \bf r} \in \mathcal{R}} \| \hat{C} ( {\rm \bf r}) - C ({\rm \bf r}) \|^2_2 \tag{6}
```

# ZJU-MoCap datasetを用いた実験と結果
## ZJU-Mocap datasetとは
著者らは新たに ZJU-MoCap datasetというものを作成した。これの概要は以下
- 9つのビデオからなり、それぞれ人がパンチやキックをしたり、ぐるぐる回ったり、手を振り回したりと、種々の動作をしている
- これを２１個のビデオカメラから同時に撮影している
- ２１個のカメラのうちtrainigとして4つを用い、残りをtest用としている
- 各ビデオは60から300フレーム

このデータは著者らのgithubページから辿っていくとフリーで入手できる。

## メトリクス
定量的評価のメトリクスは以下の２つ
- peak signal-to-noise ratio(PSNR)
- structural similarity index(SSIM)

## 比較対象
定量的評価の比較対象は以下のモデル
1. Neural Volumes [5]
2. Neural Textures [6]
3. NHR [7]

## 定量的評価
PSNR, SSIMで上記３モデルと比較した結果は以下。

![スクリーンショット 2022-04-16 2.57.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/c4377be2-37e9-36a2-1ef6-c20d7cc2089b.png)

各rowはビデオの行動。どの行動においてもPSNR, SSIMいずれも最も精度がよい。

## 定性的評価
test dataに対する定性的表以下は以下。比較対象は上記３モデル＋NeRF。

![スクリーンショット 2022-04-16 3.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/ae1bce9a-f87e-ba9a-bbc5-42d4f9dc0c1c.png)

いいとこのtest dataを引っ張ってきたにせよ、これを見る限り、本手法が最も精度がよい。

## 3D reconstructionの定性的評価
以下の手法と比較した。
1. COLMAP
2. DVR
3. PIFuHD
PIFuHDに関しては拙著
https://qiita.com/masataka46/items/d717a9d57eaa44ea197d
など参照。

１と２はそもそも人の形状がまともに再構築できなかった。よって以下の図ではPIFuHDとの比較のみ。

![スクリーンショット 2022-04-16 3.31.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/4532ba2f-2f09-0b77-ae50-bc788a7c6f0f.png)

本手法では推定したneural radiance fieldsをvoxel化し、それをmarching cubes algorithmでメッシュ化している。

この図を見る限り、PIFuHDよりも精度がよさげ。


# reference

[2] Matthew Loper, Naureen Mahmood, Javier Romero, Gerard Pons-Moll, and Michael J Black. Smpl: A skinned multi-person linear model. ACM TOG, 2015.

[3] Hanbyul Joo, Tomas Simon, and Yaser Sheikh. Total cap- ture: A 3d deformation model for tracking faces, hands, and bodies. In CVPR, 2018.

[4] https://zju3dv.github.io/neuralbody/

[5] Stephen Lombardi, Tomas Simon, Jason Saragih, Gabriel Schwartz, Andreas Lehrmann, and Yaser Sheikh. Neural volumes: Learning dynamic renderable volumes from images.In SIGGRAPH, 2019.

[6] Justus Thies, Michael Zollho ̈fer, and Matthias Nießner. Deferred neural rendering: Image synthesis using neural textures. ACM TOG, 2019. 

[7] Minye Wu, Yuehao Wang, Qiang Hu, and Jingyi Yu. Multi-view neural human rendering. In CVPR, 2020.