キーポイント系物体検出モデル その1:「CornerNet: Detecting Objects as Paired Keypoints」を読んでみました

CTOの幅野です。
今回はキーポイント検出手法を利用した物体検出モデルCornerNetを読みました。

arxiv.org

概要

オブジェクトの左上と右下の境界を予測することにより物体検出をする手法を提案 MSCOCOにおいてAP42.2%を達成した。

Corner予測のモチベーション

SSDのようなアンカーボックスを利用したObjectDetectionモデルの問題点

  • 大量のアンカーボックスを用意する必要がある
  • アンカーボックスの設計に様々なハイパーパラメータが必要 
    • アンカーボックスの数
    • アンカーボックスのサイズ
    • アンカーボックスのアスペクト比

アンカーボックスを利用しない方法としてオブジェクトの左上と右下のCornerを検出をするConerNetを提案

CornerNetのアーキテクチャ

image.png image.png

CornerNetは左上と右下のキーポイントをHeatmapとして出力する。 HeatmapはそのピクセルにCornerがあるかないかを表している。 なので、Heatmapはオブジェクトのクラス数$C$チャンネル分用意する。 さらに左上と右下のCornerは途中で別のネットワークに分離してそれぞれHeatmapを出力する。

Heatmap

Heatmapは姿勢推定などでも利用されているガウス分布に従ったヒートマップを教師として作成する。 GroundTruthのCorner座標を$x$、$y$として以下のようなヒートマップを作成する。

e^{-\frac{x^{2}+y^{2}}{2 \sigma^{2}}}

ただし\sigmaはある円の半径の$\frac{1}{3}$とする。 その半径はオブジェクトの矩形に対してIOUが少なくとも$t$(今回は0.3)以上になるような円の半径としている。 作成したHeatMapを利用した損失関数が以下の式である。

image.png

Corner($y=1$)かどうかで損失関数を条件分岐しており、式自体はBinaryCrossEntropyを拡張したものとなっている。 $\alpha, \beta$はそれぞれハイパーパラメータで$\alpha=2, \beta=4$で設定されている。

Embeddings

CornerNetは左上・右下を別々に検出する構造なので、どのCornerがペアなのかを紐付ける必要がある。 そこで利用されるのがEmbeddingと呼ばれる埋め込みベクトルを同時に出力し、その距離が小さいかどうかで紐付ける手法である。 なので、学習時にペアのCornerのEmbeddingの距離が小さくなり、他のオブジェクトのEmbeddingとは離れるように学習する。 なお、EmbeddingsはGroundTruthで与えられたCorner部分のEmbeddingsに対してのみ損失関数を適応して学習する。 $e_{t_k}$は物体$k$の左上のCornerのEmbeddingで$e_{b_k}$は右下のEmbeddingである。 ペアのEmbeddingの距離を小さくする$L_{pull}$と他のペアとのEmbeddingから離れるようにする$L_{push}$を損失関数として定義する。

$$ L_{p u l l}=\frac{1}{N} \sum_{k=1}^{N}\left[\left(e_{t_{k}}-e_{k}\right)^{2}+\left(e_{b_{k}}-e_{k}\right)^{2}\right] $$

$$ L_{p u s h}=\frac{1}{N(N-1)} \sum_{k=1}^{N} \sum_{j=1 \atop j \neq k}^{N} \max \left(0, \Delta-\left|e_{k}-e_{j}\right|\right) $$ $e_k$は右下と左上のembeddingの平均を表す。$\Delta$は1としている。

Offsets

CornerNetの出力は入力画像をダウンサンプリングしたものである。 なのでダウンスケールが$n$で入力画像サイズが$(x, y)$とすると出力サイズは$(\lfloor \frac{x}{n} \rfloor, \lfloor \frac{y}{n} \rfloor )$となってしまう。 なので出力を元の画像サイズに戻そうとすると実際の入力画像のCorner座標と出力結果のCorner座標がずれてしまう。 このずれは検出したい物体が小さくなるほど精度に悪い影響を及ぼす。 なのでそのずれをOffsetとして推定することを考える。 以下がOffsets $o$を表す式である。

image.png

この$o$をモデルで同時に予測をする。 損失関数にはSmoothL1Lossを利用している。

image.png

Corner Pooling

CornerNetは上のアーキテクチャ内でCorner Poolingというレイヤーを利用している。 Cornerを予測するという問題のときに以下の画像のようなCorner付近に対象物体が存在しない状況が想定される。 image.png このような状況のときにどこにCornerがあるのかを決定しやすくするためにはCornerへ水平方向にも垂直方向にも情報を集約する必要がある。

To determine if a pixel is a top-left corner, we need to look horizontally towards the right for the topmost boundary of an object and vertically towards the bottom for the leftmost boundary.

ここで提案されたのがCorner Poolingである。 Corner PoolingはTop Left, Bottom Rightそれぞれ別のpoolingとして定義されている。 $f_{t_{ij}}$はTop Left内の$H$×$W$の特徴マップ$f$のij番目のピクセルを表す。

image.png

これらの式を実際に計算した図が以下である。

image.png

2つpoolingしてできた特徴マップを要素ごとに加算している。

これらは以下のようにアーキテクチャ内で利用されている。 image.png

検証

Corner Poolingの有無での比較

image.png Corner Poolingを入れることで精度が向上している。 下がそれぞれが検出したbouding boxである。 image.png 中央のシマウマの画像を見るとわかりやすいが、正しくCornerを検出していることがわかる。

Anchor based VS CornerNet

image.png hourgrassをbackboneとしたモデルにAnchorbasedとCornerbasedの2つをそれぞれ利用した精度結果。

Offsetsの有無での比較

image.png

他モデルとの比較

image.png

他モデルとの精度結果、一番下のmulti scaleのAPがabstractでcontributionとして記述していたscoreで、 one-stage detectorsの中では一番精度が高い結果となっている。