論文まとめ：Convolutional Pose Machines

# はじめに  
CVPR2016 から以下の論文
[1] S. Wei, et. al. "Convolutional Pose Machines"
のまとめ。

かなり古い論文だが、その後の影響（特にOpenPoseへの影響）も加味して一読＆まとめる。

arXiv：
https://arxiv.org/abs/1602.00134


既に日本語でいくつかのまとめ記事が存在する。

yusuke ujitoko氏の緑茶思考ブログ：
http://yusuke-ujitoko.hatenablog.com/entry/2017/07/21/012238

Takanori Ogata氏のslideshare：
https://www.slideshare.net/takanoriogata1121/convolutional-pose-machines

コードも著者らのを含めてgithub上に幾つか存在。
https://github.com/shihenw/convolutional-pose-machines-release

# 概要  
1. 骨格推定モデルの１つ
2. 複数 stage に分けて関節位置を推定する特徴量をrefineする
3. 各 stage で loss を取ることで勾配消失問題に対応する

以下の例では

<img width="833" alt="conv_pose_machine_img00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b62acf46-bad6-e40d-ec69-21a39bb914ca.png">

左側の入力画像に対し、その右側 stage 1 では右手首位置を推定しているが、どちらかというと間違って左手首の位置を推定している。

しかしその右（stage 2）、さらにその右（stage 3）と進むに従って精度が増して、正確に右手首位置を推定している。

# アーキテクチャ   
まずアーキテクチャ全体は以下の図。

<img width="878" alt="conv_pose_machine_img01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/93c6985a-3de5-b13f-d626-750fa078ce5e.png">

上側の(a), (b) は[2]Pose Machine のアーキテクチャ。中段(c), (d)の部分が本CPMs。

OpenPoseのconfidence map を出力する部分に非常に似てる。

### 変数等の定義  
$\bf x$ ：入力画像
${\mathcal{Z}}$ ：画像の任意のピクセル
$t \in \\{ 1 \cdots T \\} $ ：stage
$Y_p \in {\mathcal{Z}} \subset {\mathbb{R}^2}$ ：人の体の $p$ 番目の部位（右手首など）の位置
$Y = (Y_1, \cdots , Y_p)$ ：$p$ 個の全ての体の部位の位置
$g_t (\cdot)$ ：$t$ stage 目における各部位を推定する関数で、今回はCNN。

### stage 1 でのスコアマップの出力
まずこの図の部分。

<img width="855" alt="conv_pose_machine_img01_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/323375d9-50fd-3fbc-a294-31eb4eaf6ea5.png">

画像 $\bf x$ を入力し、複数回畳み込み、プーリングを行い、各体部位のスコアマップ $b_1$ を出力する。

```math
g_1 ({\bf{x}}_{ z}) \to \{ b_1^p (Y_p = z) \}_{p \in \{ 0 \cdots P \}}
```

### stage t でのスコアマップの出力
stage 2 以降は以下。

<img width="856" alt="conv_pose_machine_img01_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/518a8117-4b9e-375e-0656-474c62aff89f.png">

現 stage において入力画像 $\bf x$ を畳み込み・プーリングし、特徴量 $\bf x'$ とする。

これに前 stage の出力 $b^p\_{t-1}$ を加えて（concatenate？）、さらに複数回畳み込む。 

### 複数 stage の効果 
以下の図は各 stage から出力した特徴量を比較したもの。

<img width="431" alt="conv_pose_machine_img02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b6cc44ff-5e09-d31a-a409-31a78a0c2d58.png">

左側４つは stage 1 からの出力。right shoulder や head などは割と正確に位置を特定できてるが、right elbow は間違って右膝辺りの位置を推定している。

このhead 位置や right shoulder位置は次のstageに入力されるので、その空間的な関係性を活かすことで右のstage 2 や stage 3 ではright elbowの位置も正しく推定できている。


また以下の図の下段のように、

<img width="850" alt="conv_pose_machine_img01_01_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/2f1c2f4f-3904-bdb4-3df2-bbd775e32c8a.png">

stage を重ねるに従って受容野が広がるので、より広範囲からの情報を用いて位置を推定することができる。

### 勾配消失問題への対応  
しかし受容野を広げるだけなら層を深くするだけでもよい。

stageにわけるメリットは、各 stageでlossをとるところにある。これにより入力に近い側において勾配が消失するのを防ぐ。

# Loss  
先に述べたように、勾配消失問題対策により各 stage で loss をとる。$t$ stage 目のlossは以下の二乗誤差。

```math
f_t = \sum^{P+1}_{p=1} \sum_{z \in \mathcal{Z}} \| b^p_t(z) - b^p_{*}(z) \|^2_2
```

関節数 $P$ より１つ多くなってるのは back ground のチャンネルを含むため。米印はtarget。

これを足し合わせたものがトータルのloss。

```math
\mathcal{F} = \sum^T_{t=1} f_t
```

# reference 
[2] V. Ramakrishna, D. Munoz, M. Hebert, J. Bagnell, and Y. Sheikh. Pose Machines: Articulated Pose Estimation via Inference Machines. In ECCV, 2014.