# Object Detection - YOLO v4
> [name=謝朋諺(Adam Hsieh)]
> [time=Thu, Jul 16, 2020 2:47 PM]
###### tags: `paper`
---
## Reference
> [YOLOv4全文閱讀(全文中文翻譯)](https://bangqu.com/2166Wr.html)
> [深入浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解](https://zhuanlan.zhihu.com/p/143747206)
> [炸了!吊打一切的 YOLOv4 重磅来袭!](https://zhuanlan.zhihu.com/p/135840896)
> [一张图梳理YOLOv4论文](https://www.cnblogs.com/ppr0 p/p/12771430.html)
> [YOLO v4它来了:接棒者出现,速度效果双提升](https://www.jiqizhixin.com/articles/2020-04-24-4)
> [YOLO演進 — 3 — YOLOv4詳細介紹](https://medium.com/ching-i/yolo%E6%BC%94%E9%80%B2-3-yolov4%E8%A9%B3%E7%B4%B0%E4%BB%8B%E7%B4%B9-5ab2490754ef)
---
# YOLOv4: Optimal Speed and Accuracy of Object Detection
[論文連結](https://arxiv.org/pdf/2004.10934.pdf)
{%pdf https://arxiv.org/pdf/2004.10934.pdf %}
## Outline
> [TOC]
## 摘要重點
- 大量的特徵常常意味著可以訓練出更好的 CNN 準度。
- 本文假設這些通用特徵包括 **Weighted-Residual-Connections (WRC)**、**Cross-Stage-Partial-connections (CSP)**、**Cross mini-Batch Normalization (CmBN)**、**Self-adversarial-training (SAT)** 和 **Mish-activation**。
- 除了上述的通用特徵還加入了 **Mosaic data augmentation**(馬賽克資料增強)、DropBlock regularization、CIoU loss,並將其中一些功能結合起來在 MS COCO 資料集上可以達到 ==43.5%== 的 AP (==65.7%== 的 AP50),
- 在 Tesla V100 上速度可以跑到 65 FPS。
- 本文貢獻:
1. 開發了一個高效、強大的物件偵測模型,使得每個人都可以使用 1080Ti, 2080Ti GPU 就可以凜按一個超快速和精確的物件偵測。
2. 訓練物件偵測期間本文驗證了許多過去最先進的方法。
3. 本文修改了最新的方法使之更有效,並更適合於單一 GPU 訓練 (CBN, PAN, SAM)。
![](https://i.imgur.com/rzagh2R.png)
:::info
:bulb: YOLOv4 的運行速度是 EfficientDet 的兩倍,且效能相當,並且對 YOLOv3 提高了 10% AP 和 12% FPS。
:::
## 現今常用的物件偵測會由以下幾個部分組成:
![](https://i.imgur.com/Uj43nWr.png)
- **Input**: Image, Patches, Image Pyramid
- **Backbones**: VGG16, ResNet-50, SpineNet, EfficientNet-B0/B7, CSPResNeXt50, CSPDarknet53
- **Neck**:
- Additional blocks: SPP, ASPP, RFB, SAM
- Path-aggregation blocks: FPN, PAN, NAS-FPN, Fully-connected FPN, BiFPN, ASFF, SFAM
- **Heads**:
- Dense Prediction (one-stage):
- RPN, SSD, YOLO,RetinaNet (anchor based)
- CornerNet, CenterNet, MatrixNet, FCOS (anchor free)
- Sparse Prediction (two-stage):
- Faster R-CNN, R-FCN, Mask R-CNN (anchor based)
- RepPoints (anchor free)
## Methodology
目標是神經網路**執行速度的加速**和**平行運算的最佳化**,而不是低計算容量的理論指標 (BFLOPS)。
- 對於 GPU:本文在卷積層中使用少量組(1-8):CSPResNeXt50 / CSPDarknet53
- 對於 VPU:本文使用 grouped-convolution,但本文不使用 Squeeze-and-excitement(SE)blocks - 具體來說就是以下幾種模型架構:==EfficientNet-lite / MixNet / GhostNet / mobileNetV3==
### Selection of architecture
- 本篇目標是找到網路裡最佳的影像輸入解析度、卷積層數、參數數量 $(filter\_size^2 \times filters \times channel\ /\ groups)$ 和每個 Layer Output 的數量。
- 本文有大量研究表明在 ImageNet 上的分類而言,CSPResNext50 比 CSPDarknet53 要好得多。
- 在 MS-COCO 資料集上的物件偵測對象反倒以 CSPDarknet53 會較好於 CSPResNext50。
- 另一個目標則是針對不同的 Detector Level 選擇額外的 block 來增加更大的 receptive field、和最好的參數聚合方法,例如:FPN、PAN、ASFF、BiFPN。
- 在分類中最好的方法也許在偵測中並不是最好的,這因為偵測需要以下幾個特點:
- 更高的網路輸入解析度:為了偵測許多小尺寸的物件
- 更多層:為了更大的 receptive field 以覆蓋增大的網路輸入
- 更多參數:為了使模型能夠在單個影像中偵測多個不同大小的物件
![](https://i.imgur.com/oB2d3tA.png)
:::info
:bulb: 影像分類的參數量
:::
- 上圖顯示了 CSPResNeXt50、CSPDarknet53 和 Efficientnet-B3 的資訊,本文假設對於較大的 receptive field 和較大的參數量來作為 Backbone,由下面兩項以及本文實驗可得知 CSPDarknet53 更適合。
- CSPResNeXt50 包含了 16 個 $3\times3$ CNN、$425\times425$ 的 receptive field 和 20.6 M 參數。
- CSPDarknet53 包含了 29 個 $3\times3$ CNN、$725\times725$ 的 receptive field 和 27.6 M 參數。
- 不同大小的 receptive field 會有幾個影響:
- 逼近物件大小:允許查看整個物件
- 逼近網路大小:允許查看物件周圍的資訊
- 超過網路大小:增加影像點和最終 activation 之間的連接數
- 本文用 CSPDarknet53 添加了 SPP Block 因為它可以增加 receptive field 的範圍,又可以分離出最重要的上下文特徵,且幾乎不會降速。
- 本文的 Neck 是使用 PANet 而非 YOLOv3 的 FPN。
### Selection of BoF and BoS
為了改善物件偵測的訓練 CNN 通常使用以下幾種方法改進:
:::info
- **Activations:** ReLU, leaky-ReLU, ~~parametric-ReLU~~, ~~ReLU6~~, ~~SELU~~, Swish, or Mish
- **Bounding box regression loss:** MSE, IoU, GIoU, CIoU, DIoU
- **Data augmentation:** CutOut, MixUp, CutMix
- **Regularization method:** ~~DropOut~~, ~~DropPath~~, ~~Spatial DropOut~~, or DropBlock
- **Normalization of the network activations by their mean and variance:** Batch Normalization (BN), ~~Cross-GPU Batch Normalization (CGBN or SyncBN)~~, Filter Response Normalization (FRN), or Cross-Iteration Batch Normalization (CBN)
- **Skip-connections:** Residual connections, Weighted residual connections, Multi-input weighted residual connections, or Cross stage partial connections (CSP)
:::
- 在訓練 Activations 時由於 PReLU 和 SELU 較難訓練,而 ReLU6 是專門為量化網路設計的,因此本文直接移除這些方法。
- Regularization 發表 DropBlock 的人詳細地比較了大家的方法,他們的方法贏了很多,因此本文也決定採用此方法。
- 至於 Normalization 由於本文只關注在一個 GPU 的情境,因此不考慮 syncBN。
### Additional improvements
為了設計更適合單 GPU 的訓練,本文做了以下的額外設計和改進:
- 使用一種新的 Data Augmentation 方法 - **Mosaic** 與 **Self-Adversarial Training(SAT)**。
- 使用**基因演算法**找出最佳**超參數**。
- 本文修改了一些現有的演算法,使得它更適合於有效的訓練和偵測 - **modified SAM**, **modified PAN**, 和 **Cross mini-Batch Normalization (CmBN)**
#### Mosaic
- Mosaic 是一種新的資料增強方法,共混合了 4 種訓練影像,因此 4 種不同的 context 是混合的,而不是像 CutMix 只混合 2 種影像。
- 這種方法允許模型能夠偵測到正常 context 外的物件。
- Batch normalization 能夠直接在每一層上的 4 個不同影像統計 Activation,大大減少對大 mini-batch size 的需求。
#### Self-Adversarial Training(SAT)
- SAT 分為兩階段,第一階段由 Neural Network 改變原始影像而不是網路權重。
- 第二階段以正常方式在修改後的影像上執行物件偵測。
- 以這種方式對其自身進行 Adversarial Attack,第一階段改變原始圖像讓第二階段以為沒有物件在影像中。
#### CmBN
![](https://i.imgur.com/Ph4YszU.png)
:::info
:bulb: Cross mini-Batch Normalization
:::
- CmBN 是 CBN 的修改版本,上圖表達的是三種不同的 BN 方式,理解的時候應該從左往右看。
- BN 是對當前 mini-batch 進行 Normalization。
- CBN 是對當前以及當前往前數 3 個 mini-batch 的結果進行 Normalization。
- CmBN 則是僅僅在這個批次中進行計算。
#### SAM, PAN
![](https://i.imgur.com/NDM8qj5.png)
- 將 Spatial-wise attention 更改為 Point-wise attention。
- 替換 PAN 的連接方式從 Addition 改為 Concatenation。也就是下面這張圖
![](https://i.imgur.com/NTtozEx.jpg)
### YOLOv4
名詞解釋:
- Bag of Freebies: 只改變訓練策略或只增加訓練成本的方法。通常最主要的作法就是 Data Augmentationu 也就是 photometric distortions 和 geometric distortions。
- Photometric distortions(光學變形):調整圖像的亮度、對比度、色調、飽和度和 Noise。
- Geometric distortions(幾何變形):隨機縮放、裁剪、偏移和旋轉。
- Bag of Specials: 只會增加少量推理成本但能顯著提高物件偵測準度的 Plugin modules 和 Post-Processing 方法。
- Plugin modules 主要用於增強模型中的某些屬性,如:擴大 receptive field, 引入 Attention 機制, 增強特徵整合能力(feature integration capability)。
- Post-Processing 則是篩選模型預測結果的一種方法。
總結來說最後本文是使用:
- **Backbone: ==CSPDarknet53==**
- **Neck: ==SPP Blocks==、==PANet==**
- **Head: ==YOLOv3-head==**
- **Bag of Freebies for Backbone: ==CutMix 和 Mosaic data augmentation==, ==DropBlock regularization==, ==Class label smoothing==**
- **Bag of Specials for Backbone: ==Mish activation==, ==Cross-stage partial connections (CSP)==, ==Multi-input weighted residual connections (MiWRC)==**
- **Bag of Freebies for detector: ==CIoU-loss==, ==CmBN==, ==DropBlock regularization==, ==Mosaic data augmentation==, ==Self-Adversarial Training==, ==Eliminate grid sensitivity==, ==Using multiple anchors for a single ground truth==, ==Cosine annealing scheduler==, ==Optimal hyperparameters==, ==Random training shapes==**
- **Bag of Specials for detector: ==Mish activation==, ==SPP-block==, ==SAM-block==, ==PAN path-aggregation block==, ==DIoU-NMS==**
## Experiments
### 在 ImageNet 的影像分類默認超參數為:
- Training Step: 8,000,000
- Batch size: 128
- Mini-batch size: 32
- Initial Learning Rate: 0.1
- 採用多項式衰減 Learning Rate 調度策略
- Warn-up step: 1,000
- Momentum: 0.9
- Weight decay: 0.005
### ImageNet 上的實驗目的
- 在 BoS 的實驗中超參數都不變,在 BoF 的實驗中則額外添加了 50% 的 training step。
- BoF 實驗驗證了 MixUp, CutMix, Mosaic, Bluring 這些資料增強的方法以及 Label smoothing regularization。
- BoS 實驗驗證了 LReLU, Swish, Mish 這幾種 Activation Function。
- 所有實驗均在 1080Ti 以及 2080 Ti GPU 上進行。
### 在 MS COCO 的物件偵測默認超參數為:
- Training Step: 500,500
- Batch size: 64
- Mini-batch size: 8 or 4
- Initial Learning Rate: 0.01
- 第 400,000 跟 450,000 step 的時候, Learning Rate 各乘 0.1
- Momentum: 0.9
- Weight decay: 0.0005
### MS COCO 上的實驗目的
- 除了使用基因演算法進行超參數搜索外,其他實驗都是上面的默認值。
- 基因演算法使用 YOLOv3-SPP 進行帶有 GIoU Loss 的訓練,搜索在 mini-val 5k 資料集的 300 epochs。
- 採用搜索 Learning rate 0.00261, momentum 0.949, IoU 閾值 0.213, Loss Normalizer 0.07 進行基因演算法實驗。
### 不同特徵在分類訓練上的影響
![](https://i.imgur.com/ruT7BiR.png)
<br>
- 本章節研究不同特徵對不同分類訓練的影響,具體來說如上圖所示,對於不同資料增強方式做比較,以及 Class label smoothing 跟不同 Activation 的結果比較。
<br>
![](https://i.imgur.com/hAeQ0lx.png)
<br>
- 上表顯示了這些方法通過引入不同的資料增強、Class label smoothing、跟 Mish Activation 結果都由提高準度。
### 不同特徵在物件偵測訓練上的影響
![](https://i.imgur.com/v1hL2SX.png)
:::info
:bulb: Ablation Studies of Bag-of-Freebies. (CSPResNeXt50-PANet-SPP, 512x512).
- **S:** 消除網格敏感度。公式是 $b_x=\sigma(t_x)+c_x, b_y=\sigma(t_y)+c_y$,其中 $c_x, c_y$ 都是整數,在 YOLOv3 中主要用於評估物件座標,因此接近 $c_x$ 或 $c_x+1$ 的 $b_x$ 值需要極高的 $t_x$ 絕對值,本文就透過 sigmoid 乘以一個超過 1.0 的因子來消除網格無法偵測到物件的影響。
- **M:** Mosaic data augmentation。使用 4-image 馬賽克訓練,而不是一張影像。
- **IT:** IoU 閾值。使用多個 anchors 對一個真實答案的 $IoU(truth, anchor)>IoU\_threshold$
- **GA:** 基因演算法。使用基因演算法在前 10% 的訓練選取最佳超參數。
- **LS:** Class label smoothing。對 Sigmoid 使用分類標籤平滑
- **CBN:** CmBN。使用 Cross mini-Batch Normalization 來收集整個 Batch 內的統計資訊,而不是在單個 mini-Batch 上收集而已。
- **CA:** 餘弦退火機制。在訓練期間改變學習率。
- **DM:** 動態 mini-Batch size。使用隨機訓練 shape,在小解析度訓練期間開始自動增加 mini-Batch size。
- **OA:** 最佳化 Anchors。使用在 $512\times512$ 網路解析度中訓練最好的 Anchors。
- **GIoU, CIoU, DIoU, MSE:** 使用不同 Loss 進行 Bounding Box 的回歸計算。
:::
![](https://i.imgur.com/wSOOjb5.png)
:::info
:bulb: 上表則是進行不同 Bag of Special 對於偵測訓練時的準度影響,包括:PAN、RFB、SAM、高斯 YOLO(G)、ASFF,在本文實驗中使用 SPP、PAN、SAM 時效果最好。
:::
### 不同骨幹和預訓練權重在物件偵測訓練上的影響
![](https://i.imgur.com/11f8llD.png)
- 本文發現具有最佳分類準度的模型不一定在物件偵測上也會有最佳的表現。
- 使用不同特徵訓練的 CSPResNeXt50 分類準度高於 CSPDarknet53,但在物件偵測任務上卻相反。
- 在分類任務上使用 BoF 和 Mish 對 CSPResNeXt50 的分類訓練可以提高準度,但若使用預訓練權重在物件偵測任務上反倒會降低。
- 但若是使用 BoF 和 Mish 對 CSPDarknet53 分類訓練可以提高分類的準度,並且使用此分類的預訓練權重在物件偵測上也能提高其準度,這也代表 CSPDarknet53 比起 CSPResNeXt50 更適合於物件偵測上。
### 不同的 mini-Batch size 在物件偵測訓練上的影響
![](https://i.imgur.com/jV7UmAL.png)
* 由上表可得知,當我們使用 BoF 和 BoS 的時候 mini-Batch size 就已經不太會造成準度的影響。
## Result
![](https://i.imgur.com/9IBWptJ.png)
:::info
:bulb: 比較不同物件偵測模型的速度與正確率。
:::
- 本文從上圖可得知不管在速度或是正確率上,都優於其他物件偵測模型。
### Maxwell 結構 GPU 跑出的結果
![](https://i.imgur.com/BVanlcx.png)
:::info
:bulb: 使用 Maxwell 型號的 GPU (GTX Titan X (Maxwell) 或 Tesla M40 GPU) 跑出來不同 model 在 MS COCO test-dev 2017 dataset 的結果
- Real-time 定義為 FPS >= 30 的模型
- Batch size = 1
- 不使用 TensorRT 加速
:::
### Pascal 結構 GPU 跑出的結果
![](https://i.imgur.com/DRuN4ge.png)
:::info
:bulb: 使用 Pascal 型號的 GPU (Titan X (Pascal), Titan Xp, GTX 1080 Ti 或 Tesla P100 GPU) 跑出來不同 model 在 MS COCO test-dev 2017 dataset 的結果
- Real-time 定義為 FPS >= 30 的模型
- Batch size = 1
- 不使用 TensorRT 加速
:::
### Volta 結構 GPU 跑出的結果
![](https://i.imgur.com/ALcQWu1.png)
:::info
:bulb: 使用 Volta 型號的 GPU (Titan Volta 或 Tesla V100 GPU) 跑出來不同 model 在 MS COCO test-dev 2017 dataset 的結果
- Real-time 定義為 FPS >= 30 的模型
- Batch size = 1
- 不使用 TensorRT 加速
:::