キーポイント系物体検出モデル その1:「CornerNet: Detecting Objects as Paired Keypoints」を読んでみました
CTOの幅野です。
今回はキーポイント検出手法を利用した物体検出モデルCornerNetを読みました。
概要
オブジェクトの左上と右下の境界を予測することにより物体検出をする手法を提案 MSCOCOにおいてAP42.2%を達成した。
Corner予測のモチベーション
SSDのようなアンカーボックスを利用したObjectDetectionモデルの問題点
- 大量のアンカーボックスを用意する必要がある
- アンカーボックスの設計に様々なハイパーパラメータが必要
- アンカーボックスの数
- アンカーボックスのサイズ
- アンカーボックスのアスペクト比
アンカーボックスを利用しない方法としてオブジェクトの左上と右下のCornerを検出をするConerNetを提案
CornerNetのアーキテクチャ
CornerNetは左上と右下のキーポイントをHeatmapとして出力する。 HeatmapはそのピクセルにCornerがあるかないかを表している。 なので、Heatmapはオブジェクトのクラス数$C$チャンネル分用意する。 さらに左上と右下のCornerは途中で別のネットワークに分離してそれぞれHeatmapを出力する。
Heatmap
Heatmapは姿勢推定などでも利用されているガウス分布に従ったヒートマップを教師として作成する。 GroundTruthのCorner座標を$x$、$y$として以下のようなヒートマップを作成する。
ただしはある円の半径の$\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の中では一番精度が高い結果となっている。