阿旭算法与机器学习 | 【保姆级教程|YOLO11改进】【卷积篇】【6】GSConv混合标准卷积与深度可分离卷积,轻量化同时确保精度与速度提升

本文来源公众号“阿旭算法与机器学习”,仅用于学术分享,侵权删,干货满满。

原文链接:【保姆级教程|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网络结构中的部分卷积进行替换,当然也可以替换C3k2SPPFC2PSA等模块内部替换卷积。此处以替换主干网络结构中的卷积为例。

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 !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值