Yolov4筆記:Optimal Speed and Accuracy of Object Detection

Patty Wu
11 min readOct 9, 2020

--

在Yolo的作者Joseph Redmon宣告退出CV屆後,由Alexey Bochkovskiy和另外兩位中研院的廖弘源和王建堯接手,提出了yolov4。

跟yolov3相比,在AP和FPS的表現上提升了10%和12%,非常厲害。

這篇文章主要是紀錄yolov4一些創新點的筆記。

架構

整體來說,yolov4架構與Yolov3差不多,不過多加了很多tricks在其中,以下將分4個部分介紹yolov4的創新點:

  1. Input:Moasic、CmBN、SAT自對抗網路
  2. Backbone:CSP、Mish、Dropblock
  3. Neck:SPP、FPN+PAN
  4. Prediction:DIoU NMS、CIoU Loss
yolov4架構圖,來源:https://blog.csdn.net/l7H9JA4/article/details/106416463
  • Input

Yolov4在input方面的創新大概有三項:1) Moasic Data augmentation、2) CmBN、3) SAT自對抗網路

Moasic

Data augmentation的一種手法,隨機將4張圖裁切拼貼在一起。這樣模型能學習去偵測在不同情境(背景)下的相同物體,而且batch normalization在計算時會用到4張圖的訊息,這樣mini-batch size就不用設太大,對單張GPU訓練有一定的幫助。

CmBN

Cross mini-Batch Normalization,BN在batch size很小時,會因為資料量太少發生偏誤,為了改進這點,CBN(Cross-iteration Batch Normalization)使用了當下iteration和前k-1個iterations的樣本參數(平均數和標準差)做標準化,k可以稱為window size。CmBN是差不多的概念,只是每個batch獨立算,不能參考跨batch的參數,例如第i個batch的第1個mini-batch不能參考第i-1個batch的最後幾個mini-batch的參數。

SAT

Self-Adversarial Training,自對抗網路,也是一種data augmentation的方法,使用對抗網路的概念來強迫模型學到更不一樣的特徵,分成2個stage:

  1. forward:將圖片輸入網路,網路會根據weights得到特徵,並修改原圖(扣掉那些特徵)。例:如果模型已學會透過人眼來偵測人,那將原圖輸入網路後,會得到人眼的特徵,再從原圖扣掉人眼特徵,產生一張沒有眼睛的人的圖像。
  2. backward:網路會用新的圖再次進行訓練,強迫模型學到不一樣的特徵。例:模型會被強迫學習用人眼以外的特徵來偵測人。
  • Backbone

Backbone的功能在於萃取有用的latent feature,創新點:1) CSPDarknet53、2) Mish activation function、3) Dropblock

CSPDarknet53

CSP全名為Cross Stage Partial Connection,CSPNet的主要功能是通過分割梯度流,實現更豐富的梯度組合,同時降低運算量,以及提升準確率。CSPNet的原論文是將CSP的結構套用在DenseNet上,看下圖(b),CSP將網路的訊息切成兩個部分,只有一半進入Dense Block的操作,最後再將兩個分流concat在一起,透過不讓part 1進入Dense Block,來節省運算量,而且也讓梯度組合更加豐富。

用下面兩張DenseNet的圖應該可以更好的理解,下圖左是一般的DenseNet操作,base layer的資訊直接進入Transition層。下圖右是CSP的結構,將base layer切成兩部分,只有一部分進入了Dense Block操作,另一部分在最後時再concat回來。

來看效能的提升,在AP上的表現有蠻顯著的提升,且同時降低運算以及memory的成本。

我們來看看它在yolov4中的應用,首先先看小的模塊,CBL結構如下,就是一般的Conv+BN+Leaky ReLU。

然後2個CBL模組可以構成Res Unit模塊:

而CSPX模塊是由3個CBL再加上X個Res Unit模塊構成,每個CSP模塊卷積都是3*3的下採樣,最後將這些特徵concat在一起。

yolov4使總共使用了5塊CSP模塊,所以維度變化:608->304->152->76->38->19,input 608*608的圖片,最終變成19*19的特徵圖。注意這裡CBL用的是Leaky ReLU,CBM用的是Mish,在Backbone的部分,2種激活函數都有用到。

總結CSP的優點就是,降低運算與內存成本的同時,還可以提升準確度。

Mish activation function

Mish激活函數是受Swish啟發,不過在很多項測試中,都顯示它比Swish, ReLU, Sigmoid…等函數表現更好。它的式子與圖形如下:

Mish函數的範圍是[-0.31, ∞),整理優點如下:

  1. 無上界,這點對激活函數來說很重要,因為能有效解決梯度消失的問題,並且加快收斂速度,訓練變得更快。
  2. 有下界,在≤0時給予很接近0的負權重,有助於降低over-fitting的發生。
  3. ReLU在<=0時神經元就死了,沒辦法再復活。但Mish函數在≤0時非單調的特性,保持了神經元很微小的負權重,此點在更深的網路中讓Mish表現得比ReLU和Swish好。
  4. 平滑特性,且它的1階、2階導數也具有平滑特性,讓訊息傳播的更好,可以參考下圖,具有平滑性的Mish所產生出來的output更加平滑,不像ReLU的很尖銳粗糙。

不過Mish還是有缺點的,它的計算成比ReLU...等其他函數還要高,不過考量到效果,Mish還是更好的選擇。

Dropblock

與Dropout功能相似,是用來防止over-fitting的一種手法。一般dropout使用在全連接層效果很好,但是用在卷積結構中,就算隨機捨棄一些訊息,但是一般卷積層的操作為:Conv+Activation+Pool,在池化時會借用到鄰近區域的訊息,導致卷積結構對於dropout不敏感。

因此該算一次drop掉整塊區域,於是作者將cutout手法運用在feature map上,隨機丟掉某塊訊息。下圖是cutout在input上的運用,是data augmentation的一種方式。

Cutout

下圖(c)是Dropblock,可以看出它是把Dropout (b)改成是丟棄一整塊區域的訊息,以此防止over-fitting。而且Dropblock捨棄區域的頻率是隨著訓練次數而跟著增加的,慢慢增加訓練難度,也強迫網路不能只學到單一的特徵。

  • Neck

Neck的功能在於特徵融合,主要是2點創新:1) SPP、2) FPN + PAN

SPP

SPP全名Spatial Pyramid Pooling,其實在yolov3中就有提供SPP模塊可以選用,它透過了各種不同大小的池化,來實現局部、全域特徵級別的特徵融合,豐富的feature map提高了mAP表現。

SPP 結構

FPN+PAN

FPN是yolov3本來就有的結構,以淺藍底表示,紫線是上採樣,從上到下傳達語意特徵。在yolov4加入了PAN的結構,以淺綠底表示,橘線是下採樣,由下到上傳遞精準的定位特徵,兩種特徵融合相輔相成。特別的是yolov4中使用了黃色底的3個feature map,使用FPN的76x76的feature map還有PAN產生出來的38x38和19x19。

FPN與PAN

另外,yolov4修改了PAN的結構,變成了concat:

PAN結構
  • Prediction

Yolov4使用了CIOU_Loss來處理迴歸的部分,然後使用DIoU NMS來取代傳統的NMS。

DIoU Loss全名是Distance IoU Loss,它考量了2個因素:

1) 重疊面積、2) bbox中心點距離

公式如下,紅框內的是比IoU多考慮的懲罰項:

一般的IoU只考量到了重疊面積,在紅框的式子考量到了prediction與gt的bbox的中心點距離,並且以兩bbox的對角線做標準化的動作,以免大框產生較大的loss,小框產生較小的loss。下面是圖示這個式子。

Yolov4用它來改良NMS,使得鄰近的物體也能夠被偵測到而不會被NMS消滅。如下,可以看到被遮擋的摩托車,也被偵測出來了。

來源:https://blog.csdn.net/l7H9JA4/article/details/106416463

CIoU Loss全名是Complete IoU Loss,它考量了3個因素:

1) 重疊面積、2) bbox中心點距離、3)長寬比

比DIoU Loss多考慮了長寬比,紅框內的是比IoU多考量到的懲罰項部分:

多考量長寬比的部分如下:

alpha是控制衡量長寬比的權重,與重疊面積有關,重疊越多,對長寬比的重越高,反之亦然。

v是長寬比的懲罰,可以看到它衡量gt與prediction bbox的長寬比差異,差越多,loss越大。

--

--

No responses yet