yolov7+SE注意力机制(个人备忘录)

该文介绍了如何在YOLOV7中添加注意力机制,包括在卷积和Concat操作中使用SEAttention模块的详细步骤,涉及修改网络结构图、源代码以及配置文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

学习视频:

yolov7各网络模型的结构图详解:

首先要了解网络结构对应部分

1.添加注意力机制在卷积里面

添加注意力机制代码链接:

添加SE注意力机制为例

步骤:

2.添加注意力机制在Concat里面

也以SE注意力机制为例

步骤

总结:想在哪里加注意力机制就修改对应的位置代码


学习视频:

 YOLOV7改进-添加注意力机制_哔哩哔哩_bilibili

yolov7各网络模型的结构图详解:

yolov7各个模型的网络结构图(最详细)_yolo网络结构图_Mrs.Gril的博客-CSDN博客

首先要了解网络结构对应部分

要知道哪里互相对应才方便改进,我用的是yolov7

那么下两张图相互对应,六个卷积,然后concat,然后一个卷积

 

 那么下图颜色框标注分别为颜色对应的层,对应网络结构图↓

 

1.添加注意力机制在卷积里面

 添加到三个特征层输出的地方

添加注意力机制代码链接:

objectdetection_script/cv-attention at master · z1069614715/objectdetection_script (github.com)

步骤:

复制代码前40行,在models文件夹下新建SE.py文件,粘贴进去

对models文件夹下的common.py文件进行修改,在前面导入SE

from models.SE import SEAttention

然后找到下图位置

在这个类下面加上

class Conv_ATT(nn.Module):
    # Standard convolution
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
        super(Conv_ATT, self).__init__()
        self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
        self.bn = nn.BatchNorm2d(c2)
        self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        self.att = SEAttention(c2)

    def forward(self, x):
        return self.att(self.act(self.bn(self.conv(x))))

    def fuseforward(self, x):
        return self.att(self.act(self.conv(x)))

然后找到SPPCSPC类

在这个类下面加上

class SPPCSPC_ATT(nn.Module):
    # CSP https://github.com/WongKinYiu/CrossStagePartialNetworks
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5, k=(5, 9, 13)):
        super(SPPCSPC_ATT, self).__init__()
        c_ = int(2 * c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(c_, c_, 3, 1)
        self.cv4 = Conv(c_, c_, 1, 1)
        self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])
        self.cv5 = Conv(4 * c_, c_, 1, 1)
        self.cv6 = Conv(c_, c_, 3, 1)
        self.cv7 = Conv(2 * c_, c2, 1, 1)
        self.att = SEAttention(c2)

    def forward(self, x):
        x1 = self.cv4(self.cv3(self.cv1(x)))
        y1 = self.cv6(self.cv5(torch.cat([x1] + [m(x1) for m in self.m], 1)))
        y2 = self.cv2(x)
        return self.att(self.cv7(torch.cat((y1, y2), dim=1)))

这里self.att = SEAttention(c2),c2是通道数,如果是SimAM这种不需要通道数的,就用空括号,不写c2,各个注意力机制的通道数链接:

objectdetection_script/cv-attention at master · z1069614715/objectdetection_script · GitHub

然后

在cfg文件夹的training文件夹下,复制yolov7.yaml到新建的yolov7att.yaml文件中

修改第42行第56行,把Conv改为Conv_ATT

修改第75行将SPPCSPC换为SPPCSPC_ATT

 然后在models文件夹下的yolo.py文件修改

在n = max(round(n * gd),1) if n>1 else n这段最后加上Conv_ATT, SPPCSPC_ATT记得加逗号

 修改结束,可以训练了,记得改cfg用的是yolov7att.yaml

2.添加注意力机制在Concat里面

步骤

同样的道理,与添加1的前面步骤一样

复制代码前40行,在models文件夹下新建SE.py文件,粘贴进去

对models文件夹下的common.py文件进行修改,在前面导入SE

from models.SE import SEAttention

在modles文件夹中找到common.py文件的class Concat类

 在这类下面加上如下代码

class Concat_ATT(nn.Module):
    def __init__(self, channel, dimension=1):
        super(Concat_ATT, self).__init__()
        self.d = dimension
        self.att = SEAttention(channel)

    def forward(self, x):
        return self.att(torch.cat(x, self.d))

然后在models文件夹下的yolo.py文件中找到elif m is Concat:

在箭头所指这行下面 加入

        elif m is Concat_ATT:
            c2 = sum([ch[x] for x in f])
            args = [c2]

然后修改yolov7att.yaml文件中的头部,将四个Concat都改成Concat_ATT

进行训练即可

YOLOv7是一个基于YOLO系列的目标检测算法,它在YOLOv3的基础上进行了改进。要为YOLOv7添加注意力机制,可以参考以下步骤: 1. 网络结构调整:首先,你需要修改YOLOv7的网络结构,以便添加注意力机制。一种常见的做法是在主干网络的某些层之间插入注意力模块。你可以选择将注意力模块添加到YOLOv7的特征提取层,如Darknet-53网络的某些卷积层。 2. 定义注意力模块:接下来,你需要定义一个注意力模块来实现注意力机制。常见的注意力模块包括SENet和CBAM等。这些模块通常包括一个全局池化层、一个全连接层和一个激活函数层。你可以根据自己的需求选择适合的注意力模块。 3. 特征融合:注意力机制通常用于增强特征的表达能力。在YOLOv7中,你可以通过将注意力模块应用于特征图上的不同通道来实现特征融合。可以使用加权求和的方式将注意力模块输出的特征与原始特征进行融合。 4. 训练和测试:完成以上步骤后,你可以使用带有注意力机制YOLOv7进行训练和测试。在训练过程中,你需要根据自己的数据集和任务进行适当的调整。在测试阶段,你可以使用注意力机制来增强目标检测的性能。 需要注意的是,以上只是添加注意力机制的一种常见方法,具体实现可能会因应用场景和需求的不同而有所差异。因此,你可以根据自己的实际情况进行适当的调整和改进。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值