オムライスの備忘録

数学・統計学・機械学習・プログラミングに関することを記す

【深層学習】PoseNet

Index

PoseNet とは

2018 年 Google から発表された姿勢推定 / Pose Estimationのタスク手法.

姿勢推定 / Pose Estimation

  • 人間の姿勢を推定する. 骨格推定 (Bone Estimation) とも
  • Single Person / Multi Person
  • 2D / 3D
  • 姿勢追跡 / Pose Tracking への応用

Top Down Approach / Bottom Down Approach

  • 人検知 -> 体の部位検知 : Top Down Approach
  • 体の部位検知 -> 人検知 : Bottom Down Approach

PoseNet は後者 (Bottom Down Approach)

Algorithm

Keypoint Detection

画像内にある、複数の人間の Keypoint を検出する.

2017 年 Google が発表した「Towards Accurate Multi-person Pose Estimation in the Wild」の考えが使われている.

  • Towards Accurate Multi-person Pose Estimation in the Wild

Heatmap と Offset Vector を計算し、「Highly Localized Activation Map」を使って最終的な Keypoint を「Fused Activation Maps」として変換(算出)している. PoseNet では、「Hough Voting」を使って、「Hough Arrays」に変換する.

定義

  •  x_i : 各ピクセル
  •  D_{R} (y) = \{ x \ | \ \| x - y \| \leq R \}
    • 中心 y, 半径 R の円領域
  •  y_{j, k} : Keypoint の座標
    •  j = 1, \cdots, J : J は人の数 / j は人の Index
    •  k = 1, \cdots, K : K は 人 j の Keypoint の数 / k は Keypoint の Index

Heat Map

ある Keypoint (例えば、左肘) の半径 R の領域 D に入るかどうかをピクセル単位で予測する.

 
p_{k} (x) = \left\{
\begin{array}{ll}
1 & x \in D_{R} (y_{j, k}) \\
0 & otherwise
\end{array}
\right.



Short Range Offsets

ピクセルから、あるkeypoint (例えば、左肘) へのベクトル (Offset Vector) を推定する. 出力は 2 チャネルで、ベクトルのスタート座標 :  xとベクトルのエンド座標 (=Keypoints):  y_{j, k}.

Offset Vector は以下のように計算する.

 S_{k} (x) = y_{j, k} - x



Hough Voting

Hough score maps  h_{k}(x) を定義.


h_{k} (x) = \dfrac{1}{\pi R^{2}} \displaystyle \sum_{i=1}^{N} p_{k}(x_{i})\ B(x_{i} + S_{k} (x_{i}) - x)



 B は bilinear kernel.

 x_i + S_k (x_i) = y _ {j,k} は、 x_i を始点とする推定 Keypoint の位置で、 x _ {i} + S _ {k} (x _ {i}) - x = y _ {j, k} - x x (画像内のすべてのピクセル)から  x _ {i} を始点とする推定 Keypoint へのベクトル. それに、bilinear kernel を適用する.

 p _ {k} (x _ {i}) をかけることで、おおよそKeypointの半径 R ピクセルだけ集計することができる.

集計したものを面積  \pi R^{2} で割って規格化する.

Mid Range Offsets

各 Keypoint 同士(特に四肢)を連結させることが目的.



Keypoint  k と Keypoint  l のベクトルの計算方法は以下.

M_{k, l} (x) = (y_{j, l} - x)
 x \in D_{R}(y_{j, k})



 y _ {j, l} は人物のIndex  j における Keypoint  l の座標.

入力の  x は、人物のIndex  j における Keypoint  k の 座標  y_{j, k} の 周辺の円形領域  D _ {R} (y _ {j, k}) に 含まれていることが条件.



Keypoint  k が肘で、Keypoint  l が肩であるならば、 M_{k, l} (x) は二の腕を表すベクトルになる.

関連している Keypoint を繋いでいくことでグルーピングされていく.

Recurrent Offset Refinement

推定した Keypoint 同士のベクトル (Offset Vector) M _ {k, l} (Mid Range Offset) を Short Range Offset を利用して、補正する.

 M^{(n+1)}_{k, l} (x) \leftarrow x^{'} + S_{l} (x^{'}),\ \ x^{'} = M^{(n)}_{k, l} (x)



この補正処理を論文では、2回行うとのこと.

Person Pose Decoding

グルーピングしたKeypoint が一人の人物になるように処理を行う.

Instance Segmentation

画像内にいる人物べつに、領域を分類する.



Embedding Based Approach で、Segmentation と Offset Vector を連結する.

参考はこちらの論文.

  • Associative embedding: End-to-end learning for joint detection and grouping.

  • Semantic instance segmentation via deep metric learning.

  • Semantic instance segmentation with a discriminative loss function.

Semantic Person Segmentation

人物の Semantic Segmentation で領域を分類 (mask画像作成) する.
FCN で Semantic Segmentation するように、結果を出力する.

Long Range Offset

Instance Segmentation の補助として使用する.

 L_{k} (x) = y_{j, k} - x



Recurrent Offset Refinement

Mid Range Offset と同じように、補正処理を行う.

論文だとこちらも 2回.

 L^{(n+1)}_{k} (x) \leftarrow x^{'} + L_{k} (x^{'}),\ \ x^{'} = L^{(n)}_{k} (x)
 L^{(n+1)}_{k} (x) \leftarrow x^{'} + S_{k} (x^{'}),\ \ x^{'} = L^{(n)}_{k} (x)

参考

  • PersonLab: Person Pose Estimation and Instance Segmentation with a Bottom-Up, Part-Based, Geometric Embedding Model