本文来源公众号“阿旭算法与机器学习”,仅用于学术分享,侵权删,干货满满。
原文链接:【保姆级教程|YOLO11改进】【卷积篇】【6】GSConv混合标准卷积与深度可分离卷积,轻量化同时确保精度与速度提升
1.引言
本文主要详细介绍如何用更高效的卷积模块替换YOLO11网络结构中的部分常规卷积模块
,从而达到改进性能的目的,供小伙伴们参考。 YOLO11原始网络结构图如下:
2.卷积介绍
关于GSConv混合标准卷积与深度可分离卷积
的源码与详细介绍
可以参考之前分享的文章《【即插即用涨点模块】GSConv混合标准卷积与深度可分离卷积:轻量化同时确保精度与速度提升【附源码】》,此处不再赘述。
3.源码修改步骤
使用的ultralytics版本号:ultralytics==8.3.127
在YOLO11源码中添加并修改相应的模块内容,用于后续网络结构配置文件的修改,详细步骤如下:
1. 新建文件
在YOLO11源码的ultralytics/nn
的目录下新建Convs
文件用于存放所有的卷积相关源码
,然后在Convs
目录下新建GSConv.py
文件,并将卷积源码
【见第2节】复制到该文件中。
在ultralytics/nn/Convs
目录下新建__init__.py
文件,并导入模块。如下:
2.修改task.py文件
首先在ultralytics/nn/tasks.py
中导入已经创建好的卷积模块。
然后,在ultralytics/nn/tasks.py
中搜索parse_model
网络结构解析函数。
在parse_model
函数中的base_modules
集合里加上模块名称即可,用于解析我们新建的模块内容
,如下:
到此,所有的源码修改部分到此结束。下面我们就可以在我们的网络结构中,进行相应的模块配置。
4.修改网络配置文件
下面我们对YOLO11网络结构中的部分卷积进行替换,当然也可以替换C3k2
、SPPF
、C2PSA
等模块内部替换卷积。此处以替换主干网络结构中的卷积为例。
1. 在替换主干中的卷积
我们在ultralytics/cfg/models/11
下新建一个网络结构配置文件yolo11-RFAConv.yaml
。然后写入如下内容:
# Parameters
nc: 80# number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.50, 0.25, 1024] # summary: 181 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
s: [0.50, 0.50, 1024] # summary: 181 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
m: [0.50, 1.00, 512] # summary: 231 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
l: [1.00, 1.00, 512] # summary: 357 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
x: [1.00, 1.50, 512] # summary: 357 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs
# YOLO11n 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, 2, C3k2, [256, False, 0.25]]
- [-1, 1, GSConv, [256, 3, 2]] # 3-P3/8
- [-1, 2, C3k2, [512, False, 0.25]]
- [-1, 1, GSConv, [512, 3, 2]] # 5-P4/16
- [-1, 2, C3k2, [512, True]]
- [-1, 1, GSConv, [1024, 3, 2]] # 7-P5/32
- [-1, 2, C3k2, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
- [-1, 2, C2PSA, [1024]] # 10
# YOLO11n head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 2, C3k2, [512, False]] # 13
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)
- [-1, 1, GSConv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4
- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)
- [-1, 1, GSConv, [512, 3, 2]]
- [[-1, 10], 1, Concat, [1]] # cat head P5
- [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)
- [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)
修改前后网络结构对比如下:
5.模型训练
使用修改后的模型网络结构进行模型训练,只需修改一下网络结构配置文件路径model_yaml_path
即可。
#coding:utf-8
from ultralytics import YOLO
import matplotlib
matplotlib.use('TkAgg')
# 模型配置文件
model_yaml_path = "ultralytics/cfg/models/11/yolo11-GSConv.yaml"
#数据集配置文件
data_yaml_path = 'datasets/GrapeData/data.yaml'
if __name__ == '__main__':
#加载预训练模型
model = YOLO(model_yaml_path)
#训练模型
results = model.train(data=data_yaml_path,
epochs=150, # 训练轮数
batch=4, # batch大小
name='train_v11', # 保存结果的文件夹名称
optimizer='SGD') # 优化器
运行后网络结构打印如下:
可以发现,网络结构已经按照我们的修改方式正常执行。
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。