論文まとめ：Lions and Tigers and Bears: Capturing Non-Rigid, 3D, Articulated Shape from Images

# はじめに
CVPR2018より以下の論文
[1] S. Zuffi, et. al. "Lions and Tigers and Bears: Capturing Non-Rigid, 3D, Articulated Shape from Images".CVPR2018
のまとめ

CVF open access:
https://openaccess.thecvf.com/content_cvpr_2018/html/Zuffi_Lions_and_Tigers_CVPR_2018_paper.html

著者のコード：
https://github.com/silviazuffi/smalr_online

# 概要
- 動物の3D-shapeを推定するモデル
- SMALモデルに対し、動物の画像を用いてrefineすることで、より詳細なモデルを作成した
- 具体的には、画像中の動物におけるlandmarkとシルエットが推定した3D-shapeを画像にprojectしたものに適合するように、3D-shapeをrefineする
- texture mapも生成できる

以下の図で下行が対象の画像、中央行がそれに対する推定したshape、上行がそれにtextureを貼ったもの。

![SMALR_img20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/f2736406-52e2-3857-666b-2db1dbf8ba80.png)


# 背景
気になったところだけざっくりまとめ。
- 人の場合と異なり、動物のリアルなshape推定、motion captureなどは現状ではない
- 人の場合は3D-scannerを用いて形状のデータを得るが、野生動物だとそれが難しいからだ
- これがあると、アニメでリアルな動きを再現したり、実験室の場で実験動物の動きを理解したり、動物の動きを真似たロボットを作成するのに役立つだろう

# 提案手法
## SMALモデル
開始点のSMALモデル[2]について。このモデルは5種類の動物（猫・犬・馬・牛・カバ）の計41toysをスキャンして、それに適合するようにパラメータを調整することで作られている。

出来上がった全ての動物に対するテンプレートの頂点群を ${\bf v}\_{template}$ として、ある特定の種類の動物（例えば猫）の典型的な頂点は

```math
{\bf v}_{shape}(\beta) = {\bf v}_{template, 0} + B_s \beta \tag{1}
```

で得られる。ここで
$\beta$ ：PCAで次元圧縮したshapeを表すベクトル
$B\_s \in \mathbb{R}^{20}$ ：βからshapeの変形ベクトルを復元するdeformation matrix

これで得られるのはrootの位置がworld座標上で　(0,0,0) かつ典型的な姿勢（いわゆるT-bone）をしたもの。これに対して任意の位置、姿勢における頂点群を表現するには

${\bf r}$ ：33個ある関節の親関節に対するロドリゲス角度。rootの関節はglobalなrotationを表す
${\bf t} = (t\_x, t\_y, t\_z)$ ：root関節のtranslation
として、

```math
{\bf v}(\beta, {\bf r}, {\bf t}) \tag{2}
```

となる。

## SMALモデルを画像に割り当てる

ここは３step。
１）$f\_x = 1000$ と想定してtranslationのz軸の値を求める
２）translationのz軸の値からtranslationとrotationを求める
３）求めたtranslationとrotationを初期値として、エネルギー方程式を解き、βを求める

### 1) translationのz軸の値を求める

まず各変数の定義
$I^{(i)}$ ：N枚ある動物が映った画像の i 番目
$S^{(i)}$ ：i 番目画像内の動物のシルエット
${\bf v}(\beta^{(i)}, {\bf r}^{(i)}, {\bf t}^{(i)})$ ：i 番目の画像内の動物の（２）式で表された頂点群のworld座標
${\bf K}^{(i)}$ ：n_k個ある画像上のlandmarkの座標の集合
${\bf k}^{(i)}\_j, (1 \leq j \leq n\_k)$ ：j 番目の landmarkの座標
${\bf v}\_{K, j}, (1 \leq j \leq n\_k)$ ：landmark の j に関連した頂点群の K 番目
$n\_{H(j)}$ ：j 番目のlandmarkに関連した頂点の個数
${\bf f} = (f\_x, f\_y)$ ：focal length。1stepでは 1,000とする。
${\bf c}({\bf f}^{(i)}, {\bf r}^{(i)}, {\bf t}^{(i)})$ ：カメラ関連のパラメータ。r_cはカメラのrotation, t_cはカメラのtranslation。

z 軸のtranslationを求める。これは以下のようなものとする。

```math
\hat{t_z^{(i)}} = f_x^{(i)} median \left( [\frac{\| {\bf v}_{K, h} - {\bf v}_{K, j} \|_2}{\| {\bf k}_{h}^{(i)} - {\bf k}_{l}^{(i)} \|_2}] \right) \tag{3}
```

ここで
${\bf v}\_{K, h}$ ：landmark の h に関連した頂点群の平均値 
${\bf v}\_{K, l}$ ：landmark の l に関連した頂点群の平均値 
としている。

括弧内の値を全てのlandmarkの組み合わせに関して計算し、そのmedianを求める。

まず(3)式右側カッコ内分子から考えると、landmarkのh に関連した頂点の3D座標の平均値と、別のlandmarkのkに関連した頂点の3D座標の平均値との間の距離を求めている。図にするとこんな感じか。

![SMALR_img31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/5047569a-a51d-057e-7e06-132e1afcc337.png)

一方でカッコ内分母はlandmarkのkおよびhの座標を画像にprojectし、その画像内の距離を求めている。図にするとこんな感じか。

![SMALR_img30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/f3357bd4-84e2-db4b-f517-6b90977759ed.png)

この（分子）：（分母）の比が　（z軸のtranslation）：（焦点距離）と大体一致すると考えると、（３）式が導かれるだろう。

### 2) translationと rotationを求める

次に translationとglobal rotationを以下の最適化問題を解くことでで求める。

```math
\newcommand{\argmin}{\mathop{\rm arg~min}\limits}
\hat{{\bf t}^{(i)}}, \hat{{\bf r}^{(i)}_{0}} = \argmin_{{\bf t}^{(i)}, {\bf r}^{(i)}_{0}} \alpha_z (t^{(i)}_z - \hat{t^{(i)}_{z}}) + \sum^{\tilde{n^{(i)}_{K}}}_{j=1} \| {\bf k}^{(i)}_{j} - \frac{1}{n_{H(j)}} \sum^{n_{H(i)}}_{h=1} \Pi ({\bf v}({\bf r}^{(i)}, {\bf t}^{(i)})_{K,j,h}, {\bf c}^{(i)}) \|_2 \tag{4}
```

ここで $\Pi$ はprojectするオペレーター。

１つ１つ見ていく。

まず右辺第１項は求めるtranslationのz成分と先で求めた(3)式のtranslationのz成分との差。$\alpha\_z$ に関しては論文中に言及が無いが、第２項との比重を考えた掛け率か。

右辺第２項はlandmark（的な値）を画像座標にprojectしたものと、実際にアノテーションされた画像上のlandmarkとの差。

より細かく見ると、

```math
{\bf v}({\bf r}^{(i)}, {\bf t}^{(i)})_{K,j,h}
```

はlandmark 「j」に関する頂点 h をrotateとtranslateしてworld座標にしたもの。<font color="red">（$K$ は何を意味してる？？）</font>

これとカメラパラメータ ${\bf c}^{(i)}$ とで画像上にprojectする。それの全てのlandmark 「j」に関する平均値を求める。

これがアノテーションした画像上の landmark 「j」の位置と一致しているだろうから、その差を求める。これを全ての landmarkに関して足す。

### 3) βを求める
以下のエネルギー方程式を解くことでβを求める。

```math
\newcommand{\argmin}{\mathop{\rm arg~min}\limits}
\hat{\Theta^{(i)}} = \argmin_{\beta, {\bf r, t, f}} \sum^N_{i=1} (E_{kp} (\Theta^{(i)}) + E^{(i)}_{\beta}(\beta) + E_{cam}({\bf f}) + E_{sil} (\Theta^{(i)}) + E_{lim}({\bf r}^{(i)}) + E_{pose}({\bf r}^{(i)}) + E_{shape}(\beta^{(i)}) \tag{5}
```

ここで

```math
\hat{\Theta^{(i)}} = (\beta^{(i)}, {\bf r}^{(i)}, {\bf t}^{(i)}, {\bf f}^{(i)})
```

以下１つ１つみていく。

$E\_{kp}$ は推論した3D上のkeypointを画像上にprojectし、それと正解との差とする。

```math
E_{kp}(\Theta^{(i)}) = \alpha_{kp} \sum^{\tilde{n_K^{(i)}}}_{j=1} \rho (\| {\bf k}^{(i)}_j - \frac{1}{n_{H(j)}} \sum^{n_{H(j)}}_{h=1} \Pi ({\bf v}(\beta^{(i)}, {\bf r}^{(i)}, {\bf t}^{(i)})_{K, j, h}, {\bf c}({\bf f}^{(i)}) \|_2) \tag{6}
```

先程の（４）式と同様だが、ここではβに加えて ${\bf r}^{(i)}, {\bf t}^{(i)}, {\bf f}^{(i)}$ が最適化対象の変数となっている。

次に $E\_{\beta}^{(i)}$ だが、これは同じビデオに出てくる同じ馬はshapeが同じだろうという事前知識でβ同士で差をとる。

```math 
E_{\beta}^{(i)} = \alpha_{\beta} | \beta^{(i-1)} - \beta^{(i)} | \  for \  i>1 \tag{7}
```

$E\_{cam}$ はf_xとf_yとの差をとるもの。

$E\_{sil}$ はシルエットに関するloss。

```math
E_{sil}(\Theta^{(i)}) = \alpha_{sil} \left( \sum_{{\bf x} \in \hat{S(i)}} \mathcal{D_S}({\bf x}) + \sum_{{\bf x} \in S(i)} \rho (\min_{\hat{\bf x} \in \hat{S^{(i)}}} \| {\bf x} - \hat{\bf x} \|_2 ) \right) \tag{8}
```

右辺カッコ内第１項の $\mathcal{D\_S}$ はL2距離で、点 x がシルエット内であれば 0 とする。

右辺カッコ内第２項の $\hat{S^{(i)}}$ はprojectしたシルエット。正解のシルエット内の全ての点とprojectしたシルエット内の全ての点とのL2を考え、そのうちの最小のものを求めているので、重なっている部分は 0、一方に対してはみ出している部分は、他方との近傍点との差となる。

$E\_{lim}$ は関節の角度に関する事前知識を利用したもの。つまり、こちらには曲がらない、という可動域を利用している。

```math
E_{lim} ({\bf r}^{(i)}) = \alpha_{lim} (\max({\bf r}^{(i)} - {\bf r}_{max}, 0) + \max ({\bf r}_{min} - {\bf r}^{(i)} , 0)) \tag{9}
```

関節角度が r_max を超えるとlossとなるし、r_min を下回っても lossとなる。

$E_{pose}, E_{shape}$ はtargetと推定値とで、meanとcovarianceをL1の2乗で計算する。


## SMALR
SMALRは ${\bf dv}$ 値を使ってSMALをrefineする。

```math
{\bf v}_{shape}({\bf dv}) = {\bf v}_{template, 0} + B_s \hat{\beta} + {\bf dv} \tag{10}
```

この ${\bf dv}$ 値もエネルギー関数を最小化させることで求めるが、その際に上記で求めたパラメータは固定させる。

```math
E_{opt} ({\bf dv} = \sum^N_{i=1} \left( E_{kp}^{(i)} ({\bf dv}) + E_{sil}^{(i)} \right) + E_{arap}({\bf dv}) + E_{sym} ({\bf dv})  + E_{lap}({\bf dv}) \tag{11}
```

新たに出てきた項に関してみると、$E\_{arap}$ は[3]に出てくるもので、変形するにも局所的には出来るだけ固定するようにするloss。

$E\_{sym}$ は左右をできるだけ対象にするloss。

$E\_{lap}$ は dv 値のlaplacianを取り、スムーズにするloss。

# textureの復元
以下の手順で動物の画像が与えられた時にtexture mapを復元する
- SMAL modelに対して textureの座標系における UV mapを定義する
- 画像とそれに対応するmeshからtextureと各textureの位置におけるvisibility weight（ちゃんと見えてると1.0みたいな値？）を定義する
- （複数の画像における？）加重平均でtexture mapを計算する。この段階ではどの画像にも映っていないtextureの部分がある
- 左右の対称性を利用し、texture mapを更新する。具体的には1)左右の対応するtexture上の点においては平均の画素とする、２）一方がどの画像にもない（つまりtexture mapで定義されてない）場合、対応する側の点の画素とする
- この１）はシマウマ模様や斑点模様の部分には適応しない（おそらく左右で異なるだろうから）
- これでもtexture map上で定義されない点に関しては、texture map全体の平均画素を割り当てる

以下はtigerの例。

![SMALR_img21_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/1df620e5-94a6-ab6d-209b-e61ef78d705b.png)

どの画像からも見えない（例えば体の下部分）などは平均的な色で埋められている。

# 実験と結果
## 合成データに対する結果
馬とサイで検証した。以下の図の左側では、左列がシルエット、中央列がSMALをfittingさせたもの、右列がSMALRでrefineしたもの。

![SMALR_img23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/c710445b-ffeb-4360-66bd-c1f0bfb694cf.png)

右側のグラフは横軸が画像数、縦軸はloss。画像が増えるとSMALRのlossがSMALのlossを安定して下回っている。

## 実データに対する結果
以下はリアルなサイに対する推論結果。

![SMALR_img24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/68593766-6252-0f23-fc05-51592cd043b5.png)

左列はSMAL、中央列はSMALR、右列の最上部はその左のSMALRにtextureをハメたもの、下３つはrealな画像。

SMALRではツノの再現等、よりリアルになっている。

# reference
[2] S. Zuffi, A. Kanazawa, D. Jacobs, and M. J. Black. 3D menagerie: Modeling the 3D shape and pose of animals. In IEEE Conf. on Computer Vision and Pattern Recognition (CVPR), July 2017.

[3] O. Sorkine and M. Alexa. As-rigid-as-possible surface mod- eling. In Proceedings of the Fifth Eurographics Symposium on Geometry Processing, Barcelona, Spain, July 4-6, 2007, pages 109–116, 2007.