前 言:作為當前先進的深度學(xué)習目標檢測算法YOLO,已經(jīng)集合了大量的trick,但是在處理一些復(fù)雜檢測問題的時候,還是容易出現(xiàn)錯漏檢的問題。此后的系列文章,將重點對YOLOv8、YOLOv7以及YOLOv5的如何改進進行詳細的介紹,目的是為了給那些搞科研的同學(xué)需要創(chuàng)新點或者搞工程項目的朋友需要達到更好的效果提供自己的微薄幫助和參考。
一、解決問題
? ? ? ? YOLO小目標檢測效果不好的一個原因是因為小目標樣本的尺寸較小,而yolov8的下采樣倍數(shù)比較大,較深的特征圖很難學(xué)習到小目標的特征信息,因此提出增加小目標檢測層對較淺特征圖與深特征圖拼接后進行檢測。加入小目標檢測層,可以讓網(wǎng)絡(luò)更加關(guān)注小目標的檢測,提高檢測效果。這個方式的實現(xiàn)十分簡單有效,只需要修改yolov8的模型文件yaml就可以增加小目標檢測層,但是在增加檢測層后,帶來的問題就是計算量增加,導(dǎo)致推理檢測速度降低。不過對于小目標,確實有很好的改善,修改yaml文件,需要修改特征融合網(wǎng)絡(luò)。
二、YOLOv8改進方法
近期有朋友問到Y(jié)OLOv8的改進方法,特此分享,增加小目標檢測層的yaml文件前后對比。
yaml文件
改進前:
# Ultralytics YOLO ??, GPL-3.0 license
# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # scales module repeats
width_multiple: 0.50 # scales convolution channels
# YOLOv8.0s backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv8.0s head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 13
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 17 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 20 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [1024]] # 23 (P5/32-large)
- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
改進后:
# Ultralytics YOLO ??, GPL-3.0 license
# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # scales module repeats
width_multiple: 0.50 # scales convolution channels
# YOLOv8.0s backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv8.0s head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 13
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 17 (P3/8-small)
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 2], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [128]] # 20 (P4/16-medium)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 15], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [256]] # 20 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [512]] # 23 (P5/32-large)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [1024]] # 23 (P5/32-large)
- [[18, 21, 24,27], 1, Detect, [nc]] # Detect(P3, P4, P5)
結(jié)構(gòu)圖
改進前:
?改進后:
?最后,將train.py中改為本文的yaml文件即可,開始訓(xùn)練。
三、YOLOv7改進方法
? ? ? 對YOLOv7項目路徑下cfg\deploy\yolov7-tiny-silu.yaml進行修改為[[74,75,76,77], 1, Detect, [nc, anchors]], ? # Detect(P3, P4, P5),同時錨框增加小目標檢測頭的錨框[5,6, 8,14, 15,11]。具體改進后的如下所示。
# parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
# anchors
anchors:
# - [10,13, 16,30, 33,23] # P3/8
# - [30,61, 62,45, 59,119] # P4/16
# - [116,90, 156,198, 373,326] # P5/32
- [5,6, 8,14, 15,11]
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv7-tiny backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [32, 3, 2]], # 0-P1/2
[-1, 1, Conv, [64, 3, 2]], # 1-P2/4
[-1, 1, Conv, [32, 1, 1]],
[-2, 1, Conv, [32, 1, 1]],
[-1, 1, Conv, [32, 3, 1]],
[-1, 1, Conv, [32, 3, 1]],
[[-1, -2, -3, -4], 1, Concat, [1]],
[-1, 1, Conv, [64, 1, 1]], # 7
[-1, 1, MP, []], # 8-P3/8
[-1, 1, Conv, [64, 1, 1]],
[-2, 1, Conv, [64, 1, 1]],
[-1, 1, Conv, [64, 3, 1]],
[-1, 1, Conv, [64, 3, 1]],
[[-1, -2, -3, -4], 1, Concat, [1]],
[-1, 1, Conv, [128, 1, 1]], # 14
[-1, 1, MP, []], # 15-P4/16
[-1, 1, Conv, [128, 1, 1]],
[-2, 1, Conv, [128, 1, 1]],
[-1, 1, Conv, [128, 3, 1]],
[-1, 1, Conv, [128, 3, 1]],
[[-1, -2, -3, -4], 1, Concat, [1]],
[-1, 1, Conv, [256, 1, 1]], # 21
[-1, 1, MP, []], # 22-P5/32
[-1, 1, Conv, [256, 1, 1]],
[-2, 1, Conv, [256, 1, 1]],
[-1, 1, Conv, [256, 3, 1]],
[-1, 1, Conv, [256, 3, 1]],
[[-1, -2, -3, -4], 1, Concat, [1]],
[-1, 1, Conv, [512, 1, 1]], # 28
]
# YOLOv7-tiny head
head:
[[-1, 1, Conv, [256, 1, 1]],
[-2, 1, Conv, [256, 1, 1]],
[-1, 1, SP, [5]],
[-2, 1, SP, [9]],
[-3, 1, SP, [13]],
[[-1, -2, -3, -4], 1, Concat, [1]],
[-1, 1, Conv, [256, 1, 1]],
[[-1, -7], 1, Concat, [1]],
[-1, 1, Conv, [256, 1, 1]], # 37
[-1, 1, Conv, [128, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[21, 1, Conv, [128, 1, 1]], # route backbone P4
[[-1, -2], 1, Concat, [1]],
[-1, 1, Conv, [64, 1, 1]],
[-2, 1, Conv, [64, 1, 1]],
[-1, 1, Conv, [64, 3, 1]],
[-1, 1, Conv, [64, 3, 1]],
[[-1, -2, -3, -4], 1, Concat, [1]],
[-1, 1, Conv, [128, 1, 1]], # 47
[-1, 1, Conv, [64, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[14, 1, Conv, [64, 1, 1]], # route backbone P3
[[-1, -2], 1, Concat, [1]],
[-1, 1, Conv, [32, 1, 1]],
[-2, 1, Conv, [32, 1, 1]],
[-1, 1, Conv, [32, 3, 1]],
[-1, 1, Conv, [32, 3, 1]],
[[-1, -2, -3, -4], 1, Concat, [1]],
[-1, 1, Conv, [64, 1, 1]], # 57
[-1, 1, Conv, [128, 3, 2]],
[[-1, 47], 1, Concat, [1]],
[-1, 1, Conv, [64, 1, 1]],
[-2, 1, Conv, [64, 1, 1]],
[-1, 1, Conv, [64, 3, 1]],
[-1, 1, Conv, [64, 3, 1]],
[[-1, -2, -3, -4], 1, Concat, [1]],
[-1, 1, Conv, [128, 1, 1]], # 65
[-1, 1, Conv, [256, 3, 2]],
[[-1, 37], 1, Concat, [1]],
[-1, 1, Conv, [128, 1, 1]],
[-2, 1, Conv, [128, 1, 1]],
[-1, 1, Conv, [128, 3, 1]],
[-1, 1, Conv, [128, 3, 1]],
[[-1, -2, -3, -4], 1, Concat, [1]],
[-1, 1, Conv, [256, 1, 1]], # 73
[47, 1, Conv, [64, 3, 1]],
[57, 1, Conv, [128, 3, 1]],
[65, 1, Conv, [256, 3, 1]],
[73, 1, Conv, [512, 3, 1]],
[[74,75,76,77], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
近期有朋友問到對于改進yolov7網(wǎng)絡(luò)結(jié)構(gòu)后增加小目標檢測層,如下所示,yaml文件所涉及的感興趣的朋友可以關(guān)注私信我:
# parameters
nc: 3 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
anchors:
- [ 19,27, 44,40, 38,94 ] # P3/8
- [ 96,68, 86,152, 180,137 ] # P4/16
- [ 140,301, 303,264, 238,542 ] # P5/32
- [ 436,615, 739,380, 925,792 ] # P6/64
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
# [-1,1,CoordAtt,[128]],
[-1, 3, ELANB, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, ELANB, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, ELANB, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, ELANB, [1024]],
[-1, 1, SPPCSPC, [512]],
]
head:
[[-1, 1, SimConv, [256, 1, 1]],
[-1, 1, Transpose, [256]],
[[-1, 6], 1, Concat, [1]],
[-1, 12, RepBlock, [256]],
[-1, 1, SimConv, [256, 1, 1]],
[-1, 1, Transpose, [256]],
[[-1, 4], 1, Concat, [1]],
[-1, 12, RepBlock, [256]],
[-1, 1, SimConv, [128, 1, 1]],
[-1, 1, Transpose, [128]],
[[-1, 2], 1, Concat, [1]],
[-1, 12, RepBlock, [128]], #out
[-1, 1, SimConv, [128, 3, 2]],
[[-1, 18], 1, Concat, [1]],
[-1, 12, RepBlock, [256]], # 20
[-1, 1, SimConv, [128, 3, 2]],
[[-1, 14], 1, Concat, [1]],
[-1, 12, RepBlock, [256]], # 20
[-1, 1, SimConv, [256, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 12, RepBlock, [512]], # 23
[[21,24,27,30], 1, IDetect, [nc, anchors]], # Detect(P3, P4, P5)
]
四、YOLOv5改進方法
YOLOv5改進YOLOv5s.yaml,改進方法參考YOLOv7算法改進。
backbone:
# [from, number, module, args]
[[-1, 1, Focus, [64, 3]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 9, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 3, C3, [1024, False]], # 9
]
# YOLOv5 head
head:
[[-1, 1, Conv, [512, 1, 1]],#20*20
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [512, 1, 1]], #40*40 14
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3 80*80
[-1, 3, C3, [512, False]], # 17 (P3/8-small) 80*80
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 2], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)21
[-1, 1, Conv, [256, 3, 2]],
[[-1, 18], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [256, False]], # 20 (P4/16-medium)24
[-1, 1, Conv, [256, 3, 2]], #22 80*80
[[-1, 14], 1, Concat, [1]], #23 80*80
[-1, 3, C3, [512, False]], #24 80*80
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[21, 24, 27,30], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
?添加小目標檢測層后的模型圖如下所示:
?最后,將train.py中改為本文的yaml文件即可,開始訓(xùn)練。
結(jié) 果:本人在多個數(shù)據(jù)集上做了大量實驗,針對不同的數(shù)據(jù)集效果不同,同一個數(shù)據(jù)集的不同添加位置方法也是有差異,需要大家進行實驗。有效果有提升的情況占大多數(shù)。
預(yù)告一下:下一篇內(nèi)容分享損失函數(shù)的改進。有興趣的朋友可以關(guān)注一下我,有問題可以留言或者私聊我哦
PS:增加檢測層的方法不僅僅是適用改進YOLOv5,也可以改進其他的YOLO網(wǎng)絡(luò),比如YOLOv4、v3等。文章來源:http://www.zghlxwxcb.cn/news/detail-788304.html
最后,有改進相關(guān)問題歡迎關(guān)注私信我。文章來源地址http://www.zghlxwxcb.cn/news/detail-788304.html
到了這里,關(guān)于YOLOv8/YOLOv7/YOLOv5系列算法改進【NO.6】增加小目標檢測層,提高對小目標的檢測效果的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!