LoginSignup
18
20

More than 5 years have passed since last update.

機械学習論文読み:SSD / Single Shot Multibox Detector

Last updated at Posted at 2018-04-26

YOLOに並んで話題のSSD(Single Shot Multibox Detector)の論文を読んでみました。

論文・参考

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

以下の記事、スライドにとてもお世話になりました。

モデル

スクリーンショット 2018-04-26 9.54.53.png

こちらの図の方がイメージしやすい。
https://qiita.com/IshitaTakeshi/items/915de731d8081e711ae5#ssd

  • CNN(VGG26)などで得られたFeature mapを、Multiboxに入力して物体を検出。同時にクラスも推定
  • CNNの特徴マップのサイズは様々なので、多様なサイズのオブジェクトを検出できる

スクリーンショット 2018-04-26 9.58.55.png

  • SSDは、入力に以下が必要
    • 画像
    • Ground truth box(学習に使う)
  • それぞれのfeature mapに対応した、defaultがある
    • 複数のアスペクト比が定義されている(後述)
  • ネットワークは以下を推論する
    • 中心座標(cx, cy)
    • width/height(w, h)
    • カテゴリ([$c_1$, $c_2$,,,,$c_p$])

こちらのP40, 41が分かりやすい

目的関数

数式の一部は、Scalable High Quality Object Detection(2015)を参照した方が分かりやすい。

x_{ij}^p = \{1, 0\}

Scalable High Quality Object Detection(2015)では、$x_{ij}$ = 1をi番目の、prediction が、j番目の grand truthと一致した事を示すとされている。$x_{ij}$ = 0 はそれ以外の場合を示す。

本論文では、複数のカテゴリに対応させるため、category(class) p の j番目の grand truth box に一致したかどうかを示すため、x_{ij}^p と定義した。

  • $x$ : input
  • $c$ : confidence (class)
  • $l$ : predict box
  • $g$ : ground truth box
L(x,c,l,g) = \frac{1}{N}(L_{conf}(x, c) + \alpha L_{loc}(x,l,g))

$L_{loc}(x,l,g)$ は、Scalable High Quality Object Detection(2015)では では以下の通り定義されていた。

F_{loc}(x, l, g) = \frac{1}{2}\sum_{i, j}x_{ij}||l_i - g_i||^2_2

※ $||x||_2$は、L2ノルム

本論文では以下の通り

L_{loc}(x,l,g) = \sum^N_{i \in Pos}\sum_{m \in {cx, cy, w, h}} x^k_{ij} {\rm smooth_{L1}}(l^m_i-\hat{g}^m_j)

Smooth L1 Loss

短形回帰(box regression)

smooth_{L1}(x) = \left\{
\begin{array}{ll}
0.5x^2 & if (|x| < 1) \\
|x| - 0.5 &otherwise
\end{array}
\right.

image.png

Note: plot したコード

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-4, 4, 100)
y = [smoothL1(i) for i in x]
plt.plot(x, y)

正規化

  • $l$ : predict box
  • $g$ : ground truth box
  • $(cx, cy)$ : offset for the center
  • $d$ : default bounding box
  • $w$, $h$ : width/height of default bounding box
\hat{g}^{cx}_j = (g^{cx}_j - d^{cx}_i) / d^{w}_i
\hat{g}^{cy}_j = (g^{cy}_j - d^{cy}_i) / d^{h}_i
\hat{g}^{w}_j = \log(g^{w}_j / d^{w}_i)
\hat{g}^{h}_j = \log(g^{h}_j / d^{h}_i)

クラスの損失関数

L_{conf}(x, c) = -\sum^N_{i \in Pos}x^p_{ij}\log(\hat{c}^p_i) -\sum^N_{i \in Neg}x^p_{ij}\log(\hat{c}^0_i)
\hat{c}^p_i = \frac{\exp(c^p_i)}{\sum_p{\exp(c^p_i)}}

Choosing scales and aspect ratios for default boxes

  • 異なるオブジェクトサイズのものに対応するため、複数のFeature mapを使う
  • $m$ はレイヤ数に対応

    • 大きいほど、小さいオブジェクトを扱える
  • $s_k$ は、$k \in [1, m]$ でオブジェクトサイズ。

s_k = s_{min} + \frac{s_{max} - s_{min}}{m-1}(k-1)  
  • 例えば、$s_{min}$ = 0.2、$s_{max}$ = 0.9 の場合、一番小さいスケールが0.2 で、大きいのが0.9。その間は等間隔となる。

  • 異なるアスペクト比として、以下を容易。

    • $a_r$=1,2,3,1/2,1/3
  • それぞれの幅、高さを計算して、バウンディングボックスを用意

w^a_k = s_k \sqrt{a_r} , h^a_k = s_k / \sqrt{a_r}

アスペクト比が1の時は、以下のスケールのバウンディングボックスを追加

s_k = s_{min} + \frac{s_{max} - s_{min}}{m-1}(k-1)

合計6つのバウンディングボックスを使う

Hard negative mining

  • ほとんどのバウンディングボックスは、negative となる
  • 信頼度の高い順にソートし、それぞれのDefault boxでトップのものをピックアップし、Negative:Positiveが、3:1 になるようにする
  • これにより、最適化が早く・安定する

Data augumentation

以下の方法でサンプリング

  • そのまま
  • 切り抜いたサンプルのオブジェクトとの重なり度(jaccard)が、0.1, 0.3, 0.5, 0.7, 0.9
  • ランダムに切り抜き

  • 切り抜きは、オリジナルサイズの[0.1, 1]の範囲

  • アスペクト比は、1/2 - 2の範囲

  • ground truth box の一致部が重なり合っていて、それが切り抜いたサンプルの中央にある場合は、それを維持

  • 上記のサンプリングを行った後、固定サイズにリサイズ

  • その後0.5 の確率でランダムFlip

  • さらに、phot-metric な歪みを加える(色を変える)

Experimental result

  • base network として VGG16を使う
  • ILSVRC CLS-LOC dataset(imagenet の Object recognition版)でpretrained
  • fcレイヤーをコンバートし、finetuning (詳細略)
  • pool5 を 2x2-s2 から、3x3-s1 に変え、atrousアルゴリズム を使い、穴を埋める

以下、SSD300は、300x300の画像を入力として使う。
SSD512は、512x512。

Pascal VOC 2007

スクリーンショット 2018-04-26 9.36.22.png
Table.1
Fast とFaster R-CNNは、入力画像として、600pixを使う。
SSDは、サイズが異なるが同じ設定。

  • 上記から、
    • 入力画像は大きい方が良い
    • データは多い方が良い
    • SSD300は、常に、Faster R-CNNより良い

スクリーンショット 2018-04-26 9.08.43.png
Fig.3

  • Cor : Correct
  • Loc : 誤った位置(poor localization)
  • Sim : 誤った、似たようなカテゴリー (similar category)
  • Oth : その他
  • BG : 背景
  • 赤い実線: 0.5 jaccard overlap(重なり率) での recall(再現率)
  • 赤い点線: 0.1 jaccard overlap

  • 1段目のグラフ

    • 積み上げグラフ(累積割合グラフ)
    • 横軸はディテクション数
    • 認識を繰り返したときの制度変化を見ている
  • 2段目のグラフ

    • false positive の分布

スクリーンショット 2018-04-26 9.29.42.png
Fig4.

  • VOC2007における、異なるオブジェクトの特長が、Sensitivityとインパクトに与える影響
  • 左側:Bounding box の大きさによるカテゴリ毎のAccuracy
  • 右側:Aspect ratio による、カテゴリ毎のAccuracy
  • 大きさ
    • XS: extra-small
    • S=small
    • M=medium
    • L=large
    • XL=extra-large
  • アスペクト比
    • XT = extra-tall/narrow
    • T=tall
    • M=medium
    • W=wide
    • XW=extra-wide

Model analysis

スクリーンショット 2018-04-26 9.43.00.png

Table 2.

  • data augmentation 重要
  • デフォルトボックスは多い方が良い
  • atrous は速い

スクリーンショット 2018-04-26 9.53.08.png
Table 3

  • 複数の解像度の複数レイヤーを用いた方が良い

Data Augmentation for Small Object Accuracy

  • 小さなオブジェクトのAccuracyを高めるためのData augmentation
    • (本論文中には書いていないが)YOLOの弱いところと言われる
  • zoom-in、zoom-outの操作をData augmentationに加える
    • クリップして拡大縮小

スクリーンショット 2018-04-26 10.14.50.png
Table 6
"*" が、上記の data augmentation をしたもの

スクリーンショット 2018-04-26 10.14.31.png

COCO test-dev でのサンプル。

スクリーンショット 2018-04-26 10.15.57.png
Fig 6
こちらも、* がdata augmentation を使ったもの。小さい画像で改善が見られる。

Inference time

  • 2.4 msec per image

スクリーンショット 2018-04-26 10.18.53.png

Conclusion

  • SSD は高速に複数カテゴリのObject detectionができる
  • 重要なのは、Multi-scaleのConvolutionでBounding boxを出力すること
  • 今回、VGG-16ベースのモデルでState-of-the-artである事を示せた

補足

以下、著者のポエムです

  • YOLOよりもSSDの方が速いですが、YOLOv2 の方が速いです。
  • Multibox が何なのかは(当然ながら)この論文では分かりません。こちらを読まないと。。
18
20
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
20