SSD(Single Shot MultiBox Detector)
論文地址:https://ar5iv.labs.arxiv.org/html/1512.02325
簡(jiǎn)述
SSD(Single Shot MultiBox Detector)屬于one - stage套路。在保證了精度的同時(shí),又提高了檢測(cè)速度,相比當(dāng)時(shí)的Yolo和Faster R-CNN是最好的目標(biāo)檢測(cè)算法了,可以達(dá)到實(shí)時(shí)檢測(cè)的要求。對(duì)于Faster R-CNN,它是一個(gè)two - stage的方法,先通過(guò)CNN得到候選框,然后再進(jìn)行分類(lèi)和回歸,而Yolo與SSD可以一步到位完成檢測(cè)。相比于YOLO,SSD采用CNN來(lái)直接進(jìn)行檢測(cè),而不是像YOLO那樣在全連接層之后再做檢測(cè)。SSD相比于YOLO還有兩個(gè)重要的改變,一是SSD提取不同尺度的特征圖來(lái)做檢測(cè),大尺度特征圖(較靠前的特征圖)用來(lái)檢測(cè)小物體,小尺度特征圖(較靠后的特征圖,感受野大)用來(lái)檢測(cè)大物體;二是SSD采用了不同尺度和長(zhǎng)寬比的先驗(yàn)框(Prior boxes, Default boxes,在Faster R-CNN中叫做錨,Anchors)。Yolo算法的缺點(diǎn)是難以檢測(cè)小目標(biāo),而且定位不準(zhǔn),但是這幾點(diǎn)重要的改進(jìn)使得SSD在一定程度上克服這些缺點(diǎn)。PASCAL VOC,COCO和ILSVRC數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果證實(shí),SSD對(duì)于利用額外的目標(biāo)建議(object proposal)的方法具有競(jìng)爭(zhēng)性的準(zhǔn)確性,并且速度更快,同時(shí)為訓(xùn)練和預(yù)測(cè)提供了統(tǒng)一的框架。對(duì)于300×300的輸入,SSD在VOC2007測(cè)試中以59FPS的速度在Nvidia Titan X上達(dá)到74.3%的mAP,對(duì)于512×512的輸入,SSD達(dá)到了76.9%的mAP,優(yōu)于目前為止最先進(jìn)的Faster R-CNN模型。與其他一步法目標(biāo)檢測(cè)算法相比,即使輸入圖像尺寸較小,SSD也具有更高的精度。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
網(wǎng)絡(luò)結(jié)構(gòu)
SSD采用VGG16作為基礎(chǔ)模型,然后在VGG16的基礎(chǔ)上新增了部分卷積層,其網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示:


VGG-16有16層,包括13個(gè)卷積層和3個(gè)全連接層,卷積層卷積核的大小為3×3,步長(zhǎng)為1,通過(guò)卷積層可以實(shí)現(xiàn)通道數(shù)的增加,池化層大小為2×2,步長(zhǎng)為2,作用是降低特征圖尺寸并能提高網(wǎng)絡(luò)抗干擾能力,所有隱藏層后都帶有ReLU非線性激活函數(shù)。第一次經(jīng)過(guò)64個(gè)卷積核的兩次卷積后,采用一次pooling;第二次經(jīng)過(guò)兩次128個(gè)卷積核卷積后,采用pooling;再經(jīng)過(guò)3次256個(gè)卷積核卷積后,采用pooling;再經(jīng)過(guò)3次512個(gè)卷積核卷積,采用pooling;再經(jīng)過(guò)3次512個(gè)卷積核卷積,采用pooling,最后經(jīng)過(guò)三次全連接。SSD網(wǎng)絡(luò)結(jié)構(gòu)對(duì)VGG16做了修改,將VGG16的全連接層fc6和fc7轉(zhuǎn)換成3×3卷積層conv6和1×1卷積層conv7。修改細(xì)節(jié)如下:

SSD與YOLO不同之處是除了在最終的特征圖上做目標(biāo)檢測(cè)之外,還選取前面5種尺寸的特征圖進(jìn)行檢測(cè),這6種特征圖所在的層為:?Conv4_3,Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2,各自的尺寸分別為:(38,38), (19,19), (10,10), (5,5), (3,3), (1,1)。它們?cè)谠瓐D上的感受野不同,尺寸越小的特征圖看到原圖的視野越大,因此大的特征圖用來(lái)檢測(cè)小目標(biāo),小的特征圖用來(lái)檢測(cè)大目標(biāo)。Conv6采用帶孔卷積,在不增加參數(shù)與模型復(fù)雜度的條件下擴(kuò)大特征圖的感受野,其使用擴(kuò)張率(dilation rate)參數(shù),來(lái)表示擴(kuò)張的大小,Conv6采用3*3大小但dilation rate=6的擴(kuò)展卷積,視野為13*13。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
計(jì)算帶孔卷積感受野的時(shí)候,把空洞也算進(jìn)去了。原圖的尺寸是 300*300,從conv7特征圖開(kāi)始,感受野的尺寸就大于原圖的尺寸了,所以后面5種特征圖的視野是整張輸入圖像,在這5種特征圖上檢測(cè)目標(biāo)時(shí)只需要關(guān)心想檢測(cè)的目標(biāo)物尺寸,而不需要關(guān)心檢測(cè)區(qū)域是否落入感受野范圍內(nèi)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
網(wǎng)絡(luò)結(jié)構(gòu)的最后兩個(gè)部分是:Detection Layer和NMS。前面指定的6種特征圖都需要接入Detection Layer,Detection Layer的輸出與損失函數(shù)直接相關(guān),因?yàn)檫@一層的網(wǎng)絡(luò)結(jié)構(gòu)由先驗(yàn)框決定。NMS是極大值抑制,它在網(wǎng)絡(luò)的訓(xùn)練階段沒(méi)有使用,模型訓(xùn)練好后,測(cè)試時(shí)需要用NMS對(duì)預(yù)測(cè)結(jié)果進(jìn)行篩選,去掉無(wú)效的、重復(fù)的結(jié)果。
先驗(yàn)框
SSD為6種特征圖每個(gè)像素點(diǎn)都設(shè)置了一些尺度和寬長(zhǎng)比(縱橫比)不同的框,稱(chēng)為先驗(yàn)框(default box,anchor box,prior box),設(shè)置先驗(yàn)框的目的是為了提取不同尺寸,不同位置的目標(biāo)。不同特征圖設(shè)置的先驗(yàn)框數(shù)目不同(同一個(gè)特征圖上每個(gè)像素設(shè)置的先驗(yàn)框是相同的)。先驗(yàn)框的設(shè)置,包括尺度(或者說(shuō)大?。┖烷L(zhǎng)寬比兩個(gè)方面,特征圖越小,先驗(yàn)框越大,使其能夠檢測(cè)出大目標(biāo);特征圖越大,先驗(yàn)框越小,使其能夠檢測(cè)出小目標(biāo)。

6種特征圖總共會(huì)產(chǎn)生多少個(gè)先驗(yàn)框?論文里是這么設(shè)置的:

把最后一列求和,一共有8732個(gè)先驗(yàn)框。先驗(yàn)框的設(shè)置是以特征圖上的像素點(diǎn)為單位的,像素的中心就是先驗(yàn)框的中心。確定了先驗(yàn)框數(shù)量后,那先驗(yàn)框的尺度該如何設(shè)置?尺度一般表示為長(zhǎng)*寬的形式,但如果是正方形,那它的尺度只給出一個(gè)量即可,即邊長(zhǎng)。論文是先給出一個(gè)正方形的先驗(yàn)框,然后調(diào)整這個(gè)正方形的寬高比來(lái)產(chǎn)生不同形狀的先驗(yàn)框。對(duì)于先驗(yàn)框的尺度,其遵守一個(gè)線性遞增規(guī)則:隨著特征圖大小降低,先驗(yàn)框尺度線性增加:

除了這一個(gè)尺度,論文里還計(jì)算了另外一個(gè)尺度:

兩個(gè)尺度設(shè)計(jì)總結(jié)在下表:

每個(gè)先驗(yàn)框的寬高比(縱橫比)如何設(shè)置?第二種尺度的寬高比例只有1,即正方形框。第1,5,6個(gè)特征圖具有相同的寬高比,第2,3,4個(gè)特征圖的寬高比多了3和1/3。

一張圖片喂給神經(jīng)網(wǎng)絡(luò),網(wǎng)絡(luò)中的每個(gè)先驗(yàn)框都需要去匹配一個(gè)真實(shí)框,這個(gè)真實(shí)框是記錄在該圖像的xml文件里的,以坐標(biāo)(xmin,ymin,xmax,ymax)的形式給出,也會(huì)給出真實(shí)框?qū)?yīng)的目標(biāo)類(lèi)別。一個(gè)先驗(yàn)框與匹配到的真實(shí)框之間會(huì)存在位置誤差,假設(shè)第 i 個(gè) default box 與第 j 個(gè) gt box 匹配,其位置信息分別表示為:

那么兩者之間的位置誤差會(huì)被編碼為:

神經(jīng)網(wǎng)絡(luò)訓(xùn)練的一個(gè)目標(biāo)就是要去擬合這個(gè)位置誤差。另外一個(gè)目標(biāo)就是常見(jiàn)的多分類(lèi)問(wèn)題,使正確類(lèi)別對(duì)應(yīng)神經(jīng)元輸出的概率最大。

那么Detection Layer這一層網(wǎng)絡(luò)就很容易設(shè)置了,輸入一張圖片,網(wǎng)絡(luò)中的每個(gè)先驗(yàn)框都需要輸出4個(gè)位置誤差和21個(gè)類(lèi)別置信度(需要做softmax),使用卷積層實(shí)現(xiàn),每張?zhí)卣鲌D都需要接入卷積層作為輸出,將需要輸出的信息放在channel維度,即設(shè)置的輸出卷積層的通道數(shù)分別為4和21。
先驗(yàn)框與真實(shí)框匹配策略

損失函數(shù)
損失函數(shù)定義為位置誤差 (locatization loss, loc) 與置信度誤差 (confidence loss, conf) 的加權(quán)和:

N是所有正樣本的個(gè)數(shù),位置誤差只統(tǒng)計(jì)正樣本,使用smooth_l1_loss進(jìn)行擬合。置信度誤差統(tǒng)計(jì)正負(fù)樣本,采用交叉熵?fù)p失函數(shù)。

代碼
1. 先驗(yàn)框生成
2. SSD網(wǎng)絡(luò)結(jié)構(gòu)
3. 先驗(yàn)框和真實(shí)框匹配
4. 損失函數(shù)
5. 訓(xùn)練
6. 預(yù)測(cè)