はじめに
ECCV 2018 から以下の論文のまとめ
G. Papandreou, et. al, "PersonLab: Person Pose Estimation and Instance Segmentation with a Bottom-Up, Part-Based, Geometric Embedding Model"
モデルのアーキテクチャやdecoder部分のみまとめる。
arXiv:
https://arxiv.org/abs/1803.08225
github:
github上には既にいくつかコードがあり、例えば以下のKeras実装
https://github.com/octiapp/KerasPersonLab
は星が多い。
概要
- ボトム・アップ方式で同時に多人数に対し pose estimation を行うモデル
- keypoint の検出と同時に人のインスタンス・セグメンテーションを行い、これらを統合してインスタンス・セグメンテーションまで行う
- COCO dataset で既存のボトム・アップ手法を上回る精度を達成した
手法の全体像
以下の図が全体像
解説にあるように、左の入力画像に対してCNNで以下の5種類を出力する。
- 各 keypoint の位置を推定する heatmap
- 上記推定位置の short-range な offset
- 同上推定位置の middle-range な offset (四肢の形成に用いる)
- 人のセグメンテーションマスク
- keypoint 推定位置の long-range な offset
図中、上側に着目すると、最初の3つの出力により各人の姿勢を推定する。
図中下側で、この姿勢と出力4番目、5番目から人のインスタンスレベルのセグメンテーションを行う。
各人の姿勢推定
1. keypoint を検出する
ここは基本的に文献[2]の手法と同じ。
まず各種定義
$x_i$ :画像上の $i = 1 , \ldots , N$ ピクセルにおける位置。
\mathcal{D}_R(y) = \{ x: \| x-y \| \leq R \
は $y$ を中心とし、半径 $R$ の円内。
$y_{j,k}$ :$j$ 番目の人の $k$ 番目の keypoint。
CNNからの1番目の出力である heatmap $p_k (x)$ では、ピクセル $x$ が $x \in \mathcal{D}_R(y_{j,k})$ なら1、それ以外は0を推定する。$R$ は定数 32 pixel を使用。
CNNからの2番目の出力である short-range offset $S_k(x)$ では、近傍の keypoint の位置をベクトルで指し示す。つまり
S_k(x) = y_{j,k} - x
近傍の範囲はやはり $R = 32$。
heatmap $p_k (x)$ と short-range offset $S_k(x)$ から hough-voting で詳細なkeypoint の位置を求める。
h_k(x) = \frac{1}{\pi R^2} \sum_{i=1:N} p_k(x_i) B (x_i + S_k(x_i) - x)
$B(\cdot)$ は bilinear kernel。$x_i + S_k(x_i) = y_{j,k}$ は $x_i$ が推定するkeypointの位置なので、$x_i + S_k(x_i) - x$ は $x$ から $x_i$ のkeypoint推定位置へのベクトル。これに対して bilinear kearnelをかける。
それに対して $p_k(x_i)$ をかけるので、おおよそkeypointの半径 $R = 32$ ピクセルだけ集計することになる。
集計したものを面積 $\pi R^2$ で割って規格化。
ということで、ざっくり言うと、heatmapの推定したkeypoint周辺領域に関してshort-range offsetの指し示すkeypointの位置を集計することで正確な位置を推定する感じ。
2.keypoint を関連づけて骨格にする
ここでは出力に3番目 middle-range な offset $M_{k,l}(x)$ を用いる。ここで $k,l$ は keypoint $k$ から keypoint $l$ への四肢という意味。具体的には
M_{k,l}(x) = (y_{j,l} - x)I \left( x \in \mathcal{D}_R (y_{j,k})\right)
のように、$j$ 人目の keypoint $k$ の半径 $R$ 内のピクセルに対し、それと関連する keypoint $l$ の位置をベクトル $y_{j,l} - x$ で表す。
更に、以下の図
のように、出力2番目 short-range な offset を利用して keypoint $l$ の位置精度を上げる。
具体的には
M_{k.l}(x) \leftarrow x' + S_l (x'), \ where \ x' = M_{k,l}(x)
とする。つまり、$x$ 位置の指し示す対応する keypoint 位置である $M_{k,l}$ ピクセルに注目し、このピクセルの short-range offset として指し示す keypoint 位置 $S_l (x')$ で更新することで、更に精度の高い位置を得る。この作業を2周繰り返す。
書きかけ
reference
[2] G. Papandreou, et. al. "Towards Accurate Multi-person Pose Estimation in the Wild"