Last updated
Last updated
原論文
https://arxiv.org/pdf/1512.02325.pdf
概要
YOLOと異なり、ベースのCNNの出力層ではなく、様々な解像度の特徴量マップを使用する。
VGG16の場合、conv4_3を使用。この特徴量マップは元画像が300x300の場合、38x38となる。
その後、VGG16のconv5_3まで処理し、Convを2層重ねて、これも特徴量マップとして使う。
あとはその後に2層重ねて、特徴量マップを抽出して、これを繰り返し、合計6層からの特徴量マップを使う。
この追加する層をextra layerと呼んでいる。
特徴量マップの層毎にdefault boxというbounding boxの候補を考える。
default boxの数は層毎に以下のように違うので注意が必要。
VGG16の場合、以下で合計8732個のdefault boxとなる。
(38,38, 512) ... 4個, 38x38x4で5776個のdefault box
(19,19,1024) ... 6個, 19x19x6で2166個のdefault box
(10,10, 512) ... 6個, 10x10x6で 600個のdefault box
( 5, 5, 256) ... 6個, 5x 5x4で 150個のdefault box
( 3, 3, 256) ... 4個, 3x 3x4で 36個のdefault box
( 1, 1, 256) ... 4個, 1x 1x4で 4個のdefault box
各default boxについて正解bounding boxまでのoffset(localization)と、クラス数分の信頼度(confidence)を計算する。
各特徴量マップ単位に、localization用のconvとconfidence用のconvを接続する。
普通の3x3のconvでlocalization用の出力チャンネル数が、default box数 x 4、confidence用の出力チャンネル数がdefault box数 x クラス数となる。
confidence側は信頼度を連続値として推定するのでこちらもregressorになる。
YOLOは、boxの信頼度と各クラス確率を独立に推定していた。
SSDは、box毎にクラス確率を持っている点も異なる。
default boxは深い部分ほど大きくなるよう設計されている。
wkとhkは元画像を1.0とした場合の相対的なwidthとheightとなる。
つまり300x300の場合で、一番深いレイヤによるdefault boxは、ar=1の時で270x270のサイズとなるイメージ。
ロス関数は、localization lossとconfidence lossの線形和である。
最終的なロス関数
localizationのロス関数は、Faster R-CNNと同様の下式。
confidence lossは、softmax lossとなる。
Hard negative mining
box数はかなり多いため、そのまま実行すると負例がとても大規模となる。
そのため、confidence lossを降順にソートして、上位から正例:負例が1:3となるよう抽出。
より負例らしいものを負例として扱う。
実装例
pytorch公式
https://github.com/pytorch/vision/blob/main/torchvision/models/detection/ssd.py
SSDの解説は@xu1718191411さんのQiita記事がもっとも丁寧
物体検出SSD詳しく紹介
https://qiita.com/xu1718191411/items/6ffdd2a65329b5b11704
https://qiita.com/xu1718191411/items/997190c6183114fcb343
https://qiita.com/xu1718191411/items/442e58f24e6608b6173c
https://qiita.com/xu1718191411/items/56002e07fe7618aef1d6
https://qiita.com/xu1718191411/items/cac5dd4e6d60038aaffb