Sleep like a pillow

Deep Learning関係の話。

Distribution-Aware Coordinate Representation for Human Pose Estimation (DARK)

論文リンク

リポジトリリンク

解説リンク

どんなもの?

ポーズ推定手法の、学習時にGTのキーポイント座標からヒートマップを作成する処理と、テスト時の出力マップからキーポイント座標を算出する処理を改良したDARK (Distribution-Aware coordinate Representation of Keypoint)を提案。DARKはモデルに依存しないプラグインとして機能するため、様々なポーズ推定モデルの性能を大幅に向上させることができる。サブピクセル推定の精度が向上するため、入力解像度が小さい場合でも精度よくキーポイントを検出することができる。HRNet-W48にDARKを組み合わせたモデルがMPIIとCOCOでSOTA。

f:id:uiiurz1:20200913070434p:plain

手法と技術のキモ

Coordinate Decoding

ヒートマップが二次元の正規分布に従うと仮定し、ヒートマップの最大値の座標(=キーポイント座標)を正規分布の平均$\mu$としてサブピクセル推定する。

ヒートマップを以下のような二次元の正規分布として表現。

 \mathcal{G}( \boldsymbol{x} ; \boldsymbol{\mu}, \Sigma)=\frac{1}{(2 \pi)|\Sigma|^{\frac{1}{2}}} \exp \left(-\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^{T} \Sigma^{-1}(\boldsymbol{x}-\boldsymbol{\mu})\right)

対数をとっても最大値を持つ座標は変わらないため、上式を以下のように変形する。

 \mathcal{P}(\boldsymbol{x} ; \boldsymbol{\mu}, \Sigma)=\ln (\mathcal{G})=-\ln (2 \pi)-\frac{1}{2} \ln (|\Sigma|) -\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^{T} \Sigma^{-1}(\boldsymbol{x}-\boldsymbol{\mu})

平均$\mu$において、正規分布の勾配は0になるため以下が成り立つ。

f:id:uiiurz1:20210110084626p:plain

 \mathcal{P}(\boldsymbol{\mu}) mにおけるテイラー展開で近似すると以下のようになる。

 \mathcal{P}(\boldsymbol{\mu})=\mathcal{P}(\boldsymbol{m})+\mathcal{D}^{\prime}(\boldsymbol{m})(\boldsymbol{\mu}-\boldsymbol{m})+\frac{1}{2}(\boldsymbol{\mu}-\boldsymbol{m})^{T} \mathcal{D}^{\prime \prime}(\boldsymbol{m})(\boldsymbol{\mu}-\boldsymbol{m})

 \mathcal{D}^{\prime \prime}(\boldsymbol{m})は$\mathcal{P}$の mにおける二次導関数であり、以下のように表される。

 \mathcal{D}^{\prime \prime}(\boldsymbol{m})=\left.\mathcal{D}^{\prime \prime}(\boldsymbol{x})\right|_{\boldsymbol{x}=\boldsymbol{m}}=-\Sigma^{-1}

以上より$\mu$について、以下の式が導出される。

$\mu = m - (D''(m))^{-1} D'(m)$

$\mu$はキーポイント座標。 mはヒートマップの最大値の座標。$D'(m)$はヒートマップの 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が最も良い性能を示している。

f:id:uiiurz1:20200913071404p:plain

Coordinate Encodingの有効性の検証。UnbiasedがDARKによるもの。

f:id:uiiurz1:20200913071418p:plain

入力解像度がモデルの推論効率に関わる重要な要素であると考え、解像度が精度に与える影響を検証。すべての解像度においてDARKを使用した方が良い精度を示している。特に入力解像度が128x96のときが顕著。

f:id:uiiurz1:20200913071434p:plain

既存手法との比較。

f:id:uiiurz1:20200913071446p:plain