---
# System prepended metadata

title: YOLOv4 論文閱讀
tags: [Object Detection, YOLO]

---

# YOLOv4 論文閱讀
YOLOv4中結合非常多技術如：Weighted-Residual-Connections(WRC), Cross-Stage-Partial-connection(CSP), Cross mini-Batch Norm(CmBN), Self-adversarial-training(SAT), Mish-activation, Mosaic data augmentation, DropBlock regularization 與 CIoU loss ，最後得到 SOTA 的結果 65.7mAP 及 65FPS。

## Introduction
大多數CNN-based的檢測器在訓練上會依賴多個GPUs，而YOLOv4的目標在於設計一個快速運行的檢測器，並且優化其平行運算，而非降低計算量，而在YOLOv4中可使用單GPU進行訓練及推論。另外YOLOv4的貢獻如下：
* 開發了一高效率及強大的物件偵測模型，並可以在1080Ti 或2080Ti上訓練。
* YOLOv4驗證了許多新技術在模型訓練過程中的影響。
* 文中修改了許多SOTA的方法(e.g. CBN, PAN, SAM, etc.)並使這些方法可以更有效率且穩定地在單顆GPU上訓練。

## Related work
### Object detection models
![](https://i.imgur.com/HyE8c1X.jpg)

目前較新的檢測器可以分為兩類：One-stage與Two-stage，常見的RCNN系列就是的Two-stage檢測器，而檢測器的架構又可以被簡易的分為Input, backbone, neck, head。
* Input即輸入層架構，可單純為輸入影像也可為影像金字塔。
* backbone為用以從輸入影像萃取特徵的模型，常見的backbone有VGG, ResNet, DarkNet, EfficientNet等等。
* neck為從每個階段收集feature map的架構，通常會由幾個bottom-up路徑與幾個top-down路徑所組成，常見的架構有FPN, PAN等等。
* head則為最後從特徵圖中預測所需資訊(e.g. bbox, class, etc.)的架構，常見的有SSD, YOLO, RetinaNet等等。

### Bag of freebies
很多研究中會為了增加準確率而開發一些方法，而這些方法只會增加訓練時的負擔，並不會影響推論時間，這些方法在文中被稱為Bag of freebies。

以pixel-wise的資料增量來說主要有光學與幾何的增量方法，而在光學方面，文中主要調整了影像的亮度、對比度、飽和度及噪聲；在幾何方面，文中加入了隨機縮放、擷取、翻轉及旋轉。

除了上述以像素為主的資料增量方法以外，為了改善物件被掩蓋或相互遮掩的問題，從影像方面的相關研究如**random erase**, **CutOut**隨機選擇方形區塊並將此區塊挖空；**hide-and-seek**與**grid mask**則是隨機選取區塊並用其他影像來填充此區塊，而從feature map來改善相互遮掩問題的方法有**DropOut**, **DropConnect**與**DropBlock**等。

另外，也有許多方法利用多張影像來進行資料增量，如**Mixup**, **CutMix**等。

上述提到了非常多的資料增量方法，而在物件偵測的任務中會因為資料不平衡而導致資料集中的語意分布有偏差，而為了解決資料不平衡的問題，有如**Focal loss**等方法被提出。另一個非常重要的議題是如何以one-hot來表達不同類別的關係，也因此**label smoothing**等方法則變得非常重要。

最後一包freebies是Bounding box的目標函數，傳統的偵測器是採用MSE來計算BBox的中心點、長寬的損失，對於anchor-based的方法則是計算offset的損失，然而，這種計算方式會將BBox視為獨立的變數，但實際上是要去考慮物件本身的完整性，為了以上原因，有些研究提出IoU loss，它可以考慮預測框與真資料重疊的範圍，而近年也有越來越多改善IoU loss的方法，如**GIoU loss, DIoU loss, CIoU loss**等等。

#### Summary
總體而言，bag of freebies有以下幾點：
* 資料增強：random erase, CutOut, hide-and-seek, grid mask, DropOut, DropConnect, DropBlock Mixup, CutMix等等
* 資料不平衡：Focal loss
* 更好的表達類別：label smoothing
* BBox目標函數：IoU, GIoU, DIoU, CIoU loss

### Bag of specials
對於而外加入的模組或是後處理方法，並且只增加些微的推論時間，卻可以顯著增加偵測的準確率的這些方法被稱為Bag of specials。普遍來講，外加的模組通常是為了使模型能增加某種屬性，如擴大感受野、引入注意力(attention)機制、加強特徵整合的能力等等；而後處理方法則是為了篩選模型預測結果。

* 常被用來增加感受野的模組有：SPP, ASPP, RFB；另外以attention機制設計的模組有：Squeeze-and-Excitation(SE)與Spatial Attention Module(SAM)。
* 而特徵整合的方法有：Skip connection, hyper-column，可以將不同level的特徵整合，而常被用來整合特徵金字塔的方法有：SFAM, ASFF, BiFPN。
* 激活函數通常也是模型設計的重點之一，因好的函數可以減少計算量，而近期常被使用的激活函數有：LReLU, PReLU, ReLU6, SELU, Swish, hard-Swish, Mish等等。
* NMS為最典型的推論後處理方法，而基於NMS考慮不同應用場景的方法有：soft NMS, DIoU NMS等。

## Methodology
### Selection of architecture
在選擇detector的backbone時，需要：
* 可輸入高解析度影像－以偵測多樣的小尺寸物件
* 更多隱藏層－為了有更多感受野以因應更高解析度的輸入影像
* 更多參數－為了有更大的容量以偵測不同尺度的輸入影像的物件

![](https://i.imgur.com/ABhBUX3.jpg)

根據這些需求，文中選擇CSPDarknet53作為YOLOv4的backbone。YOLOv4在CSPDarnet53之後加入SPP block，因為SPP模組明顯可以提高感受野，與YOLOv3不同，YOLOv4採用[PANet](https://arxiv.org/pdf/1803.01534.pdf)作為最後參數整合的架構，而最後輸出的部分與YOLOv3相同。

### Selection of BoF and BoS
為改善物件偵測訓練結果，常使用以下方法：
* activation: ReLU, leaky-ReLU, etc.
* BBox regression loss: MSE, IoU, GIoU, CIoU, DIoU
* 資料增量：CutOut, MixUp, CutMix
* 正規化方法：DropOut, DropBlock, etc.
* 使用mean與var對網路正規化：Batch Norm, SyncBN, etc.
* Skip connections: Residual connections, Weighted residual connections, etc.

### Additional improvments
為使模型可以在單顆GPU上進行訓練，文中提出了一些額外的設計：
* 引用Mosaic的資料增量方法、並使用Self-Adversarial Training(SAT)
* 使用基因演算法選擇超參數
* 修改現有的算法－modified SAM, PAN, CmBN

#### SAT
SAT為資料增益的方法，其可分為兩個階段：
1. 對於訓練樣本進行前向傳播，在反向傳播時修改樣本像素值，且不修改網路權重，這樣做可以讓網路對自身進行對抗式攻擊，以增加訓練難度。
2. 第二階段使用修改後的樣本進行訓練。

#### CmBN
CmBN基於CBN修改而得來的方法，在CBN中會對當前及前3個mini-batch的結果進行歸一化，並在每個mini-batch都更新網路權重，而CmBN則是僅在一個batch完成後才更新網路權重。

#### Modified SAM
與原始SAM不同，YOLOv4中將池化層改為連接一卷積層，如下圖：
![](https://i.imgur.com/ddgZ4qI.jpg)

#### Modified PAN
與[PANet](https://arxiv.org/pdf/1803.01534.pdf)不同，YOLOv4將add改為concat，如下圖：
![](https://i.imgur.com/ymGqP3F.jpg)

### YOLOv4
YOLOv4架構由以下所組成：
* backbone: CSPDarknet53
* Neck: SPP+PAN
* Head: YOLOv3

在backbone中使用到的BoF：CutMix, Mosaic data augmentation, dropblock, class label smoothing。
在backbone中使用到的BoS：Mish activation, CSP, MiWRC
在detector中使用到的BoF：CIoU loss, CmBN, dropblock, mosaic data augmentation, SAT, eliminate grid sensitivity, consine annealing scheduler, optimal hyperparameters
在detector中使用到的BoS：Mish activateion, SPP-block, SAM-block, PAN, DIoU-NMS

## Experiments
### Hyperparameter
In ImageNet image classifiction experiment:

* training steps: 8,000,000
* batch size: 128
* mini batch size: 32
* init lr: 0.1
* warm-up steps: 1000
* momentum: 0.9
* weight decay: 0.005

In MS COCO object detection experiment:

* training steps: 500,500
* batch size: 64
* mini batch size: 8 or4
* init lr: 0.01
* decay rate: 0.1
* milestone: [400,000, 450,000]
* momentum: 0.9
* weight decay: 0.005

### Influence
#### Features on Classifier
在訓練分類器前，文中探討了加入不同方法對準確率的影響，如下表：

![](https://i.imgur.com/X5Z2NxA.jpg =400x450)
表中顯示CutMix, Mosaic的資料增益方法、label smoothing及Mish activation可以增加分類的準確率，因此YOLOv4中使用此四種BoF方法。

#### Features on Detector
Tabel 4 中表示測試不同BoF對Detector準確率的影像響，結果顯示S, M, IT, GA及使用CIoU可以獲得最佳準確率。
* S: Eliminate grid sensitivity
* M: Mosaic data augmentation
* IT: IoU threshold
* GA: Genetic algorithms
* LS: Class label smoothing
* CBN: CmBN
* CA: Cosine annealing scheduler
* DM: Dynamic mini-batch size
* OA: Optimized Anchors

![](https://i.imgur.com/6PhjRnb.jpg =550x350)

#### 不同backbone on Detector
![](https://i.imgur.com/Ath63Dw.jpg =400x260)

文中提到在分類問題準確率較高的模型，在偵測的準確率不一定會比較高，由Table2與Table6中可看出，雖然使用BoF的CSPResNeXt-50在分類問題中可得到79.8%的Top-1 acc，較使用BoF的CSPDarknet-53高1.1%，但在Table6中可以看到以偵測問題來講CSPDarknet53的表現是比較好的。

#### 不同mini batch size on Detector
文中提到在加入BoF及BoS後，mini batch size的大小對於準確率的影響不大，如Table7：

![](https://i.imgur.com/GKYibOB.jpg =400x210)

(* 不過這邊使用不同模型來比較加入BoF, BoS與否對mini batch size的影響感覺會有點不公平)

## Results
![](https://i.imgur.com/fTuGWEw.jpg)
圖8中說明YOLOv4在不同GPU下的AP結果及FPS，而在FPS>30的情況下，YOLOv4是完勝所有對手的。

## Conclusion
文中提出的YOLOv4可以使用單顆GPU進行訓練、推論，並取得SOTA結果。除此之外，文中也探討非常多物件偵測常使用到的模組，並實際測試它們對於準確率的影響。