YOLOv2相對v1版本,在繼續(xù)保持處理速度的基礎上,從預測更準確(Better),速度更快(Faster),識別對象更多(Stronger)這三個方面進行了改進。其中識別更多對象也就是擴展到能夠檢測9000種不同對象,稱之為YOLO9000。
1、預測更準確(Better)

1)batch normalization(批歸一化)
批歸一化使mAP有2.4的提升(63.4~65.8)。
批歸一化有助于解決反向傳播過程中的梯度消失和梯度爆炸問題,降低對一些超參數(shù)(比如學習率、網(wǎng)絡參數(shù)的大小范圍、激活函數(shù)的選擇)的敏感性,并且每個batch分別進行歸一化的時候,起到了一定的正則化效果(YOLO2不再使用dropout),從而能夠獲得更好的收斂速度和收斂效果。
通常,一次訓練會輸入一批樣本(batch)進入神經(jīng)網(wǎng)絡。批規(guī)一化在神經(jīng)網(wǎng)絡的每一層,在網(wǎng)絡(線性變換)輸出后和激活函數(shù)(非線性變換)之前增加一個批歸一化層(BN),BN層進行如下變換:
①對該批樣本的各特征量(對于中間層來說,就是每一個神經(jīng)元)分別進行歸一化處理,分別使每個特征的數(shù)據(jù)分布變換為均值0,方差1。從而使得每一批訓練樣本在每一層都有類似的分布。這一變換不需要引入額外的參數(shù)。
②對上一步的輸出再做一次線性變換,假設上一步的輸出為Z,則Z1=γZ + β。這里γ、β是可以訓練的參數(shù)。增加這一變換是因為上一步驟中強制改變了特征數(shù)據(jù)的分布,可能影響了原有數(shù)據(jù)的信息表達能力。增加的線性變換使其有機會恢復其原本的信息。
關于批規(guī)一化的更多信息可以參考 Batch Normalization原理與實戰(zhàn)。
2)使用高分辨率圖像微調(diào)分類模型
mAP提升了3.7(65.8~69.5)。
圖像分類的訓練樣本很多,而標注了邊框的用于訓練對象檢測的樣本相比而言就比較少了,因為標注邊框的人工成本比較高。所以對象檢測模型通常都先用圖像分類樣本訓練卷積層,提取圖像特征。但這引出的另一個問題是,圖像分類樣本的分辨率不是很高。所以YOLO v1使用ImageNet的圖像分類樣本采用 224224 作為輸入,來訓練CNN卷積層。然后在訓練對象檢測時,檢測用的圖像樣本采用更高分辨率的 448448 的圖像作為輸入。但這樣切換對模型性能有一定影響。
所以YOLO2在采用 224224 圖像進行分類模型預訓練后,再采用 448448 的高分辨率樣本對分類模型進行微調(diào)(10個epoch),使網(wǎng)絡特征逐漸適應 448448 的分辨率。然后再使用 448448 的檢測樣本進行訓練,緩解了分辨率突然切換造成的影響。
3)采用先驗框(Anchor Boxes)
召回率大幅提升到88%,同時mAP輕微下降了0.2。
借鑒Faster RCNN的做法,YOLO2也嘗試采用先驗框(anchor)。在每個grid預先設定一組不同大小和寬高比的邊框,來覆蓋整個圖像的不同位置和多種尺度,這些先驗框作為預定義的候選區(qū)在神經(jīng)網(wǎng)絡中將檢測其中是否存在對象,以及微調(diào)邊框的位置。
同時YOLO2移除了全連接層。另外去掉了一個池化層,使網(wǎng)絡卷積層輸出具有更高的分辨率。
之前YOLO1并沒有采用先驗框,并且每個grid只預測兩個bounding box,整個圖像98個。YOLO2如果每個grid采用9個先驗框,總共有13139=1521個先驗框。所以,相對YOLO1的81%的召回率,YOLO2的召回率大幅提升到88%。同時mAP有0.2%的輕微下降。
不過YOLO2接著進一步對先驗框進行了改良。
4)聚類提取先驗框尺度
聚類提取先驗框尺度,結(jié)合下面的約束預測邊框的位置,使得mAP有4.8的提升(69.6~74.4)。
之前先驗框都是手工設定的,YOLO2嘗試統(tǒng)計出更符合樣本中對象尺寸的先驗框,這樣就可以減少網(wǎng)絡微調(diào)先驗框到實際位置的難度。YOLO2的做法是對訓練集中標注的邊框進行聚類分析,以尋找盡可能匹配樣本的邊框尺寸。
聚類算法最重要的是選擇如何計算兩個邊框之間的“距離”,對于常用的歐式距離,大邊框會產(chǎn)生更大的誤差,但我們關心的是邊框的IOU。所以,YOLO2在聚類時采用以下公式來計算兩個邊框之間的“距離”:。
centroid是聚類時被選作中心的邊框,box就是其它邊框,d就是兩者間的“距離”。IOU越大,“距離”越近。YOLO2給出的聚類分析結(jié)果如下圖所示:

上圖左邊是選擇不同的聚類k值情況下,得到的k個centroid邊框,計算樣本中標注的邊框與各centroid的Avg IOU。顯然,邊框數(shù)k越多,Avg IOU越大。YOLO2選擇k=5作為邊框數(shù)量與IOU的折中。對比手工選擇的先驗框,使用5個聚類框即可達到61 Avg IOU,相當于9個手工設置的先驗框60.9 Avg IOU。
上圖右邊顯示了5種聚類得到的先驗框,VOC和COCO數(shù)據(jù)集略有差異,不過都有較多的瘦高形邊框。
5)約束預測邊框的位置
借鑒于Faster RCNN的先驗框方法,在訓練的早期階段,其位置預測容易不穩(wěn)定。其位置預測公式為:
,
其中,是預測框的中心,
是先驗框(anchor)的中心點坐標,
是先驗框(anchor)的寬和高,
是要學習的參數(shù)。注意,YOLO論文中寫的是
,根據(jù)Faster RCNN,應該是"+"。
由于的取值沒有任何約束,因此預測邊框的中心可能出現(xiàn)在任何位置,訓練早期階段不容易穩(wěn)定。YOLO調(diào)整了預測公式,將預測邊框的中心約束在特定的grid網(wǎng)格內(nèi)。
其中,是預測框的中心和寬高。
是預測邊框的置信度,YOLOv1是直接預測置信度的值,這里對預測參數(shù)
進行
變換后作為置信度的值。
是當前網(wǎng)格左上角到圖像左上角的距離,要先將網(wǎng)格大小歸一化,即令一個網(wǎng)格的寬=1, 高=1。
是先驗框的框和高。
是sigmoid函數(shù)。
是要學習的參數(shù),分別用于預測邊框的中心和寬高,以及置信度。

參考上圖,由于函數(shù)將
約束在(0,1)范圍內(nèi),所以根據(jù)上面的計算公式,預測邊框的藍色中心點被約束在藍色背景的網(wǎng)格內(nèi)。約束邊框位置使得模型更容易學習,且預測更為穩(wěn)定。
6)passthrough層檢測細粒度特征
passthrough層檢測細粒度特征使mAP提升1(74.4~75.4)。
對象檢測面臨的一個問題是圖像中對象會有大有小,輸入圖像經(jīng)過多層網(wǎng)絡提取特征,最后輸出的特征圖中(比如YOLO2中輸入416416經(jīng)過卷積網(wǎng)絡下采樣最后輸出是1313),較小的對象可能特征已經(jīng)不明顯甚至被忽略掉了。為了更好的檢測出一些比較小的對象,最后輸出的特征圖需要保留一些更細節(jié)的信息。
YOLO2引入一種稱為passthrough層的方法在特征圖中保留一些細節(jié)信息。具體來說,就是在最后一個pooling之前,特征圖的大小是2626512,將其1拆4,直接傳遞(passthrough)到pooling后(并且又經(jīng)過一組卷積)的特征圖,兩者疊加到一起作為輸出的特征圖。

具體怎樣1拆4,如下圖所示。圖中示例的是1個44拆成4個22。因為深度不變,所以沒有畫出來。

另外,根據(jù)YOLO2的代碼,特征圖先用11卷積從 2626512 降維到 2626*64,再做1拆4并passthrough。
7)多尺度圖像訓練
多尺度圖像訓練對mAP有1.4的提升(75.4~76.8)。
因為去掉了全連接層,YOLO2可以輸入任何尺寸的圖像。因為整個網(wǎng)絡下采樣倍數(shù)是32,作者采用了{320,352,...,608}等10種輸入圖像的尺寸,這些尺寸的輸入圖像對應輸出的特征圖寬和高是{10,11,...19}。訓練時每10個batch就隨機更換一種尺寸,使網(wǎng)絡能夠適應各種大小的對象檢測。
8)高分辨率圖像的對象檢測
首圖中hi-res detector使mAP提高了1.8。因為YOLO2調(diào)整網(wǎng)絡結(jié)構后能夠支持多種尺寸的輸入圖像。通常是使用416416的輸入圖像,如果用較高分辨率的輸入圖像,比如544544,則mAP可以達到78.6,有1.8的提升。
2、速度更快
為了進一步提升速度,YOLO2提出了Darknet-19(有19個卷積層和5個MaxPooling層)網(wǎng)絡結(jié)構。DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮點運算量減少到約1/5,以保證更快的運算速度。

YOLO2的訓練主要包括三個階段:
- 第一階段就是先在ImageNet分類數(shù)據(jù)集上預訓練Darknet-19,此時模型輸入為 224 * 224 ,共訓練160個epochs。
- 第二階段將網(wǎng)絡的輸入調(diào)整為 448 * 448 ,繼續(xù)在ImageNet數(shù)據(jù)集上finetune分類模型,訓練10個epochs,此時分類模型的top-1準確度為76.5%,而top-5準確度為93.3%。
- 第三個階段就是修改Darknet-19分類模型為檢測模型,移除最后一個卷積層、global avgpooling層以及softmax層,并且新增了三個 3 * 3 * 1024卷積層,同時增加了一個passthrough層,最后使用 1 * 1 卷積層輸出預測結(jié)果,輸出的channels數(shù)為:num_anchors * (5+num_classes) ,和訓練采用的數(shù)據(jù)集有關系。由于anchors數(shù)為5,對于VOC數(shù)據(jù)集(20種分類對象)輸出的channels數(shù)就是125,最終的預測矩陣T的shape為 (batch_size, 13, 13, 125),可以先將其reshape為 (batch_size, 13, 13, 5, 25) ,其中 T[:, :, :, :, 0:4] 為邊界框的位置和大小
,T[:, :, :, :, 4] 為邊界框的置信度,而 T[:, :, :, :, 5:] 為類別預測值。
對象檢測模型各層的結(jié)構如下:

看一下passthrough層。圖中第25層route 16,意思是來自16層的output,即26 * 26 * 512,這是passthrough層的來源(細粒度特征)。第26層1 * 1卷積降低通道數(shù),從512降低到64(這一點論文在討論passthrough的時候沒有提到),輸出26 * 26 * 64。第27層進行拆分(passthrough層)操作,1拆4分成13 * 13 * 256。第28層疊加27層和24層的輸出,得到13 * 13 * 1280。后面再經(jīng)過3 * 3卷積和1 * 1卷積,最后輸出13 * 13 * 125。
3、YOLOv2輸入到輸出
綜上所述,雖然YOLO2做出了一些改進,但總的來說網(wǎng)絡結(jié)構依然很簡單,就是一些卷積+pooling,從416 * 416 * 3 變換到 13 * 13 * 5 * 25。稍微大一點的變化是增加了batch normalization,增加了一個passthrough層,去掉了全連接層,以及采用了5個先驗框。

對比YOLO1的輸出張量,YOLO2的主要變化就是會輸出5個先驗框,且每個先驗框都會嘗試預測一個對象。輸出的 13 * 13 * 5 * 25 張量中,25維向量包含 20個對象的分類概率+4個邊框坐標+1個邊框置信度。
4、YOLOv2損失函數(shù)
誤差依然包括邊框位置誤差、置信度誤差、對象分類誤差。

其中,
意思是預測邊框中,與真實對象邊框IOU最大的那個,其IOU<閾值Thresh,此系數(shù)為1,即計入誤差,否則為0,不計入誤差。YOLO2使用Thresh=0.6。
意思是前128000次迭代計入誤差。注意這里是與先驗框的誤差,而不是與真實對象邊框的誤差??赡苁菫榱嗽谟柧氃缙谑鼓P透鞂W會先預測先驗框的位置。
意思是該邊框負責預測一個真實對象(邊框內(nèi)有對象)。