1. 程式人生 > 實用技巧 >yolo-v4:Optimal Speed and Accuracy of Object Detection解析

yolo-v4:Optimal Speed and Accuracy of Object Detection解析

YOLOv4: Optimal Speed and Accuracy of Object Detection

摘要

深度學習發展至今,依據產生了許多優秀的技術。其中一些技術對特定的資料集或小資料集有著良好的表現;而有一些技術擁有著普遍的適用性,在各個領域、各種架構都有著非常好的效能提升表現,如: batch-normalizationresidual-connections。yolo的作者列舉了如下的技術(主要是本文使用的):

  • WRC (Weighted-Residual-Connections) 加權殘差連線

  • CSPCross-Stage-Partial-connections

    )跨階段部分連線

  • CmBNCross mini-Batch Normalization)交叉小批量標準化

  • SATSelf-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-v4可能是原作者的最後一次更新(廣大的粉絲當然希望大神不要就此訣別這個領域),它為我們帶來了高精度的實時性架構。你只需要一張傳統的GPU(如:2080TI)就開源訓練屬於你自己的模型。

本文中作者的主要工作是提升目標檢測器的速度與計算的優化,而不是降低計算量理論指標(BFLOP)!

這篇論文的主要貢獻為:

  • 開發了一個高效和強大的目標檢測模型。它使每個人都可以使用1080ti或2080tiGPU訓練一個超快速和準確的目標探測器。

  • 在目標檢測訓練過程中,作者驗證了Bag-of-FreebiesBag-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;

目標檢測模型

目前,目標檢測比較流行兩部分組合的網路架構,即backbone + head。一般情況下,我們需要一個backbone結構,也即我們的骨幹網路,預測分類和目標邊框迴歸(在GPU上面燥的情況):常見的有VGG、ResNet、ResNeXt、DenseNet;檢測目標在CPU上,常見的有SqueezeNet、MobileNet、ShufflfleNet。head部分一般分為兩部分: one-stage object detector and two-stage object detectortwo-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等人引入了知識蒸餾的概念進行設計標籤優化網路。

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”一樣多

這裡概率的函式表示式為:

\[\frac{1-keep\_prob }{block\_size^{2}}\frac{feat\_size^{2}}{\left ( feat\_size- block\_size +1\right )^{2}} \]

  • 傳統的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損失的公式

\[IoU\_Loss=-ln\frac{Intersection\left ( pre\_bbox, ground\_truth \right )}{Union\left ( pre\_bbox, ground\_truth \right )} \]

也有很多模型直接使用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的公式

\[L_{DIoU}=1-IoU+\frac{\rho ^{2}\left ( b,b^{gt} \right )}{c^{2}} + \alpha \upsilon \]

  • 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