文章目录
- 前言
- 🎓一、YOLOv9原始版本代码下载
- 🍀🍀1.yolov9模型结构图
- 🍀🍀2.环境配置
- 🎓二、GAM代码
- 🎓三、在YOLOv9添加GAM代码
- 🍀🍀1.在modules目录下添加上述的GAM代码
- 🍀🍀2.在__init__.py文件导入GAM模块,
- 🍀🍀3.在yolo.py文件导入改进的模块
- 🎓四、yaml文件修改
- 🍀🍀1.在头部添加
- 🎓五、训练文件修改
- 总结
前言
全局注意力机制(GAM),通过减少信息减少和放大全局交互表示来提高深度神经网络的性能。引入了带有多层感知器的 3D 排列,用于通道注意力以及卷积空间注意力子模块,GAM注意机制理论详解可以参考链接: 论文地址)
🎓一、YOLOv9原始版本代码下载
源码下载地址 :链接: link
官网打不开的话,从我的网盘下载就行,链接: 源码下载
提取码: eajp
🍀🍀1.yolov9模型结构图
根据yolov9.yaml画出yolo整体结构图,如下图所示
🍀🍀2.环境配置
环境配置参考教程链接:链接: 看第三章YOLO环境配置,如果已经配置好环境可以忽略此步骤
🎓二、GAM代码
# -*- coding: utf-8 -*-
"""
@Auth : 挂科边缘
@File :GAM.py
@IDE :PyCharm
@Motto:学习新思想,争做新青年
@Email :179958974@qq.com
@qq :179958974
"""
import torch.nn as nn
class GAM(nn.Module):
def __init__(self, in_channels, rate=4):
super(GAM, self).__init__()
self.channel_attention = nn.Sequential(
nn.Linear(in_channels, int(in_channels / rate)),
nn.ReLU(inplace=True),
nn.Linear(int(in_channels / rate), in_channels)
)
self.spatial_attention = nn.Sequential(
nn.Conv2d(in_channels, int(in_channels / rate), kernel_size=7, padding=3),
nn.BatchNorm2d(int(in_channels / rate)),
nn.ReLU(inplace=True),
nn.Conv2d(int(in_channels / rate), in_channels, kernel_size=7, padding=3),
nn.BatchNorm2d(in_channels)
)
def forward(self, x):
b, c, h, w = x.shape
x_permute = x.permute(0, 2, 3, 1).view(b, -1, c)
x_att_permute = self.channel_attention(x_permute).view(b, h, w, c)
x_channel_att = x_att_permute.permute(0, 3, 1, 2).sigmoid()
x = x * x_channel_att
x_spatial_att = self.spatial_attention(x).sigmoid()
out = x * x_spatial_att
return out
🎓三、在YOLOv9添加GAM代码
🍀🍀1.在modules目录下添加上述的GAM代码
在models目录下,新建一个python文件包,取名为newmodels,如下图所示
然后在newmodels文件夹下,新建一个python文件,我这里取名为GAM.py,把上面代码复制进去,如图所示
🍀🍀2.在__init__.py文件导入GAM模块,
文件路径为:models/newmodels/init.py,在__init__.py开头导入GAM,导入代码如下:
from .GAM import GAM
🍀🍀3.在yolo.py文件导入改进的模块
该文件路径为:models/yolo.py,在开头导入python包就行,因为newmodels是一个python工具包,以后改进的模型只需在newmodels文件夹下新建就行,然后在yolo.py只需要导入一次就行,添加如截图所示
之后在这个文件的parse_model方法,添加GAM,如果有其它注意机制添加到{}里面就行,添加如截图所示
elif m in {GAM}:
args=[ch[f],*args]
看到这里已经成功把改进的模块添加进YOLOv9源码了,接下来配置yaml文件调用改进的模块就行了
🎓四、yaml文件修改
在models/detect目录下,新建一个yaml文件,复制yolov9.yaml文件,然后取名为yolov9-GAM.yaml,我这个文件代码如下所示:
你也在其它地方添加,即插即用,多多实验出结果
🍀🍀1.在头部添加
我新增的层是第38层,是head最后一层,所以检测头连接37层的参数需要连接到新增的38层,即37改为38,需要+1,这个根据你前面新增的层数进行叠加
yolov8-CA.yaml全部代码如下:
# YOLOv9
# parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
#activation: nn.LeakyReLU(0.1)
activation: nn.ReLU()
# anchors
anchors: 3
# YOLOv9 backbone
backbone:
[
[-1, 1, Silence, []],
# conv down
[-1, 1, Conv, [64, 3, 2]], # 1-P1/2
# conv down
[-1, 1, Conv, [128, 3, 2]], # 2-P2/4
# elan-1 block
[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 3
# conv down
[-1, 1, Conv, [256, 3, 2]], # 4-P3/8
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 5
# conv down
[-1, 1, Conv, [512, 3, 2]], # 6-P4/16
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 7
# conv down
[-1, 1, Conv, [512, 3, 2]], # 8-P5/32
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 9
]
# YOLOv9 head
head:
[
# elan-spp block
[-1, 1, SPPELAN, [512, 256]], # 10
# up-concat merge
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 7], 1, Concat, [1]], # cat backbone P4
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 13
# up-concat merge
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 5], 1, Concat, [1]], # cat backbone P3
# elan-2 block
[-1, 1, RepNCSPELAN4, [256, 256, 128, 1]], # 16 (P3/8-small)
# conv-down merge
[-1, 1, Conv, [256, 3, 2]],
[[-1, 13], 1, Concat, [1]], # cat head P4
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 19 (P4/16-medium)
# conv-down merge
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 22 (P5/32-large)
# routing
[5, 1, CBLinear, [[256]]], # 23
[7, 1, CBLinear, [[256, 512]]], # 24
[9, 1, CBLinear, [[256, 512, 512]]], # 25
# conv down
[0, 1, Conv, [64, 3, 2]], # 26-P1/2
# conv down
[-1, 1, Conv, [128, 3, 2]], # 27-P2/4
# elan-1 block
[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]], # 28
# conv down fuse
[-1, 1, Conv, [256, 3, 2]], # 29-P3/8
[[23, 24, 25, -1], 1, CBFuse, [[0, 0, 0]]], # 30
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]], # 31
# conv down fuse
[-1, 1, Conv, [512, 3, 2]], # 32-P4/16
[[24, 25, -1], 1, CBFuse, [[1, 1]]], # 33
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 34
# conv down fuse
[-1, 1, Conv, [512, 3, 2]], # 35-P5/32
[[25, -1], 1, CBFuse, [[2]]], # 36
# elan-2 block
[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]], # 37
[-1, 1, GAM, []], # 38
# detect
[[31, 34, 38, 16, 19, 22], 1, DualDDetect, [nc]], # DualDDetect(A3, A4, A5, P3, P4, P5)
]
🎓五、训练文件修改
在项目里找到train_dual.py文件,
1.在’–weights参数的defaut处设置为空,
2.在’–cfg’参数的defaut处设置填改进的模型配置文件路径,
3.在’–data’参数的default处设置为数据集配置文件路径。
4.‘–hyp’参数可以默认
4.’–epochs’中的参数设置为100,表示需经过100轮训练。
5.’–batch-size’表示一次训练所抓取的数据样本数量,其大小影响训练速度和模型优化,此处将其参数设置为4,根据自己电脑性能设置大一些也是可以的
前面五个参数是常用参数,需要注意的是’–weights参数可以留空,就是不需要权重,从头训练,一般做科研改进工作时候可以不用预训练权重
测试一下训练,打印出来的YOLOv9结构可以看到添加GAM注意机制成功
总结
请在我提供的YOLOv9代码修改,把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,谢谢观看