轉自:https://zhuanlan.zhihu.com/p/172121380git
大白在以前寫過《深刻淺出Yolo系列之Yolov3&Yolov4核心基礎知識完整講解》github
對Yolov4的相關基礎知識作了比較系統的梳理,但Yolov4後不久,又出現了Yolov5,雖然做者沒有放上和Yolov4的直接測試對比,但在COCO數據集的測試效果仍是很可觀的。web
不少人考慮到Yolov5的創新性不足,對算法是否可以進化,稱得上Yolov5而議論紛紛。算法
但既然稱之爲Yolov5,也有不少很是不錯的地方值得咱們學習。不過由於Yolov5的網絡結構和Yolov3、Yolov4相比,很差可視化,致使不少同窗看Yolov5看的雲裏霧裏。網絡
所以本文,大白主要對Yolov5四種網絡結構的各個細節作一個深刻淺出的分析總結,和你們一些探討學習。架構
版權申明:本文包含圖片,都爲大白使用PPT所繪製的,如需網絡結構高清圖和模型權重,可點擊查看下載。函數
本文目錄
1 Yolov5 四種網絡模型
1.1 Yolov5網絡結構圖
1.2 網絡結構可視化
1.2.1 Yolov5s網絡結構
1.2.2 Yolov5m網絡結構
1.2.3 Yolov5l網絡結構
1.2.4 Yolov5x網絡結構
2 核心基礎內容
2.1 Yolov3&Yolov4網絡結構圖
2.2 Yolov5核心基礎內容
2.2.1 輸入端
2.2.2 Backbone
2.2.3 Neck
2.2.4 輸出端
2.3 Yolov5四種網絡結構的不一樣點
2.3.1 四種結構的參數
2.3.2 Yolov5網絡結構
2.3.3 Yolov5四種網絡的深度
2.3.4 Yolov5四種網絡的寬度
3 Yolov5相關論文及代碼
4 小目標分割檢測
5 後語
1 Yolov5四種網絡模型
Yolov5官方代碼中,給出的目標檢測網絡中一共有4個版本,分別是Yolov5s、Yolov5m、Yolov5l、Yolov5x四個模型。工具
學習一個新的算法,最好在腦海中對算法網絡的總體架構有一個清晰的理解。性能
但比較尷尬的是,Yolov5代碼中給出的網絡文件是yaml格式,和本來Yolov三、Yolov4中的cfg不一樣。學習
所以沒法用netron工具直接可視化的查看網絡結構,形成有的同窗不知道如何去學習這樣的網絡。
好比下載了Yolov5的四個pt格式的權重模型:
大白在《深刻淺出Yolo系列之Yolov3&Yolov4核心基礎完整講解》中講到,可使用netron工具打開網絡模型。
但由於netron對pt格式的文件兼容性並很差,直接使用netron工具打開,會發現,根本沒法顯示所有網絡。
所以能夠採用pt->onnx->netron的折中方式,先使用Yolov5代碼中models/export.py腳本將pt文件轉換爲onnx格式,再用netron工具打開,這樣就能夠看全網絡的總體架構了。
若是有同窗對netron工具還不是很熟悉,這裏仍是放上安裝netron工具的詳解,若是須要安裝,能夠移步大白的另外一篇文章:《網絡可視化工具netron詳細安裝流程》
如需下載Yolov5總體的4個網絡pt文件及onnx文件,也可點擊連接查看下載,便於直觀的學習。
1.1 Yolov5網絡結構圖
安裝好netron工具,就能夠可視化的打開Yolov5的網絡結構。
這裏大白也和以前講解Yolov3&Yolov4一樣的方式,繪製了Yolov5s總體的網絡結構圖,配合netron的可視化網絡結構查看,腦海中的架構會更加清晰。
本文也會以Yolov5s的網絡結構爲主線,講解與其餘三個模型(Yolov5m、Yolov5l、Yolov5x)的不一樣點,讓你們對於Yolov5有一個深刻淺出的瞭解。
1.2 網絡結構可視化
將四種模型pt文件的轉換成對應的onnx文件後,便可使用netron工具查看。
可是,有些同窗可能不方便,使用腳本轉換查看。
所以,大白也上傳了每一個網絡結構圖的圖片,也能夠直接點擊查看。
雖然沒有netron工具更直觀,可是也能夠學習瞭解。
1.2.1 Yolov5s網絡結構
Yolov5s網絡是Yolov5系列中深度最小,特徵圖的寬度最小的網絡。後面的3種都是在此基礎上不斷加深,不斷加寬。
上圖繪製出的網絡結構圖也是Yolov5s的結構,你們也可直接點擊查看,Yolov5s的網絡結構可視化的圖片。
1.2.2 Yolov5m網絡結構
此處也放上netron打開的Yolov5m網絡結構可視圖,點擊便可查看,後面第二版塊會詳細說明不一樣模型的不一樣點。
1.2.3 Yolov5l網絡結構
此處也放上netronx打開的Yolov5l網絡結構可視圖,點擊便可查看。
1.2.4 Yolov5x網絡結構
此處也放上netronx打開的Yolov5x網絡結構可視圖,點擊便可查看。
2 核心基礎內容
2.1 Yolov3&Yolov4網絡結構圖
2.1.1 Yolov3網絡結構圖
Yolov3的網絡結構是比較經典的one-stage結構,分爲輸入端、Backbone、Neck和Prediction四個部分。
大白在以前的《深刻淺出Yolo系列之Yolov3&Yolov4核心基礎知識完整講解》中講了不少,這裏很少說,仍是放上繪製的Yolov3的網絡結構圖。
2.1.2 Yolov4網絡結構圖
Yolov4在Yolov3的基礎上進行了不少的創新。
好比輸入端採用mosaic數據加強,
Backbone上採用了CSPDarknet5三、Mish激活函數、Dropblock等方式,
Neck中採用了SPP、FPN+PAN的結構,
輸出端則採用CIOU_Loss、DIOU_nms操做。
所以Yolov4對Yolov3的各個部分都進行了不少的整合創新,關於Yolov4詳細的講解仍是能夠參照大白以前寫的《深刻淺出Yolo系列之Yolov3&Yolov4核心基礎知識完整講解》,寫的比較詳細。
2.2 Yolov5核心基礎內容
Yolov5的結構和Yolov4很類似,但也有一些不一樣,大白仍是按照從總體到細節的方式,對每一個板塊進行講解。
上圖即Yolov5的網絡結構圖,能夠看出,仍是分爲輸入端、Backbone、Neck、Prediction四個部分。
你們可能對Yolov3比較熟悉,所以大白列舉它和Yolov3的一些主要的不一樣點,並和Yolov4進行比較。
(1)輸入端:Mosaic數據加強、自適應錨框計算、自適應圖片縮放
(2)Backbone:Focus結構,CSP結構
(3)Neck:FPN+PAN結構
(4)Prediction:GIOU_Loss
下面丟上Yolov5做者的算法性能測試圖:
Yolov5做者也是在COCO數據集上進行的測試,大白在以前的文章講過,COCO數據集的小目標占比,所以最終的四種網絡結構,性能上來講各有千秋。
Yolov5s網絡最小,速度最少,AP精度也最低。但若是檢測的以大目標爲主,追求速度,倒也是個不錯的選擇。
其餘的三種網絡,在此基礎上,不斷加深加寬網絡,AP精度也不斷提高,但速度的消耗也在不斷增長。
2.2.1 輸入端
(1)Mosaic數據加強
Yolov5的輸入端採用了和Yolov4同樣的Mosaic數據加強的方式。
Mosaic數據加強提出的做者也是來自Yolov5團隊的成員,不過,隨機縮放、隨機裁剪、隨機排布的方式進行拼接,對於小目標的檢測效果仍是很不錯的。
Mosaic數據加強的內容在以前《深刻淺出Yolo系列之Yolov3&Yolov4核心基礎知識完整講解》文章中寫的很詳細,詳情能夠查看以前的內容。
(2) 自適應錨框計算
在Yolo算法中,針對不一樣的數據集,都會有初始設定長寬的錨框。
在網絡訓練中,網絡在初始錨框的基礎上輸出預測框,進而和真實框groundtruth進行比對,計算二者差距,再反向更新,迭代網絡參數。
所以初始錨框也是比較重要的一部分,好比Yolov5在Coco數據集上初始設定的錨框:
在Yolov三、Yolov4中,訓練不一樣的數據集時,計算初始錨框的值是經過單獨的程序運行的。
但Yolov5中將此功能嵌入到代碼中,每次訓練時,自適應的計算不一樣訓練集中的最佳錨框值。
固然,若是以爲計算的錨框效果不是很好,也能夠在代碼中將自動計算錨框功能關閉。
控制的代碼即train.py中上面一行代碼,設置成False,每次訓練時,不會自動計算。
(3)自適應圖片縮放
在經常使用的目標檢測算法中,不一樣的圖片長寬都不相同,所以經常使用的方式是將原始圖片統一縮放到一個標準尺寸,再送入檢測網絡中。
好比Yolo算法中經常使用416*416,608*608等尺寸,好比對下面800*600的圖像進行縮放。
但Yolov5代碼中對此進行了改進,也是Yolov5推理速度可以很快的一個不錯的trick。
做者認爲,在項目實際使用時,不少圖片的長寬比不一樣,所以縮放填充後,兩端的黑邊大小都不一樣,而若是填充的比較多,則存在信息冗餘,影響推理速度。
所以在Yolov5的代碼中datasets.py的letterbox函數中進行了修改,對原始圖像自適應的添加最少的黑邊。
圖像高度上兩端的黑邊變少了,在推理時,計算量也會減小,即目標檢測速度會獲得提高。
這種方式在以前github上Yolov3中也進行了討論:https://github.com/ultralytics/yolov3/issues/232
在討論中,經過這種簡單的改進,推理速度獲得了37%的提高,能夠說效果很明顯。
可是有的同窗可能會有大大的問號??如何進行計算的呢?大白按照Yolov5中的思路詳細的講解一下,在datasets.py的letterbox函數中也有詳細的代碼。
第一步:計算縮放比例
原始縮放尺寸是416*416,都除以原始圖像的尺寸後,能夠獲得0.52,和0.69兩個縮放係數,選擇小的縮放係數。
第二步:計算縮放後的尺寸
原始圖片的長寬都乘以最小的縮放係數0.52,寬變成了416,而高變成了312。
第三步:計算黑邊填充數值
將416-312=104,獲得本來須要填充的高度。再採用numpy中np.mod取餘數的方式,獲得40個像素,再除以2,即獲得圖片高度兩端須要填充的數值。
此外,須要注意的是:
a.這裏大白填充的是黑色,即(0,0,0),而Yolov5中填充的是灰色,即(114,114,114),都是同樣的效果。
b.訓練時沒有采用縮減黑邊的方式,仍是採用傳統填充的方式,即縮放到416*416大小。只是在測試,使用模型推理時,才採用縮減黑邊的方式,提升目標檢測,推理的速度。
2.2.2 Backbone
(1)Focus結構
Focus結構,在Yolov3&Yolov4中並無這個結構,其中比較關鍵是切片操做。
好比右圖的切片示意圖,4*4*3的圖像切片後變成2*2*12的特徵圖。
以Yolov5s的結構爲例,原始608*608*3的圖像輸入Focus結構,採用切片操做,先變成304*304*12的特徵圖,再通過一次32個卷積核的卷積操做,最終變成304*304*32的特徵圖。
須要注意的是:Yolov5s的Focus結構最後使用了32個卷積核,而其餘三種結構,使用的數量有所增長,先注意下,後面會講解到四種結構的不一樣點。
(2)CSP結構
Yolov4網絡結構中,借鑑了CSPNet的設計思路,在主幹網絡中設計了CSP結構。
Yolov5與Yolov4不一樣點在於,Yolov4中只有主幹網絡使用了CSP結構。
而Yolov5中設計了兩種CSP結構,以Yolov5s網絡爲例,CSP1_X結構應用於Backbone主幹網絡,另外一種CSP2_X結構則應用於Neck中。
這裏關於CSPNet的內容,也能夠查看大白以前的《深刻淺出Yolo系列之Yolov3&Yolov4核心基礎完整講解》。
2.2.3 Neck
Yolov5如今的Neck和Yolov4中同樣,都採用FPN+PAN的結構,但在Yolov5剛出來時,只使用了FPN結構,後面才增長了PAN結構,此外網絡中其餘部分也進行了調整。
所以,大白在Yolov5剛提出時,畫的不少結構圖,又都從新進行了調整。
這裏關於FPN+PAN的結構,大白在《深刻淺出Yolo系列之Yolov3&Yolov4核心基礎知識完整講解》中,講的不少,你們應該都有理解。
但如上面CSPNet結構中講到,Yolov5和Yolov4的不一樣點在於,
Yolov4的Neck結構中,採用的都是普通的卷積操做。而Yolov5的Neck結構中,採用借鑑CSPnet設計的CSP2結構,增強網絡特徵融合的能力。
2.2.4 輸出端
(1)Bounding box損失函數
在《深刻淺出Yolo系列之Yolov3&Yolov4核心基礎知識完整講解》中,大白詳細的講解了IOU_Loss,以及進化版的GIOU_Loss,DIOU_Loss,以及CIOU_Loss。
Yolov5中採用其中的GIOU_Loss作Bounding box的損失函數。
而Yolov4中採用CIOU_Loss做爲目標Bounding box的損失。
(2)nms非極大值抑制
在目標檢測的後處理過程當中,針對不少目標框的篩選,一般須要nms操做。
由於CIOU_Loss中包含影響因子v,涉及groudtruth的信息,而測試推理時,是沒有groundtruth的。
因此Yolov4在DIOU_Loss的基礎上採用DIOU_nms的方式,而Yolov5中採用加權nms的方式。
能夠看出,採用DIOU_nms,下方中間箭頭的黃色部分,本來被遮擋的摩托車也能夠檢出。
大白在項目中,也採用了DIOU_nms的方式,在一樣的參數狀況下,將nms中IOU修改爲DIOU_nms。對於一些遮擋重疊的目標,確實會有一些改進。
好比下面黃色箭頭部分,本來兩我的重疊的部分,在參數和普通的IOU_nms一致的狀況下,修改爲DIOU_nms,能夠將兩個目標檢出。
雖然大多數狀態下效果差很少,但在不增長計算成本的狀況下,有稍微的改進也是好的。
2.3 Yolov5四種網絡結構的不一樣點
Yolov5代碼中的四種網絡,和以前的Yolov3,Yolov4中的cfg文件不一樣,都是以yaml的形式來呈現。
並且四個文件的內容基本上都是同樣的,只有最上方的depth_multiple和width_multiple兩個參數不一樣,不少同窗看的一臉懵逼,不知道只經過兩個參數是如何控制四種結構的?