YOLO演進 — 3 — YOLOv4詳細介紹

李謦伊
謦伊的閱讀筆記
21 min readSep 15, 2020

之前有介紹過 YOLOv1 、YOLOv2YOLOv3,本文要來接續介紹今年最火紅的物件偵測模型 — YOLOv4

論文連接

YOLOv4 在 YOLOv3各個部分做改進,保證速度的同時,大幅提高模型的檢測精度,並降低硬體使用的要求。由下圖可以看見YOLOv4 在 MS COCO 數據集上獲得了 43.5% 的 AP 值 (65.7% AP50)。YOLOv4 在與 EfficientDet 同等性能的情況下,速度是 EfficientDet 的二倍;與 YOLOv3 相比,YOLOv4的 AP 和 FPS 分別提高了 10% 和 12%。

該研究的主要貢獻如下:

  • 建立了一個高效強大的目標檢測模型,並且使用 1080Ti 或 2080Ti 的 GPU 就可以進行訓練
  • 驗證了SOTA (State of the Art) 的 Bag-of-Freebies 和 Bag-of-Specials 目標檢測方法在檢測器訓練過程中的影響
  • 改進了一些 tricks 、SOTA 的方法,包括 CBN、PAN、SAM 等,使之更加高效,並能夠在單 GPU 上訓練

📚 在Browse State-of-the-Art網站裡按領域、任務和數據集採集了最先進水平 (SOTA) 的論文,SOTA (State of the Art) 就是指目前技術的最優算法,並以此為衡量標準

❓ 什麼是Bag-of-Freebies、Bag-of-Specials、tricks?

💬 Tricks 就是指在訓練、測試時優化網絡的一些技巧,在論文裡將 tricks 分為兩大類: Bag-of-Freebies、Bag-of-Specials

📌 Bag-of-Freebies 是指在網絡訓練時所用到的技巧,不影響推理預測的時間,主要包括:

  • 數據增強 (data augmentation): Random erase、CutOut、Hide-and-seek、Grid mask、GAN、MixUp、CutMix
  • 正則化方法: DropOut、DropConnect
  • 處理數據不平衡問題: focal loss、Online hard example mining、Hard negative example mining
  • 處理 bndBox 回歸問題: MSE, IOU, GIOU, DIOU/CIOU

📌 Bag-of-specials 是指在網絡設計或後處理時所用到的技巧,輕微增加推理預測時間,但可提升較大的精度,主要包括:

  • 感受野: SPP、ASPP、RFB
  • 特徵融合: FPN、PAN
  • 注意力機制: attention module
  • 激活函數: Swish、Mish
  • NMS: Soft-NMS、DIoU NMS

目標檢測通常由以下幾個部分組成:

  • Input: 指圖片的輸入
  • Backbone: 在ImageNet預訓練的骨架
  • Neck: 通常用來提取不同層級的特徵圖
  • Head: 預測對象類別及bndBox的檢測器,通常分兩類 Dense Prediction (one stage), Sparse Prediction (two stage)

而 YOLOv4 模型的架構由三部分組成

  • BackBone: CSPDarknet53
  • Neck: SPP+PAN
  • HEAD: YOLO HEAD

Backbone — CSPDarknet53

為了使網絡能夠快速操作並併行計算優化,作者提供了兩種神經網絡

  • 對於GPU,在卷積層中使用少量組 (1~8 group) 的卷積,並將ResNeXt50、Darknet53分別與Cross Stage Partial Network (CSPNet) 結合,組成了CSPResNeXt50和CSPDarknet53

由下表的實驗證明 CSPResNeXt50 適合用於分類網路,而 CSPDarknet53 更適合用於檢測網路,因此最後選擇使用CSPDarknet53作為Backbone。

  • 對於 VPU,則使用了分組卷積 (grouped-convolution),但不再使用 Squeeze-and-excitement (SE) 塊,包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3

Cross Stage Partial Network (CSPNet)

論文連接

在目標檢測任務中通常是運行在小型設備上,因此需要計算量較低的模型,以縮短推理預測時間。CSPNet論文的作者認為預測計算量高的問題是源自於網路優化中的梯度信息重複導致,因此提出了跨階段局部網路 (CSPNet)。

CSPNet 的主要目的是使網路架構能夠實現獲取更豐富的梯度融合信息並降低計算量,作法是先將Base layer 的 feature map 劃分為2個部分,然後再經過transition -> concatenation -> transition 將2個部分融合起來。

Transition layer 代表過度層,包含1x1卷積層及 pooling 層。

這樣的作法使得 CSPNet 解決了三個問題:

  • 增加CNN的學習能力,即便將模型輕量化,也能保持準確性
  • 去掉計算力較高的計算瓶頸結構 (降低計算)
  • 降低內存占用

下圖是 DenseNet 及結合了 CSPNet 的具體結構

下圖是 CSPNet 結合不同 backbone 後的結果,由下圖中可以看出在ImageNet分類的準確率保持不變或是稍略提升一些,但計算量卻大幅下降。而在 MS COCO 檢測的結果,CSPNet 的 AP50 明顯高於其他方法,並且在相同精確度時,FPS 快速很多。

Neck — SPP+PAN

Neck 的部分是為了能夠擴大感受野以及融合不同尺度feature map 的信息 (更好的進行特徵融合)

  • SPP (Spatial Pyramid Pooling): 在網路的最後一層 concate 所有的 feature maps,後面能繼續接 CNN module

圖a為 YOLOv2 的網路架構,將最後一層攤平接上 fully-connected layers,圖b則是使用 SPP 架構,將最後一層的 feature maps concate 起來。

  • PANet (Path Aggregation Network): 以 FPN 為基礎做改進,將串的層數再多加一層

另外還有將原本相加的部分修改為合併,效果會比相加來的好,但是缺點就是 channel 會變多,計算量會變大。

Head:沿用 YOLOv3 的 head

接著在介紹BoF、BoS 方法前,先來看一下 YOLOv4 所用的完整方法有哪些

BoF for backbone

  • CutMix

CutMix 是2019年提出的數據增強方式,論文連接

作法是將一部分區域cut掉但不填充0像素而是隨機填充訓練集中的其他數據的區域像素值,分類結果按一定的比例分配。

從下圖可以看到 CutMix 的 Image 及 Label是由兩張不同的照片組合而成的,此外,數據增強還有另兩個方式: Mixup、Cutout

  • Mixup: 將隨機的兩張樣本按比例混合,分類的結果按比例分配
  • Cutout: 隨機的將樣本中的部分區域cut掉,並且填充0像素值,分類的結果不變
  • Mosaic data augmentation

Mosaic 是作者新創的數據增強方法,採用隨機縮放、裁剪的方式混合拼接4種圖片進行訓練,可以說是 CutMix 的加強版。

採用這個方法可以豐富檢測數據集,並且因為隨機縮放增加了很多小目標,讓模型穩健性更好。此外,作者考慮到可能需要只使用單GPU的計算也能達到好的效果,因此使用 Mosaic 訓練時,可以直接計算4張圖片的數據,使 Mini-batch 的大小不需要很大。

  • DropBlock regularization

DropBlock 與 Dropout 功能類似,也是避免 overfitting 的一種正則化方法,於2018年提出。論文連接

圖b是使用 Dropout 的方法,會隨機刪除神經元的數量,但網路仍可以從相鄰的激活單元學習到相同信息。

圖c是使用 DropBlock 的方法,隨機將整個局部區域進行刪減,網路就會去注重學習某些特徵以實現正確分類而得到更好的泛化效果。

  • Class label smoothing

Label Smoothing 是圖像分類經常會用到的一種正則化方法。論文連接

在多分類任務中,通常會將輸出用 softmax 進行歸一化處理,再使用 one-hot label 去計算 cross-entropy loss function 來訓練模型。但使用 one-hot 向量表示容易導致網路overfitting的問題,因此 Label Smoothing 就是將 one-hot label 變得更加 soft,使得在計算 loss 時可以有效抑制 overfitting 的現象,提高模型的泛化能力。

作法如下圖的公式,降低正確類別的權重,另一方面提高錯誤類別的權重

其中 K 為類別數, 為超參數, 在 yk 為正確類別時為1,錯誤類別時為0

Bag of Specials (BoS) for backbone

  • Mish activation

Mish 是連續可微的非單調激活函數,跟 ReLU 相比,Mish 的梯度更平滑,並且在負值時允許有較小的負梯度,可以穩定網路梯度流,具有更好的泛化能力。論文連接

公式定義如下

YOLOv4 作者使用 CSPDarknet53 網絡在 ImageNet 數據集上做圖像分類任務,發現使用了Mish激活函數的 TOP-1和 TOP-5的精度比沒有使用時都略高一些。

因此 YOLOv4 的 Backbone 中都使用了 Mish 激活函數,而後面的網絡則還是使用 leaky relu 函數。

  • Multiinput weighted residual connections (MiWRC)

YOLOv4 參考了 EfficientDet 的架構及方式,使用了多輸入加權的殘差連接 (MiWRC) 作為 backbone 的 BoS。

EfficientDet 的 backbone 使用 EfficientNet、 Neck 為 BiFPN

由下圖可以看出 EfficientNet-B0 的架構通過多個 MBConv Block 建構而成,MBConv Block就是指 MobileNet V2 的 Inverted Residual Block。

MBConv 的主要架構如下圖右所示,其設計是先升維再降維,與residual block先降維再升維的操作不同,而這樣的設計可以讓 MobileNetV2 能夠更好的利用殘差連接以提升準確率。

BiFPN 是由 PANet 進行簡化,刪除貢獻程度較小的節點 (只有一個輸入的節點: P3、P7),並提出跨尺度融合 (Cross-Scale Connections) 的優化方法,在輸入與輸出節點中間加入 connection。

MiWRC 的思想源自於 BiFPN,在 FPN中每一層取得的 feature 都視為平等的,而 MiWRC 則認為不同層的 feature 理應有不同的重要性,需針對不同尺度的特徵給予不同的權重比例。

Bag of Freebies (BoF) for detector

  • CIoU-loss

在介紹 CIoU-loss 之前,先說明 IOU loss 的缺點以及各個 IOU loss 的演進過程。

📚 Bounding Box Regression Loss Function 演進過程: Smooth L1 Loss-> IoU Loss (2016) -> GIoU Loss (2019) -> DIoU Loss (2020) ->CIoU Loss (2020)

🔸 IOU loss

使用 IOU loss 會有2個問題:

1. 當預測框 (predict bndBox) 和目標框 (ground truth) 不相交時,IOU為0,無法反應兩個框之間的遠近,此時損失函數不可導,也就是說無法算梯度,因此無法優化兩個框不相交的情況

2. IOU 無法反應預測框與目標框的重合大小,如下圖所示,這三種情況擁有相同的 IOU 值,但重合度不同

之後的GIoU、DIoU、CIoU 都是基於 IOU loss增加一個懲罰項

🔸 GIOU loss (Generalized IOU loss)

GIOU 為了解決預測框與目標框不重疊的問題,因此在 IOU loss 的基礎上增加一個懲罰項,比 IOU 更能反應兩個框的接近程度。

由下圖可以看到 C 為目標框 Ground Truth 與預測框 Predict 的最小包圍框

從下圖可以得知,當兩個框距離越遠,GIOU loss 越大,因此 GIOU 比 IOU 更能反應兩個框的接近程度

雖然 GIOU 解決了 IOU 的梯度問題,但仍存在一些缺點…

在訓練過程中,GIOU 會傾向先增大predict bndBox 的大小,使它能夠與 ground truth 有所重疊,如此一來才能計算 IOU loss。這個操作會導致消耗大量的時間,影響收斂速度。

由下圖可以看到 predict bndBox 的變化過程,綠色框為目標框ground truth,黑色的為 anchor box,藍色的為預測框 predict bndBox。

若預測框剛好在目標框內部,此時 GIOU loss 與 IOU loss 的值一樣,無法區分相對位置。

若兩個框平行或是垂直時,會導致 GIOU loss 的值一樣。

🔸 DIOU loss (Distance IOU loss)

基於 IOU 與 GIOU 存在的問題,作者提出了兩個問題:

1. 直接最小化預測框與目標框之間的歸一化距離是否可行,以達到更快的收斂速度

2. 如何在預測框與目標框有重疊時,回歸地更準確

DIOU 考慮了重疊面積與中心點距離,增加了一個懲罰項用於最小化兩個框的中心點距離

DIOU 能夠直接優化兩個框的距離;而 GIOU 趨向減少最小包圍框的面積,因此比 GIOU loss 收斂速度更快。

當預測框在目標框內時,GIOU loss 與 IOU loss 值相同,此時 GIOU 退化成 IOU 而無法區分其相對位置,DIOU 可以更好地優化此類問題。

可以將 DIOU 替換 IOU 用於 NMS 算法中,即論文提出的 DIOU-NMS。

好的目標框回歸損失函數應該考慮三個因素: 重疊面積、中心點距離、長寬比,DIOU loss 考慮了重疊面積與中心點距離,但沒有考慮長寬比,因此作者提出了 CIOU loss 將三個因素都考慮到,並且其收斂精度更高。

🔸 CIOU loss (Complete IOU loss)

CIOU 在 DIOU 的基礎上多增加了一個懲罰項,考慮了長寬比的因素。

CIOU loss 的梯度類似於 DIOU loss,但還要考慮v的梯度,以下是v 的梯度計算

  • CmBN (Cross mini-Batch Normalization)

下圖表示三種不同的 Batch Normalization (BN) 的方式

BN 是對當前 mini-batch 進行歸一化,但往往 batch size 都很小,可能會發生抽樣不均勻而導致歸一化會有問題,因此有許多對於小 batch size 的 Batch Normalization 方法。

CBN 的想法就是將之前的 mini-batch 一起計算,但不保留太多個 mini-batch,做法是對當前及當前 3 個 mini-batch 的結果進行歸一化。

而 YOLOv4 新創的 CmBN 是基於 CBN 去做修改,在mini-batch之間不做更新計算,而是在一個 batch 做完後才去更新網路參數。

  • Self-Adversarial Training (SAT)

SAT 是作者創新的一種數據增強的方法,分成兩階段完成

🔸 首先,先對訓練樣本進行前向傳播,然後進行反向傳播時修改圖片像素 (不修改網路權重),降低模型檢測的性能,透過這種方式讓神經網路對自身執行對抗式攻擊,製造出圖片沒有檢測對象的錯覺。這第一階段其實就是在增加樣本的訓練難度

🔸 第二階段,就是使用這修改過的圖片對模型進行訓練

這樣的方式有助於推廣模型和降低 overfitting 的問題。

  • Eliminate grid sensitivity

作者在觀測一段物件偵測的影片中發現,因為檢測物體的中心點多位於接近 Grid 中心,而導致在 Grid 邊緣時較難檢測 (完全無法被預測為物件中心),但實際狀況物件移動的路線是連續的,所以其中心位置應該也是連續的,也就是說物體可能會出現在 Grid 邊緣。

作者認為之所以有檢測物體的中心點多位於接近 Grid 中心點的問題存在,是因為 Sigmoid 函數的梯度,由下圖可以看到 Sigmoid 在 Grid 邊緣時導數接近0,容易發生梯度消失,導致中心點在 Grid 邊緣時很難學習到準確的結果。

因此作者在 Sigmoid 函數做了些改變,將 Sigmoid 乘上一個大於1的值,並且考慮到不同的 Grid size 對於邊界效應的敏感度,採用 (1+x)* Sigmoid — (0.5*x),其中當 Grid 解析度越高, x 就越高。

  • Cosine annealing scheduler

Cosine annealing 是利用餘弦函數來調整 learning rate,一開始會先緩慢的降低 learning rate,然後中途再加速下降,最後再次地緩慢下降。

Pytorch 提供了兩個版本的 Cosine annealing

🔸 torch.optim.lr_scheduler.CosineAnnealingLR (optimizer, T_max, eta_min=0, last_epoch=-1, verbose=False)

optimizer 是指優化器、T_max 是指最大的迭代次數,表示 cos 週期的1/4、eta_min 是指最小學習率,last_epoch 是指最後一個 epoch 的 index,默認為1表示從頭開始訓練、verbose 表示是否要印出更新的訊息

公式如下

🔸 torch.optim.lr_scheduler.CosineAnnealingWarmRestarts (optimizer, T_0, T_mult=1, eta_min=0, last_epoch=-1, verbose=False)

它與 CosinAnnealingLR() 參數有兩個不一樣的地方,T_0 是指初始 restart 的 epoch 數目、T_mult 是指 restart 後增加迭代次數的乘法因子,可以想成 T_0 = T_0 * T_mult

公式如下

  • Optimal hyperparameters

使用基因演算法 Genetic Algorithms (Evolutionary Algorithms) 來選擇超參數。作法是先隨機組合超參數去做訓練,然後挑選出最好的 10% 超參數再去隨機組合並訓練,最後選擇最佳的模型。

Bag of Specials (BoS) for detector

  • SAM-block (Spatial Attention Module)

SAM 是源自於 CBAM(Convolutional Block Attention Module) 的論文,提供了兩種注意力機制的技巧。論文連接

先來介紹一下 CBAM,如下圖所示,輸入一個特徵F,先進行 Channel attention module 後得到權重系數與原來的特徵F相乘,然後再進行 Spatial attention module 後得到權重系數與原來的特徵F相乘,最後就可以得到縮放後的新特徵。

那 Channel attention module 與 Spatial attention module 分別是什麼呢?

Channel attention module (通道注意力模塊) 就是將輸入的特徵F分別進行全局的 Maxpooling 與 Averagepooling,接著將這兩個 vector 輸入到一個權重共享的 MLP,再將這兩個 vector 進行 element-wise summation 操作後經過 Sigmoid 函數會得到權重系數Mc,再將這個權重系數與原來的特徵F相乘,就可以得到縮放後的新特徵。

而後就再進行 Spatial attention module (空間注意力模塊) 的操作,先對不同 feature map 上相同位置的像素值進行全局的 Maxpooling 與 Averagepooling,接著將這兩個 spatial attention map 進行 concat,再利用一個 7x7 的卷積進行卷積後經過 Sigmoid 函數會得到權重系數Ms,再將這個權重系數與原來的特徵F相乘,就可以得到縮放後的新特徵。

YOLOv4 將 SAM 修改為 pointwise attention,由下圖可以看到它不做 Maxpooling 與 Averagepooling 的操作,而是直接接一個 7x7 的卷積層

  • DIoU-NMS

在經典的 NMS 中,信心度最高的檢測框和其他檢測框會逐一算出對應的 IOU 值,並將值超過 threshold 的檢測框過濾掉。但在實際的情況下,當兩個不同的物體靠得很近時,由於 IOU 值比較大,在經過 NMS 算法後,往往只剩下一個檢測框,導致可能有漏檢的狀況發生。

DIoU-NMS 不僅僅考慮 IOU 值,還考慮兩個框的中心點之間的距離。如果兩個框之間 IOU 比較大,但是他們之間的距離比較遠,會認為是不同物體的檢測框而不會被過濾掉。

以下是 DIoU-NMS 的公式

得分最高的預測框 M 和其他框 Bi 的 DIOU 值比 IOU 值大時,Bi 的置信度仍可以保持;反之,Bi 的置信度就設成 0

這些方法就是 YOLOv4 所改進的部分! 作者做了很多近幾年的各種技巧的實驗,以及一些創新改進的方法,看 YOLOv4 的論文可以學習到不少知識呢!

--

--