【保姆级教程|YOLO11改进】【卷积篇】【6】DepthwiseConv深度可分离卷积,模型轻量化必备神器

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称项目名称
1.【人脸识别与管理系统开发2.【车牌识别与自动收费管理系统开发
3.【手势识别系统开发4.【人脸面部活体检测系统开发
5.【图片风格快速迁移软件开发6.【人脸表表情识别系统
7.【YOLOv8多目标识别与自动标注软件开发8.【基于深度学习的行人跌倒检测系统
9.【基于深度学习的PCB板缺陷检测系统10.【基于深度学习的生活垃圾分类目标检测系统
11.【基于深度学习的安全帽目标检测系统12.【基于深度学习的120种犬类检测与识别系统
13.【基于深度学习的路面坑洞检测系统14.【基于深度学习的火焰烟雾检测系统
15.【基于深度学习的钢材表面缺陷检测系统16.【基于深度学习的舰船目标分类检测系统
17.【基于深度学习的西红柿成熟度检测系统18.【基于深度学习的血细胞检测与计数系统
19.【基于深度学习的吸烟/抽烟行为检测系统20.【基于深度学习的水稻害虫检测与识别系统
21.【基于深度学习的高精度车辆行人检测与计数系统22.【基于深度学习的路面标志线检测与识别系统
23.【基于深度学习的智能小麦害虫检测识别系统24.【基于深度学习的智能玉米害虫检测识别系统
25.【基于深度学习的200种鸟类智能检测与识别系统26.【基于深度学习的45种交通标志智能检测与识别系统
27.【基于深度学习的人脸面部表情识别系统28.【基于深度学习的苹果叶片病害智能诊断系统
29.【基于深度学习的智能肺炎诊断系统30.【基于深度学习的葡萄簇目标检测系统
31.【基于深度学习的100种中草药智能识别系统32.【基于深度学习的102种花卉智能识别系统
33.【基于深度学习的100种蝴蝶智能识别系统34.【基于深度学习的水稻叶片病害智能诊断系统
35.【基于与ByteTrack的车辆行人多目标检测与追踪系统36.【基于深度学习的智能草莓病害检测与分割系统
37.【基于深度学习的复杂场景下船舶目标检测系统38.【基于深度学习的农作物幼苗与杂草检测系统
39.【基于深度学习的智能道路裂缝检测与分析系统40.【基于深度学习的葡萄病害智能诊断与防治系统
41.【基于深度学习的遥感地理空间物体检测系统42.【基于深度学习的无人机视角地面物体检测系统
43.【基于深度学习的木薯病害智能诊断与防治系统44.【基于深度学习的野外火焰烟雾检测系统
45.【基于深度学习的脑肿瘤智能检测系统46.【基于深度学习的玉米叶片病害智能诊断与防治系统
47.【基于深度学习的橙子病害智能诊断与防治系统48.【基于深度学习的车辆检测追踪与流量计数系统
49.【基于深度学习的行人检测追踪与双向流量计数系统50.【基于深度学习的反光衣检测与预警系统
51.【基于深度学习的危险区域人员闯入检测与报警系统52.【基于深度学习的高密度人脸智能检测与统计系统
53.【基于深度学习的CT扫描图像肾结石智能检测系统54.【基于深度学习的水果智能检测系统
55.【基于深度学习的水果质量好坏智能检测系统56.【基于深度学习的蔬菜目标检测与识别系统
57.【基于深度学习的非机动车驾驶员头盔检测系统58.【太基于深度学习的阳能电池板检测与分析系统
59.【基于深度学习的工业螺栓螺母检测60.【基于深度学习的金属焊缝缺陷检测系统
61.【基于深度学习的链条缺陷检测与识别系统62.【基于深度学习的交通信号灯检测识别
63.【基于深度学习的草莓成熟度检测与识别系统64.【基于深度学习的水下海生物检测识别系统
65.【基于深度学习的道路交通事故检测识别系统66.【基于深度学习的安检X光危险品检测与识别系统
67.【基于深度学习的农作物类别检测与识别系统68.【基于深度学习的危险驾驶行为检测识别系统
69.【基于深度学习的维修工具检测识别系统70.【基于深度学习的维修工具检测识别系统
71.【基于深度学习的建筑墙面损伤检测系统72.【基于深度学习的煤矿传送带异物检测系统
73.【基于深度学习的老鼠智能检测系统74.【基于深度学习的水面垃圾智能检测识别系统
75.【基于深度学习的遥感视角船只智能检测系统76.【基于深度学习的胃肠道息肉智能检测分割与诊断系统
77.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统78.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统
79.【基于深度学习的果园苹果检测与计数系统80.【基于深度学习的半导体芯片缺陷检测系统
81.【基于深度学习的糖尿病视网膜病变检测与诊断系统82.【基于深度学习的运动鞋品牌检测与识别系统
83.【基于深度学习的苹果叶片病害检测识别系统84.【基于深度学习的医学X光骨折检测与语音提示系统
85.【基于深度学习的遥感视角农田检测与分割系统86.【基于深度学习的运动品牌LOGO检测与识别系统
87.【基于深度学习的电瓶车进电梯检测与语音提示系统88.【基于深度学习的遥感视角地面房屋建筑检测分割与分析系统
89.【基于深度学习的医学CT图像肺结节智能检测与语音提示系统90.【基于深度学习的舌苔舌象检测识别与诊断系统
91.【基于深度学习的蛀牙智能检测与语音提示系统92.【基于深度学习的皮肤癌智能检测与语音提示系统

二、机器学习实战专栏【链接】,已更新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)​两步操作,显著降低了参数量和计算复杂度。

原理

  1. 深度卷积(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个通道的特征图。这一步仅提取空间特征,不进行通道间融合。

  2. 逐点卷积(Pointwise Convolution)
    使用 1 × 1 1 \times 1 1×1卷积核将深度卷积的输出通道进行线性组合,生成最终的 C o u t C_{out} Cout个通道。这一步仅处理通道间的信息融合,不涉及空间维度。

作用

  1. 减少计算量和参数量
    通过分解操作,计算量降至传统卷积的约 1 / k 2 + 1 / C o u t 1/k^2 + 1/C_{out} 1/k2+1/Cout,适合资源受限的场景(如移动设备)。
  2. 保持特征表达能力
    深度卷积提取空间特征,逐点卷积融合通道信息,平衡了效率与性能。
  3. 轻量化模型设计
    广泛应用于MobileNet、Xception等轻量级网络,支持实时推理。
  4. 降低过拟合风险
    参数减少有助于提升模型泛化能力。

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网络结构中的部分卷积进行替换,当然也可以替换C3k2SPPFC2PSA等模块内部替换卷积。此处以替换主干网络结构中的卷积为例。

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.免费获取源码

为了小伙伴们能够,更好的学习实践,本文已将所有代码、示例数据集等相关内容打包上传,供小伙伴们学习。获取方式如下:

在这里插入图片描述
后续还会更新更多关于网络结构修改相关内容,感谢点赞关注

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

参考资源链接:[YOLO-Ant:轻量天线干扰源检测器](https://wenku.csdn.net/doc/5ufz5txrbw?utm_source=wenku_answer2doc_content) YOLO-Ant探测器结合了深度可分离卷积和大卷积核的结构,以解决轻量模型在小目标检测方面的挑战。深度可分离卷积是一种高效的卷积操作,它将标准卷积分解成深度卷积和逐点卷积,大幅减少了模型的参数量和计算量,这对于实时性能要求高的应用场景尤其重要。大卷积核则能够在较低的计算成本下捕获更大的空间信息,这在处理小目标时非常关键,因为小目标通常需要更宽的视野来捕捉足够的上下文信息。YOLO-Ant的设计中,深度可分离卷积的引入显著提高了模型轻量化程度,而大卷积核则增强了特征提取的能力,特别是在复杂的通信干扰场景中。这种结合通过DSLK-Block实现,它是一种深度可分离的卷积结构,配合大卷积核的设计使得YOLO-Ant即便在面对天线干扰源等小目标也能保持高检测精度和效率。此外,DSLKVit-Block的引入进一步提升了模型在处理具有复杂背景和大类间差异数据时的能力,这主要得益于其融合了卷积层和变压器结构,能够捕获长距离的依赖关系,增强对上下文的理解。YOLO-Ant模型的这些创新结合不仅提高了检测性能,也保证了模型轻量化,对于5G通信等资源受限的场景尤为适用。如果你希望深入了解YOLO-Ant的结构设计和应用效果,推荐阅读《YOLO-Ant:轻量天线干扰源检测器》。这份资料详细阐述了YOLO-Ant的设计原理、实验结果和应用场景,将帮助你全面理解这一创新性模型的潜力和实现细节。 参考资源链接:[YOLO-Ant:轻量天线干扰源检测器](https://wenku.csdn.net/doc/5ufz5txrbw?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值