---
# System prepended metadata

title: YOLOv1-v4(上)
tags: [papper]

---

# 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