干貨|深入淺出YOLOv5
AI編輯:我是小將
本文作者:江大白
https://zhuanlan.zhihu.com/p/172121380
本文已由原作者授權(quán),不得擅自二次轉(zhuǎn)載
如果你想進(jìn)一步學(xué)習(xí)YOLOV5,可以關(guān)注公眾號(hào)即將發(fā)布的YOLOV5后續(xù)文章!
之前已經(jīng)對(duì)Yolov4的相關(guān)基礎(chǔ)知識(shí)做了比較系統(tǒng)的梳理(深入淺出Yolov3和Yolov4),但Yolov4后不久,又出現(xiàn)了Yolov5,雖然作者沒有放上和Yolov4的直接測(cè)試對(duì)比,但在COCO數(shù)據(jù)集的測(cè)試效果還是很可觀的。
很多人考慮到Yolov5的創(chuàng)新性不足,對(duì)算法是否能夠進(jìn)化,稱得上Yolov5而議論紛紛。
但既然稱之為Yolov5,也有很多非常不錯(cuò)的地方值得我們學(xué)習(xí)。不過因?yàn)?span style="font-weight: 600;">Yolov5的網(wǎng)絡(luò)結(jié)構(gòu)和Yolov3、Yolov4相比,不好可視化,導(dǎo)致很多同學(xué)看Yolov5看的云里霧里。
因此本文,大白主要對(duì)Yolov5四種網(wǎng)絡(luò)結(jié)構(gòu)的各個(gè)細(xì)節(jié)做一個(gè)深入淺出的分析總結(jié),和大家一些探討學(xué)習(xí)。
版權(quán)申明:本文包含圖片,都為大白使用PPT所繪制的,如需網(wǎng)絡(luò)結(jié)構(gòu)高清圖和模型權(quán)重,可點(diǎn)擊查看下載(https://blog.csdn.net/nan355655600/article/details/107852288)。
本文目錄
1 Yolov5 四種網(wǎng)絡(luò)模型
1.1 Yolov5網(wǎng)絡(luò)結(jié)構(gòu)圖
1.2 網(wǎng)絡(luò)結(jié)構(gòu)可視化?
1.2.1 Yolov5s網(wǎng)絡(luò)結(jié)構(gòu)?
1.2.2 Yolov5m網(wǎng)絡(luò)結(jié)構(gòu)
1.2.3 Yolov5l網(wǎng)絡(luò)結(jié)構(gòu)
1.2.4 Yolov5x網(wǎng)絡(luò)結(jié)構(gòu)
2 核心基礎(chǔ)內(nèi)容?
2.1 Yolov3&Yolov4網(wǎng)絡(luò)結(jié)構(gòu)圖?
2.2 Yolov5核心基礎(chǔ)內(nèi)容?
2.2.1 輸入端
2.2.2 Backbone
2.2.3 Neck
2.2.4 輸出端
2.3 Yolov5四種網(wǎng)絡(luò)結(jié)構(gòu)的不同點(diǎn)
2.3.1 四種結(jié)構(gòu)的參數(shù)
2.3.2 Yolov5網(wǎng)絡(luò)結(jié)構(gòu)
2.3.3 Yolov5四種網(wǎng)絡(luò)的深度
2.3.4 Yolov5四種網(wǎng)絡(luò)的寬度
3 Yolov5相關(guān)論文及代碼
4 小目標(biāo)分割檢測(cè)
5 后語
1 Yolov5四種網(wǎng)絡(luò)模型
Yolov5官方代碼中,給出的目標(biāo)檢測(cè)網(wǎng)絡(luò)中一共有4個(gè)版本,分別是Yolov5s、Yolov5m、Yolov5l、Yolov5x四個(gè)模型。
學(xué)習(xí)一個(gè)新的算法,最好在腦海中對(duì)算法網(wǎng)絡(luò)的整體架構(gòu)有一個(gè)清晰的理解。
但比較尷尬的是,Yolov5代碼中給出的網(wǎng)絡(luò)文件是yaml格式,和原本Yolov3、Yolov4中的cfg不同。
因此無法用netron工具直接可視化的查看網(wǎng)絡(luò)結(jié)構(gòu),造成有的同學(xué)不知道如何去學(xué)習(xí)這樣的網(wǎng)絡(luò)。
比如下載了Yolov5的四個(gè)pt格式的權(quán)重模型:

但因?yàn)閚etron對(duì)pt格式的文件兼容性并不好,直接使用netron工具打開,會(huì)發(fā)現(xiàn),根本無法顯示全部網(wǎng)絡(luò)。
因此可以采用pt->onnx->netron的折中方式,先使用Yolov5代碼中models/export.py腳本將pt文件轉(zhuǎn)換為onnx格式,再用netron工具打開,這樣就可以看全網(wǎng)絡(luò)的整體架構(gòu)了。

如需下載Yolov5整體的4個(gè)網(wǎng)絡(luò)pt文件及onnx文件,也可點(diǎn)擊鏈接查看下載,便于直觀的學(xué)習(xí)。
1.1 Yolov5網(wǎng)絡(luò)結(jié)構(gòu)圖
安裝好netron工具,就可以可視化的打開Yolov5的網(wǎng)絡(luò)結(jié)構(gòu)。
這里大白也和之前講解Yolov3&Yolov4同樣的方式,繪制了Yolov5s整體的網(wǎng)絡(luò)結(jié)構(gòu)圖,配合netron的可視化網(wǎng)絡(luò)結(jié)構(gòu)查看,腦海中的架構(gòu)會(huì)更加清晰。

本文也會(huì)以Yolov5s的網(wǎng)絡(luò)結(jié)構(gòu)為主線,講解與其他三個(gè)模型(Yolov5m、Yolov5l、Yolov5x)的不同點(diǎn),讓大家對(duì)于Yolov5有一個(gè)深入淺出的了解。
1.2 網(wǎng)絡(luò)結(jié)構(gòu)可視化
將四種模型pt文件的轉(zhuǎn)換成對(duì)應(yīng)的onnx文件后,即可使用netron工具查看。
但是,有些同學(xué)可能不方便,使用腳本轉(zhuǎn)換查看。
因此,大白也上傳了每個(gè)網(wǎng)絡(luò)結(jié)構(gòu)圖的圖片,也可以直接點(diǎn)擊查看。
雖然沒有netron工具更直觀,但是也可以學(xué)習(xí)了解。
1.2.1 Yolov5s網(wǎng)絡(luò)結(jié)構(gòu)
Yolov5s網(wǎng)絡(luò)是Yolov5系列中深度最小,特征圖的寬度最小的網(wǎng)絡(luò)。后面的3種都是在此基礎(chǔ)上不斷加深,不斷加寬。
上圖繪制出的網(wǎng)絡(luò)結(jié)構(gòu)圖也是Yolov5s的結(jié)構(gòu),大家也可直接點(diǎn)擊查看,Yolov5s的網(wǎng)絡(luò)結(jié)構(gòu)可視化的圖片。
1.2.2 Yolov5m網(wǎng)絡(luò)結(jié)構(gòu)
此處也放上netron打開的Yolov5m網(wǎng)絡(luò)結(jié)構(gòu)可視圖,點(diǎn)擊即可查看,后面第二版塊會(huì)詳細(xì)說明不同模型的不同點(diǎn)。
1.2.3 Yolov5l網(wǎng)絡(luò)結(jié)構(gòu)
此處也放上netronx打開的Yolov5l網(wǎng)絡(luò)結(jié)構(gòu)可視圖,點(diǎn)擊即可查看。
1.2.4 Yolov5x網(wǎng)絡(luò)結(jié)構(gòu)
此處也放上netronx打開的Yolov5x網(wǎng)絡(luò)結(jié)構(gòu)可視圖,點(diǎn)擊即可查看。
2 核心基礎(chǔ)內(nèi)容
2.1 Yolov3&Yolov4網(wǎng)絡(luò)結(jié)構(gòu)圖
2.1.1 Yolov3網(wǎng)絡(luò)結(jié)構(gòu)圖
Yolov3的網(wǎng)絡(luò)結(jié)構(gòu)是比較經(jīng)典的one-stage結(jié)構(gòu),分為輸入端、Backbone、Neck和Prediction四個(gè)部分。
大白在之前的《深入淺出Yolo系列之Yolov3&Yolov4核心基礎(chǔ)知識(shí)完整講解》中講了很多,這里不多說,還是放上繪制的Yolov3的網(wǎng)絡(luò)結(jié)構(gòu)圖。

2.1.2 Yolov4網(wǎng)絡(luò)結(jié)構(gòu)圖
Yolov4在Yolov3的基礎(chǔ)上進(jìn)行了很多的創(chuàng)新。
比如輸入端采用mosaic數(shù)據(jù)增強(qiáng),
Backbone上采用了CSPDarknet53、Mish激活函數(shù)、Dropblock等方式,
Neck中采用了SPP、FPN+PAN的結(jié)構(gòu),
輸出端則采用CIOU_Loss、DIOU_nms操作。
因此Yolov4對(duì)Yolov3的各個(gè)部分都進(jìn)行了很多的整合創(chuàng)新,關(guān)于Yolov4詳細(xì)的講解還是可以參照大白之前寫的《深入淺出Yolo系列之Yolov3&Yolov4核心基礎(chǔ)知識(shí)完整講解》,寫的比較詳細(xì)。

2.2 Yolov5核心基礎(chǔ)內(nèi)容
Yolov5的結(jié)構(gòu)和Yolov4很相似,但也有一些不同,大白還是按照從整體到細(xì)節(jié)的方式,對(duì)每個(gè)板塊進(jìn)行講解。

上圖即Yolov5的網(wǎng)絡(luò)結(jié)構(gòu)圖,可以看出,還是分為輸入端、Backbone、Neck、Prediction四個(gè)部分。
大家可能對(duì)Yolov3比較熟悉,因此大白列舉它和Yolov3的一些主要的不同點(diǎn),并和Yolov4進(jìn)行比較。
(1)輸入端:Mosaic數(shù)據(jù)增強(qiáng)、自適應(yīng)錨框計(jì)算
(2)Backbone:Focus結(jié)構(gòu),CSP結(jié)構(gòu)
(3)Neck:FPN+PAN結(jié)構(gòu)
(4)Prediction:GIOU_Loss
下面丟上Yolov5作者的算法性能測(cè)試圖:

Yolov5作者也是在COCO數(shù)據(jù)集上進(jìn)行的測(cè)試,大白在之前的文章講過,COCO數(shù)據(jù)集的小目標(biāo)占比,因此最終的四種網(wǎng)絡(luò)結(jié)構(gòu),性能上來說各有千秋。
Yolov5s網(wǎng)絡(luò)最小,速度最少,AP精度也最低。但如果檢測(cè)的以大目標(biāo)為主,追求速度,倒也是個(gè)不錯(cuò)的選擇。
其他的三種網(wǎng)絡(luò),在此基礎(chǔ)上,不斷加深加寬網(wǎng)絡(luò),AP精度也不斷提升,但速度的消耗也在不斷增加。
2.2.1 輸入端
(1)Mosaic數(shù)據(jù)增強(qiáng)
Yolov5的輸入端采用了和Yolov4一樣的Mosaic數(shù)據(jù)增強(qiáng)的方式。
Mosaic數(shù)據(jù)增強(qiáng)提出的作者也是來自Yolov5團(tuán)隊(duì)的成員,不過,隨機(jī)縮放、隨機(jī)裁剪、隨機(jī)排布的方式進(jìn)行拼接,對(duì)于小目標(biāo)的檢測(cè)效果還是很不錯(cuò)的。

Mosaic數(shù)據(jù)增強(qiáng)的內(nèi)容在之前《深入淺出Yolo系列之Yolov3&Yolov4核心基礎(chǔ)知識(shí)完整講解》文章中寫的很詳細(xì),詳情可以查看之前的內(nèi)容。
(2) 自適應(yīng)錨框計(jì)算
在Yolo算法中,針對(duì)不同的數(shù)據(jù)集,都會(huì)有初始設(shè)定長寬的錨框。
在網(wǎng)絡(luò)訓(xùn)練中,網(wǎng)絡(luò)在初始錨框的基礎(chǔ)上輸出預(yù)測(cè)框,進(jìn)而和真實(shí)框groundtruth進(jìn)行比對(duì),計(jì)算兩者差距,再反向更新,迭代網(wǎng)絡(luò)參數(shù)。
因此初始錨框也是比較重要的一部分,比如Yolov5在Coco數(shù)據(jù)集上初始設(shè)定的錨框:

但Yolov5中將此功能嵌入到代碼中,每次訓(xùn)練時(shí),自適應(yīng)的計(jì)算不同訓(xùn)練集中的最佳錨框值。
當(dāng)然,如果覺得計(jì)算的錨框效果不是很好,也可以在代碼中將自動(dòng)計(jì)算錨框功能關(guān)閉。
控制的代碼即train.py中上面一行代碼,設(shè)置成False,每次訓(xùn)練時(shí),不會(huì)自動(dòng)計(jì)算。
(3)自適應(yīng)圖片縮放
在常用的目標(biāo)檢測(cè)算法中,不同的圖片長寬都不相同,因此常用的方式是將原始圖片統(tǒng)一縮放到一個(gè)標(biāo)準(zhǔn)尺寸,再送入檢測(cè)網(wǎng)絡(luò)中。
比如Yolo算法中常用416*416,608*608等尺寸,比如對(duì)下面800*600的圖像進(jìn)行縮放。

但Yolov5代碼中對(duì)此進(jìn)行了改進(jìn),也是Yolov5推理速度能夠很快的一個(gè)不錯(cuò)的trick。
作者認(rèn)為,在項(xiàng)目實(shí)際使用時(shí),很多圖片的長寬比不同,因此縮放填充后,兩端的黑邊大小都不同,而如果填充的比較多,則存在信息冗余,影響推理速度。
因此在Yolov5的代碼中datasets.py的letterbox函數(shù)中進(jìn)行了修改,對(duì)原始圖像自適應(yīng)的添加最少的黑邊。

圖像高度上兩端的黑邊變少了,在推理時(shí),計(jì)算量也會(huì)減少,即目標(biāo)檢測(cè)速度會(huì)得到提升。
這種方式在之前github上Yolov3中也進(jìn)行了討論:https://github.com/ultralytics/yolov3/issues/232
在討論中,通過這種簡單的改進(jìn),推理速度得到了37%的提升,可以說效果很明顯。
但是有的同學(xué)可能會(huì)有大大的問號(hào)??如何進(jìn)行計(jì)算的呢?大白按照Yolov5中的思路詳細(xì)的講解一下,在datasets.py的letterbox函數(shù)中也有詳細(xì)的代碼。
第一步:計(jì)算縮放比例

原始縮放尺寸是416*416,都除以原始圖像的尺寸后,可以得到0.52,和0.69兩個(gè)縮放系數(shù),選擇小的縮放系數(shù)。
第二步:計(jì)算縮放后的尺寸

原始圖片的長寬都乘以最小的縮放系數(shù)0.52,寬變成了416,而高變成了312。
第三步:計(jì)算黑邊填充數(shù)值

將416-312=104,得到原本需要填充的高度。再采用numpy中np.mod取余數(shù)的方式,得到40個(gè)像素,再除以2,即得到圖片高度兩端需要填充的數(shù)值。
此外,需要注意的是:
a.這里大白填充的是黑色,即(0,0,0),而Yolov5中填充的是灰色,即(114,114,114),都是一樣的效果。
b.訓(xùn)練時(shí)沒有采用縮減黑邊的方式,還是采用傳統(tǒng)填充的方式,即縮放到416*416大小。只是在測(cè)試,使用模型推理時(shí),才采用縮減黑邊的方式,提高目標(biāo)檢測(cè),推理的速度。
2.2.2 Backbone
(1)Focus結(jié)構(gòu)

Focus結(jié)構(gòu),在Yolov3&Yolov4中并沒有這個(gè)結(jié)構(gòu),其中比較關(guān)鍵是切片操作。
比如右圖的切片示意圖,4*4*3的圖像切片后變成3*3*12的特征圖。
以Yolov5s的結(jié)構(gòu)為例,原始608*608*3的圖像輸入Focus結(jié)構(gòu),采用切片操作,先變成304*304*12的特征圖,再經(jīng)過一次32個(gè)卷積核的卷積操作,最終變成304*304*32的特征圖。
需要注意的是:Yolov5s的Focus結(jié)構(gòu)最后使用了32個(gè)卷積核,而其他三種結(jié)構(gòu),使用的數(shù)量有所增加,先注意下,后面會(huì)講解到四種結(jié)構(gòu)的不同點(diǎn)。
(2)CSP結(jié)構(gòu)
Yolov4網(wǎng)絡(luò)結(jié)構(gòu)中,借鑒了CSPNet的設(shè)計(jì)思路,在主干網(wǎng)絡(luò)中設(shè)計(jì)了CSP結(jié)構(gòu)。

Yolov5與Yolov4不同點(diǎn)在于,Yolov4中只有主干網(wǎng)絡(luò)使用了CSP結(jié)構(gòu)。
而Yolov5中設(shè)計(jì)了兩種CSP結(jié)構(gòu),以Yolov5s網(wǎng)絡(luò)為例,CSP1_X結(jié)構(gòu)應(yīng)用于Backbone主干網(wǎng)絡(luò),另一種CSP2_X結(jié)構(gòu)則應(yīng)用于Neck中。

這里關(guān)于CSPNet的內(nèi)容,也可以查看大白之前的《深入淺出Yolo系列之Yolov3&Yolov4核心基礎(chǔ)完整講解》。
2.2.3 Neck
Yolov5現(xiàn)在的Neck和Yolov4中一樣,都采用FPN+PAN的結(jié)構(gòu),但在Yolov5剛出來時(shí),只使用了FPN結(jié)構(gòu),后面才增加了PAN結(jié)構(gòu),此外網(wǎng)絡(luò)中其他部分也進(jìn)行了調(diào)整。
因此,大白在Yolov5剛提出時(shí),畫的很多結(jié)構(gòu)圖,又都重新進(jìn)行了調(diào)整。

這里關(guān)于FPN+PAN的結(jié)構(gòu),大白在《深入淺出Yolo系列之Yolov3&Yolov4核心基礎(chǔ)知識(shí)完整講解》中,講的很多,大家應(yīng)該都有理解。
但如上面CSPNet結(jié)構(gòu)中講到,Yolov5和Yolov4的不同點(diǎn)在于,
Yolov4的Neck結(jié)構(gòu)中,采用的都是普通的卷積操作。而Yolov5的Neck結(jié)構(gòu)中,采用借鑒CSPnet設(shè)計(jì)的CSP2結(jié)構(gòu),加強(qiáng)網(wǎng)絡(luò)特征融合的能力。

2.2.4 輸出端
(1)Bounding box損失函數(shù)
在《深入淺出Yolo系列之Yolov3&Yolov4核心基礎(chǔ)知識(shí)完整講解》中,大白詳細(xì)的講解了IOU_Loss,以及進(jìn)化版的GIOU_Loss,DIOU_Loss,以及CIOU_Loss。
Yolov5中采用其中的GIOU_Loss做Bounding box的損失函數(shù)。

而Yolov4中采用CIOU_Loss作為目標(biāo)Bounding box的損失,如果采用CIOU_Loss,應(yīng)該會(huì)有更快更好的收斂效果。

(2)nms非極大值抑制
在目標(biāo)檢測(cè)的后處理過程中,針對(duì)很多目標(biāo)框的篩選,通常需要nms操作。
Yolov4在DIOU_Loss的基礎(chǔ)上采用DIOU_nms的方式,而Yolov5中仍然采用普通的nms的方式。
可以看出,下方中間箭頭的黃色部分,原本被遮擋的摩托車也可以檢出。

大白在項(xiàng)目中,也采用了DIOU_nms的方式,在同樣的參數(shù)情況下,將nms中IOU修改成DIOU_nms。對(duì)于一些遮擋重疊的目標(biāo),確實(shí)會(huì)有一些改進(jìn)。
比如下面黃色箭頭部分,原本兩個(gè)人重疊的部分,在參數(shù)和普通的IOU_nms一致的情況下,修改成DIOU_nms,可以將兩個(gè)目標(biāo)檢出。
雖然大多數(shù)狀態(tài)下效果差不多,但在不增加計(jì)算成本的情況下,有稍微的改進(jìn)也是好的。

2.3 Yolov5四種網(wǎng)絡(luò)結(jié)構(gòu)的不同點(diǎn)
Yolov5代碼中的四種網(wǎng)絡(luò),和之前的Yolov3,Yolov4中的cfg文件不同,都是以yaml的形式來呈現(xiàn)。
而且四個(gè)文件的內(nèi)容基本上都是一樣的,只有最上方的depth_multiple和width_multiple兩個(gè)參數(shù)不同,很多同學(xué)看的一臉懵逼,不知道只通過兩個(gè)參數(shù)是如何控制四種結(jié)構(gòu)的?
2.3.1 四種結(jié)構(gòu)的參數(shù)
大白先取出Yolov5代碼中,每個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的兩個(gè)參數(shù):
(1)Yolov5s.yaml

(2)Yolov5m.yaml

(3)Yolov5l.yaml

(4)Yolov5x.yaml

四種結(jié)構(gòu)就是通過上面的兩個(gè)參數(shù),來進(jìn)行控制網(wǎng)絡(luò)的深度和寬度。其中depth_multiple控制網(wǎng)絡(luò)的深度,width_multiple控制網(wǎng)絡(luò)的寬度。
2.3.2 Yolov5網(wǎng)絡(luò)結(jié)構(gòu)
四種結(jié)構(gòu)的yaml文件中,下方的網(wǎng)絡(luò)架構(gòu)代碼都是一樣的。
為了便于講解,大白將其中的Backbone部分提取出來,講解如何控制網(wǎng)絡(luò)的寬度和深度,yaml文件中的Head部分也是同樣的原理。

在對(duì)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行解析時(shí),yolo.py中下方的這一行代碼將四種結(jié)構(gòu)的depth_multiple,width_multiple提取出,賦值給gd,gw。后面主要對(duì)這gd,gw這兩個(gè)參數(shù)進(jìn)行講解。

下面再細(xì)致的剖析下,看是如何控制每種結(jié)構(gòu),深度和寬度的。
2.3.3 Yolov5四種網(wǎng)絡(luò)的深度

(1)不同網(wǎng)絡(luò)的深度
在上圖中,大白畫了兩種CSP結(jié)構(gòu),CSP1和CSP2,其中CSP1結(jié)構(gòu)主要應(yīng)用于Backbone中,CSP2結(jié)構(gòu)主要應(yīng)用于Neck中。
需要注意的是,四種網(wǎng)絡(luò)結(jié)構(gòu)中每個(gè)CSP結(jié)構(gòu)的深度都是不同的。
a.以yolov5s為例,第一個(gè)CSP1中,使用了1個(gè)殘差組件,因此是CSP1_1。而在Yolov5m中,則增加了網(wǎng)絡(luò)的深度,在第一個(gè)CSP1中,使用了2個(gè)殘差組件,因此是CSP1_2。
而Yolov5l中,同樣的位置,則使用了3個(gè)殘差組件,Yolov5x中,使用了4個(gè)殘差組件。
其余的第二個(gè)CSP1和第三個(gè)CSP1也是同樣的原理。
b.在第二種CSP2結(jié)構(gòu)中也是同樣的方式,以第一個(gè)CSP2結(jié)構(gòu)為例,Yolov5s中使用了3個(gè)殘差組件,因此是CSP2_3。
而Yolov5m中使用了5個(gè),Yolov5l中使用了7個(gè),Yolov5x中使用了9個(gè)。
其他的四個(gè)CSP2結(jié)構(gòu),也是同理。
Yolov5中,網(wǎng)絡(luò)的不斷加深,也在不斷增加網(wǎng)絡(luò)特征提取和特征融合的能力。
(2)控制深度的代碼
控制四種網(wǎng)絡(luò)結(jié)構(gòu)的核心代碼是yolo.py中下面的代碼,存在兩個(gè)變量,n和gd。
我們?cè)賹?span style="font-weight: 600;">n和gd帶入計(jì)算,看每種網(wǎng)絡(luò)的變化結(jié)果。

(3)驗(yàn)證控制深度的有效性
我們選擇最小的yolov5s.yaml和中間的yolov5l.yaml兩個(gè)網(wǎng)絡(luò)結(jié)構(gòu),將gd(height_multiple)系數(shù)帶入,看是否正確。

其中height_multiple=0.33,即gd=0.33,而n則由上面紅色框中的信息獲得。
以上面網(wǎng)絡(luò)框圖中的第一個(gè)CSP1為例,即上面的第一個(gè)紅色框。n等于第二個(gè)數(shù)值3。
而gd=0.33,帶入(2)中的計(jì)算代碼,結(jié)果n=1。因此第一個(gè)CSP1結(jié)構(gòu)內(nèi)只有1個(gè)殘差組件,即CSP1_1。
第二個(gè)CSP1結(jié)構(gòu)中,n等于第二個(gè)數(shù)值9,而gd=0.33,帶入(2)中計(jì)算,結(jié)果n=3,因此第二個(gè)CSP1結(jié)構(gòu)中有3個(gè)殘差組件,即CSP1_3。
第三個(gè)CSP1結(jié)構(gòu)也是同理,這里不多說。
b. yolov5l.xml
其中height_multiple=1,即gd=1
和上面的計(jì)算方式相同,第一個(gè)CSP1結(jié)構(gòu)中,n=1,帶入代碼中,結(jié)果n=3,因此為CSP1_3。
下面第二個(gè)CSP1和第三個(gè)CSP1結(jié)構(gòu)都是同樣的原理。
2.3.4 Yolov5四種網(wǎng)絡(luò)的寬度

(1)不同網(wǎng)絡(luò)的寬度:
如上圖表格中所示,四種yolov5結(jié)構(gòu)在不同階段的卷積核的數(shù)量都是不一樣的,因此也直接影響卷積后特征圖的第三維度,即厚度,大白這里表示為網(wǎng)絡(luò)的寬度。
a.以Yolov5s結(jié)構(gòu)為例,第一個(gè)Focus結(jié)構(gòu)中,最后卷積操作時(shí),卷積核的數(shù)量是32個(gè),因此經(jīng)過Focus結(jié)構(gòu),特征圖的大小變成304*304*32。
而yolov5m的Focus結(jié)構(gòu)中的卷積操作使用了48個(gè)卷積核,因此Focus結(jié)構(gòu)后的特征圖變成304*304*48。yolov5l,yolov5x也是同樣的原理。
b. 第二個(gè)卷積操作時(shí),yolov5s使用了64個(gè)卷積核,因此得到的特征圖是152*152*64。而yolov5m使用96個(gè)特征圖,因此得到的特征圖是152*152*96。yolov5l,yolov5x也是同理。
c. 后面三個(gè)卷積下采樣操作也是同樣的原理,這樣大白不過多講解。
四種不同結(jié)構(gòu)的卷積核的數(shù)量不同,這也直接影響網(wǎng)絡(luò)中,比如CSP1,CSP2等結(jié)構(gòu),以及各個(gè)普通卷積,卷積操作時(shí)的卷積核數(shù)量也同步在調(diào)整,影響整體網(wǎng)絡(luò)的計(jì)算量。
大家最好可以將結(jié)構(gòu)圖和前面第一部分四個(gè)網(wǎng)絡(luò)的特征圖鏈接,對(duì)應(yīng)查看,思路會(huì)更加清晰。
當(dāng)然卷積核的數(shù)量越多,特征圖的厚度,即寬度越寬,網(wǎng)絡(luò)提取特征的學(xué)習(xí)能力也越強(qiáng)。
(2)控制寬度的代碼
在yolov5的代碼中,控制寬度的核心代碼是yolo.py文件里面的這一行:

它所調(diào)用的子函數(shù)make_divisible的功能是:

(3)驗(yàn)證控制寬度的有效性
我們還是選擇最小的yolov5s和中間的yolov5l兩個(gè)網(wǎng)絡(luò)結(jié)構(gòu),將width_multiple系數(shù)帶入,看是否正確。

a. yolov5x.yaml
其中width_multiple=0.5,即gw=0.5。

以第一個(gè)卷積下采樣為例,即Focus結(jié)構(gòu)中下面的卷積操作。
按照上面Backbone的信息,我們知道Focus中,標(biāo)準(zhǔn)的c2=64,而gw=0.5,代入(2)中的計(jì)算公式,最后的結(jié)果=32。即Yolov5s的Focus結(jié)構(gòu)中,卷積下采樣操作的卷積核數(shù)量為32個(gè)。
再計(jì)算后面的第二個(gè)卷積下采樣操作,標(biāo)準(zhǔn)c2的值=128,gw=0.5,代入(2)中公式,最后的結(jié)果=64,也是正確的。
b. yolov5l.yaml
其中width_multiple=1,即gw=1,而標(biāo)準(zhǔn)的c2=64,代入上面(2)的計(jì)算公式中,可以得到Y(jié)olov5l的Focus結(jié)構(gòu)中,卷積下采樣操作的卷積核的數(shù)量為64個(gè),而第二個(gè)卷積下采樣的卷積核數(shù)量是128個(gè)。
另外的三個(gè)卷積下采樣操作,以及yolov5m,yolov5x結(jié)構(gòu)也是同樣的計(jì)算方式,大白這里不過多解釋。
3 Yolov5相關(guān)論文及代碼
3.1 代碼
Yolov5的作者并沒有發(fā)表論文,因此只能從代碼角度進(jìn)行分析。
Yolov5代碼:github.com/ultralytics/
大家可以根據(jù)網(wǎng)頁的說明,下載訓(xùn)練,及測(cè)試,流程還是比較簡單的。
3.2 相關(guān)論文
另外一篇論文,PP-Yolo,在Yolov3的原理上,采用了很多的tricks調(diào)參方式,也挺有意思。
感興趣的話可以參照另一個(gè)博主的文章:點(diǎn)擊查看
4 小目標(biāo)分割檢測(cè)
目標(biāo)檢測(cè)發(fā)展很快,但對(duì)于小目標(biāo)的檢測(cè)還是有一定的瓶頸,特別是大分辨率圖像小目標(biāo)檢測(cè)。比如7920*2160,甚至16000*16000的圖像。

圖像的分辨率很大,但又有很多小的目標(biāo)需要檢測(cè)。但是如果直接輸入檢測(cè)網(wǎng)絡(luò),比如yolov3,檢出效果并不好。
主要原因是:
(1)小目標(biāo)尺寸
以網(wǎng)絡(luò)的輸入608*608為例,yolov3、yolov4,yolov5中下采樣都使用了5次,因此最后的特征圖大小是19*19,38*38,76*76。
三個(gè)特征圖中,最大的76*76負(fù)責(zé)檢測(cè)小目標(biāo),而對(duì)應(yīng)到608*608上,每格特征圖的感受野是608/76=8*8大小。

再將608*608對(duì)應(yīng)到7680*2160上,以最長邊7680為例,7680/608*8=101。
即如果原始圖像中目標(biāo)的寬或高小于101像素,網(wǎng)絡(luò)很難學(xué)習(xí)到目標(biāo)的特征信息。
(PS:這里忽略多尺度訓(xùn)練的因素及增加網(wǎng)絡(luò)檢測(cè)分支的情況)
(2)高分辨率
而在很多遙感圖像中,長寬比的分辨率比7680*2160更大,比如上面的16000*16000,如果采用直接輸入原圖的方式,很多小目標(biāo)都無法檢測(cè)出。
(3)顯卡爆炸
很多圖像分辨率很大,如果簡單的進(jìn)行下采樣,下采樣的倍數(shù)太大,容易丟失數(shù)據(jù)信息。
但是倍數(shù)太小,網(wǎng)絡(luò)前向傳播需要在內(nèi)存中保存大量的特征圖,極大耗盡GPU資源,很容易發(fā)生顯存爆炸,無法正常的訓(xùn)練及推理。
因此可以借鑒2018年YOLT算法的方式,改變一下思維,對(duì)大分辨率圖片先進(jìn)行分割,變成一張張小圖,再進(jìn)行檢測(cè)。
需要注意的是:
為了避免兩張小圖之間,一些目標(biāo)正好被分割截?cái)啵詢蓚€(gè)小圖之間設(shè)置overlap重疊區(qū)域,比如分割的小圖是960*960像素大小,則overlap可以設(shè)置為960*20%=192像素。

每個(gè)小圖檢測(cè)完成后,再將所有的框放到大圖上,對(duì)大圖整體做一次nms操作,將重疊區(qū)域的很多重復(fù)框去除。
這樣操作,可以將很多小目標(biāo)檢出,比如16000*16000像素的遙感圖像。

無人機(jī)視角下,也有很多小的目標(biāo)。大白也進(jìn)行了測(cè)試,效果還是不錯(cuò)的。
比如下圖是將原始大圖->416*416大小,直接使用目標(biāo)檢測(cè)網(wǎng)絡(luò)輸出的效果:

可以看到中間黃色框區(qū)域,很多汽車檢測(cè)漏掉。
再使用分割的方式,將大圖先分割成小圖,再對(duì)每個(gè)小圖檢測(cè),可以看出中間區(qū)域很多的汽車都被檢測(cè)出來:

不過這樣的方式有優(yōu)點(diǎn)也有缺點(diǎn):
優(yōu)點(diǎn):
(1)準(zhǔn)確性
分割后的小圖,再輸入目標(biāo)檢測(cè)網(wǎng)絡(luò)中,對(duì)于最小目標(biāo)像素的下限會(huì)大大降低。
比如分割成608*608大小,送入輸入圖像大小608*608的網(wǎng)絡(luò)中,按照上面的計(jì)算方式,原始圖片上,長寬大于8個(gè)像素的小目標(biāo)都可以學(xué)習(xí)到特征。
(2)檢測(cè)方式
在大分辨率圖像,比如遙感圖像,或者無人機(jī)圖像,如果無需考慮實(shí)時(shí)性的檢測(cè),且對(duì)小目標(biāo)檢測(cè)也有需求的項(xiàng)目,可以嘗試此種方式。
缺點(diǎn):
(1)增加計(jì)算量
比如原本7680*2160的圖像,如果使用直接大圖檢測(cè)的方式,一次即可檢測(cè)完。
但采用分割的方式,切分成N張608*608大小的圖像,再進(jìn)行N次檢測(cè),會(huì)大大增加檢測(cè)時(shí)間。
借鑒Yolov5的四種網(wǎng)絡(luò)方式,我們可以采用盡量輕的網(wǎng)絡(luò),比如Yolov5s網(wǎng)絡(luò)結(jié)構(gòu)或者更輕的網(wǎng)絡(luò)。
當(dāng)然Yolov4和Yolov5的網(wǎng)絡(luò)各有優(yōu)勢(shì),我們也可以借鑒Yolov5的設(shè)計(jì)方式,對(duì)Yolov4進(jìn)行輕量化改造,或者進(jìn)行剪枝。
5 后語
綜合而言,在實(shí)際測(cè)試中,Yolov4的準(zhǔn)確性有不錯(cuò)的優(yōu)勢(shì),但Yolov5的多種網(wǎng)絡(luò)結(jié)構(gòu)使用起來更加靈活,我們可以根據(jù)不同的項(xiàng)目需求,取長補(bǔ)短,發(fā)揮不同檢測(cè)網(wǎng)絡(luò)的優(yōu)勢(shì)。
希望在人工智能的道路上,和大家共同進(jìn)步。
推薦閱讀
VoVNet:實(shí)時(shí)目標(biāo)檢測(cè)的新backbone網(wǎng)絡(luò)
帶你捋一捋anchor-free的檢測(cè)模型:FCOS
機(jī)器學(xué)習(xí)算法工程師
? ??? ? ? ? ? ? ? ? ? ? ? ??????????????????一個(gè)用心的公眾號(hào)
?

