手把手教你如何修改YOLO11的模型结构(CBAM和可变性卷积为例)
1 环境准备
基础的Conda环境配置和VsCode软件的使用就不说了,站内有很多大佬都有教程,如果你是用的PyCharm 也是差不多的操作。
1.1 获取可供自己编辑的YOLO11源码
要想自己修改模型,首先要获取YOLO11的源码,安装到系统环境中的YOLO11代码尽量不要去动它。
这里如果你不会操作就新建一个conda环境,然后自己安装pytorch。
附pytorch安装教程:➡️【超详细教程】2024最新Pytorch安装教程(同时讲解安装CPU和GPU版本)-CSDN博客
现在,我们去获得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文件去用,要进行导包设置,这都是作者给我们设计好的。
- 在conv.py上把DCNConv模块导出去,在这个文件的最上面
同时 也可以看到作者已经把CBAM这个模块导出了 ,我们导出我们自己的DCNConv模块就行。由此可见,要是你想加的模块,作者已经在conv.py中实现了,那么你既不用自己实现也不用自己导出,就少很多事情。不过自己实现一下也不难就是了。
- 现在是把这个导出了,但距离我们去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网络结构图)-CSDN博客
训练的时候你可能会遇到数据集路径报错的情况,可能是这个原因。
终端输入
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 函数中使用这些参数。