【論文読み】CornerNet: Detecting Objects as Paired Keypoints

公開日:2019-08-10
最終更新:2019-08-10
※この記事は外部サイト(https://qiita.com/habakan/items/fde4d15a7a...)からのクロス投稿です

論文:https://arxiv.org/abs/1808.01244

概要

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

Corner予測のモチベーション

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

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

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

CornerNetのアーキテクチャ


CornerNetは左上と右下のキーポイントをHeatmapとして出力する。
HeatmapはそのピクセルにCornerがあるかないかを表している。
なので、Heatmapはオブジェクトのクラス数$C$チャンネル分用意する。
EmbeddingとOffsetsはHeatmapと同じ出力サイズでチャンネル数はともに1次元としている。
さらに左上と右下の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を利用した損失関数が以下の式である。

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$を表す式である。

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

Corner Pooling

CornerNetは上のアーキテクチャ内でCorner Poolingというレイヤーを利用している。
Cornerを予測するという問題のときに以下の画像のようなCorner付近に対象物体が存在しない状況が想定される。

このような状況のときにどこに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番目のピクセルを表す。

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

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

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

検証

Corner Poolingの有無での比較


Corner Poolingを入れることで精度が向上している。
下がそれぞれが検出したbouding boxである。

中央のシマウマの画像を見るとわかりやすいが、正しくCornerを検出していることがわかる。

Anchor based VS CornerNet


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

Offsetsの有無での比較

他モデルとの比較

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

記事が少しでもいいなと思ったらクラップを送ってみよう!
11
+1
@habakanの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする