はじめに
CVPR2017 から以下の論文
[1] G. Pavlakos, et. al."Coarse-to-Fine Volumetric Prediction for Single-Image 3D Human Pose", CVPR2017.
のまとめ
● 著者らのプロジェクトページ
https://www.seas.upenn.edu/~pavlakos/projects/volumetric/
● arXiv:
https://arxiv.org/abs/1611.07828
● 既にいくつかまとめ記事が存在する。
1)yusuke ujitoko 氏のブログ:
http://yusuke-ujitoko.hatenablog.com/entry/2017/08/06/015654
2)DeNA naoki kato 氏のまとめ:
https://engineer.dena.jp/2019/12/cv-papers-19-3d-human-pose-estimation.html
● コード
1)著者らの matlabでの実装
https://github.com/geopavlakos/c2f-vol-demo
2)その他有志の caffe での実装
https://github.com/strawberryfg/c2f-3dhm-human-caffe
概要
- 単眼カメラから3次元の姿勢を推定するモデル
- 関節の heat map を3次元的に推定する
- hourglass なネットワークを複数回繰り返すことで深さ方向の推定精度を増していく
2に関しては以下の図のような Volumetric な heat map を出力する。

3次元 heat map
3次元 heat map は2次元 heat mapを3次元に拡張したもので、図にするとこんな感じか?

2次元 heat map と同様に関節点に対してガウシアンをかけ、生成する。関節点を $(i,j,k)$ とすると、$(x,y,z)$ における heat map の値は
G_{i,j,k}({\bf{x}}^n_{gt}) = \frac{1}{2 \pi \sigma^2} \exp \left[ - \frac{(x-i)^2 + (y-j)^2 + (z - k) ^2}{2 \sigma^2} \right]
となる。よくある heat map と違って基準化定数があるが、 $\sigma = 2$ を使用するので、山のピークはそれほど低くならないだろう。
loss は MSE。
\mathcal{L} = \sum^N_{n=1} \sum_{i,j,k} \| G_{(i,j,k)} ({\bf{x}}^n_{gt}) - p^n_{(i,j,k)} \|^2
$n$ は関節の番号。
Carse-to-fine prediction
OpenPose 等で用いられている「モジュールを多段に経てだんだん正確なheatmapにする仕組み」に近いが、幾つかの点で異なる。

1. 深さ方向を少しずつ増やす
違いの1つ目は、ステージを経るごとに深さ方向を増やすしくみ。
voxel なので、中間層における heatmapの要素数をできるだけ減らしたい。そこでステージ1では深さの要素数1、ステージ2では2、ステージ3では4、と $2^n$ で増やしていく。
2. 中間層の heat map を分離する
以下の図で
(a)では prediction の一部であるあるステージの heatmap に対し、そのまま次のステージの入力として利用している。
これだと特にステージ1においては深さ方向が1、つまり2Dの画像になるが、その情報のみから次のステージで深さ方向を復元することになってしまう。これは困難だろう。
そこで(b)のように深さ情報も含めた特徴量とheatmapとを分け、その後両者をconcate(?)して次のステージに伝える。
実験と結果
1. 3次元 heat map の効果

各関節の座標を回帰問題として解いた場合と3次元 heat map を用いた場合との mean per joint error の比較。
3次元 heat map の方がよい。
2. 多ステージなアーキテクチャの効果

中間層のfeature map 、あるいはその周囲のパラメータは減っているはずだが、逆に性能がよくなっていて、興味深い。
3. 他モデルとの比較

4. 定性的評価

左側入力画像に対し、その右2つが prediction。predictionの左は入力画像と同じ角度から見た3d poseで、その右はそれを回転させたもの。