論文位址:
《YOLOv4: Optimal Speed and Accuracy of Object Detection》
讀完論文的感受就像是一篇目标檢測tricks綜述,瘋狂疊buff就完事了。
先來論文tricks的截圖:
Backbones-Neck-Heads的tricks:

Activations、bbox回歸、資料增強、正則化、歸一化、跨域連接配接的tricks:
YOLOv4:
1. 目标檢測器通用架構:
除了輸入,一般
one-stage
的目标檢測算法通常由提取特征的
backbone
、傳輸到檢測網絡的
Neck
部分和負責檢測的
Head
部分。而
two-stage
的算法通常還包括空間預測部分;
作為
one-stage
的
YOLO
網絡主要由三個主要元件組成:
- Backbone -在不同圖像細粒度上聚合并形成圖像特征的卷積神經網絡;
- Neck:一系列混合群組合圖像特征的網絡層,并将圖像特征傳遞到預測層;
- Head:對圖像特征進行預測,生成邊界框和并預測類别;
yolo v4作為yolo系列的網絡改進,也是基于上述幾個方面進行改進的,作者對目标檢測的tricks進行了簡單介紹,并改進了部分buff,形成了最終的yolo v4網絡;
2. yolo v4的網絡結構:
網圖侵删
Input:
trick1:Mosaic資料增強
Yolov4中使用的Mosaic是參考2019年底提出的CutMix資料增強的方式,但CutMix隻使用了兩張圖檔進行拼接,而Mosaic資料增強則采用了4張圖檔,随機縮放、随機裁剪、随機排布的方式進行拼接:
Mosaic資料增強将
4
張訓練圖像合并成一張進行訓練的資料增強方法(而不是
CutMix
中的
2
張)。這增強了對正常背景(
context
)之外的對象的檢測,豐富檢測物體的背景;此外,每個小批包含一個大的變化圖像(
4
倍),是以,減少了估計均值和方差的時需要大
mini-batch
的要求,降低了訓練成本;
trick2:自對抗訓練(SAT)
SAT為一種新型資料增強方式。在第一階段,神經網絡改變原始圖像而不是網絡權值。通過這種方式,神經網絡對其自身進行一種對抗式的攻擊,改變原始圖像,制造圖像上沒有目标的假象。在第二階段,訓練神經網絡對修改後的圖像進行正常的目标檢測。
Self-Adversarial Training是在一定程度上抵抗對抗攻擊的資料增強技術。CNN計算出Loss, 然後通過反向傳播改變圖檔資訊,形成圖檔上沒有目标的假象,然後對修改後的圖像進行正常的目标檢測。需要注意的是在SAT的反向傳播的過程中,是不需要改變網絡權值的。 使用對抗生成可以改善學習的決策邊界中的薄弱環節,提高模型的魯棒性。是以這種資料增強方式被越來越多的對象檢測架構運用。
BackBone:
trick1:CSPDarknet53
YOLOv3中特征提取網絡使用的是Darknet53,YOLOv4借鑒了CSPNet,其全稱是Cross Stage Partial Networks,即跨階段局部網絡;
CSPNet解決了其他大型卷積神經網絡架構Backbone中網絡優化的梯度資訊重複問題,将梯度的變化從頭到尾地內建到特征圖中,是以減少了模型的參數量和FLOPS數值,既保證了推理速度和準确率,又減小了模型尺寸;CSPNet如下:
trick2:Mish激活函數
Mish是一個平滑的曲線,平滑的激活函數允許更好的資訊深入神經網絡,進而得到更好的準确性和泛化;在負值的時候并不是完全截斷,允許比較小的負梯度流入。實驗中,随着層深的增加,ReLU激活函數精度迅速下降,而Mish激活函數在訓練穩定性、平均準确率(1%-2.8%)、峰值準确率(1.2% - 3.6%)等方面都有全面的提高;
主幹網絡為什麼要用Mish,那當然是煉丹有效果啦。
trick3:Dropblock
傳統的dropout對FC層效果更好,對conv層效果較差,因為卷積層通常是:卷積+激活+池化層,池化層本身就是對相鄰單元起作用,而且即使随機丢棄,卷積層仍然可以從相鄰的激活單元學習到相同的資訊;是以,在全連接配接層上效果很好的Dropout在卷積層上效果并不好,輸入的資訊仍舊能夠被送到下一層,導緻網絡過拟合;而DropBlock則是将在特征圖上去掉一部分相鄰的整片的區域(比如頭和腳),網絡就會去注重學習狗的别的部位的特征,來實作正确分類,進而表現出更好的泛化;
Neck
trick1:SPP(Spatial Pyramid Pooling Networks)
使用k={1×1,5×5,9×9,13×13}的最大池化的方式,再将不同尺度的特征圖進行Concat操作,采用SPP子產品的方式,比單純的使用k×k最大池化的方式,極大地增加感受野,顯著的分離了最重要的上下文特征;
trick2:PANet
(
Path Aggregation Network
)
PANet
論文中融合的時候使用的方法是
Add
,
YOLOv4
算法将融合的方法由add改為
Concate,這是改進的一種
特征圖融合方式 ;
Prediction
使用yolo v3的head
other tricks:
trick1:類标簽平滑
對于分類特别是多分類問題,常常把标簽轉換成one-hot向量類别标簽,對于損失函數,我們需要用預測機率去拟合真實機率,而拟合one-hot的真實機率函數會帶來兩個問題:
- 無法保證模型的泛化能力,容易造成過拟合;
- 全機率和零機率鼓勵所屬類别和其他類别之間的差距盡可能加大,而由梯度有界可知,這種情況很難适應,會造成模型過于相信預測的類别;
對預測有100%的信心可能表明模型隻是在記憶訓練資料,而不是在進行學習:标簽平滑處理調整預測的目标上限為一個較低的值,比如0.995。即對分類準确做了一點懲罰,讓模型不可以分類的太準确,它将使用這個值而不是1.0來計算loss,這種方法緩解了過拟合;
标簽平滑就是一定程度縮小label中min和max的差距,label平滑可以減小過拟合,是以,适當調整label,讓兩端的極值往中間湊,以增加泛化性能。
trick2:CmBN
傳統BN(batch normalization)是僅利用目前疊代時刻資訊進行歸一化操作,而CBN(cross batch normalization)在計算目前時刻統計量時候會考慮前k個時刻的統計量,進而實作擴大batch size操作;同時CBN操作不會引入比較大的記憶體開銷,訓練速度不會影響很多,但是訓練時候會慢一些;
CmBN是CBN的改進版本,把大batch内的4個mini batch當做一個整體,對外隔離;CBN在第t時刻,也會考慮前3個時刻的統計量進行彙合,而CmBN操作不會,不再滑動cross,其僅僅在mini batch内部進行彙合操作,保持BN一個batch更新一次可訓練參數;
BN:無論每個batch被分割為多少個mini batch,其算法就是在每個mini batch前向傳播後統計目前的BN資料(即每個神經元的期望和方差)并進行Normalization,BN資料與其他mini batch的資料無關;
CBN:每次iteration中的BN資料是其之前n次資料和目前資料的和(對非目前batch統計的資料進行了補償再參與計算),用該累加值對目前的batch進行Normalization,好處在于每個batch可以設定較小的size;
CmBN:隻在每個Batch内部使用CBN的方法,如果每個Batch被分割為一個mini batch,則其效果與BN一緻;若分割為多個mini batch,則與CBN類似,隻是把mini batch當作batch進行計算,其差別在于權重更新時間點不同,同一個batch内權重參數一樣,是以計算不需要進行補償;
trick3:學習率循環餘弦衰減
學習率會先上升再下降,上升的時候使用線性上升,下降的時候模拟cos函數下降,循環執行多次;
trick4:改進的SAM(空間注意力機制)
空間注意力機制在
深度學習
中被廣泛采用,Convolutional Block Attention Module (CBAM) 表示卷積子產品的注意力機制子產品,是一種結合了空間(spatial)和通道(channel)的注意力機制子產品;
在
SAM
中,最大值池化和平均池化分别用于輸入
feature map
,建立兩組
feature map
。結果被輸入到一個卷積層,接着是一個
Sigmoid
函數來建立空間注意力;在
YOLOv4
中,使用修改後的
SAM
而不應用最大值池化和平均池化;
trick5:DIoU-NMS
nms主要用于預測框的篩選,常用的目标檢測算法中,一般采用普通的nms的方式;而Yolo v4将其中計算IOU的部分替換成DIOU的方式:
DIOU被用作非最大值抑制(
NMS
)的一個因素,該方法在抑制備援框的同時,采用
IoU
和兩個邊界盒中心點之間的距離,這使得它在有遮擋的情況下更加健壯;
關于DIOU等loss的總結,這裡可以看看大佬的部落格:
關于SIoU的原理和代碼實作(回顧IoU、GIoU、DIoU、CIoU)
trick6:遺傳算法優化超參
遺傳算法如何模拟大自然的進化?
還有一些tricks這裡沒有全部提到,大家可以看看下面的參考;
小結
YOLO-v4算法是在原有YOLO目标檢測架構的基礎上,采用了之前CNN領域中最優秀的優化政策,從資料處理、主幹網絡、網絡訓練、激活函數、損失函數等各個方面都有着不同程度的優化;
作者把訓練的方法分成了兩類:
Bag of freebies:隻改變訓練政策或者隻增加訓練成本,比如資料增強;
Bag of specials:插件子產品和後處理方法,它們僅僅增加一點推理成本,但是可以極大地提升目标檢測的精度;
參考文獻
通道注意力
目标檢測loss
深度學習中的規範化
目标檢測算法YOLOv4詳解
YOLO V4 — 網絡結構和損失函數解析
推薦一個大佬的代碼實作(keras、tf2與torch):
Bubbliiiing:https://blog.csdn.net/weixin_44791964/category_9408229.html?spm=1001.2014.3001.5482
僅為學習記錄,侵删!