手把手教你如何修改YOLO11的模型结构(以CBAM和可变性卷积为例)

手把手教你如何修改YOLO11的模型结构(CBAM和可变性卷积为例)

1 环境准备

​ 基础的Conda环境配置和VsCode软件的使用就不说了,站内有很多大佬都有教程,如果你是用的PyCharm 也是差不多的操作。

1.1 获取可供自己编辑的YOLO11源码

​ 要想自己修改模型,首先要获取YOLO11的源码,安装到系统环境中的YOLO11代码尽量不要去动它。

​ 这里如果你不会操作就新建一个conda环境,然后自己安装pytorch。
​ 附pytorch安装教程:➡️【超详细教程】2024最新Pytorch安装教程(同时讲解安装CPU和GPU版本)-优快云博客

​ 现在,我们去获得YOLO11的源码,首先去Github ➡️ ultralytics/ultralytics: Ultralytics YOLO11 🚀

​ 然后,下载代码的压缩包

在这里插入图片描述

​ 下载完成之后解压,然后把文件夹放到vscode中。完成后vscode中就能看到 ultralytics-x.x.xx的项目文件夹了,这个版本号无所谓,这样我们就得到了可编辑的YOLO11的源码。

在这里插入图片描述
​ 这里有人可能需要YOLO11的官方文档,附链接:➡️Home - Ultralytics YOLO Docs

​ 另外一个方法:如果你会使用git操作也可以按照官方文档给的方法操作,把源码克隆下来

git clone https://github.com/ultralytics/ultralytics

​ 然后我们去选择虚拟环境,随便点击一个.py文件就可以再右下角选择虚拟环境了。如果你是第一次使用vscode 点击.py文件后 它会弹出让你安装一个python的扩展,直接安装,安装后就可以选择环境了。 我这里选择我新建的yolo11_2虚拟环境。
在这里插入图片描述

1.2 安装配置文件

​ 在选择完虚拟环境后需要安装配置文件,点击终端,新建终端后,可以发现终端进到了 ultralytics-x.x.xx的项目文件夹中

在这里插入图片描述

​ 然后按照官方文档的操作 在终端中输入

pip install -e .

​ 等待安装完成,如果下载超时可以加上镜像

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -e .

2 模型修改

​ 修改模型,不仅要修改模型的yaml配置文件,还有进入到源码中对具体代码进行修改。

2.1 模型配置文件的修改

​ 我现在要在 模型里面加入一个CBAM的即插即用模块。首先要去模型配置文件中进行修改模型的结构

这里我把原来的yolo11.yaml复制了一份并命名为myyolo11.yaml。然后再进行修改

​ 模型配置文件路径如下

在这里插入图片描述
在这里插入图片描述

​ 修改后的yaml如下:
在这里插入图片描述

​ 可以看到,跟原来的yolo11.yaml相比,在 1 处(第9层处)多加了一个CBAM层 , 那这个配置文件的 1 处后面的层号 应该都要加一层 这个能理解吧 ,比如原来的第11层就 变为了现在的第12层了。

​ 而 2 3 4 这里代表的是 接受哪些层的输出 那原来大于9层的一个就要加一层吧。比如2这个位置 原来接受 -1层(即上一层)和13层的输出,但13层 变为现在的14层了。

​ 这个 args列表后面仔细说怎么处理

​ 这样模型配置文件就改好了,当然还有其他情况,比如加了不止一层的情况,就要更用心的计算层号问题了。

​ 还有就是单纯的把原来的某一层,变为了另外一种模块,没有多加层,这种就不用考虑层号了

2.2 源码的修改

2.2.1 模块的实现和导出

​ 首先先进入到conv.py中

在这里插入图片描述

​ 这里就是要添加或者修改的层的具体实现。比如我的这个CBAM模块,作者已经写了,我们就可以直接用,在文件中的309行。可以ctrl+f 查找CBAM模块

在这里插入图片描述

如果你加的模块是这个conv.py中没有的,就要你自己去实现。

​ 比如我现在要加一个可变性卷积DCNConv模块,假设我已经修改完模型配置文件yaml了。现在应该在conv.py中实现这个作者没有帮我们实现的DCNConv模块。代码如下。

在这里插入图片描述

​ 可以看到,我加的这个DCNConv模块 其实就是在官方给的Conv模块的基础上加了一点东西,它的输入通道数和输出通道数都没有改变。

​ 这个时候还没有完,我们这个模型实现最终要到task.py文件去用,要进行导包设置,这都是作者给我们设计好的。

  1. 在conv.py上把DCNConv模块导出去,在这个文件的最上面

在这里插入图片描述

​ 同时 也可以看到作者已经把CBAM这个模块导出了 ,我们导出我们自己的DCNConv模块就行。由此可见,要是你想加的模块,作者已经在conv.py中实现了,那么你既不用自己实现也不用自己导出,就少很多事情。不过自己实现一下也不难就是了。

  1. 现在是把这个导出了,但距离我们去task还远,这个DCNConv在conv.py导出后会到__init__.py中,这个__init__.py 就是一个中转站,task.py要从它这里导包

在这里插入图片描述

init.py导入

在这里插入图片描述

init.py导出

在这里插入图片描述

2.2.2 解析模块的方法修改

​ 接下来就是实现我们的模块的方法的修改了,首先进入task.py,这个是模块实现相关的文件。

在这里插入图片描述

首先在这里把DCNConv模块或者CBAM模块导入进来

在这里插入图片描述

 找到   parse_model 这个函数  可以ctrl+f搜索

在这里插入图片描述

接下来就是对我们模型的实现的一些特殊处理,这里以CBAM模块为例子。这里面就要把我们前面讲的串联起来了。

​ 下面这段代码就是conv.py中每一个模块的具体实现,我们也把CBAM加入到里面。

在这里插入图片描述

​ 然后对下面的代码进行处理

在这里插入图片描述

​ 相比与原代码

args = [c1, c2, *args[1:]]

我们对 m是CBAM的时候进行了特殊的处理

​ 这里的c1 就是 上一层的输出通道数 表示这一层的输出通道

​ *args[1:] 就是第二个数7

在这里插入图片描述

​ 这里也对应了我们的CBAM模块接受两个参数 c1和 kernel_size 这里c1 既是CBAM的输入通道数 又是输出通道数

在这里插入图片描述

​ 我们在模型配置文件中加CBAM层时加个1024的作用

​ 在task.py中 parse_model 函数 中

在这里插入图片描述

​ 在task.py中 parse_model 方法 中的最后

在这里插入图片描述

​ 这里的c2 就是这个1024 1024表示CBAM这一层输出通道为1024,它要传给下一层,下一层可能会把上层的输出通道数当自己的输入通道数

3 模型训练

​ yolo11的模型训练方法,站内有很多方法,这个就不写了,比较简单。

​ 附一篇链接:➡️YOLOv11来了,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)-优快云博客

​ 训练的时候你可能会遇到数据集路径报错的情况,可能是这个原因。

​ 终端输入

yolo settings 

| 在这里插入图片描述

​ 就是你的数据集 datasets 要在 这个dataset_dir 路径下面

​ 你可以输入

yolo settings reset

​ 还原dataset_dir设置

​ 也可以

yolo settings datasets_dir="数据集路径"

​ 设置路径

4 总结

​ 修改模型要在模型配置文件 和 task.py conv.py 中修改
​ 在task.py的 parse_model 函数中 要对你的模块实现进行特殊处理

aset_dir 路径下面

​ 你可以输入

yolo settings reset

​ 还原dataset_dir设置

​ 也可以

yolo settings datasets_dir="数据集路径"

​ 设置路径

​ 修改模型要在模型配置文件 和 task.py conv.py 中修改
​ 在task.py的 parse_model 函数中 要对你的模块实现进行特殊处理

​ 要理解到模型配置文件 yolo11.yaml中的每个参数意义,在parse_model 函数中使用这些参数。

### 修改YOLO神经网络架构自定义模型结构 #### 了解现有YOLO版本差异 不同版本的YOLO在网络设计上存在显著区别。相比于YOLOv8,新的进版主要将C2f组件替换为C3k2,并引入了注意力机制模块C2PSA来增强特征提取能力[^2]。 #### 定义新层模块 为了创建定制化的YOLO架构,可以先基于现有的框架实现新增加的功能块。比如,在PyTorch中可以通过继承`nn.Module`类来自行编写特定功能的新层: ```python import torch.nn as nn class C3k2(nn.Module): def __init__(self, in_channels, out_channels): super(C3k2, self).__init__() # 实现具体的卷积操作逻辑 def forward(self, x): pass class C2PSA(nn.Module): def __init__(self, channels): super(C2PSA, self).__init__() # 添加注意力机制的具体实现细节 def forward(self, x): pass ``` #### 调整主干网路配置文件 对于Darknet风格的YOLO系列来说,通常会有一个`.cfg`格式的配置文档用于描述整个网络拓扑关系。当要调整或扩展原有结构时,则需编辑此文件中的相应部分以反映所作更如增加一层C3k2单元到某阶段后应如下所示更新路径下的.cfg文件: ``` [convolutional] size=1 stride=1 pad=1 filters=x activation=y batch_normalize=z [C3k2] filters=a ... ``` #### 集成至检测头部 最后一步涉及对预测头(Prediction Head)做出适当变动以便更好地适应前面所做的动。这可能意味着重新设置锚框数量、尺度以及类别数目等超参数;也可能涉及到更复杂的变换如多尺度融合策略的应用。 通过上述方法能够有效地构建出具有独特特性的YOLO变体,从而满足特定应用场景的需求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值