YOLOv4: Optimal Speed and Accuracy of Object Detection
摘要
深度學習發展至今,依據產生了許多優秀的技術。其中一些技術對特定的數據集或小數據集有着良好的表現;而有一些技術擁有着普遍的適用性,在各個領域、各種架構都有着非常好的性能提升表現,如: batch-normalization, residual-connections。yolo的作者列舉了如下的技術(主要是本文使用的):
-
WRC (Weighted-Residual-Connections) 加權殘差連接
-
CSP (Cross-Stage-Partial-connections)跨階段部分連接
-
CmBN (Cross mini-Batch Normalization)交叉小批量標准化
-
SAT(Self-adversarial-training)自我對抗訓練
-
Mish-activation Mish激活-----> 即將取代Relu激活的存在: https://www.cnblogs.com/think90/p/11857224.html
介紹見附件 Mish激活函數介紹
-
Mosaic data augmentation 馬賽克式數據增強:將幾張圖片拼接到一起!
-
DropBlock Regularization 刪除塊的正則化
介紹見附件 DropBlock正則化介紹
-
CIoU Loss 正則化函數介紹鏈接: https://zhuanlan.zhihu.com/p/104236411
yolov4在一些任務上達到了SOTA狀態!在MS COCO數據集上實現了43.5%的\(AP\),65.7的\(AP_{50}\),實時性達到了65幀。代碼開源在:https://github.com/AlexeyAB/darknet
介紹
當前基於CNN的網絡架構主要用於輔助決策(推薦系統),當我們需要實時地決策時,一般網絡就不能很好地兼容我們的系統開發了,因為這些網絡一般非常龐大(追求模型的性能精度而損失實時性)。作者提出的yolo系列正是考慮了實時性的優秀架構,隨着版本的更替,yolo系列模型的精度也在不斷提升!而很多公司也正是因為有了yolo系列,視覺檢測任務才能夠進行(毫不誇張地說)。
yolo-v3可能是原作者的最后一次更新(廣大的粉絲當然希望大神不要就此訣別這個領域),它為我們帶來了高精度的實時性架構。你只需要一張傳統的GPU(如:2080TI)就可以訓練屬於你自己的模型。
本文中作者的主要工作是提升目標檢測器的速度與計算的優化,而不是降低計算量理論指標(BFLOP)!
這篇論文的主要貢獻為:
-
開發了一個高效和強大的目標檢測模型。它使每個人都可以使用1080ti或2080tiGPU訓練一個超快速和准確的目標探測器。
-
在目標檢測訓練過程中,作者驗證了Bag-of-Freebies與Bag-of-Specials方法在模型中的影響。
Bag-of-Freebies and Bag-of-Specials方法介紹見附件。
方法提出者在yolo-v3上驗證此方法在不改變模型建構和損失函數的情況下將性能提升了5個百分點。
————————————————
(1)Bag-of- Freebies
傳統的目標探測器是離線訓練的,因此,研究者希望利用這一優勢,開發出更好的訓練方法,使目標檢測器在不增加推理成本的情況下獲得更好的精度。把這些只改變訓練策略或只增加訓練成本的方法稱為“免費包”。
輸入圖像可變性,遮擋,多張圖數據增強,樣式轉換(GAN),數據分布不平衡, 不同類別的關聯, BBox回歸
(2)Bag of specials
對於那些只增加少量推理代價卻能顯著提高目標檢測精度的插件模塊和后處理方法,我們稱之為“特殊包”。
擴大感受野,注意力機制,特征融合,激勵函數,后處理模塊(NMS)
————————————————
原文鏈接:https://blog.csdn.net/xiaoshulinlove/article/details/105760976 -
修改了一些SOTA方法,使之能夠更高效、更適合單張GPU訓練,包括CBN、PAN、SAM等。
論文的相關工作
架構示意圖
上面的示意圖可以清楚地了解整個架構的組成(前提是你得有基本的視覺理論基礎)。
最后的架構
最后YOLO v4 作者選擇的架構:
- Backbone: CSPDarknet53
- Neck: SPP and PAN
- Head: YOLOv3
YOLO v4 uses:
- BoF for backbone: CutMix和Mosaic數據增強,DropBlock正則化,類標簽平滑(CutMix介紹見附件)
- BoS for backbone: Mish激活函數、跨階段(跨stage)部分連接、MiWRC:多輸入加權殘差連接;
- BoF for detector: CIoU-loss、CmBN、DropBlock正則、馬賽克式的數據增強、SAT自我對抗訓練、消除網格敏感性、一個gt_bbox生成多個錨框(常規操作)、余弦退火機制、隨機訓練數據的shape;
YOLOv4的網絡結構:
目標檢測模型
目前,目標檢測比較流行兩部分組合的網絡架構,即backbone + head。一般情況下,我們需要一個backbone結構,也即我們的骨干網絡,預測分類和目標邊框回歸(在GPU上面燥的情況):常見的有VGG、ResNet、ResNeXt、DenseNet;檢測目標在CPU上,常見的有SqueezeNet、MobileNet、ShufflfleNet。head部分一般分為兩部分: one-stage object detector and two-stage object detector。 two-stage object detector的代表是R-CNN系列:fast R-CNN、 faster R-CNN 、R-FCN、Libra R-CNN;也可以是基於 anchor-free 的目標檢測算法如RepPoints。 one-stage object detector的代表有:yolo系列、SSD、RetinaNet。最近 anchor-free one-stage的目標檢測發展迅速,有CenterNet、CornerNet、FCOS等。
最近一段時間的研究,學者經常在backbone和head中加入一些layer,主要是連接不同的stages。這些添加的layer,yolo-v4作者們稱之為neck層。這些neck層一般是采用了自上而下的路徑與自下而上的路徑的組合,需要這種結構的架構如:FPN、Path Aggregation Network (PAN) 、 BiFPN、NAS-FPN。
除了上述的架構外,一些學者將工作重心放到了研究新的backbone(DetNet、DetNAS)或新的全模型(SpineNet、HitDetector)上。
綜上,一個物體檢測可以由以下幾部分組成:
-
Input: Image, Patches, Image Pyramid(原始圖像數據,裁剪后的圖像數據、圖像金字塔)
-
Backbones:VGG16, ResNet-50, SpineNet, EffificientNet-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)
-
BOF 免費包(袋)
一般傳統的目標檢測模型是在線下訓練的,而研究者可以基於這些成果進一步提升模型的精度而沒有增加推理的成本。我們將只改變訓練策略或只在模型上進行inference的方法稱之為:bag of freebies(BOF)--免費包方法。BOF方法典型的就是數據增強(提高樣本在不同環境中的模型穩定性), photometric distortions 光學扭曲:改變圖片的亮度、飽和度、對比度、色調等;geometric distortions 幾何扭曲:旋轉、翻轉、裁剪、縮放等幾何操作。這些數據增強的方法在目標檢測中是非常有用的。
數據增強
上面的數據增強方法主要是對像素級的操作,全局的像素信息沒有大的變化。一些研究者提出了一些新穎的方法改變全局特征,從而提升模型性能。如 random erase隨機搽除、CutOut隨機拿一個矩形區域進行零(或其他值)填充;相同的概率被應用到特征圖,如DropOut、DropConnect、DropBlock。還有一些研究人員將多幅圖像進行區域加權融合。MixUp將兩個圖像進行疊加,根據比率來調整label;CutMix將裁剪后的圖像覆蓋到其他圖像的矩形區域,並根據混合區域的大小調整標簽。 style transfer GAN風格變換也常用於數據增強,它可以有效改善CNN網絡對紋理的學習偏差。
數據不平衡
我們的原始數據很多時候是不平衡的,在 two-stage目標檢測中經常對負樣本采樣獲取足夠的樣本量,但是這種方法對one-stage目標檢測並不友好,因為檢測是屬於稠密型預測架構。所以有學者提出了focal loss(焦點損失),用於處理這些問題。另一個嚴重的問題是我們很難用單一的一個度來衡量數據不同類別直接的關系,如我們常用的label真的可以較好地區分數據本身嗎?為了解決這個問題,有學者提出了 label smoothing(標簽平滑)技術。即將硬標簽替換為軟標簽。為了獲得更好的軟標簽,Islam等人引入了知識蒸餾的概念進行設計標簽優化網絡。
- Label refifinement network for coarse-to-fifine semantic segmentation, 博客資源:https://blog.csdn.net/u012905422/article/details/61614728 , 論文鏈接:https://arxiv.org/abs/1703.00551
BBox回歸的目標函數
常用的損失函數是MSE(對象為框的中心坐標,高和寬--BBox),關於這里會出現的問題見附件CIoU Loss介紹,里面有詳細的解釋。最后我們目前較好的損失為CIoU Loss。
BOS 特價包(袋)
對於那些插件模型和后處理方法,只需要一點點inference成本就可以大幅提升模型精度的方法,我們稱之為bag of specials(BOS)----特價包方法。
-
可增強感受野的方法:SPP、ASPP、RFB;
SPP模型來源於 Spatial Pyramid Matching (SPM) 模型,原始的SPMs模型是將特征圖分為\(d\times d\)的塊,然后計算詞袋特征;SPP引入該思想:在CNN中使用最大池化操作代替詞袋( bag-of-word)操作。這里就可以實現特征圖的向量化!!!
ASPP模型在SPP模型上對kernel采樣膨脹系數k,即空洞卷積。
RFB 模型類似地設置了膨脹系數為k,步長為1.
……更多模型介紹參考論文
附件
公式編輯器
LaTeX:https://www.codecogs.com/latex/eqneditor.php
Mish 激活函數介紹
Mish激活的函數及圖像
-
softplus函數
\[log\left ( 1 + e^{x} \right ) \] -
Mish激活函數
Mish激活簡單來說就是:Mish = x * tanh(ln(1+e^(x))),即:
\[x\times tanh\left ( ln\left ( 1 + e^{x} \right ) \right ) \] -
Mish的圖像
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-10, 10, 500) y = x * np.tanh(np.log(1 + np.exp(x))) y1 = 0 * x x2 = [0 for _ in range(-50, 1000, 1)] y2 = [i/100 for i in range(-50, 1000, 1)] plt.plot(x, y) plt.plot(x, y1, c="red", linestyle='--') plt.plot(x2, y2, c="red", linestyle='--') plt.show()
Mish激活的pytorch實現
class Mish(nn.model):
def __init__(self):
super().__init__()
print("Mish activation loaded …")
def forward(self, x):
x =x * (torch.tanh(F.softplus(x)))
return x
# softplus是ReLU的平滑版本
DropBlock正則化介紹
論文資源
arxiv鏈接:https://arxiv.org/pdf/1810.12890.pdf
博客資源(參考):https://blog.csdn.net/qq_14845119/article/details/85103503
介紹
上圖中的(a)是訓練的原始圖像;(b)中的淺綠色是被激活的區域,“X”標識了被dropout的區域;(c)中的dropout方式就是我們這里需要提及的DropBlock正則化。
(b)中的正則化方式,被drop掉的區域特征容易從周邊區域學習得到,而(c)采用了DropBlock的方式,將較大一塊區域的信息drop掉,網絡就會學習對象剩余部分的特征,依據這些特征進行正確分類,提高了模型的泛化能力!
DropBlock模塊
DropBlock模塊主要有兩個超參數:block_size、\(\gamma\)
block_size表示Block的邊長,block_size=1時就是dropout技術!
\(\gamma\) 表示區域被DropBlock的概率,這個參數和dropout技術一樣!
DropBlock保證drop掉的特征點與傳統的dropout技術一樣多,即圖中的“X”一樣多
這里概率的函數表達式為:
-
傳統的dropout技術drop掉的元素一共有:
\(\left ( 1-keep\_prob \right )feat\_size^{2}\)
綠色區域標識了可以進行DropBlock的區域,紅色的“X”表示要DropBlock的中心點,黑色的“X”表示了根據紅色的“X”生成的DropBlock區域!
-
現在我們使用DropBlock drop掉的元素有:
\[\frac{1-keep\_prob }{block\_size^{2}}\frac{feat\_size^{2}}{\left ( feat\_size- block\_size +1\right )^{2}}\times {\left ( feat\_size- block\_size +1\right )^{2}}\times block\_size^{2} \]上式的第二項是可能被刪除的中心元素(以當前點為中心划定block)概率;第三項是每個bolck的元素個數。從期望的角度,兩種算法是會drop掉相同期望值的元素個數!
-
上式第二項實際上划定了一個DropBlock 的區域,即邊緣無法滿足block_size的地方不能進行DropBlock操作;
-
論文中的試驗結果
訓練時使用block_size=7,keep_prob=0.9,測試時使用block_size=7,keep_prob=1.0,可以獲得更好的效果。具體使用需要根據具體情況設定!
-
CIoU Loss 介紹
參考鏈接
https://zhuanlan.zhihu.com/p/104236411
IoU 損失
IoU損失由曠視於2016年ACM提出。
IoU即兩個對象bbox的交並比(交/並)!
- IoU值如果為1,當然是我們最希望的情況,它表示着預測和實際的錨框一模一樣!不為1時就存在bbox的損失。
- IoU損失的不足之處:
- 表示一個框的方式是有很多種的,但是無論哪一種都是用四個值去標識,而IoU相同的錨框,bbox的形狀可以是多種多樣的,物體的形狀信息會被忽略而損失。
- bbox是通過回歸的方式獲取的,由統計學的基本假設知,我們在使用這種簡單結構的時候已經假設這些值之間兩兩相互獨立!而實際上這些值(如[start_x, start_y, w, h])是有較強的相關性的。
- 對L2 loss、L1 loss的改進:具有尺度不變性。當bbox的歐式距離損失一樣時,IoU損失差異很大。即距離一樣的框,IoU值可能不一樣!
IoU損失的公式
也有很多模型直接使用1-IoU作為IoU損失。
GIoU Loss
GIoU Loss在2019年的CVPR由斯坦福學者提出。
IoU損失的缺點
- 當預測框與真實框不相交時,IoU損失為1,且損失函數不可導,此時不能反映兩者之間的距離,所以無法優化兩者不相交的情況;
- 當預測框與真實框大小一定,且相交的值確定,那么IoU值就知道了,但是我們不知道他們是怎么相交的!
GIoU的公式
-
定義一個外接矩形C,它是包含預測框與真實框的下確界;
-
GIoU的值為:
\[GIoU=IoU-\frac{\left | C-\left ( pre\_bbox\cup ground\_truth \right ) \right |}{\left | C \right |} \]
GIoU的性質
- 同IoU一樣我們可以將其看作一種距離的度量方式;
- GIoU具有尺度不變性;
- 對於任意的預測框A,真實框B,有:\(GIoU\left ( A,B \right )\leqslant IoU\left ( A,B \right )\)且\(0\leqslant IoU\left ( A,B \right )\leqslant 1\),因此\(-1\leqslant GIoU\left ( A,B \right )\leqslant 1\),當A趨向於B時,GIoU與IoU一樣等於1;當兩者不相交時,GIoU等於-1。
DIoU Loss和CIoU Loss
引用鏈接:https://zhuanlan.zhihu.com/p/104236411
當真實框完全包含預測框時,IoU與GIoU是一樣的,此時GIoU退化為IoU。作者加入框的中心點歸一化距離,優化了此類問題!
- 第一:直接最小化預測框與目標框之間的歸一化距離是否可行,以達到更快的收斂速度。
- 第二:如何使回歸在與目標框有重疊甚至包含時更准確、更快。
好的目標框回歸損失應該考慮三個重要的幾何因素:重疊面積,中心點距離,長寬比。基於問題一,作者提出了DIoU Loss,相對於GIoU Loss收斂速度更快,該Loss考慮了重疊面積和中心點距離,但沒有考慮到長寬比;針對問題二,作者提出了CIoU Loss,其收斂的精度更高,以上三個因素都考慮到了。
DIoU Loss的公式
-
\(L_{DIoU}=1-IoU+\frac{\rho ^{2}\left ( b,b^{gt} \right )}{c^{2}}\)
其中\(\rho\)表示歐式距離,\(b,b^{gt}\)分別表示預測框、真實框的中心,\(c\)表示GIoU 中的外接矩形C的對角線長度。
CIoU Loss的公式
- CIoU在DIoU的懲罰項的基礎上加了一個影響因子$ \alpha \upsilon$,它考慮了預測框長寬比與真實框的長寬比;
- 參數\(\upsilon\)刻畫了兩者長寬比的一致性;
- \(\upsilon =\frac{4}{\pi ^{2}}\left ( arctan\frac{\omega ^{gt}}{h^{gt}} -arctan\frac{\omega }{h} \right )^{2}\);
- 參數$ \alpha\(是對參數\)\upsilon\(做權衡的權值,其中:\)\alpha =\frac{\upsilon }{\left ( 1-IoU \right )+\upsilon } $。
論文:https://arxiv.org/pdf/1911.08287.pdf
代碼:https://github.com/Zzh-tju/DIoU-darknet
https://github.com/Zzh-tju/CIoU
Bag-of-Freebies
參考鏈接:https://blog.csdn.net/stezio/article/details/87816785
Bag-of-Specials
Mixup、Cutout、CutMix數據增強
博客鏈接:https://blog.csdn.net/weixin_38715903/article/details/103999227
余弦退火
博客鏈接:https://blog.csdn.net/CarryLvan/article/details/104394960