論文まとめ：GANerated Hands for Real-Time 3D Hand Tracking from Monocular RGB

# はじめに
CVPR2018より以下の論文
[1] F. Mueller, et. al."GANerated Hands for Real-Time 3D Hand Tracking from Monocular RGB" CVPR2018
のまとめ

CVF open accessのリンク：
https://openaccess.thecvf.com/content_cvpr_2018/papers/Mueller_GANerated_Hands_for_CVPR_2018_paper.pdf

著者らのコードは不明。以下は有志のコード：
https://github.com/Ninebell/GaneratedHandsForReal_TIME

# 概要
- 単眼RGBカメラのみから3Dのhand poseをreal-timeでtrackingするモデル
- 旧来手法と比べてocclusionやカメラ位置の変化に対して頑健
- 学習時に合成データからリアルっぽいデータを生み出す（sim2real）
- sim2realはcycle-GAN的手法で学習させるが、これに幾何学的一貫性損失を加える

# 背景
3D の hand pose を推定することはVRやAR、human computer interactionに繋がるので重要である。単眼RGBカメラのようにどこにでもあるものからこれを推定できれば有用である。しかし、depth情報が無いため3Dを推定することは困難である。

しかし最近の機械学習的手法によって3D の hand poseを推定する技術も進展している。しかしそのデータセットを作成することは困難だ。これに対する１つの解決策は、合成データを作成し、これを教師とすることだが、合成データで学習したモデルは現実のデータに汎化できないという問題がある。

そこで本手法では合成画像をrealに変換する

# 手法

## 全体のシステム

全体のシステムは以下。

![GANerated_hand3dtrack_img00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/8f32e43f-2d26-8634-7aaf-1474ca60d6dc.png)

左側のオレンジ破線内がoff-lineの部分で、右の緑破線内がonline・・・つまりreal-timeで3Dのhand pose trackingをする部分。

まずoff-lineを見ると、GeoConGANなるもので合成画像をrealにしている。

次にon-line側を見ると、そうして生成された画像＋ラベルとrealな画像＋ラベルとでRegNetなるものを使って2d joint heatmapや3d joint locationsを推定する。

それをskeleton fittingを行うことで、手の各関節の３次元のワールド座標を推定する。

## 学習データの生成（off-line）部分

学習データの生成（off-line）部分は以下。GeoGonGANと名付けている。

![GANerated_hand3dtrack_img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/362cffb4-3440-1834-a75d-dcbb8baa7a36.png)

両端以外はCycle-GAN。

両端ではsim2realもしくはreal2simな画像が変換によってアノテーション位置が変わらないよう、幾何学的な制約を設けている。

具体的には SilNet（これも学習対象） なるものでシルエットを推定させ、その差（交差エントロピー）を最小化させることで実現する。

## 3Dのhand poseを生成する部分
まず3Dのhand poseを生成する部分のみ再掲。

![GANerated_hand3dtrack_img00_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/e1ca05f6-4fbf-bfde-46da-ce87485828c1.png)

## RegNet
real、もしくは擬似realな画像から2D joint heatmapsや3D joint Locationsを推定するRegNetは以下。

![GANerated_hand3dtrack_img20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/551d5702-1923-1dcd-ed6d-e35f1a700e65.png)

流れとしては図の左から、

- リアル画像、もしくは擬似リアル画像を入力し、ResNet的な仕組みで畳み込み、各関節の3D座標を（中間）出力する
- それをさらに ProjLayer で画像座標に正射影し、heatmap化する
- これら２つを更に畳み込み、画像座標の2D heatmapや3D座標を出力する

loss としては中間出力の3D座標、最後の3D座標と2D heatmapとでL2を計算する。


# kinematic skeleton fitting
RegNetから推定した2D heatmapと3Dの相対座標から3Dの絶対座標を求めたい。そこで手の骨格における幾つかの制約を用いる。

まず定義
$J$ :手の関節の数で、ルート関節を入れて21
${\bf t} \in \mathbb{R}^3$ : kinematic skeleton model のルート関節のワールド座標
${\bf R} \in SO(3)$ :kinematic skeleton model のルート関節のオイラー角
$\theta \in \mathbb{R}^{20}$ :kinematic skeleton model の１５個ある稼動関節の角度で自由度２０
$\Theta = ({\bf t},{\bf R},\theta)$
$\mathcal{M}(\Theta) \in \mathbb{R}^{J \times 3}$ :kinematic skeleton model のルート関節を含めた２１関節の絶対座標

これに対して以下のエネルギー関数を考える。

```math
E(\Theta) = E_{2D}(\Theta) + E_{3D}(\Theta) + E_{limits}(\Theta) + E_{temp}(\Theta)
```

これを最小化させる $\Theta $ を求めたい。以下、各項の説明。 

## 2D Fitting 項
kinematic skeleton model の各関節の絶対座標 $\mathcal{M}(\Theta)$ を画像座標に変換したものは、推定した2Dのheatmapに等しいだろう、という制約。

```math
E_{2D}(\Theta) = \sum_j w_j \| \Pi (\mathcal{M}_j(\Theta)) -u_j \|^2_2
```

ここで
$u\_j \in \mathbb{R}^2$ :推定した2Dのheatmap
$w\_j$ :heatmapの確信度
$\Pi : \mathbb{R}^3 \to \mathbb{R}^2$ :3D絶対座標から2D画像座標へのproject

## 3D fitting 項

kinematic skeleton model のルート関節に対する相対座標は推定した相対座標と等しいだろうという制約。

```math
\begin{eqnarray}
E_{3D} (\Theta) &=& \sum_j \| \mathcal{M}_j(\Theta) - \mathcal{M}_{root}(\Theta) -z_j\|^2_2 \tag{3} \\
z_j &=& z_{p(j)} + \frac{\| \mathcal{M}_j(\Theta) - \mathcal{M}_{p(j)}(\Theta)\|_2 }{\| x_j - x_{p(j)} \|_2} (x_j - x_{p(j)}) \tag{4}
\end{eqnarray}
```

ここで
$z\_j \in \mathbb{R}^3$ :推定した3D 相対座標を推定した人固有の長さを用いて調整したもの
$p(j)$ :関節 j に対する親側（根元側の）隣接関節
$z_{root} = {\bf 0} \in \mathbb{R}^3$
$z\_{p(j)}$ :j 関節の根元側の隣接関節の相対座標
$x\_j$ :RegNetから推定した各関節 j の3D相対座標

（４）式から眺める。第２項目の分数によって長さがkinematic skeleton model向けに変更されている。

この値が推定した根元隣接関節から推定した当該関節 j へのベクトルにかかっているので、第２項目全体はkinematic skeleton modelに長さが変更された推定した根元隣接関節から当該関節 j へのベクトル。

これに第１項 $z\_{p(j)}$ ：根元隣接関節の相対座標を足す。

よって $z\_j$ は長さがkinematic skeleton model、角度が推定したものとして組み上げた関節 j の相対座標。

次に式（３）を眺める。

$\mathcal{M}\_j(\Theta) - \mathcal{M}\_{root}(\Theta)$ はkinematic skeleton modelの相対座標。

これから $z\_j$ を引くと、角度の影響による位置ずれ分だけ値が残る。よってこの値を最小化すると、手の関節の角度を調整することができるだろう。

## Joint Angle Constraints
ここでは各関節があらぬ方向に曲がったりはしない、という制約を用いる。

```math 
E_{limits}(\theta) = \| \max([{\bf 0}, \theta - \theta^{max}, \theta^{min} - \theta])\|_2^2 \tag{5}
```

ここで
$\theta^{max} \in \mathbb{R}^{20}$ :各関節の最大稼動角
$\theta^{min} \in \mathbb{R}^{20}$ :各関節の最小稼動角

## temporal smoothness
連続したフレームにおいて、前のフレームの各パラメータ $\Theta$ の変化率は急激には変わらないだろうという制約。

```math
E_{temp}(\theta) = \| (\nabla (\Theta)^{prev} -  \nabla (\Theta)\|_2^2
```

# 実験と結果
## ablation study
以下の４パターンで比較
- 合成画像のみ
- 合成画像に対してcolorのaugmentation
- 合成画像をGANeratedしたもの（Project layer無し）
- 合成画像をGANeratedしたもの（Project layerあり）

評価手法は3D PCK。

![GANerated_hand3dtrack_img04_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/64e71a37-8536-7b9e-c2c8-85e959c5e086.png)

GANeratedして精度が上がってる。

## 他のSOTAなモデルとの比較

以下の図において左がStereo datasetにおける3D PCKの比較。右がDexter+Object dataset等における2D PCKの比較。

![GANerated_hand3dtrack_img04_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/26e2629d-419b-f88b-5aef-7be84b969f76.png)

いずれもいい感じ。

## 定性的評価
以下が各 dataset において推論した結果のサンプル。

![GANerated_hand3dtrack_img05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b8644317-7a29-6264-f903-b297cef572d0.png)