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

目录

学习视频:

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

进行训练即可

  • 28
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
注意力机制可以帮助网络更加关注输入张量中的重要特征,从而提高网络的性能。在神经网络中,注意力机制通常被添加到卷积层或全连接层的输出上。 以下是一种常见的在卷积层输出上添加注意力机制的方法: 1. 在卷积层输出上应用一个全局平均池化层,将每个通道的输出值压缩成一个标量。 2. 将全局平均池化层的输出张量传递给一个全连接层,得到注意力权重向量。 3. 将注意力权重向量与卷积层的输出张量相乘,得到加权的特征张量。 4. 将加权的特征张量传递给下一层网络进行处理。 以下是一个示例代码,展示了如何在 PyTorch 中实现这种注意力机制: ``` import torch.nn as nn import torch.nn.functional as F class AttentionConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride, padding): super(AttentionConv, self).__init__() self.conv_layer = nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, stride=stride, padding=padding, bias=False) self.global_pool_layer = nn.AdaptiveAvgPool2d((1, 1)) self.attention_layer = nn.Sequential( nn.Linear(out_channels, out_channels // 16), nn.ReLU(inplace=True), nn.Linear(out_channels // 16, out_channels), nn.Sigmoid() ) def forward(self, x): # 前向传递输入张量 out = self.conv_layer(x) # 应用全局平均池化层并进行展平操作 out = self.global_pool_layer(out) out = out.view(out.size(0), -1) # 通过全连接层得到注意力权重向量 attention_weights = self.attention_layer(out) # 将注意力权重向量与卷积层的输出张量相乘,得到加权的特征张量 out = out * attention_weights.view(-1, out.size(1), 1, 1) # 将加权的特征张量传递给下一层网络进行处理 out = F.relu(out) return out ``` 在这个示例代码中,AttentionConv 类是一个继承自 nn.Module 的自定义卷积层,其中包含了卷积层、全局平均池化层和注意力层。在类的初始化方法中,先定义了卷积层、全局平均池化层和注意力层,并将它们组合成一个顺序容器。在类的 forward 方法中,先通过卷积层计算出卷积特征图,然后传递给全局平均池化层进行降维操作,得到一个形状为 (batch_size, out_channels, 1, 1) 的张量。这个张量经过一个全连接层,得到注意力权重向量。最后,将注意力权重向量与卷积特征图相乘得到加权的特征张量,然后传递给下一层网络。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值