《------往期经典推荐------》
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
1.引言
本文主要详细介绍如何用更高效的卷积模块替换YOLO11网络结构中的部分常规卷积模块
,从而达到改进性能的目的,供小伙伴们参考。
YOLO11原始网络结构图如下:
2.卷积介绍
深度可分离卷积(Depthwise Separable Convolution)最早由Laurent Sifre在2013年提出,并在其博士论文《Rigid-motion scattering for image classification》中进行了详细分析和实验
。这一概念最初是为了解决传统卷积计算量大的问题,通过将标准卷积分解为深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)
两步操作,显著降低了参数量和计算复杂度。
原理
-
深度卷积(Depthwise Convolution)
对输入特征图的每个通道独立应用一个卷积核,即每个通道单独进行空间卷积。假设输入有 C i n C_{in} Cin个通道,则使用 C i n C_{in} Cin个 k × k k \times k k×k的卷积核,输出 C i n C_{in} Cin个通道的特征图。这一步仅提取空间特征,不进行通道间融合。 -
逐点卷积(Pointwise Convolution)
使用 1 × 1 1 \times 1 1×1卷积核将深度卷积的输出通道进行线性组合,生成最终的 C o u t C_{out} Cout个通道。这一步仅处理通道间的信息融合,不涉及空间维度。
作用
- 减少计算量和参数量
通过分解操作,计算量降至传统卷积的约 1 / k 2 + 1 / C o u t 1/k^2 + 1/C_{out} 1/k2+1/Cout,适合资源受限的场景(如移动设备)。 - 保持特征表达能力
深度卷积提取空间特征,逐点卷积融合通道信息,平衡了效率与性能。 - 轻量化模型设计
广泛应用于MobileNet、Xception等轻量级网络,支持实时推理。 - 降低过拟合风险
参数减少有助于提升模型泛化能力。
3.源码修改步骤
使用的ultralytics版本号:ultralytics==8.3.127
在YOLO11源码中添加并修改相应的模块内容,用于后续网络结构配置文件的修改,详细步骤如下:
1. 新建文件
在YOLO11源码的ultralytics/nn
的目录下新建Convs
文件用于存放所有的卷积相关源码
,然后在Convs
目录下新建DWSConv.py
文件,并将卷积源码
复制到该文件中。
在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-DWSConv.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, DWSConv, [256, 3, 2]] # 3-P3/8
- [-1, 2, C3k2, [512, False, 0.25]]
- [-1, 1, DWSConv, [512, 3, 2]] # 5-P4/16
- [-1, 2, C3k2, [512, True]]
- [-1, 1, DWSConv, [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, DWSConv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4
- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)
- [-1, 1, DWSConv, [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-DWSConv.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') # 优化器
运行后网络结构打印如下:
可以发现,网络结构已经按照我们的修改方式正常执行。
原始结构与改进后结构的计算量与参数量对比如下,参数量降低23%,计算量降低19%。
YOLO11 summary: 181 layers, 2,590,035 parameters, 2,590,019 gradients, 6.4 GFLOPs
YOLO11-DWSConv summary: 181 layers, 2,004,691 parameters, 2,004,675 gradients, 5.2 GFLOPs
6.免费获取源码
为了小伙伴们能够,更好的学习实践,本文已将所有代码、示例数据集等相关内容打包上传,供小伙伴们学习。获取方式如下:
后续还会更新更多关于网络结构修改相关内容,感谢点赞关注
好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!