創新點: 端到端訓練及推斷 + 改革區域建議框式目標檢測框架 + 實時目標檢測
python
(1) 改革了區域建議框式檢測框架: RCNN系列均須要生成建議框,在建議框上進行分類與迴歸,但建議框之間有重疊,這會帶來不少重複工做。YOLO將全圖劃分爲SXS的格子,每一個格子負責中心在該格子的目標檢測,採用一次性預測全部格子所含目標的bbox、定位置信度以及全部類別機率向量來將問題一次性解決(one-shot)。算法
YOLO網絡結構由24個卷積層與2個全鏈接層構成,網絡入口爲448x448(v2爲416x416),圖片進入網絡先通過resize,網絡的輸出結果爲一個張量,維度爲:
\[S * S * (B * 5 + C)\]
其中,S爲劃分網格數,B爲每一個網格負責目標個數,C爲類別個數。該表達式含義爲:網絡
(1) 每一個小格會對應B個邊界框,邊界框的寬高範圍爲全圖,表示以該小格爲中心尋找物體的邊界框位置。框架
(2) 每一個邊界框對應一個分值,表明該處是否有物體及定位準確度:\[P(object)*IoU_{pred}^{truth}\]ide
(3) 每一個小格會對應C個機率值,找出最大機率對應的類別\(P(Class | object)\),並認爲小格中包含該物體或者該物體的一部分。函數
一直困惑的問題是:分格思想在代碼實現中究竟如何體現的呢?
在yolov1的yolo.cfg文件中:學習
[net] batch=1 subdivisions=1 height=448 width=448 channels=3 momentum=0.9 decay=0.0005 saturation=1.5 exposure=1.5 hue=.1 conv24 。。。 [local] size=3 stride=1 pad=1 filters=256 activation=leaky [dropout] probability=.5 [connected] output= 1715 activation=linear [detection] classes=20 coords=4 rescore=1 side=7 num=3 softmax=0 sqrt=1 jitter=.2 object_scale=1 noobject_scale=.5 class_scale=1 coord_scale=5
最後一個全鏈接層輸出特徵個數爲1715,而detction層將該1715的特徵向量整個爲一個,\(side * side * ((coodrds + rescore) * num + classes)\)的張量。其中,\(side * side\)即爲原圖中\(S * S\)的小格。爲何side位置的輸出會對應到原圖中小格的位置呢?由於訓練過程當中會使用對應位置的GT監督網絡收斂,測試過程當中每一個小格天然對應原圖小格上目標的檢測。測試
在訓練yolo前須要先準備數據,其中有一步爲:spa
python voc_label.py
中有個convert函數.net
def convert(size, box): dw = 1./(size[0]) dh = 1./(size[1]) x = (box[0] + box[1])/2.0 - 1 y = (box[2] + box[3])/2.0 - 1 w = box[1] - box[0] h = box[3] - box[2] x = x*dw w = w*dw y = y*dh h = h*dh return (x,y,w,h)
GT邊界框轉換爲(xc, yc, w, h)的表示方式,wc, yc, w, h被歸一化到0~1之間。
再看損失函數
參見博文
1) 對小物體及鄰近特徵檢測效果差:當一個小格中出現多於兩個小物體或者一個小格中出現多個不一樣物體時效果欠佳。緣由:B表示每一個小格預測邊界框數,而YOLO默認同格子裏全部邊界框爲同種類物體。
(2) 圖片進入網絡前會先進行resize爲448 x 448,下降檢測速度(it takes about 10ms in 25ms),若是直接訓練對應尺寸會有加速空間。
(3) 基礎網絡計算量較大,yolov2使用darknet-19進行加速。
(1) 速度更快(實時):yolo(24 convs) -> 45 fps,fast_yolo(9 convs) -> 150 fps
(2) 全圖爲範圍進行檢測(而非在建議框內檢測),帶來更大的context信息,使得相對於Fast-RCNN誤檢率更低,但定位精度欠佳。
Yolo損失函數的理解學習於潛伏在代碼中
** Loss = \(λcoord\) * 座標預測偏差(1) + 含object的box confidence預測偏差 (2)+ $λnoobj $* 不含object的box confidence預測偏差(3) + 每一個格子中類別預測偏差(4) **
\[=\]
(1) 整個損失函數針對邊界框損失(圖中1, 2, 3部分)與格子(4部分)主體進行討論。
(2) 部分1爲邊界框位置與大小的損失函數,式中對寬高都進行開根是爲了使用大小差異比較大的邊界框差異減少。例如,一個一樣將一個100x100的目標與一個10x10的目標都預測大了10個像素,預測框爲110 x 110與20 x 20。顯然第一種狀況咱們還能夠失道接受,但第二種狀況至關於把邊界框預測大了一倍,但若是不使用根號函數,那麼損失相同,都爲200。但把寬高都增長根號時:
\[(sqrt(20) - sqrt(10))^2 = 3.43\]
\[(sqrt(110) - sqrt(100))^2 = 0.48\]
顯然,對小框預測誤差10個像素帶來了更高的損失。經過增長根號,使得預測相同誤差與更小的框產生更大的損失。但根據YOLOv2的實驗證實,還有更好的方法解決這個問題。
(3) 如有物體落入邊界框中,則計算預測邊界框含有物體的置信度\(C_{i}\)和真實物體與邊界框IoU\(\widehat{C_{i}}\)的損失,咱們但願兩差值越小損失越低。
(4) 若沒有任何物體中心落入邊界框中,則\(\widehat{C_{i}}\)爲0,此時咱們但願預測含有物體的置信度\(C_{i}\)越小越好。然而,大部分邊界框都沒有物體,聚沙成塔,形成loss的第3部分與第4部分的不平衡,所以,做纔在loss的三部分增長權重\(\lambda_{nobj} = 0.5\) 。
(5) 對於每一個格子而言,做者設計只能包含同種物體。若格子中包含物體,咱們但願但願預測正確的類別的機率越接近於1越好,而錯誤類別的機率越接近於0越好。loss第4部分中,若\(\widehat{p_{i}(c)}\)中c爲正確類別,則值爲1,若非正確類別,則值爲0。
參考譯文
參考潛伏在代碼中
yolov1基礎上的延續,新的基礎網絡,多尺度訓練,全卷積網絡,Faster-RCNN的anchor機制,更多的訓練技巧等等改進使得yolov2速度與精度都大幅提高,改進效果以下圖:
Batchnorm是2015年之後廣泛比較流行的訓練技巧,在每一層以後加入BN層能夠將整個batch數據歸一化到均值爲0,方差爲1的空間中,即將全部層數據規範化,防止梯度消失與梯度爆炸,如:
\[0.9^{30} = 0.04\]
加入BN層訓練以後效果就是網絡收斂更快,而且效果更好。YOLOv2在加入BN層以後mAP上升2%。
關於BN做用
yolov1也在Image-Net預訓練模型上進行fine-tune,可是預訓練時網絡入口爲224 x 224,而fine-tune時爲448 x 448,這會帶來預訓練網絡與實際訓練網絡識別圖像尺寸的不兼容。yolov2直接使用448 x 448的網絡入口進行預訓練,而後在檢測任務上進行訓練,效果獲得3.7%的提高。
yolov2爲了提高小物體檢測效果,減小網絡中pooling層數目,使最終特徵圖尺寸更大,如輸入爲416 x 416,則輸出爲13 x 13 x 125,其中13 x 13爲最終特徵圖,即原圖分格的個數,125爲每一個格子中的邊界框構成(5 x (classes + 5))。須要注意的是,特徵圖尺寸取決於原圖尺寸,但特徵圖尺寸必須爲奇數,以此保存中間有一個位置能看到原圖中心處的目標。
爲了使網絡可以接受多種尺寸的輸入圖像,yolov2除去了v1網絡結構中的全連層,由於全鏈接層必需要求輸入輸出固定長度特徵向量。將整個網絡變成一個全卷積網絡,可以對多種尺寸輸入進行檢測。同時,全卷積網絡相對於全鏈接層可以更好的保留目標的空間位置信息。
下圖爲不一樣基礎網絡結構作分類任務所對就的計算量,橫座標爲作一次前向分類任務所須要的操做數目。能夠看出做者所使用的darknet-19做爲基礎預訓練網絡(共19個卷積層),能在保持高精度的狀況下快速運算。而SSD使用的VGG-16做爲基礎網絡,VGG-16雖然精度與darknet-19至關,但運算速度慢。關於darknet-19基礎網絡速度
yolov2爲了提升精度與召回率,使用Faster-RCNN中的anchor機制。如下爲我對anchor機制使用的理解:在每一個網格設置k個參考anchor,訓練以GT anchor做爲基準計算分類與迴歸損失。測試時直接在每一個格子上預測k個anchor box,每一個anchor box爲相對於參考anchor的offset與w,h的refine。這樣把原來每一個格子中邊界框位置的全圖迴歸(yolov1)轉換爲對參考anchor位置的精修(yolov2)。
至於每一個格子中設置多少個anchor(即k等於幾),做者使用了k-means算法離線對voc及coco數據集中目標的形狀及尺度進行了計算。發現當k = 5時而且選取固定5比例值的時,anchors形狀及尺度最接近voc與coco中目標的形狀,而且k也不能太大,不然模型太複雜,計算量很大。
這部分沒有看太懂,先佔個坑,等之後明白了再來補,感受應該是在彌補大小邊界框迴歸偏差損失的問題吧。這裏發現有篇博文對這部分講得挺仔細的。
爲了使用網絡可以更好檢測小物體,做者使用了resnet跳級層結構,網絡末端的高級特徵層與前一層或者前幾層的低級細粒度特徵結合起來,增長網絡對小物體的檢測效果,使用該方法可以將mAP提升1%。
一樣,在SSD檢測器上也能夠看出使用細粒度特徵(低級特徵)將進行小物體檢測的思想,可是不一樣的是SSD直接在多個低級特徵圖上進行目標檢測,所以,SSD對於小目標檢測效果要優於YOLOv2,這點能夠coco測試集上看出,由於coco上小物體比較多,但yolov2在coco上要明顯遜色於ssd,但在比較簡單的檢測數據集voc上優於ssd。
yolov2網絡結構爲全卷積網絡FCN,能夠適於不一樣尺寸圖片做爲輸入,但要知足模型在測試時可以對多尺度輸入圖像都有很好效果,做者訓練過程當中每10個epoch都會對網絡進行新的輸入尺寸的訓練。須要注意的是,由於全卷積網絡總共對輸入圖像進行了5次下采樣(步長爲2的卷積或者池化層), 因此最終特徵圖爲原圖的1/32。因此在訓練或者測試時,網絡輸入必須爲32的位數。而且最終特徵圖尺寸即爲原圖劃分網絡的方式。
譯文參見
ref1
ref2比較明白
ref3