V1:
You Only Look Once: Unified, Real-Time Object Detection
V2:
YOLO9000: Better, Faster, Stronger
V3:
YOLOv3: An Incremental Improvement
V4
YOLOv4: Optimal Speed and Accuracy of Object Detection
papper
輸入影像大小為448x448,
變為7x7x1024張量(圖一中倒數第三個立方體),
最後經過兩層全連接層,輸出張量維度為7x7x30,
分類網絡最後的全連接層,
一般連接於一個一維向量,
向量的不同比特代表不同類別,
而這裡的輸出向量是一個三維的張量(7x7x30)。
backbone,Darknet的先鋒。用了一層Dropout。
除了最後一層的輸出使用了線性啟動函數,
其他層全部使用Leaky Relu啟動函數。
(1)7x7的含義
7x7是指圖片被分成了7x7個格子,如下所示:
在Yolo中,如果一個物體的中心點,落在了某個格子中,那麼這個格子將負責預測這個物體。 這句話怎麼理解,用上圖舉例,設左下角格子假設座標為[1,1],小狗所在的最小包圍矩形框的中心,落在了[2,3]這個格子中。 那麼7x7個格子中,[2,3]這個格子負責預測小狗,而那些沒有物體中心點落進來的格子,則不負責預測任何物體。 這個設定就好比該網絡在一開始,就將整個圖片上的預測任務進行了分工,
(2)30的含義
剛才設定了49個檢測人員,檢測的內容,就是30
30是由[(4+1)x2+20]得到的。
其中4+1是矩形框的中心點座標x,y,
長寬w,h以及是否屬於被檢測物體的置信度c;
2是一個格子共回歸兩個矩形框,每個矩形框分別產生5個預測值(x,y,w,h,c); 20代表預測20個類別。
預測框的中心點[x,y]。 造成的損失是圖五中的第一行。 其中
為控制函數,在標籤中包含物體的那些格點處,該值為1; 若格點不含有物體,該值為0。 也就是只對那些有真實物體所屬的格點進行損失計算,若該格點不包含物體,那麼預測數值不對損失函數造成影響。 [x,y]數值與標籤用簡單的平方和誤差。
預測框的寬高(w,h)。 造成的損失是圖五的第二行。
的含義一樣,也是使得只有真實物體所屬的格點才會造成損失。 這裡對(w,h)在損失函數中的處理分別取了根號,原因在於,如果不取根號,損失函數往往更傾向於調整尺寸比較大的預測框。 例如,20個點數點的偏差,對於800x600的預測框幾乎沒有影響,此時的IOU數值還是很大,但是對於30x40的預測框影響就很大。 取根號是為了盡可能的消除大尺寸框與小尺寸框之間的差异。
第三行與第四行,都是預測框的置信度C。 當該格點不含有物體時,該置信度的標籤為0; 若含有物體時,該置信度的標籤為預測框與真實物體框的IOU數值(IOU計算公式為:兩個框交集的面積除以並集的面積)。
第五行為物體類別概率P,對應的類別位置,該標籤數值為1,其餘位置為0,與分類網絡相同。
在論文中,
與
的取值分別為5與0.5。
回歸offset代替直接回歸座標
[x,y]不直接回歸中心點座標數值,而是回歸相對於格點左上角座標的位移值。 例如,第一個格點中物體座標為[2.3,3.6],另一個格點中的物體座標為[5.4,6.3],這四個數值讓神經網路暴力回歸,有一定難度。 所以這裡的offset是指,既然格點已知,那麼物體中心點的座標一定在格點正方形裏,相對於格點左上角的位移值一定在區間[0,1]中。讓神經網路去預測[0.3,0.6]與[0.4,0.3]會更加容易,在使用時,加上格點左上角座標[2.3]、[5.6]即可。
同一格點的不同預測框有不同作用
每個格點預測兩個或多個矩形框。
那麼在訓練時,見到一個真實物體,我們是希望兩個框都去逼近這個物體的真實矩形框,還是只用一個去逼近? 或許通常來想,讓兩個人一起去做同一件事,比一個人做一件事成功率要高,所以可能會讓兩個框都去逼近這個真實物體。 但是作者沒有這樣做,在損失函數計算中,只對和真實物體最接近的框計算損失,其餘框不進行修正。 這樣操作之後作者發現,一個格點的兩個框在尺寸、長寬比、或者某些類別上逐漸有所分工,總體的召回率有所提升。
使用NMS
Run 1:
信心程度最高的BBox (紅色) 選入「確定是物件集合」
其他BBox會看這步驟選出最高的BBox進行IoU計算,
如果粉紅色的IoU為0.6大於我們設定的0.5,
所以將粉紅色的BBox信心度設置為0。
「確定是物件集合」= {紅色BBox }
Run 2: 不考慮信心度為0和已經在「確定是物件集合」的BBox,剩下來的物件選出最大信心的BBox,將此BBox(黃色)丟入「確定是物件集合」,剩下的BBox和Run2選出的最大信心的BBox計算IoU,其他BBox都大於0.5,所以其他的BBox信心度設置為0。
因為沒有物件信心度>0,所以結束NMS。
「確定是物件集合」= {紅色BBox; 黃色BBox}。
這樣也可以過濾掉一些大部分重疊的矩形框。
輸出檢測物體的置信度,
同時考慮了矩形框與類別,滿足閾值的輸出更加可信
Yolov2和Yolo9000算法內核相同,區別是訓練管道不同:Yolov2用coco數据集訓練後,可以識別80個種類。 而Yolo9000可以使用coco數据集+ ImageNet數据集聯合訓練,可以識別9000多個種類。 圖一為Yolo9000的檢測效果圖,可以看到圖片中的人,被分為了leader、American、skin-diver、athlete。
採用:歸一化、多尺度訓練,v2也嘗試借鑒了R-CNN體系中的anchor box
訓練過程
YOLO2的訓練主要包括三個階段。
第一階段就是先在ImageNet分類數据集上預訓練Darknet-19,此時模型輸入為224x224,共訓練160個epochs。
第二階段將網絡的輸入調整為448x448,繼續在ImageNet數据集上finetune分類模型,訓練10個epochs,此時分類模型的top-1準確度為76.5%,而top-5準確度為93.3%。
第三個階段就是修改Darknet-19分類模型為檢測模型,移除最後一個卷積層、global avgpooling層以及softmax層,並且新增了三個3x3x1024卷積層,同時新增了一個passthrough層,最後使用1x1卷積層輸出預測結果,輸出的channels數為:num_ anchors x (5+num_classes)。
Darknet19
Darknet-19,該架構的網路參數較VGG-16更少
在ImageNet上,仍然可以達到top-1 72.9%以及top-5 91.2%的精度。
passthrough層
本質其實就是特徵重排,26x26x512的feature map分別按行和列隔點採樣,可以得到4幅13x13x512的特徵,把這4張特徵按channel串聯起來,就是最後的13x13x2048的feature map.還有就是,passthrough layer本身是不學習參數的,直接用前面的層的特徵重排后拼接到後面的層, 越在網路前面的層,感受野越小,有利於小目標的檢測。
歸一化
在Yolo的每個捲積層中加入BN之後,mAP提升了2%
Batch Normalization 的作法就是對每一個 mini-batch 都進行正規化到平均值為0、標準差為1的常態分佈,如此一來可以將分散的數據統一,有助於減緩梯度消失以及解決 Internal Covariate Shift 的問題,同時可以加速收斂,並且有正則化的效果 (可以不使用Dropout)
Anchor Box替換全連接層
Anchor寬高比
Faster R-CNN中的九個Anchor Box的寬高是事先設定好的比例大小,一共設定三個面積大小的矩形框,每個矩形框有三個寬高比:1:1,2:1,1:2,總共九個框。
v2中,Anchor Box的寬高不經過人為獲得,
而是將訓練數據集中的矩形框全部拿出來,
用kmeans聚類得到先驗框的寬和高。
例如使用5個Anchor Box,
那麼kmeans聚類的類別中心個數設置為5。(mAP上升)
多尺度訓練
v2中只有捲積層與池化層,所以對於網路的輸入大小,並沒有限制,整個網路的降採樣倍數為32,只要輸入的特徵圖尺寸為32的倍數即可,如果網路中有全連接層,就不是這樣了。 所以Yolo v2可以使用不同尺寸的輸入圖片訓練。
作者使用的訓練方法是,
在每10個batch之後,就將圖片resize成
{320, 352, …, 608}中的一種。 不同的輸入,
最後產生的格點數不同,比如輸入圖片是320x320,那麼輸出格點是10x10,如果每個格點的先驗框個數設置為5,那麼總共輸出500個預測結果;如果輸入圖片大小是608x608,輸出格點就是19x19,共1805個預測結果。
位置預測
Dataset with WordTree
樹結構表示物體之間的從屬關係非常合適,第一個大類,物體,物體之下有動物、人工製品、自然物體等,動物中又有更具體的分類。 此時,在類別中,不對所有的類別進行softmax操作,而對同一層級的類別進行softmax:
如圖中所示,同一顏色的位置,進行softmax操作,使得同一顏色中只有一個類別預測分值最大。 在預測時,從樹的根節點開始向下檢索,每次選取預測分值最高的子節點,直到所有選擇的節點預測分值連乘后小於某一閾值時停止。 在訓練時,如果標籤為人,那麼只對人這個節點以及其所有的父節點進行loss計算,而其子節點,男人、女人、小孩等,不進行loss計算。
問題:只有當父節點在檢測集中出現過,子節點的預測才會有效。 如果子節點是褲子、T恤、裙子等,而父節點衣服在檢測集中沒有出現過,那麼整條預測類別支路幾乎都是檢測失效的狀態。
Darknet-53
使用FPN
Yolo v3在3種不同的Scale上做預測
回歸
最後一個layer預測
bounding box, objectness和class predictions。
在COCO資料集上,每個scale上有3個框。因此,output tensor為N×N×[3×(4+1+C)],
即預測N * N grid cell、
3 bounding box、
4 bounding box offsets、
1 objectness、
C class predictions。
(C = 80)
Yolo輸出的檢測結果
binary cross-entropy
YOLOv3將 Softmax 改以 binary cross-entropy 的方式對Bbox上的多個標籤進行多分類預測
整體效果