SSD詳解


This results in a significant improvement in speed for high-accuracy detection(59 FPS with mAP 74.3% on VOC2007 test, vs Faster-rcnn 7 FPS with mAP 73.2% or YOLO 45 FPS with mAP 63.4%)


圖1 SSD和其它算法的性能比較

一、SSD網絡總體架構


                                                                                                圖2 SSD網絡架構(精簡版)


                                                                                                  圖3 SSD網絡架構(細節版)

SSD算法步驟:

1. 輸入一幅圖片(200x200),將其輸入到預訓練好的分類網絡中來獲得不同大小的特征映射,修改了傳統的VGG16網絡;

    將VGG16的FC6和FC7層轉化為卷積層,如圖1上的Conv6和Conv7;
    去掉所有的Dropout層和FC8層;
    添加了Atrous算法(hole算法),參考該鏈接;
    將Pool5從2x2-S2變換到3x3-S1;

2. 抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2層的feature map,然后分別在這些feature map層上面的每一個點構造6個不同尺度大小的BB,然后分別進行檢測和分類,生成多個BB,如圖1下面的圖所示;

3. 將不同feature map獲得的BB結合起來,經過NMS(非極大值抑制)方法來抑制掉一部分重疊或者不正確的BB,生成最終的BB集合(即檢測結果);

SSD論文貢獻:

1. 引入了一種單階段的檢測器,比以前的算法YOLO更准更快,並沒有使用RPN和Pooling操作;

2. 使用一個小的卷積濾波器應用在不同的feature map層從而預測BB的類別的BB偏差;

3. 可以在更小的輸入圖片中得到更好的檢測效果(相比Faster-rcnn);

4. 在多個數據集(PASCAL、VOC、COCO、ILSVRC)上面的測試結果表明,它可以獲得更高的mAp值;


二、 SSD算法細節

1. 多尺度特征映射


                                                                                                                         圖4 高斯金字塔

做CV的你應該對上圖很熟悉吧,對,沒錯,這就是SIFT算法中的高斯金字塔,對任意的一幅圖片做一個高斯金字塔,你可以獲得不同分辨率的圖片,模擬了人眼看東西時近大遠小的過程。這是針對整幅圖像而言,那么,對於patch而言,同樣也可以做這個操作。我們不僅可以在圖像域做,當然我們也可以在特征域做。

傳統算法與SSD算法的思路比較:


                                                                                                             圖5 傳統做法和SSD做法的比較

如上圖所示,我們可以看到左邊的方法針對輸入的圖片獲取不同尺度的特征映射,但是在預測階段僅僅使用了最后一層的特征映射;而SSD不僅獲得不同尺度的特征映射,同時在不同的特征映射上面進行預測,它在增加運算量的同時可能會提高檢測的精度,因為它具有更多的可能性。

Faster-rcnn與SSD比較:


                                                                                                                                圖6 Faster-rcnn與SSD比較

如圖所示,對於BB的生成,Faster-rcnn和SSD有不同的策略,但是都是為了同一個目的,產生不同尺度,不同形狀的BB,用來檢測物體。對於Faster-rcnn而言,其在特定層的Feature map上面的每一點生成9個預定義好的BB,然后進行回歸和分類操作進行初步檢測,然后進行ROI Pooling和檢測獲得相應的BB;而SSD則在不同的特征層的feature map上的每個點同時獲取6個不同的BB,然后將這些BB結合起來,最后經過NMS處理獲得最后的BB。

原因剖析:


                                                                                                                      圖7 不同卷積層的feature map

如上圖所示,輸入一幅汽車的圖片,我們將其輸入到一個卷積神經網絡中,在這期間,經歷了多個卷積層和池化層,我們可以看到在不同的卷積層會輸出不同大小的feature map(這是由於pooling層的存在,它會將圖片的尺寸變小),而且不同的feature map中含有不同的特征,而不同的特征可能對我們的檢測有不同的作用。總的來說,淺層卷積層對邊緣更加感興趣,可以獲得一些細節信息,而深層網絡對由淺層特征構成的復雜特征更感興趣,可以獲得一些語義信息,對於檢測任務而言,一幅圖像中的目標有復雜的有簡單的,對於簡單的patch我們利用淺層網絡的特征就可以將其檢測出來,對於復雜的patch我們利用深層網絡的特征就可以將其檢測出來,因此,如果我們同時在不同的feature map上面進行目標檢測,理論上面應該會獲得更好的檢測效果。

SSD多尺度特征映射細節:

SSD算法中使用到了conv4_3,conv_7,conv8_2,conv7_2,conv8_2,conv9_2,conv10_2,conv11_2這些大小不同的feature maps,其目的是為了能夠准確的檢測到不同尺度的物體,因為在低層的feature map,感受野比較小,高層的感受野比較大,在不同的feature map進行卷積,可以達到多尺度的目的。

2. Defalut box


                                                                                                                      圖8 default bounding box

如上圖所示,在特征圖的每個位置預測K個BB,對於每一個BB,預測C個類別得分,以及相對於Default box的4個偏移量值,這樣總共需要(C+4)* K個預測器,則在m*n的特征圖上面將會產生(C+4)* K * m * n個預測值。

Defalut box分析:


                                                                                                                                           圖9 Defalut box分析

SSD中的Defalut box和Faster-rcnn中的anchor機制很相似。就是預設一些目標預選框,后續通過softmax分類+bounding box regression獲得真實目標的位置。對於不同尺度的feature map 上使用不同的Default boxes。如上圖所示,我們選取的feature map包括38x38x512、19x19x1024、10x10x512、5x5x256、3x3x256、1x1x256,Conv4_3之后的feature map默認的box是4個,我們在38x38的這個平面上的每一點上面獲得4個box,那么我們總共可以獲得38x38x4=5776個;同理,我們依次將FC7、Conv8_2、Conv9_2、Conv10_2和Conv11_2的box數量設置為6、6、6、4、4,那么我們可以獲得的box分別為2166、600、150、36、4,即我們總共可以獲得8732個box,然后我們將這些box送入NMS模塊中,獲得最終的檢測結果。

以上的操作都是在特征圖上面的操作,即我們在不同尺度的特征圖上面產生很多的BB,如果將映射到原始圖像中,我們會獲得一個密密麻麻的BB集合,如下圖所示:


                                                                                                                      圖10 原始圖像中生成的BB

Defalut box生成規則

    以feature map上每個點的中點為中心(offset=0.5),生成一系列同心的Defalut box(然后中心點的坐標會乘以step,相當於從feature map位置映射回原圖位置)
    使用m(SSD300中m=6)個不同大小的feature map 來做預測,最底層的 feature map 的 scale 值為 Smin=0.2,最高層的為Smax=0.95,其他層通過下面的公式計算得到:



    使用不同的ratio值,[1, 2, 3, 1/2, 1/3],通過下面的公式計算 default box 的寬度w和高度h

    而對於ratio=0的情況,指定的scale如下所示,即總共有 6 中不同的 default box。

                                                                                                              圖11 default box的計算

3. LOSS計算

與常見的 Object Detection模型的目標函數相同,SSD算法的目標函數分為兩部分:計算相應的default box與目標類別的confidence loss以及相應的位置回歸。


其中N是match到Ground Truth的default box數量;而alpha參數用於調整confidence loss和location loss之間的比例,默認alpha=1。


位置回歸則是采用 Smooth L1 loss,目標函數為:


confidence loss是典型的softmax loss:



三、SSD提高精度的方法

1. 數據增強


                                                                                                            圖12 數據增強效果

如上圖所示,不同於Faster-rcnn,SSD算法使用了多種數據增強的方法,包括水平翻轉、裁剪、放大和縮小等。論文明確指出,數據增強可以明顯的提高算法的性能。主要的目的是為了使得該算法對輸入的不同大小和不同形狀的目標具有更好的魯棒性。直觀的理解是通過這個數據增強操作可以增加訓練樣本的個數,同時構造出更多的不同形狀和大小的目標,將其輸入到網絡中,可以使得網絡學習到更加魯棒的特征。

2. Hard Negative Mining技術

一般情況下negative default boxes數量是遠大於positive default boxes數量,如果隨機選取樣本訓練會導致網絡過於重視負樣本(因為抽取到負樣本的概率值更大一些),這會使得loss不穩定。因此需要平衡正負樣本的個數,我們常用的方法就是Hard Ngative Mining,即依據confidience score對default box進行排序,挑選其中confidience高的box進行訓練,將正負樣本的比例控制在positive:negative=1:3,這樣會取得更好的效果。如果我們不加控制的話,很可能會出現Sample到的所有樣本都是負樣本(即讓網絡從這些負樣本中找正確目標,這顯然是不可以的),這樣就會使得網絡的性能變差。

3. 匹配策略(即如何重多個default box中找到和ground truth最接近的box)

    首先,尋找與每一個ground truth有最大的IoU的default box,這樣就能保證ground truth至少有default box匹配;
    SSD之后又將剩余還沒有配對的default box與任意一個ground truth嘗試配對,只要兩者之間的IoU大於閾值(SSD 300 閾值為0.5),就認為match;
    配對到ground truth的default box就是positive,沒有配對的default box就是negative。

總之,一個ground truth可能對應多個positive default box,而不再像MultiBox那樣只取一個IoU最大的default box。其他的作為負樣本(每個default box要么是正樣本box要么是負樣本box)。

4. Atrous Algothrim(獲得更加密集的得分映射)


圖13 Atrous Algothrim理解1

作用:既想利用已經訓練好的模型進行fine-tuning,又想改變網絡結構得到更加dense的score map。
這個解決辦法就是采用Hole算法。如下圖(a) (b)所示,在以往的卷積或者pooling中,一個filter中相鄰的權重作用在feature map上的位置都是物理上連續的。如上圖(c)所示,為了保證感受野不發生變化,某一層的stride由2變為1以后,后面的層需要采用hole算法,具體來講就是將連續的連接關系是根據hole size大小變成skip連接的(圖(c)為了顯示方便直接畫在本層上了)。不要被(c)中的padding為2嚇着了,其實2個padding不會同時和一個filter相連。 pool4的stride由2變為1,則緊接着的conv5_1, conv5_2和conv5_3中hole size為2。接着pool5由2變為1, 則后面的fc6中hole size為4。
圖14 Atrous Algothrim理解2
如上圖所示,Atrous Algothrim可以在提高feature map大小的同時提高接收場的大小,即可以獲得更加密集的score map。

5. NMS(非極大值抑制)

在SSD算法中,NMS至關重要,因為多個feature map 最后會產生大量的BB,然而在這些BB中存在着大量的錯誤的、重疊的、不准確的BB,這不僅造成了巨大的計算量,如果處理不好會影響算法的性能。僅僅依賴於IOU(即預測的BB和GT的BB之間的重合率)是不現實的,IOU值設置的太大,可能就會丟失一部分檢測的目標,即會出現大量的漏檢情況;IOU值設置的太小,則會出現大量的重疊檢測,會大大影響檢測器的性能,因此IOU的選取也是一個經驗活,常用的是0.65,建議使用論文中作者使用的IOU值,因為這些值一般都是最優值。即在IOU處理掉大部分的BB之后,仍然會存在大量的錯誤的、重疊的、不准確的BB,這就需要NMS進行迭代優化。NMS的迭代過程可以看我以前的博客。鏈接


四、SSD性能評估

1. 模塊性能評估


                                                           表1 模塊性能評估

觀察上圖可以得到如下的結論:

    數據增強方法在SSD算法中起到了關鍵性的作用,使得mAP從65.5變化到71.6,主要的原因可能是數據增強增加了樣本的個數,使得模型可以獲得更重更樣的樣本,即提高了樣本的多樣性,使得其具有更好的魯棒性,從而找到更接近GT的BB。
    [1/2,2]和[1/3, 3]box可以在一定程度上提升算法的性能,主要的原因可能是這兩種box可以在一定程度上增加較大和較小的BB,可以更更加准確的檢測到較大和較小的目標,而且VOC數據集上面的目標一般都比較大。當然,更多的比例可以進一步提升算法的性能。
    atrous算法可以輕微提升算法性能,但是其主要的作用是用來提速,論文中表明它可以提速20%。主要的原因可能是雖然該算法可以獲得更大的feature map和接收場,但是由於SSD本身利用了多個feature map來獲取BB,BB的多樣性已經足夠,由於feature map擴大而多得到的BB可能是一些重復的,並沒有起到提升檢測性能的作用。

2. SSD加速的原因


                                                                           表2 SSD的BB個數

如上圖所示,當Faster-rcnn的輸入分辨率為1000x600時,產生的BB是6000個;當SSD300的輸入分辨率為300x300時,產生的BB是8372個;當SSD512的輸入分辨率為512x512時,產生的BB是24564個,大家像一個情況,當SSD的分辨率也是1000x600時,會產生多少個BB呢?這個數字可能會很大!但是它卻說自己比Faster-rcnn和YOLO等算法快很多,我們來分析分析原因。

    原因1:首先SSD是一個單階段網絡,只需要一個階段就可以輸出結果;而Faster-rcnn是一個雙階段網絡,盡管Faster-rcnn的BB少很多,但是其需要大量的前向和反向推理(訓練階段),而且需要交替的訓練兩個網絡;
    原因2:Faster-rcnn中不僅需要訓練RPN,而且需要訓練Fast-rcnn,而SSD其實相當於一個優化了的RPN網絡,不需要進行后面的檢測,僅僅前向推理就會花費很多時間;
    原因3:YOLO網絡雖然比SSD網絡看起來簡單,但是YOLO網絡中含有大量的全連接層,和FC層相比,CONV層具有更少的參數;同時YOLO獲得候選BB的操作比較費時;
    原因4:SSD算法中,調整了VGG網絡的架構,將其中的FC層替換為CONV層,這一點會大大的提升速度,因為VGG中的FC層都需要大量的運算,有大量的參數,需要進行前向推理;
    原因5:使用了atrous算法,具體的提速原理還不清楚,不過論文中明確提出該算法能夠提速20%。
    原因6:SSD設置了輸入圖片的大小,它會將不同大小的圖片裁剪為300x300,或者512x512,和Faster-rcnn相比,在輸入上就會少很多的計算,不要說后面的啦,不快就怪啦!!!

3. SSD准確率評估


                                                                                             表3 VOC2007評估結果


                                                                                                表4 VOC2012評估結果


                                                                                                    表5 COCO評估結果

分析:如上表所示,我們可以觀察到在不同數據集上面(VOC2007、VOC2012、COCO),SSD512都獲得了最佳的性能,在這里進行了加粗。可以看出,Faster-rcnn和SSD相比,在IOU上面最少相差3個點。

當然這只是作者的結果,具體的結果你可以去測試。好了,我不喜歡在博客里寫這些東西,詳細的分析經仔細閱讀原文。

4. SSD算法的優缺點

優點:運行速度超過YOLO,精度超過Faster-rcnn(一定條件下,對於稀疏場景的大目標而言)。

缺點:

    需要人工設置prior box的min_size,max_size和aspect_ratio值。網絡中default box的基礎大小和形狀不能直接通過學習獲得,而是需要手工設置。而網絡中每一層feature使用的default box大小和形狀恰好都不一樣,導致調試過程非常依賴經驗。(相比之下,YOLO2使用聚類找出大部分的anchor box形狀,這個思想能直接套在SSD上)
    雖然采用了pyramdial feature hierarchy的思路,但是對小目標的recall依然一般,並沒有達到碾壓Faster RCNN的級別。可能是因為SSD使用conv4_3低級feature去檢測小目標,而低級特征卷積層數少,存在特征提取不充分的問題。

個人觀點:SSD到底好不好,需要根據你的應用和需求來講,真正合適你的應用場景的檢測算法需要你去做性能驗證,比如你的場景是密集的包含多個小目標的,我很建議你用Faster-rcnn,針對特定的網絡進行優化,也是可以加速的;如果你的應用對速度要求很苛刻,那么肯定首先考慮SSD,至於那些測試集上的評估結果,和真實的數據還是有很大的差距,算法的性能也需要進一步進行評估。


五、總結

    SSD算法是在YOLO的基礎上改進的單階段方法,通過融合多個feature map上的BB,在提高速度的同時提高了檢測的精度,性能超過了YOLO和Faster-rcnn。下圖是其檢測結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM