# YOLOv1-v4(上)
## 全名You Only Look Once
**V1:**
[You Only Look Once: Unified, Real-Time Object Detection](https://arxiv.org/abs/1506.02640)
**V2:**
[YOLO9000: Better, Faster, Stronger](https://arxiv.org/abs/1612.08242)
**V3:**
[YOLOv3: An Incremental Improvement](https://arxiv.org/abs/1804.02767)
**V4**
[YOLOv4: Optimal Speed and Accuracy of Object Detection](https://arxiv.org/abs/2004.10934)
## 整理的ppt簡報下載:[網址](https://drive.google.com/drive/folders/1TJMFrk1aMQanjHsX_rIu2RrfebnZ7iSt?usp=sharing)
###### tags: `papper`
---
![](https://i.imgur.com/C7URmpU.png)
## YOLOv1
![](https://i.imgur.com/adGotck.jpg)
輸入影像大小為448x448,
變為7x7x1024張量(圖一中倒數第三個立方體),
最後經過兩層全連接層,輸出張量維度為7x7x30,
分類網絡最後的全連接層,
一般連接於一個一維向量,
向量的不同比特代表不同類別,
而這裡的輸出向量是一個三維的張量(7x7x30)。
backbone,Darknet的先鋒。用了一層Dropout。
除了最後一層的輸出使用了線性啟動函數,
其他層全部使用Leaky Relu啟動函數。
![](https://i.imgur.com/WgisbGq.png)
(1)7x7的含義
![](https://i.imgur.com/aO9TaYE.png)
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個類別。
1. 每個方格(grid)產生2個預測框,
2. 2也是參數,可以調,但是一旦設定為2以後,那麼每個方格只產生兩個矩形框,最後選定置信度更大的矩形框作為輸出,也就是最終每個方格只輸出一個預測矩形框。
3. 每個方格只能預測一個物體。 雖然可以通過調整參數,產生不同的矩形框,但這只能提高矩形框的精度。 所以當有很多個物體的中心點落在了同一個格子裏,該格子只能預測一個物體。 也就是格子數為7x7時,該網絡最多預測49個物體。
---
### LOSS
![](https://i.imgur.com/mX873It.png)
預測框的中心點[x,y]。 造成的損失是圖五中的第一行。 其中![](https://i.imgur.com/arTj7U6.png)
為控制函數,在標籤中包含物體的那些格點處,該值為1; 若格點不含有物體,該值為0。 也就是只對那些有真實物體所屬的格點進行損失計算,若該格點不包含物體,那麼預測數值不對損失函數造成影響。 [x,y]數值與標籤用簡單的平方和誤差。
預測框的寬高(w,h)。 造成的損失是圖五的第二行。![](https://i.imgur.com/qZdYY9n.png)
的含義一樣,也是使得只有真實物體所屬的格點才會造成損失。 這裡對(w,h)在損失函數中的處理分別取了根號,原因在於,如果不取根號,損失函數往往更傾向於調整尺寸比較大的預測框。 例如,20個點數點的偏差,對於800x600的預測框幾乎沒有影響,此時的IOU數值還是很大,但是對於30x40的預測框影響就很大。 取根號是為了盡可能的消除大尺寸框與小尺寸框之間的差异。
第三行與第四行,都是預測框的置信度C。 當該格點不含有物體時,該置信度的標籤為0; 若含有物體時,該置信度的標籤為預測框與真實物體框的IOU數值(IOU計算公式為:兩個框交集的面積除以並集的面積)。
第五行為物體類別概率P,對應的類別位置,該標籤數值為1,其餘位置為0,與分類網絡相同。
在論文中,
![](https://i.imgur.com/Y5oNb5q.png)
與![](https://i.imgur.com/9jaR33e.png)
的取值分別為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**
![](https://i.imgur.com/H6cvXrN.png)
* 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}。
---
![](https://i.imgur.com/wWWQ3Ag.png)
這樣也可以過濾掉一些大部分重疊的矩形框。
輸出檢測物體的置信度,
同時考慮了矩形框與類別,滿足閾值的輸出更加可信
---
# YOLOv2(YOLO9000)
![](https://i.imgur.com/SPvTSN3.png)
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**
![](https://i.imgur.com/OYtxiSu.png)
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%
![](https://i.imgur.com/B4GFkpf.png)
Batch Normalization 的作法就是對每一個 mini-batch 都進行正規化到平均值為0、標準差為1的常態分佈,如此一來可以將分散的數據統一,有助於減緩梯度消失以及解決 Internal Covariate Shift 的問題,同時可以加速收斂,並且有正則化的效果 (可以不使用Dropout)
**Anchor Box替換全連接層**
* v2中移除兩層全連接層
* 網路預測Anchor框的偏差(offset),每個格點指定n個Anchor框。 在訓練時,最接近ground truth的框產生loss,其餘框不產生loss。
**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個預測結果。
**位置預測**
![](https://i.imgur.com/PYIgoyF.png)
![](https://i.imgur.com/KDAx2x1.png)
* V2提出了預測的新公式, 直接對anchor box點的偏移位置進行預測
* 而sigma函數用來約束其可能的偏移範圍(相對於Grid Cell的坐標位置)
* 通過預測tx和ty來得到bound box中心座標(bx, by)值
* cx和cy是當前網格左上角到圖像左上角的距離
* σ函數將約束在(0,1)範圍內,所以根據上面的計算公式,
* 預測邊框的藍色中心點被約束在藍色背景的網格內。約束邊框位置使得模型更容易學習,且預測更為穩定
* 因為自然對數e表示「增長的極限」,所以在這邊以e為底以scale放大率為次方,計算出數值的自然放大倍率
**Dataset with WordTree**
![](https://i.imgur.com/5wld0et.png)
樹結構表示物體之間的從屬關係非常合適,第一個大類,物體,物體之下有動物、人工製品、自然物體等,動物中又有更具體的分類。 此時,在類別中,不對所有的類別進行softmax操作,而對同一層級的類別進行softmax:
![](https://i.imgur.com/k4hHN5y.png)
如圖中所示,同一顏色的位置,進行softmax操作,使得同一顏色中只有一個類別預測分值最大。 在預測時,從樹的根節點開始向下檢索,每次選取預測分值最高的子節點,直到所有選擇的節點預測分值連乘后小於某一閾值時停止。 在訓練時,如果標籤為人,那麼只對人這個節點以及其所有的父節點進行loss計算,而其子節點,男人、女人、小孩等,不進行loss計算。
問題:只有當父節點在檢測集中出現過,子節點的預測才會有效。 如果子節點是褲子、T恤、裙子等,而父節點衣服在檢測集中沒有出現過,那麼整條預測類別支路幾乎都是檢測失效的狀態。
---
---
# YOLOv3
![](https://i.imgur.com/WJUPTh6.png)
**Darknet-53**
![](https://i.imgur.com/NU8L4v6.png)
**使用FPN**
Yolo v3在3種不同的Scale上做預測
![](https://i.imgur.com/usxhgNb.png)
* 所以將Conv前一層的特徵,與conv後再經過上取樣的featue重新結合為一個新的feature
* later connection(側向連結)中 做 element-wise 相加後,還會多做一個3 × 3 Conv layer,用來減少通道數、並進行跨channel的特徵融合
**回歸**
最後一個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)
![](https://i.imgur.com/VsTss3a.png)
![](https://i.imgur.com/aqfF6Kx.png)
* 13 x 13層負責檢測較大的物體,
* 52 x 52層檢測較小的物體,
* 26 x 26層檢測中等物體。解析度越大檢測能力越強
* 這裡還使用k-means來尋找更好的bounding box
* 錨框使用了(10×13), (16×30), (33×23), (30×61), (62×45), (59×119), (116×90), (156×198)和(373×326)。
**Yolo輸出的檢測結果**
![](https://i.imgur.com/3qmzWTK.png)
![](https://i.imgur.com/FXLyFdb.png)
**binary cross-entropy**
YOLOv3將 Softmax 改以 binary cross-entropy 的方式對Bbox上的多個標籤進行多分類預測
![](https://i.imgur.com/LB1d8VF.png)
**整體效果**
![](https://i.imgur.com/UMpJiac.png)
---
### YOLOv1-v3
![](https://i.imgur.com/fmmDRxY.png)
![](https://i.imgur.com/SKAkTWl.png)
---
參考資料
https://zhuanlan.zhihu.com/p/70387154