最新創(chuàng)新點改進推薦
-??統(tǒng)一使用 YOLO 代碼框架,結(jié)合不同模塊來構(gòu)建不同的YOLO目標檢測模型。
?? 《芒果書》系列改進專欄內(nèi)的改進文章,均包含多種模型改進方式,均適用于YOLOv3
、YOLOv4
、 YOLOR
、 YOLOX
、YOLOv5
、 YOLOv7
、 YOLOv8
改進(重點)?。?!
?? 專欄創(chuàng)新點教程 均有不少同學反應(yīng)和我說已經(jīng)在自己的數(shù)據(jù)集上有效漲點啦?。?包括COCO數(shù)據(jù)集也能漲點
所有文章博客均包含 改進源代碼部分,一鍵訓練即可
?? 對應(yīng)專欄訂閱的越早,就可以越早使用原創(chuàng)創(chuàng)新點
去改進模型,搶先一步
點擊查看詳情:YOLOv5改進、YOLOv7改進|YOLO改進超過50種注意力機制,全篇共計30萬字(內(nèi)附改進源代碼),原創(chuàng)改進50種Attention注意力機制和Transformer自注意力機制
芒果書 點擊以下鏈接 查看文章目錄詳情??
-
??????:一、CSDN原創(chuàng)《芒果改進YOLO高階指南》強烈改進漲點推薦!??推薦指數(shù):??????????
-
??????:二、CSDN原創(chuàng)YOLO進階 | 《芒果改進YOLO進階指南》改進漲點推薦!??推薦指數(shù):??????????
-
??????:三、CSDN獨家全網(wǎng)首發(fā)專欄 | 《目標檢測YOLO改進指南》改進漲點推薦!推薦指數(shù):??????????
一、理論部分
這個模塊比較簡單,就直接上代碼了.
C2f模塊來自YOLOv8系列,本質(zhì)上改進借鑒了YOLOv7核心模塊
的思想,所以這個嚴格來說不算改進。
YOLOv5作者
和 YOLOv8作者
是用一個作者,所以沒必要基于YOLOv5
加這個了…作者本身就是基于 YOLOv5 改進得到的 YOLOv8
就簡單試一下效果吧
這個 C2f 模塊
中存在 Split 等操作對特定硬件部署沒有之前那么友好
圖中C2f模塊就是ultralytics改進的模塊
C2f模塊結(jié)合了C3模塊以及ELAN模塊的思想設(shè)計
圖源:https://github.com/ultralytics/ultralytics/issues/189
二、將其應(yīng)用到Y(jié)OLOv7中
配置文件
增加以下yolov7_c2f.yaml文件
代碼演示
# YOLOv5 ?? by YOLOAir, GPL-3.0 license
# parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel iscyy multiple
# anchors
anchors:
- [12,16, 19,36, 40,28] # P3/8
- [36,75, 76,55, 72,146] # P4/16
- [142,110, 192,243, 459,401] # P5/32
# yolov7 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [32, 3, 1]], # 0
[-1, 1, Conv, [64, 3, 2]], # 1-P1/2
[-1, 1, Conv, [64, 3, 1]],
[-1, 1, Conv, [128, 3, 2]], # 3-P2/4
[-1, 1, C2f, [128]],
[-1, 1, Conv, [256, 3, 2]],
[-1, 1, MP, []],
[-1, 1, Conv, [128, 1, 1]],
[-3, 1, Conv, [128, 1, 1]],
[-1, 1, Conv, [128, 3, 2]],
[[-1, -3], 1, Concat, [1]], # 16-P3/8
[-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, 1, Conv, [128, 3, 1]],
[-1, 1, Conv, [128, 3, 1]],
[[-1, -3, -5, -6], 1, Concat, [1]],
[-1, 1, Conv, [512, 1, 1]],
[-1, 1, MP, []],
[-1, 1, Conv, [256, 1, 1]],
[-3, 1, Conv, [256, 1, 1]],
[-1, 1, Conv, [256, 3, 2]],
[[-1, -3], 1, Concat, [1]],
[-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, 1, Conv, [256, 3, 1]],
[-1, 1, Conv, [256, 3, 1]],
[[-1, -3, -5, -6], 1, Concat, [1]],
[-1, 1, Conv, [1024, 1, 1]],
[-1, 1, MP, []],
[-1, 1, Conv, [512, 1, 1]],
[-3, 1, Conv, [512, 1, 1]],
[-1, 1, Conv, [512, 3, 2]],
[[-1, -3], 1, Concat, [1]],
[-1, 1, C2f, [1024]],
[-1, 1, Conv, [256, 3, 1]],
]
# yolov7 head
head:
[[-1, 1, SPPCSPC, [512]],
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[31, 1, Conv, [256, 1, 1]],
[[-1, -2], 1, Concat, [1]],
[-1, 1, C2f, [128]],
[-1, 1, Conv, [128, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[18, 1, Conv, [128, 1, 1]],
[[-1, -2], 1, Concat, [1]],
[-1, 1, C2f, [128]],
[-1, 1, MP, []],
[-1, 1, Conv, [128, 1, 1]],
[-3, 1, Conv, [128, 1, 1]],
[-1, 1, Conv, [128, 3, 2]],
[[-1, -3, 44], 1, Concat, [1]],
[-1, 1, C2f, [256]],
[-1, 1, MP, []],
[-1, 1, Conv, [256, 1, 1]],
[-3, 1, Conv, [256, 1, 1]],
[-1, 1, Conv, [256, 3, 2]],
[[-1, -3, 39], 1, Concat, [1]],
[-1, 3, C2f, [512]],
# 檢測頭 -----------------------------
[49, 1, RepConv, [256, 3, 1]],
[55, 1, RepConv, [512, 3, 1]],
[61, 1, RepConv, [1024, 3, 1]],
[[62,63,64], 1, IDetect, [nc, anchors]], # Detect(P3, P4, P5)
]
核心代碼
./models/common.py文件增加以下模塊
class Bottlenecks(nn.Module):
# Standard bottleneck
def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5): # ch_in, ch_out, shortcut, groups, kernels, expand
super().__init__()
c_ = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, c_, k[0], 1)
self.cv2 = Conv(c_, c2, k[1], 1, g=g)
self.add = shortcut and c1 == c2
def forward(self, x):
return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
class C2f(nn.Module):
# CSP Bottleneck with 2 convolutions
def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansion
super().__init__()
self.c = int(c2 * e) # hidden channels
self.cv1 = Conv(c1, 2 * self.c, 1, 1)
self.cv2 = Conv((2 + n) * self.c, c2, 1) # optional act=FReLU(c2)
self.m = nn.ModuleList(Bottlenecks(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))
def forward(self, x):
y = list(self.cv1(x).split((self.c, self.c), 1))
y.extend(m(y[-1]) for m in self.m)
return self.cv2(torch.cat(y, 1))
其他配置
找到./models/yolo.py
文件下里的parse_model
函數(shù),將類名加入進去
for i, (f, n, m, args) in enumerate(d[‘backbone’] + d[‘head’]):`內(nèi)部
對應(yīng)位置 下方只需要增加 代碼文章來源:http://www.zghlxwxcb.cn/news/detail-445104.html
參考代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-445104.html
elif m in [C2f]:
c1, c2 = ch[f], args[0]
if c2 != no: # if not output
c2 = make_divisible(c2 * gw, 8)
args = [c1, c2]
if m in [C2f]:
args.insert(2, n) # number of repeats
n = 1
運行配置
python train.py --cfg yolov7_c2f.yaml
到了這里,關(guān)于YOLOv7改進主干結(jié)構(gòu)系列:結(jié)合豐富的梯度流信息模塊,來自YOLOv8的核心模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!