版權聲明:本文為博主原創文章,轉載需注明出處。 https://blog.csdn.net/qianqing13579/article/details/82106664 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭頭圖標 勿刪 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<hr>
前言
五一假期期間,寫了幾篇SSD源碼解讀系列文章,閱讀完源碼之后,SSD的很多細節都弄懂了,經過這幾個月的工作和學習,對SSD又有了新的理解,這里跟大家一起分享我對SSD的一些理解,歡迎一起討論交流。
目錄
SSD效果為什么這么好
雖然SSD這個算法出來已經兩年了,但是至今依舊是目標檢測中應用最廣泛的算法,雖然后面有很多基於SSD改進的算法,但至今也沒有哪一種檢測算法在速度和精度上能夠完全碾壓SSD的。那么為什么SSD效果這么好?SSD效果好主要有三點原因:
1. 多尺度
2. 設置了多種寬高比的default box(anchor box)
3. 數據增強
下面一一對他們進行分析。
原因1:多尺度
由SSD的網絡結構可以看出,SSD使用6個不同特征圖檢測不同尺度的目標。低層預測小目標,高層預測大目標。
作者在論文中通過實驗驗證了,采用多個特征圖做檢測能夠大大提高檢測精度,從上面的表格可以看出,采用6個特征圖檢測的時候,mAP為74.3%,如果只采用conv7做檢測,mAP只有62.4%。
原因2:設置了多種寬高比的default box
在特征圖的每個像素點處,生成不同寬高比的default box(anchor box),論文中設置的寬高比為{1,2,3,1/2,1/3}。假設每個像素點有k個default box,需要對每個default box進行分類和回歸,其中用於分類的卷積核個數為c*k(c表示類別數),回歸的卷積核個數為4*k。
SSD300中default box的數量:(38*38*4 + 19*19*6 + 10*10*6 + 5*5*6 + 3*3*4 + 1*1*4)= 8732
講到這里,我想對於剛學習SSD的朋友,一定有這些疑惑:
1. 為什么要設置default box?
2. 為什么要設置多種寬高比的default box?
3. 為什么在6個特征圖上使用3x3的卷積核進行卷積就可以做檢測了呢?
這些問題曾經困惱我很長時間,當我看完SSD的源碼,並通過很長時間的實踐,對這些問題豁然開朗,下面分享自己對這些問題的一些理解,希望對你理解SSD能夠提供一些幫助。
理論感受野和有效感受野
這里先簡單說明一下理論感受野和有效感受野的概念,更加詳細的介紹參考論文:Understanding the Effective Receptive Field in Deep Convolutional Neural Networks[1]。這兩個概念的理解對於理解default box(anchor)非常重要。
影響某個神經元輸出的輸入區域就是理論感受野,也就是我們平時說的感受野,但該輸入區域的每個像素點對輸出的重要性不同,越靠近中心的像素點影響越大,呈高斯分布,也就是說只有中間的一小部分區域對最后的輸出有重要的影響,這個中間的一小部分區域就是有效感受野。
圖a中,整個黑色區域就是理論感受野(TRF),中間呈高斯分布的白色點雲區域就是有效感受野(ERF)
圖b中,圖中黑色虛線區域對應理論感受野,藍色虛線部分對應有效感受野,紅色實線框是anchor大小,他比理論感受野小很多,但是能夠匹配有效感受野。
為什么要設置default box?
SSD在6個特征圖上使用2組3x3的卷積核分別做分類和boundingbox回歸,所以SSD是一個全卷積神經網絡。我們知道每個特征圖上每個像素點對應一個理論感受野,所以SSD相當於對原圖中所有的理論感受野作分類和回歸,由於有效感受野在理論感受野中有重要的影響,其他區域的影響可以忽略,所以這里我們認為SSD是對有效感受野作分類和回歸,那么問題來了,既然是對所有的有效感受野做分類和回歸,那每個有效感受野的分類的label和回歸的label是如何確定的呢?default box就是用來干這個的。
每一層的default box設置了每一層特征圖的有效感受野,然后使用這些default box與ground truth進行匹配來確定特征圖上每個像素點的實際的有效感受野的label(包含分類label和回歸label),分別用於分類和boundingbox回歸。說的簡單點,default box就是用來確定特征圖上每個像素點實際的有效感受野的label的。
既然default box是確定實際有效感受野的label的,所以如果default box設置的有效感受野能夠很好的匹配實際的有效感受野,SSD模型效果就會很好,如果兩者相差較大,模型效果就會很差。
上圖中,某一層特征圖的某個像素點對應的實際有效感受野是紅色區域,這個實際有效感受野的label應該是貓,但是SSD訓練時這個紅色區域的label是由default box確定的,如果default box設置的有效感受野對應的是藍色區域,通過對default box與ground truth進行匹配我們發現,藍色區域的label不是貓,而是背景,這樣由default box確定的labe與實際有效感受野的真實的label就匹配不上了,如果用這個label作為紅色區域的真實label就不對了,訓練效果就會很差。
由於default box只要匹配實際的有效感受野就可以了,而實際的有效感受野要比理論感受野小很多,所以SSD中每一層的default box的大小可以比理論感受野小很多。作者在論文中也提到了這一點:
Feature maps from different levels within a network are known to have different (empirical) receptive field sizes .Fortunately, within the SSD framework, the default boxes do not necessary need to correspond to the actual receptive fields of each layer. We design the tiling of default boxes so that specific feature maps learn to be responsive to particular scales of the objects.
大意就是:SSD中default box不必響應實際的感受野,default box只對特定尺度的目標響應。也就是說,SSD的default box只要能夠響應有效感受野就可以了。
所以在訓練SSD的時候,default box大小的設置非常重要。目前實際的有效感受野的大小還不能精確計算出來,如何讓default box設置的有效感受野更好的匹配實際的有效感受野還需要進一步研究。這一點作者在論文中也提到了:
An alternative way of improving SSD is to design a better tiling of default boxes so that its position and scale are better aligned with the receptive field of each position on a feature map. We leave this for future work.
了解了default box的作用后,我們就很容易知道SSD的本質了
SSD對6個特征圖上所有的default box進行分類和回歸,其實就是對6個特征圖對應的實際的有效感受野進行分類和回歸,說得更加通俗一點,這些有效感受野其實就是原圖中的滑動窗口,所以SSD本質上就是對所有滑動窗口進行分類和回歸。這些滑動窗口圖像其實就是SSD實際的訓練樣本。知道SSD的原理后我們發現深度學習的目標檢測方法本質與傳統的目標檢測方法是相同的,都是對滑動窗口的分類。
注:
1. 這里要好好理解這兩個概念:“每一層實際的有效感受野”和“default box設置的有效感受野”
2. 注意全卷積神經網絡與非全卷積神經網絡的區別,一般的分類網絡比如AlexNet只需要對整幅圖像提取特征然后做分類,感受野是整幅圖像,所以最后會用全連接層,而SSD中,由於要對每一個感受野做分類,所以只能用卷積層。
default box的匹配
現在我們知道了default box是用來確定label的,那么是如何確定label的呢?
在訓練階段,SSD會先尋找與每個default box的IOU最大的那個ground truth(大於IOU閾值0.5),這個過程叫做匹配。如果一個default box找到了匹配的ground truth,則該default box就是正樣本,該default box的類別就是該ground truth的類別,如果沒有找到,該default box就是負樣本。圖1(b)中8x8特征圖中的兩個藍色的default box匹配到了貓,該default box的類別為貓,圖1(c)中4x4特征圖中的一個紅色的default box匹配到了狗,該default box的類別為狗。圖2顯示了實際的匹配過程,兩個紅色的default box分別匹配到了貓和狗,左上角的default box沒有匹配,即為負樣本。
圖1
圖 2
關於匹配更多的細節,參考Caffe源碼multibox_loss_layer.cpp中的FindMatches()函數,前面的博客:SSD源碼解讀3-MultiBoxLossLayer中也講到了該函數。
為什么要設置多種寬高比的default box?
我們知道default box其實就是SSD的實際訓練樣本,如果只設置了寬高比為1的default box,最多只有1個default box匹配到,如果設置更多寬高比的default box,將會有更多的default box匹配到,也就相當於有更多的訓練樣本參與訓練,模型訓練效果越好,檢測精度越高。
作者實驗結果表明,增加寬高比為1/2,2,1/3,3的default box,mAP從71.6%提高到了74.3%。
如何選擇default box的scale和aspect ratio?
假設我們用m個feature maps做預測,那么對於每個featuer map而言其default box的scale是按以下公式計算的。
這里 是0.2,表示最低層的scale是0.2, 是0.9,表示最高層的scale是0.9。寬高比 ,因此每個default box的寬 ,高 ,當aspect ratio為1時,作者還增加一種scale的default box: ,因此,對於每個feature map cell而言,一共有6種default box。
示例:
假設m=6,即使用6個特征圖做預測, 則每一層的scale:0.2,0.34,0.48,0.62,0.76,0.9
對於第一層,scale=0.2,對應的6個default box為:
寬高比 | 寬 | 高 |
---|---|---|
1 | 0.200000 | 0.200000 |
2 | 0.282843 | 0.141421 |
3 | 0.346410 | 0.115470 |
1/2 | 0.141421 | 0.282843 |
1/3 | 0.115412 | 0.346583 |
最后增加的default box | 0.260768 | 0.260768 |
注:表格中每個寬高比的default box的實際寬和高需要乘以輸入圖像的大小,如SSD300,則需要使用上面的數值乘以300得到default box實際大小。
Caffe源碼中default box的寬高比以及scale的設置參考prior_box_layer.cpp,前面的博客:SSD源碼解讀2-PriorBoxLayer也對該層進行過解讀。
原因3:數據增強
SSD中使用了兩種數據增強的方式
放大操作: 隨機crop,patch與任意一個目標的IOU為0.1,0.3,0.5,0.7,0.9,每個patch的大小為原圖大小的[0.1,1],寬高比在1/2到2之間。能夠生成更多的尺度較大的目標
縮小操作: 首先創建16倍原圖大小的畫布,然后將原圖放置其中,然后隨機crop,能夠生成更多尺度較小的目標
作者實驗表明,增加了數據增強后,mAP從65.5提高到了74.3!
數據增強對應Caffe源碼annotated_data_layer.cpp,前面的博客:SSD源碼解讀1-數據層AnnotatedDataLayer也對該層進行過解讀。
SSD的缺點及改進
SSD主要缺點:SSD對小目標的檢測效果一般,作者認為小目標在高層沒有足夠的信息。
論文原文:
This is not surprising because those small objects may not even have any information at the very top layers. Increasing the input size (e.g. from 300× 300 to 512× 512) can help improve detecting small objects, but there is still a lot of room to improve.
對SSD的改進可以從下面幾個方面考慮:
1. 增大輸入尺寸
2. 使用更低的特征圖做檢測
3. 設置default box的大小,讓default box能夠更好的匹配實際的有效感受野
SSD與MTCNN
這里為什么會提到MTCNN[2]呢?如果你了解過MTCNN這個算法,一定對PNet這個網絡不陌生,仔細比較SSD與PNet,你就會發現SSD與PNet之間有着千絲萬縷的聯系。
其實我對SSD的理解就是源於MTCNN中的PNet,實際上SSD可以看成是由6個不同的PNet組合而成,最大的不同是數據層,MTCNN需要事先手動將所有的訓練數據生成好,然后輸入到網絡中訓練,而SSD直接輸入原圖就可以,實際的訓練數據由數據層和priorbox層共同完成,其中priorbox層用來確定每個樣本的label。SSD實現了真正意義上的端到端的訓練。
這里用原論文中的SSD300的結構與MTCNN作比較
SSD與MTCNN的區別
- 生成訓練數據的方式不同
MTCNN需要將訓練樣本事先生成好,同時生成label(分類label和回歸label),然后輸入到網絡中訓練,而SSD直接輸入原圖,實際的訓練數據由數據層和priorbox層共同完成,其中priorbox層用來確定每個樣本的label,也就是說SSD將MTCNN的生成訓練數據的部分融合到一個網絡中,實現了真正意義上的端到端。 - MTCNN和SSD實現了兩種滑動窗口檢測策略
MTCNN:首先構建圖像金字塔,然后使用固定大小的滑動窗口在金字塔每一級滑動,對每個滑動窗口分類回歸。這個固定大小的滑動窗口的大小就是PNet的輸入大小,滑動窗口操作由全卷積PNet實現。
SSD: 在原圖中設置了不同大小的滑動窗口,對不同大小的滑動窗口進行分類和回歸。由於SSD可以看作是由6個不同的PNet組成,所以這些不同大小的滑動窗口其實對應了6種PNet。
不管是MTCNN,還是SSD,本質上是對所有滑動窗口的分類。這與傳統的目標檢測方法本質上是一樣的。 - SSD使用3x3卷積核進行分類和回歸,而MTCNN使用1x1卷積核進行分類和回歸
3x3的卷積核覆蓋了該像素點的感受野以及它的領域,加入了局部信息,使得模型更加魯棒。
結束語
SSD在目標檢測領域中具有里程碑式的意義,非常值得我們學習和研究,由於接觸SSD的時間並不是很長,加上時間精力有限,不可能深入理解SSD的每一個細節,文中有什么不妥的地方,歡迎大家批評指正,有喜歡SSD算法的朋友,也歡迎留言一起交流討論。
2018-8-27 08:08:36
Last Updated:2018-8-28 15:44:27
參考文獻
[1] [2016 NIPS] Understanding the Effective Receptive Field in Deep Convolutional Neural Networks
[2] [2016 ISPL] Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
非常感謝您的閱讀,如果您覺得這篇文章對您有幫助,歡迎掃碼進行贊賞。