Distribution-Aware Coordinate Representation for Human Pose Estimation (DARK)
論文リンク
リポジトリリンク
解説リンク
どんなもの?
ポーズ推定手法の、学習時にGTのキーポイント座標からヒートマップを作成する処理と、テスト時の出力マップからキーポイント座標を算出する処理を改良したDARK (Distribution-Aware coordinate Representation of Keypoint)を提案。DARKはモデルに依存しないプラグインとして機能するため、様々なポーズ推定モデルの性能を大幅に向上させることができる。サブピクセル推定の精度が向上するため、入力解像度が小さい場合でも精度よくキーポイントを検出することができる。HRNet-W48にDARKを組み合わせたモデルがMPIIとCOCOでSOTA。
手法と技術のキモ
Coordinate Decoding
ヒートマップが二次元の正規分布に従うと仮定し、ヒートマップの最大値の座標(=キーポイント座標)を正規分布の平均$\mu$としてサブピクセル推定する。
ヒートマップを以下のような二次元の正規分布として表現。
対数をとっても最大値を持つ座標は変わらないため、上式を以下のように変形する。
平均$\mu$において、正規分布の勾配は0になるため以下が成り立つ。
をにおけるテイラー展開で近似すると以下のようになる。
は$\mathcal{P}$のにおける二次導関数であり、以下のように表される。
以上より$\mu$について、以下の式が導出される。
$\mu = m - (D''(m))^{-1} D'(m)$
$\mu$はキーポイント座標。はヒートマップの最大値の座標。$D'(m)$はヒートマップのにおける一次微分。$D''(m)$はヒートマップの$m$における二次微分(ヘッセ行列)。実装上は以下のようになる。
# px, pyが最大値の座標 # 一次微分 dx = 0.5 * (hm[py][px+1] - hm[py][px-1]) dy = 0.5 * (hm[py+1][px] - hm[py-1][px]) # 二階偏微分 dxx = 0.25 * (hm[py][px+2] - 2 * hm[py][px] + hm[py][px-2]) dxy = 0.25 * (hm[py+1][px+1] - hm[py-1][px+1] - hm[py+1][px-1] + hm[py-1][px-1]) dyy = 0.25 * (hm[py+2*1][px] - 2 * hm[py][px] + hm[py-2*1][px]) # D'(m) derivative = np.matrix([[dx], [dy]]) # D''(m) hessian = np.matrix([[dxx, dxy], [dxy, dyy]]) if dxx * dyy - dxy ** 2 != 0: hessianinv = hessian.I # -(D''(m))^{-1} D'(m) offset = -hessianinv * derivative offset = np.squeeze(np.array(offset.T), axis=0) # m - (D''(m))^{-1} D'(m) coord += offset
「二次元の正規分布に従う」という仮定を強めるために、上記の処理の前にヒートマップにガウシアンブラーをかける。ガウシアンブラーをかけるだけだとヒートマップのスケールが変化してしまうため、ヒートマップの最小値と最大値を用いて正規化する。
Coordinate Encoding
GTのキーポイント座標からヒートマップを作成する処理を改良。既存手法はキーポイント座標を整数にしてから、ヒートマップを作成していたのに対して、DARKでは連続値のままヒートマップを作成する。
有効性の検証
Coordinate Decodingの有効性の検証。Standard Shiftingは既存手法のdecodingで行われる0.25 * sign(diff)を座標に加える処理のこと。DARKのdecodingが最も良い性能を示している。
Coordinate Encodingの有効性の検証。UnbiasedがDARKによるもの。
入力解像度がモデルの推論効率に関わる重要な要素であると考え、解像度が精度に与える影響を検証。すべての解像度においてDARKを使用した方が良い精度を示している。特に入力解像度が128x96のときが顕著。
既存手法との比較。