Sleep like a pillow

Deep Learning関係の話。

論文読み Objects as Points (CenterNet)

arxiv.org

著者による実装 github.com

3D detectionとポーズ推定についても追々まとめます。

どんなもの?

  • 従来の物体検出手法では、潜在的な物体位置を網羅的に列挙しそれぞれを分類することで検出を行うが、無駄が多く非効率でNMSなどの後処理を必要とする。
  • CenterNetでは、物体をbounding boxの中心点としてモデル化することで物体を検出する。
  • キーポイント推定によって中心点を探索するとともに、タスクに合わせてbounding boxの大きさや3D location, orientation, ポーズなどを回帰で推定する。
  • 精度と速度の両方でSOTA。 f:id:uiiurz1:20190519182622p:plain

技術や手法のキモ

Preliminary

  • 入力画像 (W x H)に対して、出力されるキーポイントマップは$$\hat{Y} \in [0, 1]^{\frac{W}{R} \times \frac{H}{R} \times C}$$
  • Rはストライドを表しており、キーポイントマップは入力画像に対して1/Rにダウンサンプリングされる。
  • Cはキーポイントの種類を表しており、物体検出の場合にはカテゴリ数、ポーズ推定の場合には関節数となる。
  •  \hat{Y} = 1は検出したキーポイント、 \hat{Y} = 0は背景に対応する。
  • hourglass networkやDLAなどのencoder-decoderネットワークを用いて、キーポイントマップ \hat{Y}を推定する。
  • ground truthのキーポイント座標 p \in R^2に対して、ダウンサンプリングされたキーポイント座標は \tilde{p} = \lfloor \frac{p}{R} \rfloor
  •  \tilde{p}とガウシアンカーネルを用いてground truthのキーポイントマップYを作成する。 $$Y \in [0, 1]^{\frac{W}{R} \times \frac{H}{R} \times C}$$
  • ガウシアンカーネルをかけた後のマップについて一つの座標に複数クラスが存在する場合には最大のみ採用する。
  • 学習に用いるlossは以下の L_k。 $$ L_k = -\frac{1}{N} \sum_{xyc} \left\{ \begin{array}{} (1 - \hat{Y}_{xyc})^{\alpha} \log \hat{Y}_{xyc} & {\rm if} \hspace{1pt} Y_{xyc} = 1 \\ (1 - Y_{xyc})^{\beta} \hat{Y}_{xyc}^{\alpha} \log (1 - \hat{Y}_{xyc}) & {\rm otherwise} \end{array} \right. $$
  • ストライドによって発生する離散的な誤差を修正するために追加でオフセット \hat{O} \in R^{\frac{W}{R} \times \frac{H}{R} \times 2}を推定する。
  • オフセットは以下のL1 lossで学習。 $$ L_{off} = \frac{1}{N} \sum_p \left|\hat{O}_{\tilde{p}} - \left(\frac{p}{R} - \tilde{p}\right)\right| $$

Objects as Points

  • オブジェクト kのbounding boxを (x_1^{(k)}, y_1^{(k)}, x_2^{(k)}, y_2^{(k)})、カテゴリを c_kとする。
  • 中心点 p_k (\frac{x_1^{(k)} + x_2^{(k)}}{2}, \frac{y_1^{(k)} + y_2^{(k)}}{2})
  • キーポイントマップ \hat{Y}によって中心点を推定するのに加えて、bounding boxのサイズ s_k = (x_2^{(k)} - x_1^{(k)}, y_2^{(k)} - y_1^{(k)})を推定する。
  • つまり、キーポイントマップ \hat{Y}と、bounding boxの大きさを示すマップ \hat{S} \in R^{\frac{W}{R} \times \frac{H}{R} \times 2}を推定する。
  • 学習には以下のL1 lossを用いる。 $$L_{size} = \frac{1}{N} \sum_{k=1}^N \left| \hat{S}_{p_k} - s_k \right|$$
  • 他の物体検出手法でやるような座標のスケーリングは行わず、代わりにそれぞれのlossの係数でスケールを調整する。
  • 全体のlossは以下の通り。 $$L_{det} = L_k + \lambda_{size} L_{size} + \lambda_{off} L_{off}$$
  • キーポイント \hat{Y}、オフセット \hat{O}、bounding boxのサイズ \hat{S}の3つを推定するため、ネットワークが出力するマップのチャンネル数は C+4となる。 f:id:uiiurz1:20190519182844p:plain

From points to bounding boxes

  • 推論時にはキーポイントマップからピークを各カテゴリ独立に抽出する。
  • 周囲8近傍点以上の値を持つ点のうち上位100点をピークとする。
  • ピークの値をそのまま確信度として用いるとともに、ピークの座標 (\hat{x
}_i, \hat{y}_i)とオフセット (\delta \hat{x}_i, \delta \hat{y}_i)、bounding boxのサイズ (\hat{w}_i, \hat{h}_i)から以下のようにしてbounding boxを求める。 $$(\hat{x}_i + \delta \hat{x}_i - \frac{\hat{w}_i}{2}, \hat{y}_i + \delta \hat{y}_i - \frac{\hat{h}_i}{2}, \hat{x}_i + \delta \hat{x}_i + \frac{\hat{w}_i}{2}, \hat{y}_i + \delta \hat{y}_i + \frac{\hat{h}_i}{2})$$
  • ピークを抽出する処理がNMSのような作用を持つため、NMSのような後処理は必要ない。
  • さらにピーク抽出は3x3のmax poolingによって実装できるため、NMSよりも計算コストが低そう。

有効性の検証

  • 物体検出についてはCOCOデータセットを用いてSOTAと比較。
  • 精度・速度の両面で良好な結果。 f:id:uiiurz1:20190519182347p:plain

議論や改善点

  • 後処理として試しにNMSを適用してみた結果、精度は変わらないか若干上がる程度だったので使用しなかった。
  • 物体検出のregression lossといえばsmooth L1 lossという感じだが、通常のL1 lossの方が良かったらしい。
  • アルゴリズムがシンプルで速くて精度が高い。
  • CenterNetのフレームワークはbounding boxだけでなく、推定できるオブジェクトの特性の幅が広いため応用性が高い。