論文まとめ：2D/3D Pose Estimation and Action Recognition using Multitask Deep Learning

# はじめに 
CVPR2018 から 以下の論文
[1] D. C. Luvizon, et. al "2D/3D Pose Estimation and Action Recognition using Multitask Deep Learning", CVPR2018
のまとめ

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

著者らのコード:
https://github.com/dluvizon/deephar
Keras で実装されてる

現状では日本語でまとめた記事は見当たらない

# 概要 
1. 単眼 RGB 画像から 2D、3D の姿勢推定を行うと同時に2D, 3Dの行動推定も行うモデル
2. これら全てをend-to-endの学習で行うことで精度を上げる
3. そのため Soft-argmax なるものを用いて heatmap から微分可能な方法で peak を取得する

# 背景 
2D 姿勢推定や 3D 姿勢推定は既に高精度のモデルが提案されている。またこの姿勢を利用した行動推定も様々なモデルが提案されている。

しかし、姿勢推定を行ったのちに行動を推定するまで end-to-end で行うモデルはほとんどない。

近年の姿勢推定の多くは heatmap を推定し、その argmax を計算して peak を取得し、それを関節位置とする。その後、この情報を行動推定に利用する。よって argmax を用いる段階で backpropagation できなくなるため、end-to-end な学習はできない。

本手法で用いる Soft-argmax はこれに対する解決策。

# 全体のアーキテクチャ 

全体のアーキテクチャは以下。

<img width="657" alt="2d_3d_softargmax_img01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/8ffdc3f7-a1ab-e0ed-d229-84277e23376e.png">

このように人の画像 ${\bf{I}} \in \mathbb{R}^{X \times H \times 3}$ を入力し、　probability map $\hat{P} \in \mathbb{R}^{N\_j \times D}$ （heat map に soft-max したもの）を出力する。これに Soft-argmax なるものを作用させて関節位置を出力する。

network としては inception-v4 から feature map を出力し、その後 prediction block を多段にして、それぞれから probability map を出力する。

# Soft-argmax なるもの
本手法の核心、Soft-argmax の仕組み。
### 2D の Soft-argmax  
以下が概略図。

<img width="636" alt="2d_3d_softargmax_img02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/659749d3-57cd-e6d2-b0f9-4c119cc0840a.png">

まず、heat map $\bf{x}$ に対し画像の全ピクセルに関する soft-max をかけて probability map $\Phi ({\bf{x}})\_{l,c}$ とする。 

これに対して、x 軸、及び y 軸の値を持つ画像との Hadamard 積を求め、画像の縦横で足し合わせる。

そうすると、各軸に対して、分布の期待値を求めることになるので、画像上の位置が求まる。

```math
\begin{equation}
\Phi ({\bf{x}} )= \left( \sum^{W_{\bf{x}}}_{c=0} \sum^{H_{\bf{x}}}_{t=0} \frac{c}{W_{\bf{x}}} \Phi ({\bf{x}})_{l,c}, \sum^{W_{\bf{x}}}_{c=0} \sum^{H_{\bf{x}}}_{t=0} \frac{l}{H_{\bf{x}}} \Phi ({\bf{x}})_{l,c} \right)^T \tag{1}
\end{equation}
```

具体的な値で考える。以下ではわかりやすくするために (1) 式のような相対座標ではなく整数値の座標で表示している。

<img width="724" alt="2d_3d_softargmax_img22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/97c79aa6-b0a4-2d7c-1f79-d2d250557bfe.png">

左側のような heatmap に対して、全ピクセルに対して soft-max をとって、その右の probability map になる。

それに対してその右、X軸を刻んだ map を pixel-wise でかけると、その下のようなものになる。

これを全ピクセルに渡って集計すると $3.0$ となる。これが求める $x$ 軸の位置。

$y$ 軸方向に関して同様で、

<img width="720" alt="2d_3d_softargmax_img23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/e9c4cf2e-21e1-b18c-0310-67aad73060e2.png">
右側、$y$ の値を刻んだ map を pixel-wise でかけて、その下のようなものになる。

これを全ピクセルに渡って集計すると $2.0$ となり、$y$ 軸の位置が求まる。

### 3D の Soft-argmax 
3D の場合は voxel に対して同じことをすると思いきや、そうではなく、以下の様に 2D と depthとに分けたのちに、それぞれに対して Soft-argmax を実施する。

<img width="690" alt="2d_3d_softargmax_img03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/499c00d6-036d-ba93-96d2-b0b28b92785b.png">

# 行動認識 
行動認識まで含めたモデルの全体像は以下。

<img width="559" alt="2d_3d_softargmax_img00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b19b8771-093a-0180-2aed-09a186bca1de.png">

右側は推定した骨格を使って行動認識する流れ。ただ骨格だけだと、例えば耳に受話器を当てて電話をしてるのか、あるいはジュースを飲んでるのかは判別しにくい。

そこで左側の画像の特徴量ベースな流れを作り、行動認識に利用する。

### 1. pose-based recognition

まずこの部分、

<img width="488" alt="2d_3d_softargmax_img00_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/1ba20b4a-3a43-e34b-bef9-4d21f96e1c49.png">

推定した 2D or 3D の骨格から何をしてるのか推定する部分。

ここはこのように

<img width="553" alt="2d_3d_softargmax_img04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/8d627e2c-d475-20b6-18fd-f2eca97598e1.png">

convolutionを使用する。

具体的には横に各関節の座標、縦に時間、チャンネル方向に各軸を取った画像に対して畳み込む。何回か畳み込んだ後に、多段のモジュールで更に畳み込む。

各モジュールからの feature map に対して max pooling と min pooling し、softmaxして出力とする。

# 2. appearance-based recognition 
次にこの部分。
<img width="465" alt="2d_3d_softargmax_img00_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/5605c601-9458-f3c2-4159-4939ebcbc905.png">

まずvisual features $F\_t \in \mathbb{R}^{W\_f \times H\_f \times N\_f}$と probability maps  $M\_t \in \mathbb{R}^{W\_f \times H\_f \times N\_J}$ とを multiply する。

両者はネットワークのここ

<img width="650" alt="2d_3d_softargmax_img01_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/560a1e48-a083-81ea-e0a0-31c05964440a.png">

から出力されたもの。つまり visual features は特徴量抽出機である Inception-v4 から出た特徴量であり、 probability maps は heat map に soft-max をかけた各関節の probability を表す map。

これらをチャンネル方向に総当たりで multiply する。なので、特徴量内のあるチャンネル $F\_{t, c}$ で考えると、それに対して全ての $M\_t$ と multiply された結果、 $N\_J$ チャンネルが出力されるが、それぞれのチャンネルは対応する関節付近の特徴量のみ抽出されている。。

この出力に対して画像の縦横に関して合計し、$V\_t \in \mathbb{R}^{N\_J \times N\_f}$ が求まる。実際には時間 t それぞれに対して求めるので、 $V \in \mathbb{R}^{T \times N\_J \times N\_f}$ となる。

<img width="746" alt="2d_3d_softargmax_img05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/07fca2ae-6e3b-3968-7d4e-2bc1f3c6d7a5.png">

この $V$ に対して、上図の最右のように横方向に $N\_j$ 、縦方向に時間、チャンネル方向に $N\_f$ と結合させ、テンソルとする。この並びは pose-based recognition からの出力に一致している。

### 3. Action aggregation 
せっかくテンソルの軸を揃えたが、最後は全結合で両者（pose-based recognition と appearance-based recogtion）を結合するみたい。

# loss 
### 1. pose estimation タスクのロス
以下の elastic net loss。

```math
L_{\bf{p}} = \frac{1}{N_J} \sum^{N_J}_{n=1} ( \| \hat{{\bf p}_n} - {\bf p}_n\|_1 + \| \hat{{\bf p}_n} - {\bf p}_n\|_2^2)
```

${\bf p}\_n$ はground truthの第 $n$ 関節座標で、$\hat{{\bf p}\_n}$ はそのprediction。

### 2. action recognition の loss。
分類タスクなので交差エントロピー。

# 実験の概要
### 1. 用いるデータセット 
- MP2 Human Pose Dataset
- Human 3.6M
- Penn Action
- NTU RGB+D・・・3D action recognition 用

### 2. メトリクス
1. 2D pose estimation・・・PCKh, AUC
2. 3D pose estimation・・・MPJPE(mean per joint position error)
3. 2D action recognition・・・Accuracy
4. 3D action recognition・・・Accuracy

# 実験の結果  
### 1. MP2 dataset を用いた 2D pose estimationの実験結果

<img width="572" alt="2d_3d_softargmax_img08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/3f32da18-b7c6-068f-9b52-d0a4ea935616.png">

他の手法と比べてまぁまぁいい。

### 2. Human 3.6M dataset を用いた 3D pose estimationの実験結果

<img width="938" alt="2d_3d_softargmax_img07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/df8ba427-3325-cd08-1db7-1f690d193ad3.png">

他の手法より軒並みよい。

### 3. MP2 dataset を用いた2D action recognition の実験結果

<img width="485" alt="2d_3d_softargmax_img09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/74da8c71-263b-aa32-19a0-0571df0489c0.png">

これもよい。

### 4. NTU for 3D dataset を用いた 3D action recognition の実験結果

<img width="505" alt="2d_3d_softargmax_img10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/9b10714c-f14b-e293-a300-7daecfb31a00.png">

kinect のdepth情報を使ってなくても結構よい。

### 5. ablation study 
action recognition における各要素の効果は以下。

<img width="650" alt="2d_3d_softargmax_img11 _1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/e0ad3f31-c0ef-5962-4231-995f95c52c51.png">

例えば、上から２行目の Estimated poses に注目すると、estimatied pose(pose-based recognition) の流れだけだと 64.5、それに Appearance RGB (appearance-based recognition)の流れが加わると80.1、両者の結合だと81.1。

pose-based recognition の効果はイマイチな気がする。

# 個人的な感想
骨格推定から行動推定まで end-to-end な学習を行うため導入した Soft-argmax なるものは、面白いと思う。

しかし、あくまで１画面に１個人のみ写ってる場合でないと変な値になるはずなので、前処理の段階で画像から１人の領域を切り抜けるかが重要。

また１個人のみが写っていても、例えば人を前から写したものか、後ろから写したものか分かりにくい場合、右肩のprobability mapのpeakは２箇所に分散し、Soft-argmaxをかけるとその中間の首あたりの座標が出力されてしまうだろう。

なので、人の写りが悪い場合は不向きな手法と思われる。

peak が複数ある場合に、複数の座標が微分可能な形で求まるような手法があれば面白いが。。。