ssd系列演算法總結(一)

目標檢測演算法「one stage 」演算法的一個主要的系列演算法SSD是比較有代表性,比較有研究價值,效果相對較好,在SSD演算法出現之後,後續又有一系列的演算法對SSD針對不同的角度進行改進,不同演算法效果均有了很大的改善,了解SSD系列演算法的特點,有助於理解目標檢測演算法的一些基本的思想。

SSD系列演算法的主要文章(僅整理自己讀過的幾篇論文):

SSD:Single Shot MultiBox Detector

DSSD: Deconvolutional Single Shot Detector

FSSD:Feature Fusion Single Shot Multibox Detector

RefineDet: Single-Shot Refinement Neural Network for Object Detection

RfbNet:Receptive Field Block Net for Accurate and Fast Object Detection

M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid Network

Pelee:Pelee: A Real-Time Object Detection System on Mobile Devices

1、SSD

SSD是ECCV2016的一篇文章,演算法效果比yolo v1效果好了非常多,可以說開創了應用多尺度的特徵圖進行目標檢測的先河,其後幾乎所有的目標檢測演算法(自己了解知識範圍內),均或多或少採用多尺度的思想。

利用多尺度特徵圖提高目標檢測準確率的思想主要來自,淺層特徵圖包含著位置資訊,對於目標定位非常重要;深層的特徵圖包含大量的語義資訊,對影像目標的分類具有重要的意義。

同時,由於深層的特徵圖anchor所對應的目標的區域較大,例如特徵圖縮小為原始尺度的64倍,那麼這個特徵圖每個錨點所對應的原始影像目標尺度為64個像素。因而僅僅採用較高層的特徵圖進行目標檢測,很難檢測出較小的物體,這也是ssd效果優於yolo的一個主要的原因。

先看結構圖:

v2-92ea90571806c0733bca91e805e01610_b.jpg

圖片來自ssd論文原文

演算法採用Vgg16作為基礎特徵提取網路,然後分別利用conv43的特徵圖(下取樣3次,尺度縮小為原始大小的1/8左右)、conv7的特徵圖(在conv4_3基礎上下取樣一次),這一部分是vgg16,,然後再利用逐步下取樣得到的特徵圖,分別進行檢測。

演算法的pytorch源碼://github.com/amdegroot/ssd.pytorch

ssd演算法的配置:

voc = {
    'num_classes': 21,
    'lr_steps': (80000, 100000, 120000),
    'max_iter': 120000,
    'feature_maps': [38, 19, 10, 5, 3, 1],
    'min_dim': 300,
    'steps': [8, 16, 32, 64, 100, 300],
    'min_sizes': [30, 60, 111, 162, 213, 264],
    'max_sizes': [60, 111, 162, 213, 264, 315],
    'aspect_ratios': [[2], [2, 3], [2, 3], [2, 3], [2], [2]],
    'variance': [0.1, 0.2],
    'clip': True,
    'name': 'VOC',
}

其中feature_maps:所使用用來進行目標檢測的特徵圖尺度

steps: 進行目標檢測的特徵圖乘以step,即可映射回原始位置。

aspectratios: 每層特徵圖的所用的anchor的長寬比。每個aspect_ratio可以產生兩個目標框

Conv4_3: 38 × 38 × 4 = 5776
Conv7: 19 × 19 × 6 = 2166
Conv8_2: 10 × 10 × 6 = 600
Conv9_2: 5 × 5 × 6 = 150
Conv10_2: 3 × 3 × 4 = 36
Conv11_2: 4

那麼最終一共有先驗框8762個。

先驗框的設置:pytorch源碼,layer/function/priorboxes.py文件說明這個過程。

計算思路:以feature map上每個點的中點為中心(offset=0.5),生成一些列同心的prior box(然後中心點的坐標會乘以step,相當於從feature map位置映射回原圖位置),最後會歸一化處理

正方形prior box最小邊長為min_size,最大邊長為

轉存失敗重新上傳取消\sqrt{min *max}

每在priorbox設置一個aspect ratio,會生成2個長方形,長寬為:

轉存失敗重新上傳取消\sqrt{apect}*min​ 和

轉存失敗重新上傳取消1/\sqrt{apect}*min​ ,

因而在conv4_3上會有38×38×4個,兩個正方形兩個矩形。

同時在預測階段,依照論文所說預測的時offset,也就是真實的目標框與先驗框的坐標轉換後的值。也就是一個編碼與解碼過程。

先驗框的位置表示為

轉存失敗重新上傳取消d=(d^{cx}, d^{cy}, d^w, d^h)

對應的真實邊界框的位置為

轉存失敗重新上傳取消b=(b^{cx}, b^{cy}, b^w, b^h)

那麼預測得到的值l實際為:

轉存失敗重新上傳取消l^{cx} = (b^{cx} - d^{cx})/d^w, \space l^{cy} = (b^{cy} - d^{cy})/d^h

轉存失敗重新上傳取消l^{w} = \log(b^{w}/d^w), \space l^{h} = \log(b^{h}/d^h)

然後再根據預測的值進行解碼得到原始的位置

轉存失敗重新上傳取消b^{cx}=d^w l^{cx} + d^{cx}, \space b^{cy}=d^y l^{cy} + d^{cy}

轉存失敗重新上傳取消b^{w}=d^w \exp(l^{w}), \space b^{h}=d^h \exp(l^{h})

如上邊程式碼段所示,在pytorch源碼中還存在variance參數,這個參數將得到的預測值進行變換,將原始的預測值,l進行如下變換。然後進行匹配,也就是decode,這種encode與decode源碼存在於utils/box_utils.py中。

轉存失敗重新上傳取消l = l*variance

如此基本上的演算法的結構及一些實現的細節(包括先驗框的設置,編碼與解碼)介紹清楚。


下一篇將會介紹幾種演算法的改進思想