YOLO(You Only Look Once!)系列是非常經典的目標檢測算法,可以完成多尺度、多目標的檢測任務,並且相比於兩階段的檢測方法更加的高效。因此,本篇文章對新開源的YOLOv5目標檢測模型進行詳細的介紹。
1 YOLOv5模型結構
YOLOv5模型結構如下圖所示。
從上圖可以看出,YOLOv5的模型結構可以分為四個部分:輸入端、Backbone、Neck和Prediction。
各部分的關鍵元素或者功能總結如下:
- 輸入端:Mosaic數據增強、自適應錨框計算、自適應圖片縮放;
- Backbone:Focus結構、CBL結構、CSP結構、SPP結構;
- Neck:FPN+PAN結構;
- Prediction:CIOU_Loss
此外,YOLOv5模型根據網絡寬度和深度的區別,分為依次遞增的四個版本,分別是Yolov5s、Yolov5m、Yolov5l、Yolov5x。
接下來,詳細介紹各個部分的結構或者功能。
2 輸入端
2.1 Mosaic數據增強
Mosaic數據增強采用了4張圖片,隨機縮放、隨機裁剪、隨機排布的方式進行拼接,主要有以下優點:
- 豐富數據集:隨機使用4張圖片,隨機縮放,再隨機分布進行拼接,大大豐富了檢測數據集,特別是隨機縮放增加了很多小目標,讓網絡的魯棒性更好。
- 減少GPU:可能會有人說,隨機縮放,普通的數據增強也可以做,但作者考慮到很多人可能只有一個GPU,因此Mosaic增強訓練時,可以直接計算4張圖片的數據,使得Mini-batch大小並不需要很大,一個GPU就可以達到比較好的效果。
2.2 自適應錨框計算
在Yolo算法中,針對不同的數據集,都會有初始設定長寬的錨框。在網絡訓練中,網絡在初始錨框的基礎上輸出預測框,進而和真實框groundtruth進行比對,計算兩者差距,再反向更新,迭代網絡參數。
在Yolov3、Yolov4中,訓練不同的數據集時,計算初始錨框的值是通過單獨的程序運行的。但Yolov5中將此功能嵌入到代碼中,每次訓練時,自適應的計算不同訓練集中的最佳錨框值。當然,如果覺得計算的錨框效果不是很好,也可以在代碼中將自動計算錨框功能關閉,關閉參數項如下圖所示。
2.3 自適應圖片縮放
在常用的目標檢測算法中,不同的圖片長寬都不相同,因此常用的方式是將原始圖片統一縮放到一個標准尺寸,再送入檢測網絡中。但Yolov5代碼中對此進行了改進,也是Yolov5推理速度能夠很快的一個不錯的trick。
作者認為,在項目實際使用時,很多圖片的長寬比不同,因此縮放填充后,兩端的黑邊大小都不同,而如果填充的比較多,則存在信息冗余,影響推理速度。因此在Yolov5的代碼中datasets.py的letterbox函數中進行了修改,對原始圖像自適應的添加最少的黑邊。
3 BackBone
3.1 Focus結構
Focus結構的操作示意如下圖所示。
Focus是YOLOv5中新加入的結構,以往版本的模型結構中並沒有Focus。
比如右圖的切片示意圖,443的圖像切片后變成2212的特征圖。以Yolov5s的結構為例,原始6086083的圖像輸入Focus結構,采用切片操作,先變成30430412的特征圖,再經過一次32個卷積核的卷積操作,最終變成30430432的特征圖。所以,Focus結構的操作相當於是下采樣的過程,可以減小計算量,但是由於下采樣的方式比較特別,可以盡可能的保留原始圖片的信息,減少信息丟失。
需要注意的是:Yolov5s的Focus結構最后使用了32個卷積核,而其他三種結構,使用的數量有所增加。
3.2 CBL結構
在YOLOv3中就已經使用了該組件,由Conv+BN(Batch Normalization)+Leaky_relu組成
3.3 CSP結構
Yolov4網絡結構中,借鑒了CSPNet的設計思路,在主干網絡中設計了CSP結構。Yolov5與Yolov4不同點在於,Yolov5中設計了兩種CSP結構,以Yolov5s網絡為例,CSP1_X結構應用於Backbone主干網絡,另一種CSP2_X結構則應用於Neck中,結構圖如下圖所示。
每個CSP模塊前面的卷積核的大小都是3*3,stride=2,因此可以起到下采樣的作用。
CSPNet全稱是Cross Stage Paritial Network,主要從網絡結構設計的角度解決推理中從計算量很大的問題。CSPNet的作者認為推理計算過高的問題是由於網絡優化中的梯度信息重復導致的。因此采用CSP模塊先將基礎層的特征映射划分為兩部分,然后通過跨階段層次結構將它們合並,在減少了計算量的同時可以保證准確率。
因此CSP結構主要有三個方面的優點:
- 增強CNN的學習能力,使得在輕量化的同時保持准確性。
- 降低計算瓶頸
- 降低內存成本
關於CSPNet的詳細內容可以參考https://zhuanlan.zhihu.com/p/116611721以及CSPNet論文https://arxiv.org/pdf/1911.11929.pdf
3.4 SPP結構
SPP(Spatial Pyramid Pooling)模塊,其實在Yolov3中已經存在了,結構及操作如下圖所示。
在SPP模塊中,使用k={11,55,99,1313}的最大池化的方式,再將不同尺度的特征圖進行Concat操作。
研究發現,采用SPP模塊的方式,比單純的使用k*k最大池化的方式,更有效的增加主干特征的接收范圍,顯著的分離了最重要的上下文特征。
4 Neck
4.1 FPN+PAN結構
Yolov5現在的Neck和Yolov4中一樣,都采用FPN+PAN的結構,如下圖所示。
FPN(Feature Pyramid Network)層自頂向下傳達強語義特征,而PAN(Pyramid Attention Network)則自底向上傳達強定位特征,兩兩聯手,從不同的主干層對不同的檢測層進行參數聚合,使得目標的位置信息和類別信息都最大程度的進行了保留。
Yolov4的Neck結構中,采用的都是普通的卷積操作。而Yolov5的Neck結構中,采用借鑒CSPnet設計的CSP2結構,加強網絡特征融合的能力。
FPN+PAN借鑒的是18年CVPR的PANet,當時主要應用於圖像分割領域。
5 Prediction
5.1 Bounding Box損失函數
Yolov5中采用其中的CIOU_Loss做Bounding box的損失函數,但是本節將詳細介紹IOU_Loss系列損失函數的變遷。
- IOU_Loss
IOU_Loss的計算如下圖所示。
從圖中可以看到IOU的loss其實很簡單,主要是交集/並集,但其實也存在如下圖所示的兩個問題。
問題1:即狀態1的情況,當預測框和目標框不相交時,IOU=0,無法反應兩個框距離的遠近,此時損失函數不可導,IOU_Loss無法優化兩個框不相交的情況。
問題2:即狀態2和狀態3的情況,當兩個預測框大小相同,兩個IOU也相同,IOU_Loss無法區分兩者相交情況的不同。
因此,2019年出現了改進方法——GIOU_Loss。
-
GIOU_Loss
GIOU_Loss的計算如下圖所示。
從圖中可以看出右圖GIOU_Loss中,增加了相交尺度的衡量方式,緩解了單純IOU_Loss時的尷尬,但是還存在一種不足:
問題:狀態1、2、3都是預測框在目標框內部且預測框大小一致的情況,這時預測框和目標框的差集都是相同的,因此這三種狀態的GIOU值也都是相同的,這時GIOU退化成了IOU,無法區分相對位置關系。
基於這個問題,2020年的AAAI又提出了DIOU_Loss。 -
DIOU_Loss
好的目標框回歸函數應該考慮三個重要幾何因素:重疊面積、中心點距離,長寬比。
針對IOU和GIOU存在的問題,需要從兩個方面進行考慮
一:如何最小化預測框和目標框之間的歸一化距離?
二:如何在預測框和目標框重疊時,回歸的更准確?
針對第一個問題,提出了DIOU_Loss(Distance_IOU_Loss),如下圖所示。
DIOU_Loss考慮了重疊面積和中心點距離,當目標框包裹預測框的時候,直接度量2個框的距離,因此DIOU_Loss收斂的更快。
但是DIOU_Loss並沒有考慮到長寬比,因此會引出如下圖所示的問題。
如上圖所示的三種情況,目標框包裹預測框,本來DIOU_Loss可以起作用,但預測框的中心點的位置都是一樣的,因此按照DIOU_Loss的計算公式,三者的值都是相同,導致DIOU_Loss無法起作用。
針對這個問題,又提出了CIOU_Loss,進一步考慮長寬比。
- CIOU_Loss
CIOU_Loss在DIOU_Loss的基礎上增加了一個影響因子,將預測框和目標框的長寬比都考慮了進去,公式如下圖所示。
其中v是衡量長寬比一致性的參數,可以定義為:
這樣CIOU_Loss就將目標框回歸函數應該考慮三個重要幾何因素:重疊面積、中心點距離,長寬比全都考慮進去了。
再來綜合的看下各個Loss函數的不同點:
IOU_Loss:主要考慮檢測框和目標框重疊面積。
GIOU_Loss:在IOU的基礎上,解決邊界框不重合時的問題。
DIOU_Loss:在IOU和GIOU的基礎上,考慮邊界框中心點距離的信息。
CIOU_Loss:在DIOU的基礎上,考慮邊界框寬高比的尺度信息。
5.2 nms非極大值抑制
在目標檢測的后處理過程中,針對很多目標框的篩選,通常需要nms操作。
因為CIOU_Loss中包含影響因子v,涉及groudtruth的信息,而測試推理時,是沒有groundtruth的。所以Yolov4在DIOU_Loss的基礎上采用DIOU_nms的方式,而Yolov5中采用加權nms的方式。
當然,我們也可以在YOLOv5中采用DIOU_nms,說不定對於遮擋重疊目標的檢測會有一些改進。
6 YOLOv5的不同網絡結構
Yolov5代碼中的四種網絡都是以yaml的形式來呈現,而且四個文件的內容基本上都是一樣的,只有最上方的depth_multiple和width_multiple兩個參數不同。
6.1 Yolov5四種網絡的深度
四種網絡的深度差別如下圖所示。
a.以yolov5s為例,第一個CSP1中,使用了1個殘差組件,因此是CSP1_1。而在Yolov5m中,則增加了網絡的深度,在第一個CSP1中,使用了2個殘差組件,因此是CSP1_2。而Yolov5l中,同樣的位置,則使用了3個殘差組件,Yolov5x中,使用了4個殘差組件。
其余的第二個CSP1和第三個CSP1也是同樣的原理。
b.在第二種CSP2結構中也是同樣的方式,以第一個CSP2結構為例,Yolov5s組件中使用了2×X=2×1=2個卷積,因為X=1,所以使用了1組卷積,因此是CSP2_1。而Yolov5m中使用了2組,Yolov5l中使用了3組,Yolov5x中使用了4組。
其他的四個CSP2結構,也是同理。
Yolov5中,網絡的不斷加深,也在不斷增加網絡特征提取和特征融合的能力。
6.2 Yolov5四種網絡的寬度
四種網絡的寬度差別如下圖所示。
如上圖表格中所示,四種yolov5結構在不同階段的卷積核的數量都是不一樣的,因此也直接影響卷積后特征圖的第三維度,即厚度,這里表示為網絡的寬度。
a.以Yolov5s結構為例,第一個Focus結構中,最后卷積操作時,卷積核的數量是32個,因此經過Focus結構,特征圖的大小變成30430432。而yolov5m的Focus結構中的卷積操作使用了48個卷積核,因此Focus結構后的特征圖變成30430448。yolov5l,yolov5x也是同樣的原理。
b. 第二個卷積操作時,yolov5s使用了64個卷積核,因此得到的特征圖是15215264。而yolov5m使用96個特征圖,因此得到的特征圖是15215296。yolov5l,yolov5x也是同理。
Yolov5中,卷積核的數量越多,特征圖的厚度,即寬度越寬,網絡提取特征的學習能力也越強。
========================================
本文主要參考了以下兩篇文章:
https://zhuanlan.zhihu.com/p/172121380
https://zhuanlan.zhihu.com/p/143747206