[YOLOv7/YOLOv5系列算法改进NO.1]添加SE注意力机制

 前      言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是在处理一些复杂背景问题的时候,还是容易出现错漏检的问题。此后的系列文章,将重点对YOLOv5的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。

解决问题:加入SE通道注意力机制,可以让网络更加关注待检测目标,提高检测效果

SE模块的原理和结构

添加方法:

第一步:确定添加的位置,作为即插即用的注意力模块,可以添加到YOLOv5网络中的任何地方。本文以添加进C3模块中为例。

第二步:common.py构建融入se模块的C3,与原C3模块不同的是,该模块中的bottleneck中融入se模块。这样添加主要为了更好的做实验。

class seC3(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(seC3, 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)  # act=FReLU(c2)
        self.m = nn.Sequential(*[seBottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])
        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))

class seBottleneck(nn.Module):
    # Standard bottleneck
    def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansion
        super(seBottleneck, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_, c2, 3, 1, g=g)
        self.add = shortcut and c1 == c2
        self.avgpool = nn.AdaptiveAvgPool2d(1)
        self.l1 = nn.Linear(c1, c1 // 4, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.l2 = nn.Linear(c1 // 4, c1, bias=False)
        self.sig = nn.Sigmoid()

    def forward(self, x):
        x = self.cv1(x)
        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)
        x = x * y.expand_as(x)
        return x + self.cv2(x) if self.add else self.cv2(self.cv1(x))

第三步:yolo.py中注册我们进行修改的seC3

        if m in [Conv, GhostConv, Bottleneck, Bottleneck_cot,TransformerC3,GhostBottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP,
                 C3,seC3]:
            c1, c2 = ch[f], args[0]
            if c2 != no:  # if not output
                c2 = make_divisible(c2 * gw, 8)
            args = [c1, c2, *args[1:]]
            if m in [BottleneckCSP, seC3]:
                args.insert(2, n)  # number of repeats
                n = 1

第四步:修改yaml文件,本文以修改主干特征提取网络为例,将原C3模块改为seC3即可。

第五步:将train.py中改为本文的yaml文件即可,开始训练。

 结    果:本人在多个数据集上做了大量实验,针对不同的数据集效果不同,同一个数据集的不同添加位置方法也是有差异,需要大家进行实验。有效果有提升的情况占大多数。

预告一下:下一篇内容分享自己研究生期间第一篇中文核心期刊的发表。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦

PS:SE通道注意力机制,参数量引入较少,不仅仅是可以添加进YOLOv5,也可以添加进任何其他的深度学习网络,不管是分类还是检测还是分割,主要是计算机视觉领域,都可能会有不同程度的提升效果。

最后,希望能互粉一下,做个朋友,一起学习交流。

  • 29
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
YOLO(You Only Look Once)是一种实时目标检测算法YOLOv8、YOLOv7YOLOv5是在YOLO算法基础上进行了改进的版本。 YOLOv8是YOLOv7改进版本,主要的改进点在于改进网络架构和骨干网络。YOLOv8使用了Darknet53骨干网络,通过堆叠多个卷积层来提取特征。此外,YOLOv8还引入了SPP结构(Spatial Pyramid Pooling)来捕捉不同尺度的特征。它还采用了FPN(Feature Pyramid Network)来融合多层次的特征信息,以增加目标检测的准确性和鲁棒性。 YOLOv7相较于YOLOv8,改进点在于网络架构和损失函数。YOLOv7使用了YOLO9000的骨干网络Darknet19,并使用了Anchor Box来预测目标位置和大小。此外,YOLOv7还引入了Focal Loss来解决目标检测中类别不平衡的问题。Focal Loss能够更加关注困难样本,使得目标检测更加准确。 YOLOv5YOLO的最新改进版本,相较于YOLOv4,它主要改进了网络架构和训练策略。YOLOv5使用了CSPDarknet53作为骨干网络,它可以提取更加丰富的特征。此外,YOLOv5还引入了PANet结构来融合不同层次的特征。此外,YOLOv5采用了自适的训练策略,可以根据不同的目标检测任务自动调整模型大小和数据增强程度,从而提升了目标检测的性能和速度。 综上所述,YOLOv8、YOLOv7YOLOv5都是在YOLO算法基础上进行了不同程度的改进,通过改进网络架构、骨干网络和训练策略等方面来提升目标检测的准确性和效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人工智能算法研究院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值