[論文読み] Rethinking Keypoint Representations: Modeling Keypoints and Poses as Objects for Multi-Person Human Pose Estimation

arxiv.org

ヒートマップフリーなkeypoint detectionを提案。すべてBounding Box(BBox)で表現。
f:id:Ninhydrin:20211124102414p:plain

導入

既存のヒートマップ形式のkeypoint detectionは
1) ヒートマップの解像度が大きくないと正確な予測ができないが、ヒートマップの解像度が大きいとコストが大きい
2) 同じクラスのkeypointが近くにあるとヒートマップが重なり1つのkeypointに扱われる
なのでヒートマップフリーなkeypoint detectionが求められる。

既存手法でkeypointを小さいBBoxの中心で捉える手法がある。
これはローカルな特徴で捉えられるkeypointにはうまく作用する。例えば"目"は小さく切り取ってもわかる。
逆に"腰"はそこだけ切り取られてもわからず、よりグローバルな特徴が必要。
そこでpose objectを導入する。

手法

提案手法はKAPAO(Keypoints And Poses As Objects)。発音は“Ka-Pow!”。

仕組みとしては後述のkeypoint objectの集合 \{ \hat{\mathcal{O}}^k \in \hat{\textbf{O}}^k \}とpose objectの集合 \{ \hat{\mathcal{O}}^p \in \hat{\textbf{O}}^p \}を合わせた \hat{\textbf{O}} = \hat{\textbf{O}}^k \cup \hat{\textbf{O}}^p を予測する。

keypoint objectは各keypointの中心を小さいBBox  \textbf{b} = (b_x, b_y, b_w, b_h)で表現する。 b_x, b_yはkeypointの座標、 b_w, b_hはBBoxの縦横のサイズ(サイズに関してはハイパーパラメータとして与える)。
単純に座標だけじゃなくBBoxにして幅を持たせる理由はなんだろう? -> ablation studyで検証。

pose objectは人間全体を検出するためのもので、keypointの集合 \textbf{z} = \{(x_k, y_k)\}^K_{k=1}を持つ。

keypoint objectはローカルな特徴に紐付いた個々のkeypoint(目や口など)の検出に強いが、複数のhuman poseを作るには対応関係を構築するためにボトムアップな手法が必要になる。
pose objectはボトムアップな手法を必要とせず、keypoint同士の関係を構築できる。

アーキテクチャ

f:id:Ninhydrin:20211124092122p:plain

CNNを \mathcal{N}、入力のRGB画像を \textbf{I} \in \mathbb{R}^{h \times w \times 3}とすると出力はグリッドの集合 \hat{\textbf{G}} = \{ \hat{\mathcal{G}}^s \}として \mathcal{N}(\textbf{I})= \hat{\textbf{G}}となる。
なお s \in \{8, 16, 32, 64\} \hat{\mathcal{G}}^s \in \mathcal{R}^{\frac{h}{s} \times \frac{w}{s} \times N_a \times N_o}
 N_aはアンカー用のチャンネル数、 N_oはオブジェクト用のチャンネル数。
各オブジェクトの中心が含まれるグリッドがそのオブジェクトの検出を担当する。
feature pyramidな出力になっているので sが大きいほど多段になり、出力グリッドが少ない分受容野が大きい。そのため大きなオブジェクトの検出に向いている。
アンカー \textbf{A}^s = \{(A_{w_a}, A_{h_a}) \}^{N_a}_{a=1}は一つのグリッドが複数の異なる大きさのオブジェクトを検出するため。
また隣のグリッドのオブジェクトも検出する冗長な検出の仕組みも導入。

 N_oはオブジェクトに関する情報で各アンカー・グリッド毎。
objectness  \hat{p}_o、グリッド内部でのBBox \hat{\textbf{t}}' = (\hat{t}'_x, \hat{t}'_y, \hat{t}'_w, \hat{t}'_h)、クラススコア \hat{\textbf{c}} = (\hat{c}_1,...,\hat{c}_{K+1})、pose object用のkeypoint集合 \hat{\textbf{v}}' = \{ (\hat{v}'_xk, \hat{v}'_yk)\}^K_{k=1}
なので N_o = 3K + 6となる。
詳しくは図4を参照。

損失関数

損失関数は式(5)~(8)の4つの重み付き和(式(9))。
 \mathcal{L_{obj}}がobjectness、 \mathcal{L}_{box}がグリッド内部のBBox、 \mathcal{L}_clsがクラススコア、 \mathcal{L}_kpsがpose objectのkeypoint集合に対応する。
グリッドにターゲットが無いときは p_o=0となる。

f:id:Ninhydrin:20211124095458p:plain
f:id:Ninhydrin:20211124095538p:plain

予測

グリッド(i, j)におけるBBoxとkeypointそれぞれの予測 \hat{\textbf{t}} \hat{\textbf{v}}を以下のように変換する。
f:id:Ninhydrin:20211124100109p:plain

objectnessとクラススコアの最大値の積\hat{p}_o \cdot \verb|max|(\hat{\textbf{c}})しきい値以上のときにポジティプとして扱われ、クラススコアが最大のクラスによってpose objectもしくはkeypoint objectとして扱われる。
余分なオブジェクトを削除するために検出されたpose object、keypoint objectに対してNMSを適用する。
pose objectからkeypoint objectの組み合わせ方はAlgorithm 1を参照。
f:id:Ninhydrin:20211124100802p:plain

実験・結果

他のsingle-stageの手法に比べパラメータ数が少なく、速度も高速でAP・ARが同等以上くらい。ヒートマップを作成しない分Post-Procが速い。
f:id:Ninhydrin:20211124101040p:plain

two-stageな手法とも比較。two-stageには劣る。
f:id:Ninhydrin:20211124101102p:plain
f:id:Ninhydrin:20211124101155p:plain

keypoint objectのBBoxサイズについて検証した結果が図5。横軸は b_s/w b_s/w < 2.5%は安定性が低下。 b_s/w = 5%が最も良い結果だった。既存研究の報告結果と異なり b_s/w > 5%で急激に悪化。これはkeypoint objectだけでなくpose objectも予測しているためと予測。
f:id:Ninhydrin:20211124101756p:plain

所感

object detectionはあまり追っておらず、keypointをBBoxで捉えるという手法を知らなかった。
実験結果だけを見ると高速で良さそうな印象を受けるが、他の手法が現在のSOTAレベルなのか知らないので評価できない。
Rethinkingとあったのでどんなのかなと思い読んだ。