yoloV4文章精讀

yolov4在Tesla V100硬件和coco數據集下達到43.5%AP/65FPS的成績
v4這篇文章更像是很多種trick的一種集成,實驗做着做着就變成了SOTA了。在研究v4的文章過程中,最有趣的就是可以看到一個小trick如何被驗證有效,然後被修改,最後被集成到算法中。

這篇論文學習了很久,把裏面出現的reference儘量地去搞清楚了,所有的pdf都已經下載到本地了,可以公衆號回覆“20”,打包下載
在這裏插入圖片描述

1、BackBone

爲了提升精度,主幹網絡經常被設計的很深,一方面增強模型的表達力,另一方面增大了感受野,然後隨着網絡變深,訓練難度也會隨之增大,所以會在網絡中加入一些 skip-connection。YOLOV4的主幹網絡採用的是CSPDarknet53,這裏來簡單梳理一下這個bakebone

Dense Block

自從resnet將殘差概念帶入到CNN之後,稠密連接已經被證實對於提升網絡表達能力有效果,可以參考 Densely Connected Convolutional Networks
在這裏插入圖片描述
一個Dense Block可以包含多個卷積層,如上圖所示的Hi。每一個卷積層(Hi)中包括卷積層,BN層,ReLU等。除了輸入層以外,其他的所有Block的輸入都來自於前面所有的Block,所以這樣特徵圖的數量就會變大,這個概念就被稱爲增長率(growth rate)。

在多個Dense Block之間加上卷積和池化之後,就可以組成Dense Net
在這裏插入圖片描述
在這裏插入圖片描述

CSP(Cross-Stage-Partial-connections)

CSPNet將DenseBlock的輸入特徵圖分成了兩個部分,如下圖所示
在這裏插入圖片描述
CSP在Dense Block上的改進,只允許Part2經過Dense Block的主要目的是降低計算量。具體的理論原理參考原文
在這裏插入圖片描述

CSPDarknet53

這個纔是這裏的主角,YOLOv4將CSP方法應用到了DarkNet53中,如下圖所示
在這裏插入圖片描述
Darknet53來自於YOLOv3,v4文章中說,CSPDarknet53雖然在做classification任務的時候精度不如ResNet系列網絡,但是在目標檢測任務中會略勝一籌。然後如果在CSPDarknet53上加上一點其他的trick,classification能力也可以超過ResNet。這裏後面再說。

2、Neck

在上篇文章中就介紹過Neck這個概念,整個網絡架構就是 Input,Backbone,Neck,Prediction。Neck主要是做多尺度特徵融合。
在這裏插入圖片描述
信息流在餵給Prediction之前,會在Neck階段進行element-wise或者concat融合,bottom-up信息流(下采樣)包含更多的空間信息,top-down信息流(上採樣)會包含更多的語義信息。

FPN(Feature Pyramid Network)

早在YOLOV3中,就已經使用了和FPN類似的在多尺度上進行目標檢測的方法
在這裏插入圖片描述
如上圖所示,M5經過2倍上採樣之後和特徵圖與C4輸出經過1*1卷積之後的特徵圖進行融合得到M4,M4再經過3*3卷積用來降低上採樣帶來的僞像(artifacts),最後輸出P4

SPP(spatial pyramid pooling layers)

SPP網絡中,最後面的一個池化層被空間金字塔池化(spatial pyramid pooling layer)所代替,特徵圖在空間上被分爲m*m個維度,m分別是1,2,4,然後分別在每一個維度上做最大值池化(max pool),這樣最後輸出的特徵表示就是定長的,然後將定長特徵輸入給FC層。
在這裏插入圖片描述
傳統的CNN模型由於最後有FC層,所以網絡輸入只能是固定尺寸,但是SPP因爲有空間金字塔池化,所以不受這個限制。當然,類似於FCN這樣的不包含FC層的網絡也是可以任意尺寸輸入的,這種設計對於空間信息的提取非常有用,所以FCN一般用於分割領域。

對於YOLO來說,將2D特徵圖轉換爲定長的1D向量,這種操作不一定是最優的。

YOLO with SPP

分別使用1*1,5*5,9*9,13*13的最大值池化對輸入特徵圖進行處理,然後將來自不同尺寸的特徵圖進行concat操作,SPP如何被加到YOLO中,可以參考下圖。下圖來自於文章《DC-SPP-YOLO: Dense Connection and Spatial Pyramid Pooling Based YOLO for Object Detection》
在這裏插入圖片描述

PAN(Path Aggregation Network)

在傳統的串聯的CNN模型設計中,淺層網絡主要負責提取局部的紋理和圖案信息輸入給深層網絡,從而提取去全局的語義信息。隨着網絡的加深,局部信息就很可能被丟失。
在這裏插入圖片描述
後來隨着深度學習的發展,層與層之間的連接變得複雜,例如DenseNet,每一層都直接與之前的所有層直接相連
在這裏插入圖片描述
例如,FPN,重新設計相鄰層的信息流交互
在這裏插入圖片描述
所以隨着深度學習的發展,網絡結構中層與層之間的信息交互就變成了一個模型設計的關鍵

如下圖所示是PAN網絡目標校測框架圖
在這裏插入圖片描述
在b部分,增加了自底向上的路徑,淺層的局部信息可以容易地傳到深層,紅色箭頭表示FPN的路徑,綠色箭頭表示PAN路徑

FPN做目標檢測的時候,分別是在每一個尺度上進行獨立地檢測,這樣會導致兩個問題,第一個是沒有利用來自其它層的信息,第二是預測出來的信息會有重複冗餘。

PAN使用element-wise max融合了所有層的信息。

SAM(Spatial Attention Module)

注意力機制在模型設計中用的也挺多的。在SAM中,在一個特徵圖上分別進行最大值池化和均值池化,這樣就可以生成兩組特徵圖,兩組特徵圖經過卷積層,再經過非線性層之後就可以產生空間注意力,如下圖所示
在這裏插入圖片描述
在這裏插入圖片描述
在YOLOv4中,修改了SAM,直接使用卷積代替最大值池化和平均池化,進行注意力操作
在這裏插入圖片描述

3、主幹網絡中的 Bag of Freebies(BoF)

目標檢測算法在訓練過程中提升性能,常見的無非就是幾種套路,數據增強,處理類別平衡,損失函數,軟標籤等。這些操作只在訓練階段完成,不會對模型的推理速度產生影響,所以v4的作者稱之爲“Bag of freebies”。

YOLOv4中包含的一些BoF操作有:

  • 數據增強,CutMix和Mosaic
  • 正則化,Dropblock
  • Class label smoothing

CutMix

如下圖所示,CutOut是將圖像中隨機區域進行裁剪,用黑色填充,這樣可以使模型在訓練的時候不要對特定的特徵過多的擬合;CutMix是將一張圖片的一部分裁剪到另外一張圖上,標籤也會隨之進行修改,例如將貓的一部分裁剪到狗的圖片上,標籤可以被標註爲0.6 Dog,0.4 Cat。CutMix來自於這篇文章《CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features》,具體方法可以參考原文。
在這裏插入圖片描述

Mosaic

上面的CutMix只能將兩張圖片進行融合,這裏的Mosaic可以將4個訓練圖片合併爲一個訓練圖像,這樣每一個訓練樣本都具有更大的多樣性,也可以在一定程度上減少對大Batch Size的需求。
在這裏插入圖片描述

不管是普通訓練還是multi-scale training,根據我們的煉丹經驗,coco上訓練出來的模型,小目標的AP永遠是比中目標和大目標低很多,一般都是低了2倍左右。《Stitcher: Feedback-driven Data Provider for Object Detection》這篇文章中的方法貌似有點跟YOLOv4中的mosaic撞車了。在這篇文章中,統計了小目標在數據集中的分佈,發現訓練集中的小目標數量並不少,如下面表格所示,小目標所佔比例41.4%,數量上比其他兩種都還要多;但是小目標的分佈卻是非常不均勻,只有52.3%的訓練圖片中包含有小目標,而其他兩種分佈都是相對均勻的。
在這裏插入圖片描述
然後作者又統計了訓練過程中小目標的loss分佈,超過50%的iteration中小目標所產生的loss都非常低,這也就說明了小目標提供的監督信息是不足的。所以順着這個思路,直接從源頭解決問題,想辦法解決小目標分佈不均勻的問題,也就是這個數據增強的思路。具體細節可以參考stitcher這篇文章。

DropBlock Regularization

2012年,Hinton提出DropOut,主要是解決網絡模型訓練過程中過擬合的問題,以一定概率失活一些全連接層的神經元連接,使模型不會太依賴與某些局部特徵,提高泛化性。但是這種方法不適用與卷積層,在圖像中,相鄰位置像素都具有強相關性,如果丟掉一些像素,它的空間信息還是可以被檢測到,如下圖中間所示。DropBlock就是在卷積層上實現類似功能的正則化
在這裏插入圖片描述
丟掉單獨的像素反而不好操作,在文章中實現的直接丟掉block_size*block_size的塊。DropBlock和DropOut一樣只在訓練過程中使用,下圖顯示的就是DropBlock的僞代碼
在這裏插入圖片描述

Class Label Smoothing

在訓練深度學習分類模型的時候經常會碰到兩個問題,第一個是過擬合(overfitting),第二個是過度自信(overconfidence)。過擬合在上面已經討論過,通常處理這種問題的套路是提前停止,dropout,正則化等操作;標籤平滑(Label Smoothing)就是處理過度自信的一種方法,不過只用於具有softmax的模型訓練。在訓練過程中,預測值爲100%的時候意味着模型是記住了訓練樣本的數據,而不是從訓練數據中學習知識,所以適當的將label平滑之後,有助於分類的學習,提高泛化性。具體可以參考這篇文章 Label Smoothing

4、主幹網絡中的Bag of specials(BoS)

“Bag of special”就是在提升精度的同時會帶來一些推理負擔的技巧。常見的有增大感受野、注意力機制、特徵融合、NMS等

YOLOv4中包含的BoS技巧有:

  • Mish activation
  • CSP(Cross-stage partial connections)
  • MiWRC(Multi-input weighted residual connections)

Mish activation

從激活函數的發展歷史來看,基本上都是通過實驗來確定的,在NAS中也經常看到搜索最適合某個數據集的激活函數,例如谷歌大腦在2017年提出的Swish也是通過實驗證明比ReLU系列的表現要好
在這裏插入圖片描述
Mish 是一種比較新的激活函數,跟ReLU和Swish有一點相似,但是效果在大多數數據集上都優於後者,函數圖像如下圖所示
在這裏插入圖片描述
函數表達式如下圖
在這裏插入圖片描述
使用Mish之後,YOLOv4的性能提升明顯

MiWRC(Multi-input weighted residual connection)

多輸入加權殘差連接這個方法來自於EfficientDet,也就是EfficientDet中說的帶權重特徵融合(Weighted Feature Fusion)
在這裏插入圖片描述
Wi是一個可訓練參數,具體原理參考EfficientDet

5、檢測器中的BoF(Bag of Freebies)

  • CIoU-loss
  • CmBN
  • Self-Adversarial Training

CIoU-loss

談到目標檢測,肯定少不了IoU,也就是交併比,在anchor-based的方法中,不僅可以用來確定正負樣本,還可以用來評價預測box和標註box的距離,所以Iou-loss應用在目標檢測中比較常見。

但是IoU作爲損失函數會有一個先天性的不足。兩個box的IoU相等的時候,會涵蓋很多種情況,如下圖所示
在這裏插入圖片描述
這三種情況下,其IoU是相等的,但是他們分別在訓練的時候迴歸效果肯定是不一樣的,左邊迴歸效果最好,右邊最差。當然還有一種情況,當兩個box沒有重合部分的時候,其IoU都是0,其loss就是一樣的,這樣顯然是不科學的。

後來CVPR2019中提出了GIoU,解決了IoU作爲損失函數的痛點,不僅關注重疊區域,還關注其他的非重合區域,再後來DIoU被提出來,將目標與anchor之間的距離,重疊率以及尺度全都都考慮進去了,解決了GIoU訓練過程中不容易收斂的問題,DIoU應用到yoloV3上,直接漲點3個。
在這裏插入圖片描述
DIoU引入一個新的目標用來降低兩個box的中心距離,關於IoULoss可以參考[知乎這個回答]([https://www.zhihu.com/search?type=content&q=iou%20loss](https://www.zhihu.com/search?type=content&q=iou loss))

在yoloV4中使用的loss是CIoU,進一步增加預測box和標註box之間的重疊區域,然後最小化他們之間的中心點距離,保持box的長寬比一致
在這裏插入圖片描述

CmBN

原始的BN操作是針對每一個batch中的數據進行計算均值和方差,但是當batch size設置的很小的時候,預測值中就會存在很多噪聲。在CBN方法中,通過迭代一定的次數,然後估算出K次迭代中的統計信息
在這裏插入圖片描述
CmBN在CBN基礎上稍微修改了一下下,只在單個batch中的小mini-batch之間手機統計信息

**SAT(Self-Adversarial Training) **

自監督訓練其實也是屬於一種數據增強的方法。我們傳統意義上進行的模型訓練,首先訓練數據前向傳播,然後計算loss,再將loss反傳回來,最後更新網絡層權重。但是在自監督訓練中,流程就不是這樣的了,首先訓練數據進行前向傳,計算loss,然後網絡會將輸入訓練圖片進行修改,使得loss變得更大,也就是針對當前模型進行攻擊。然後使用新圖像再進行訓練,這樣可以理解爲有針對性的數據增強。

遺傳算法選擇超參數

遺傳算法是一種比較經典的算法了,其大致原理就是隨着迭代次數增多,每一次迭代都會出最好的一批參數,然後人爲地使其“基因突變”,也就是修改超參數,然後再繼續迭代,最終選出一組最好的參數。

6、檢測器中的Bag of Specials

DIou-NMS

在這裏插入圖片描述
DIoU前面說過,裏面包含了兩個box之間中心點之間的距離,在最後做NMS的時候,也可以將box之間的中心點距離加入到計算中。實驗結果顯示對於遮擋情況魯棒性非常強

7、最後

YOLOv4中集成了非常非常多的技巧,每一個技巧都是通過自己的實驗來確定最終是否能夠work的,可見作者在object detection方面積累之深,內功之深厚,對還要有錢!沒錢買卡,這些實驗做到猴年馬月都出不了結果

人類的大腦,是想象不出自己沒有見過的東西的,而任何所謂的“創新”,都是大腦中已有知識或影像的排列重組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章