yolov5添加注意力机制的具体步骤(代码片段)

萝北村的枫子 萝北村的枫子     2023-04-07     644

关键词:

本文以CBAM和SE注意力机制的添加过程为例,主要介绍了向YOLOv5中添加注意力机制的具体步骤

本文在此篇博客的基础上向YOLOv5-5.0版本代码中添加注意力机制
yolov5模型训练———使用yolov5训练自己的数据集

本文主要包括以下内容

YOLOv5加入注意力机制可分为以下三个步骤:
1.common.py中加入注意力模块
2.yolo.py中增加判断条件
3.yaml文件中添加相应模块

一、CBAM注意力机制添加

(1)在common.py中添加可调用的CBAM模块

1.打开models文件夹中的common.py文件

2.将下面的CBAMC3代码复制粘贴到common.py文件中

class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
        self.relu = nn.ReLU()
        self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
        # 写法二,亦可使用顺序容器
        # self.sharedMLP = nn.Sequential(
        # nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False), nn.ReLU(),
        # nn.Conv2d(in_planes // rotio, in_planes, 1, bias=False))

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.f2(self.relu(self.f1(self.avg_pool(x))))
        max_out = self.f2(self.relu(self.f1(self.max_pool(x))))
        out = self.sigmoid(avg_out + max_out)
        return torch.mul(x, out)


class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()

        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
        padding = 3 if kernel_size == 7 else 1

        self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        out = torch.cat([avg_out, max_out], dim=1)
        out = self.sigmoid(self.conv(out))
        return torch.mul(x, out)


class CBAMC3(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super(CBAMC3, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)
        self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
        self.channel_attention = ChannelAttention(c2, 16)
        self.spatial_attention = SpatialAttention(7)

        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
   		# 将最后的标准卷积模块改为了注意力机制提取特征
        return self.spatial_attention(
            self.channel_attention(self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))))

如下图所示,本文这里是将其粘贴到了common.py的末尾
(图片长度过长,所以截取了两张,以及记得点击保存)

(2)向yolo.py文件添加CBAMC3判断语句

1.打开models文件夹中的yolo.py文件

2.分别在218行和224行添加CBAMC3,如下图所示



同样改完之后记得点保存

(3)修改yaml文件

注意力机制可以添加在backbone,Neck,Head等部分,大家可以在yaml文件中修改网络的结构、添加其他模块等等,接下来本文将以向主干网络(backbone)添加CBAM模块为例,本文介绍的只是其中一种添加方式

1.在yolov5-5.0工程文件夹下,找到models文件夹下的yolov5s.yaml文件

2.backbone主干网络中的4个C3模块改为CBAMC3,如下图所示:


这样我们就在yolov5s主干网络中添加了CBAM注意力机制
(在服务器上跑代码修改后,记得点击文本编辑器右上角的保存

接下来开始训练模型,我们就可以看到CBAMC3模块已经成功添加到主干网络中了

二、SE注意力机制添加

(步骤和CBAM相似)

(1)在common.py中添加可调用的SE模块

1.打开models文件夹中的common.py文件

2.将下面的SE代码复制粘贴到common.py文件中

class SE(nn.Module):
    def __init__(self, c1, c2, r=16):
        super(SE, self).__init__()
        self.avgpool = nn.AdaptiveAvgPool2d(1)
        self.l1 = nn.Linear(c1, c1 // r, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.l2 = nn.Linear(c1 // r, c1, bias=False)
        self.sig = nn.Sigmoid()
    def forward(self, x):
        print(x.size())
        b, c, _, _ = x.size()
        y = self.avgpool(x).view(b, c)
        y = self.l1(y)
        y = self.relu(y)
        y = self.l2(y)
        y = self.sig(y)
        y = y.view(b, c, 1, 1)
        return x * y.expand_as(x)

如下图所示,本文这里是将其粘贴到了common.py的末尾

(2)向yolo.py文件添加SE判断语句

1.打开models文件夹中的yolo.py文件

2.分别在218行和224行添加SE,如下图所示

同样改完之后记得点保存

(3)修改yaml文件

注意力机制可以添加在backbone,Neck,Head等部分,大家可以在yaml文件中修改网络的结构、添加其他模块等等。与CBAM的添加过程一样,接下来本文将以向主干网络(backbone)添加SE模块为例,本文介绍的只是其中一种添加方式

1.在yolov5-5.0工程文件夹下,找到models文件夹下的yolov5s.yaml文件

2.backbone主干网络末尾添加下面的代码,如下图所示:
(注意逗号是英文,以及注意对齐)

[-1, 1, SE, [1024, 4]],


这样我们就在yolov5s主干网络中添加了SE注意力机制
(在服务器上跑代码修改后,记得点击文本编辑器右上角的保存

接下来开始训练模型,我们就可以看到SE模块已经成功添加到主干网络中了

三、其他几种注意力机制代码

添加过程不再赘述,模仿上方CBAM和SE的添加过程即可

(1)ECA注意力机制代码

 class eca_layer(nn.Module):
     """Constructs a ECA module.
     Args:
         channel: Number of channels of the input feature map
         k_size: Adaptive selection of kernel size
     """
     def __init__(self, channel, k_size=3):
         super(eca_layer, self).__init__()
         self.avg_pool = nn.AdaptiveAvgPool2d(1)
         self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)
         self.sigmoid = nn.Sigmoid()
 
     def forward(self, x):
         # feature descriptor on the global spatial information
         y = self.avg_pool(x)
 
         # Two different branches of ECA module
         y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)
 
         # Multi-scale information fusion
         y = self.sigmoid(y)
         x=x*y.expand_as(x)
 
         return x * y.expand_as(x)

(2)CA注意力机制代码:

 class h_sigmoid(nn.Module):
     def __init__(self, inplace=True):
         super(h_sigmoid, self).__init__()
         self.relu = nn.ReLU6(inplace=inplace)
 
     def forward(self, x):
         return self.relu(x + 3) / 6
 
 
 class h_swish(nn.Module):
     def __init__(self, inplace=True):
         super(h_swish, self).__init__()
         self.sigmoid = h_sigmoid(inplace=inplace)
 
     def forward(self, x):
         return x * self.sigmoid(x)
 
 
 class CoordAtt(nn.Module):
     def __init__(self, inp, oup, reduction=32):
         super(CoordAtt, self).__init__()
         self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
         self.pool_w = nn.AdaptiveAvgPool2d((1, None))
 
         mip = max(8, inp // reduction)
 
         self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)
         self.bn1 = nn.BatchNorm2d(mip)
         self.act = h_swish()
 
         self.conv_h = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)
         self.conv_w = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)
 
     def forward(self, x):
         identity = x
 
         n, c, h, w = x.size()
         x_h = self.pool_h(x)
         x_w = self.pool_w(x).permute(0, 1, 3, 2)
 
         y = torch.cat([x_h, x_w], dim=2)
         y = self.conv1(y)
         y = self.bn1(y)
         y = self.act(y)
 
         x_h, x_w = torch.split(y, [h, w], dim=2)
         x_w = x_w.permute(0, 1, 3, 2)
 
         a_h = self.conv_h(x_h).sigmoid()
         a_w = self.conv_w(x_w).sigmoid()
 
         out = identity * a_w * a_h
 
         return out

yolov5添加注意力机制pytorch(代码片段)

我的YOLOv5版本为6.0需要修改的两个文件如下:./models/yolo5s_SE-Net.yaml./models/commom.py1.yolo5s_SE-Net.yaml文件yolo5s_SE-Net.yaml修改自文件yolo5s.yamlyolo5s.yaml文件内容为:#YOLOv5 查看详情

yolov5-6.1添加注意力机制(secbamecaca)(代码片段)

...加方法主要步骤:(1)在models/common.py中注册注意力模块(2)在models/yolo.py中的parse_model函数中添加注意力模块(3)修改配置文件yolov5s.yaml(4)运行yolo.py进行验证各个注意力机制模块的添加方... 查看详情

手把手带你yolov5(v6.1)添加注意力机制(二)(在c3模块中加入注意力机制)(代码片段)

之前在《手把手带你Yolov5(v6.1)添加注意力机制(并附上30多种顶会Attention原理图)》文章中已经介绍过了如何在主干网络里添加单独的注意力层,今天这篇将会介绍如何在C3模块里面加入注意力层。文章目录1.添加方式... 查看详情

yolov7改进--添加cbam注意力机制(代码片段)

YOLOV7改进--添加CBAM注意力机制CBAM注意力机制代码在commen.py中添加CBAM模块在yolo.py中添加CBAM模块名在cfg文件中添加CBAM信息因为项目需要,尝试在yolov7上加入CBAM注意力机制,看看能不能提升点性能。之前有在yolov5上添加CBAM... 查看详情

yolov7改进--添加cbam注意力机制(代码片段)

YOLOV7改进--添加CBAM注意力机制CBAM注意力机制代码在commen.py中添加CBAM模块在yolo.py中添加CBAM模块名在cfg文件中添加CBAM信息因为项目需要,尝试在yolov7上加入CBAM注意力机制,看看能不能提升点性能。之前有在yolov5上添加CBAM... 查看详情

yolov5v7改进之三十二:引入skattention注意力机制(代码片段)

 前言:作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv7的如... 查看详情

yolov5改进之加入cbam,se,eca,ca,simam,shuffleattention,criss-crossattention,crisscrossattention多种注意力机制(代码片

...到的yolov5网络为6.1版本(6.0-6.2均适用)yolov5加入注意力机制模块的三个标准步骤(适用于本文中的任何注意力机制)1.common.py中加入注意力机制模块2.yolo.py中增加对应的注意力机制关键字3.yaml文件中添加相应模块... 查看详情

神经网络加上注意力机制,精度不升反降?(代码片段)

之前写过两篇YOLOv5+各种注意力机制的文章,收到了大家很多的反馈,这篇博文就简单针对这些问题讨论一下:为什么我添加了注意力模块以后精度反而下降了?在什么位置添加注意力模块比较好?同一种或... 查看详情

手把手带你yolov5/v7添加注意力机制(并附上30多种顶会attention原理图)2023/2/11更新(代码片段)

...d6;🌟,您的点赞是对我最大的鼓励~神经网络加上注意力机制,精度不升反降?大家好,我是迪菲赫尔曼😁,我最近将本人硕士阶段所有学习的计算机视觉基础知识进行了一个系统性的整理,编写... 查看详情

yolox改进之一:添加cbamseeca注意力机制(代码片段)

...智能AI算法工程师 解决问题:本文以加入CBAM双通道注意力机制为例,可以让网络更加关注待检测目标,提高检测效果,解决复杂环境背景下容易错漏检的情况。添加方法:第一步:确定添加的位置,... 查看详情

yolov5添加辅助训练头(代码片段)

1.介绍思路添加Auxhead的主要原因是让网络中间层学到更多信息,有更丰富的梯度信息帮助训练。这里要注意,好的梯度信息能够让相同参数量的网络学的更好。作者原文为:Bylettingtheshallowerauxiliaryheaddirectlylearntheinformationthatleadhea... 查看详情

改进yolov5系列:增加swin-transformer小目标检测头(代码片段)

...ackbone特征主干】、【Neck特征融合】、【Head检测头】、【注意力机制】、【IoU损失函数】、【NMS】、【Loss计算方式】、【自注意力机制】、【数据增强部分】、【标签分配策略】、【激活函数】等各个部分。本篇 查看详情

改进yolov7系列:最新结合即插即用ca(coordinateattention)注意力机制(适用于yolov5),cvpr2021顶会助力分类检测涨点!(代码片段)

...模块来构建不同的YOLO目标检测模型。论文所提的Coordinate注意力很简单,可以灵活地插入到经典的移动网络中,而且几乎没有计算开销。大量实验表明,Coordinate注意力不仅有益于ImageNet分类,而且更有趣的是,... 查看详情

改进yolov5系列:8.增加acmix结构的修改,自注意力和卷积集成(代码片段)

...的改进方式,降低改进难度,改进点包含Backbone、Neck、Head、注意力机制、IoU损失函数、NMS、L 查看详情

目标检测yolov5改进系列:主干网络中添加se注意力机制网络

...并在通道维度上进行融合而得到。SEnet就是对通道维度的注意力机制,上面介绍了通道特征是对空间特征FeatueMap的融合。其实同一个通道维度的不同的FeatureMap是用着不同的重要程度的,也就是说对于同一个FeatureMap里面的信息权... 查看详情

yolov5训练步骤及安全帽检测(代码片段)

环境部署问题、训练后无法识别问题都有介绍注意事项一、说明系统uname-ar:ubuntu18.0.4(Linuxubuntu5.4.0-122-generic)64bit显卡lspci:GeForceGT1030nvidia版本:NVIDIA-Linux-x86_64-470.129.06.run(该网址搜索下载:https://www.n 查看详情

yolov5训练步骤及安全帽检测(代码片段)

环境部署问题、训练后无法识别问题都有介绍注意事项一、说明系统uname-ar:ubuntu18.0.4(Linuxubuntu5.4.0-122-generic)64bit显卡lspci:GeForceGT1030nvidia版本:NVIDIA-Linux-x86_64-470.129.06.run(该网址搜索下载:https://www.n 查看详情

yolov5改进助力涨点

...YOLOv5改进损失函数(EIOU、alphaIOU等)📈添加注意力机制(CBAM、SE等)📌结合最新特征金字塔网络结构(最新论文改进方法)📃增加小目标检测层,提高模型对小目标物体的识别能力🏀... 查看详情