YOLOv4結構以及用到的tricks與創新總結
?本文參考了幾位大佬的文章,然后作了下總結,(文中用到的圖大部分來源于他們的文章,還有各演算法對應的論文)文末參考鏈接附有這幾位大佬的博客地址,
?先放上YOLOv3和YOLOv4的結構圖,好有個大致的思路:
YOLOv3:

YOLOv4:

圖中的說明:
1. Concat:張量拼接,會擴充兩個張量的維度,例如2626256和2626512兩個張量拼接,結果是2626768,Concat和cfg檔案中的route功能一樣,
2. add:張量相加,張量直接相加,不會擴充維度,例如104104128和104104128相加,結果還是104104128,add和cfg檔案中的shortcut功能一樣,
講YOLOv4之前先來簡單說下YOLOv3:
YOLOv3改進之處:
1. 多尺度預測:引入FPN,結合了3個尺度進行特征融合,
2. 更好的基礎分類網路Darknet-53,類似ResNet引入了殘差結構,
3. Softmax層被替換成一個1x1的卷積層+logistic激活函式的結構,
分類損失采用binary cross-entropy loss(二分類交叉損失熵)
4. Tiny-YOLOv3主要區別就是:只結合2個尺度進行特征融合,
YOLOv4改進之處:
YOLOv4的特點是集大成者,用到了相當多的tricks,
文章將目前主流的目標檢測器框架進行拆分:input、backbone、neck 和 head.
總結一下YOLOv4框架:
Backbone:CSPDarknet53
Neck:SPP,FPN+PAN
Head:YOLOv3
YOLOv4 = CSPDarknet53 + SPP + (FPN+PAN) + YOLOv3
本文主要從以上4個部分對YoloV4的創新之處進行講解,讓大家一目了然,
(各部分有超鏈接直接點擊即可跳到文中相應位置)
- 輸入端:這里指的創新主要是訓練時對輸入端的改進,主要包括Mosaic資料增強、cmBN、SAT自對抗訓練
- BackBone主干網路:將各種新的方式結合起來,包括:CSPDarknet53、Mish激活函式、Dropblock
- Neck:目標檢測網路在BackBone和最后的輸出層之間往往會插入一些層,比如Yolov4中的SPP模塊、FPN+PAN結構
- 預測端:輸出層的錨框機制和Yolov3相同,主要改進的是訓練時的損失函式CIOU_Loss,以及預測框篩選的nms變為DIOU_nms
Mosaic資料增強(輸入端部分):

?Yolov4中使用的Mosaic是參考2019年底提出的CutMix資料增強的方式,但CutMix只使用了兩張圖片進行拼接,而Mosaic資料增強則采用了4張圖片,隨機縮放、隨機裁剪、隨機排布的方式進行拼接,
使用原因:
?在平時專案訓練時,小目標的AP一般比中目標和大目標低很多,而Coco資料集中也包含大量的小目標,但比較麻煩的是小目標的分布并不均勻,所以為了平衡小、中、大目標的占比數量,
優點:
1.擴充了資料集:隨機使用4張圖片隨機拼接,且通過隨機縮放可以獲得很多小目標,讓網路的魯棒性更好,
2.減少GPU:因為使用Mosaic增強進行訓練時,4張圖片被整合成一張圖片,這樣一來可以使mini-batch大小并不用很大,這樣一個GPU就能達到比較好的效果,
?
CmBN交叉小批量標準化(輸入端部分):

?上圖為BN的處理程序,BN是對當前mini-batch進行歸一化,
?CBN則是對當前及其前3個batch的結果進行歸一化,且利用了泰勒多項式對前3次統計資料進行了補償(因為每個batch都更新了一次引數,所以這4個batch的使用的是不同網路引數,所以這里才做補償),
?CmBN是CBN的改進,其區別在于其區別在于權重更新時間點不同,CBN是針對batch來說的,因為同一個batch內權重引數一樣,因此計算不需要進行補償,而CmBN是針對mini-batch來說的,其僅僅收集單個batch中的mini-batch之間的統計資料,(這里不太確定,應該是這樣吧?)

SAT,Self-adversarial-training自對抗訓練(輸入端部分):
自對抗訓練(SAT)也是一種新的資料增強方法,它包括兩步,
1.利用原始影像生成對抗樣本,
2.通過在原有的模型訓練程序中注入對抗樣本,從而提升模型對于微小擾動的魯棒性,
Mish激活函式(backbone主干網路部分):
Mish:x * tanh(ln(1+e^x))

?ReLU和Mish的對比,Mish的梯度更平滑,相比之下,Mish能更好地保持準確性,這可能是因為它能更好地傳播資訊,平滑的激活函式允許更好的資訊深入神經網路,從而得到更好的準確性和泛化,(具體的可以看mish論文)
作者只在Backbone中采用了Mish激活函式,網路后面仍然采用Leaky_relu激活函式,
CSPDarknet53(backbone主干網路部分):

?我們先來看看CSP論文里的圖,它是對比了DenseNet和CSPDenseNet,
?Yolov4在Backbone部分的一個主要改進點就是在ResBlock部分采用了CSP,相比較于原始的ResBlock,CSP將輸入的特征圖按照channel進行了切割,只使用原特征圖的一半輸入到殘差網路中進行前向傳播,另一半在最后與殘差網路的輸出結果直接進行按channel拼接(concatenate),這樣做的好處在于:
1、輸入只有一半參與了計算,可以大大減少計算量和記憶體消耗;
2、反向傳播程序中,增加了一條完全獨立的梯度傳播路徑,梯度資訊不存在重復利用,如下圖所示:
?下圖為YOLOv4中的CSP塊:

?可以看到一半經過殘差模塊的路徑,一半直接于殘差網路的輸出結果進行channel拼接cancat,
?下面對比一下darknet53(YOLOv3中采用),CSPdarknet53(YOLOv4中采用):


?說明一下:關于圖中各模塊的解釋看最上面的YOLOv4總結構圖,
?注意:YOLO V4使用時刪去了最后的池化層、全連接層以及Softmax層
?CSPdarknet53優點:
1.增強CNN的學習能力,使得在輕量化的同時保持準確性,
2.優點二:降低計算瓶頸
3.優點三:降低記憶體成本
Dropblock(backbone主干網路部分):
?dropout的主要問題就是隨機drop特征,這一點在FC層是有效的,但在卷積層是無效的效果并不好,因為卷積層的特征是空間相關的,當特征相關時,即使有dropout,資訊仍能傳送到下一層,導致過擬合,
DropBlock是dropout的一種結構化形式,在DropBlock中,特征在一個block中,例如一個feature map中的連續區域會一起被drop掉(因為連續的區域它們之間的資訊密切相關,洗掉連續的區域可以洗掉某些語意資訊),當DropBlock拋棄掉相關區域的特征時,為了擬合資料網路就不得不往別處尋找新的特征,(具體實作可以看dropblock論文)

SPP模塊(Neck部分):
YOLOv4中的SPP是在backbone和prediction之間的neck部分,neck部分是為了更好地提取融合特征,提升模型性能,

?作者在SPP模塊中,使用k={11,55,99,1313}的最大池化的方式,再將不同尺度的特征圖進行Concat操作(即channels堆疊),
?注意:這里最大池化采用padding操作,移動的步長為1,比如13×13的輸入特征圖,使用5×5大小的池化核池化,padding=2,因此池化后的特征圖仍然是13×13大小,
采用SPP模塊的方式,比單純的使用k*k最大池化的方式,更有效的增加主干特征的接收范圍,顯著的分離了最重要的背景關系特征,
FPN+PAN模塊(Neck部分):
?FPN其實就是不同尺度特征融合預測,PAN是借鑒影像分割領域的PANet的創新點,Alexey將其拆分應用到Yolov4中,進一步提高特征提取的能力,,
?FPN結構我在我的另一篇博客有講:FPN (feature pyramid network)特征金字塔網路,
?這里直接根據YOLOv4中的FPN分析,再來看看YOLOv4的圖:

?可以看到經過幾次下采樣(CSPDarknet53中講到,每個CSP模塊前面的卷積核都是33大小,步長為2,相當于下采樣操作),三個紫色箭頭指向的地方,輸出分別是7676、3838、1919,
以及最后的Prediction中用于預測的三個特征圖①1919255、②3838255、③7676255,[注:255表示80類別(1+4+80)×3=255]
?我們將Neck部分用立體圖畫出來,更直觀的看下兩部分之間是如何通過FPN+PAN結構融合的,
?(左:特征正常傳遞路徑,中:FPN,右:引入了PAN(圖中有兩處用了PAN結構))

?FPN層自頂向下傳達強語意特征,而PAN則自底向上傳達強定位特征(因為低級特征圖還沒有被下采樣那么多,所以保留的定位資訊肯定完整一點咯,而高層特征被下采樣多次,更多地體現出的是較為高級抽象的語意資訊咯),兩兩結合實屬牛掰,
?PAN這里還有一點需要注意:
?原本的PANet網路的PAN結構中,兩個特征圖結合是采用shortcut操作(即add相加),而Yolov4中則采用concat(route)操作(即channels堆疊),特征圖融合后的尺寸發生了變化,

CIOU_LOSS+DIOU_NMS(預測端部分):
一般來說,目標檢測的LOSS = 分類LOSS + BBOX回歸LOSS,
一個好的BBOX回歸LOSS應該考慮三個重要幾何因素:重疊面積、中心點距離,長寬比,
近年BBOX回歸LOSS的發展
- Smooth L1 LOSS
- IOU LOSS(2016)
- GIOU LOSS(2019)
- DIOU LOSS(2020)
- CIOU LOSS(2020)
下面分別介紹這幾種IOU LOSS:
1.IOU LOSS(2016)


IOU很簡單就是交并比而已,

但存在如上圖這兩種情況的問題:
問題1:無法優化兩個框不相交的情形,當IOU為0時無法衡量兩框之間的相對距離,此時LOSS不可導,
問題2:如圖狀態2、3他們的IOU值是相同的,但IOU無法區分兩者,
2.GIOU LOSS(2019)


GIOU雖然增加了衡量相交情況的方式,但是還是存在不足,

如圖這種情況,它們的GIOU都是相同的,這時不就跟IOU一個樣,區分不了位置關系,
3.DIOU LOSS(2020)
針對IOU和GIOU的問題,DIOU綜合考慮了重疊面積,中心點距離,當目標框包裹預測框的時候,直接度量2個框的距離,因此DIOU_Loss收斂的更快,


但問題是DIOU沒有考慮到長寬比,如圖:

如圖它們的中心點距離相同,所以DIOU也是相同的,
4.CIOU LOSS(2020)
DIOU LOSS在CIOU LOSS的基礎上增加了一項,將預測框和目標框的長寬比都考慮了進去:


再來綜合的看下各個Loss函式的不同點:
IOU_Loss:主要考慮檢測框和目標框重疊面積,
GIOU_Loss:在IOU的基礎上,解決邊界框不重合時的問題,
DIOU_Loss:在IOU和GIOU的基礎上,考慮邊界框中心點距離的資訊,
CIOU_Loss:在DIOU的基礎上,考慮邊界框寬高比的尺度資訊,
Yolov4中采用了CIOU_Loss的回歸方式,使得預測框回歸的速度和精度更高一些,
DIOU_NMS
為啥用CIOU LOSS 不用CIOU NMS呢?
?因為前面講到的CIOU_loss,是在DIOU_loss的基礎上,添加的影響因子,包含目標框ground truth的資訊,在訓練時用于回歸,但在測驗階段,我們是沒有ground truth的,所以不用CIOU LOSS新增加的項,即直接用DIOU LOSS,
?
?
EndEndEndEndEndEndEndEndEndEndEndEndEndEndEndEndEndEndEndEnd
??
??
?
參考鏈接:
- 深入淺出Yolo系列之Yolov3&Yolov4&Yolov5核心基礎知識完整講解
- Yolov4技巧學習
- Yolov4論文翻譯與決議(二)
有問題歡迎評論區指出,thanks!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260354.html
標籤:AI
上一篇:EM(expectation maximization)演算法的理解和證明
下一篇:K-Means聚類演算法(一)
