論文まとめ：PIFuHD: Multi-Level Pixel-Aligned Implicit Function for High-Resolution 3D Human Digitization

# はじめに
再来月開催予定（コロナの影響で無理？）のCVPR2020 に acceptされた論文から以下
[1] S. Saito, et. al. "PIFuHD: Multi-Level Pixel-Aligned Implicit Function for High-Resolution 3D Human Digitization"
のまとめ。

arXiv:
https://arxiv.org/abs/2004.00452

project ページ：
https://shunsukesaito.github.io/PIFuHD/

githubのページは用意されてるが、現状（4/18）ではコードがupされてない。
https://github.com/shunsukesaito/PIFuHD

関連論文として、著者のサイトーさんが ICCV に出した PIFu モデル。
https://arxiv.org/abs/1905.05172
とそれに対する私のまとめ：
https://qiita.com/masataka46/items/86588703ed24265ba4a0

# 概要
1. 画像から人の形状を復元するモデル
2. ベースは著者らが以前作成した PIFu モデル
3. coarse-to-fine な手法で高解像度な surface 出力する


# 手法
### ベースの PIFu な部分。

<img width="723" alt="PIFuHD_img_30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/f34430ad-8799-6dc4-6540-f7c2cbbbd942.png">

詳細は昨日まとめた PIFu 参照
https://qiita.com/masataka46/items/86588703ed24265ba4a0

ここではざっくりと。

${\bf X} = ({\bf X}\_x, {\bf X}\_y, {\bf X}\_z) \in \mathbb{R}^3$ ・・・カメラ座標での位置  
$x = \pi ({\bf X})$ ・・・それを画像へ project した入力画像上の座標
${\bf I}$ ・・・入力画像
$\Phi (x, {\bf I})$ ・・・入力画像をconvolution層で encode したもの

この encode したものと depth から多層パーセプトロンで陰関数を求める。

```math
f({\bf X}, {\bf I}) = g(\Phi (x, {\bf I}), {\bf X}_x) \tag{1}
```

この陰関数が $1$ の時に体表面の内側、$0$ の時に外側、境界（つまり体表面）を $0.5$ とする。

```math
f({\bf X}, {\bf I}) =\begin{cases}
    1 & if \ {\bf X} \ is \ inside \ mesh \ surface \\
    0 & otherwise 
  \end{cases}

```

### PIFu と違う点１：Front-to-Back inference

PIFu と違う点の１つ目は、以下の左側のように画像からは見えてない人の後ろ側を先に推定する点。

<img width="971" alt="PIFuHD_img_32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/e62c685f-87bc-712f-fd77-509d25d85702.png">

従来の PIFu ではこの仕組みの中で見えてない後ろ側を推定していた。これにより PIFu の役割が増え、学習が困難になっていた。 

そこで、本手法では pix2pixHD を用いて後ろ側、及び前側の正規化したものを推定させる。

よって PIFu ユニットに入力されるのは 512x512 の入力画像 ${\bf I}\_L$ と 前側の normal map ${\bf F}_L$ と後ろ側の normal map ${\bf B}_L$ 。これを反映して（１）式の陰関数を書き直すと

```math
f^L({\bf X}, {\bf I}) = g^L(\Phi^L (x_L, {\bf I}_L, {\bf F}_L, {\bf B}_L), {\bf X}_x) \tag{2}
```

って感じ。

### PIFu と違う点２：multi-level な PIFu  

PIFu と違う点の２つ目は以下の図の Fine PIFu 部分のような refine する部分を加えた点。

<img width="971" alt="PIFuHD_img_33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/7a3620ab-63f8-3489-7efa-20a500cd798e.png">

この Fine PIFu は後に PIFu でencodeされた $\Phi$ が加わるので、それに対する refine な部分を学習すると考えられる。

Fine PIFu からの出力は

```math
f^H({\bf X}, {\bf I}) = g^H(\Phi^H (x_H, {\bf I}_H, {\bf F}_H, {\bf B}_H), \Omega ({\bf X})) \tag{3}
```

### Loss
Loss も PIFu から変化している。PIFu では L2 だったが、本手法は binary cross entropy としている。<font color="red">（なぜか不明）</font>

$f^L({\bf X})$ と $f^H({\bf X})$ とをまとめて $f^{(L,H)}({\bf X})$ と書いて、

```math
\mathcal{L}_o = \sum_{x \in \mathcal{S}} \lambda f^* ({\bf X}) \log f^{(L,H)}({\bf X}) + (1-\lambda)(1-f^*({\bf X}))\log \left( 1 - f^{(L,H)}({\bf X}) \right) \tag{4}
```

とする。$f^*$ は target。$\lambda$ は各項の重みを調整する係数。$\mathcal{S}$ は体表面（付近）。データのサンプリング方法は PIFu と同様。

# 実験と結果

### 1. 定量的評価
RenderPeople dataest 及び BUFF dataset を用いて各種メトリクスで評価した結果は以下。

<img width="508" alt="PIFuHD_img_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/0a98fd0f-d633-6cd3-0447-9d2f791996e3.png">

PIFu 単体とあまり変わらない印象。

### 2. 定性的評価

<img width="991" alt="PIFuHD_img_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/a5f40e8e-a48d-1f9d-54a8-d96ffa6793a5.png">

他の手法と比べると正確かつ繊細だが、やはり PIFu 単体とあまり変わらない印象。

### 3. ablatio study 
1)Fine module だけ、2) それに global image feature を加えたもの、3)PIFu 単体、4)本手法 とで比較したものは以下。

<img width="989" alt="PIFuHD_img_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/78ca7730-8e40-1ff5-b0fb-b6a923abd616.png">

こう見ると PIFu 単体と比べて、より繊細になっている気がする。