Press "Enter" to skip to content

YOLOv7改进之二十三:引入SimAM无参数注意力

​前 言:作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv7的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。由于出到YOLOv7,YOLOv5算法2020年至今已经涌现出大量改进论文,这个不论对于搞科研的同学或者已经工作的朋友来说,研究的价值和新颖度都不太够了,为与时俱进,以后改进算法以YOLOv7为基础,此前YOLOv5改进方法在YOLOv7同样适用,所以继续YOLOv5系列改进的序号。另外改进方法在YOLOv5等其他算法同样可以适用进行改进。希望能够对大家有帮助。

 

需要更多程序资料以及答疑欢迎大家关注——微信公众号:人工智能AI算法工程师

 

解决问题:中山大学在注意力机制方面的尝试,从神经科学理论出发,构建了一种能量函数挖掘神经元重要性,并对此推导出了解析解以加速计算。通过ImageNet分类、COCO检测与分割等任务验证了所提SimAM的灵活性与有效性。值得一提的是,所提SimAM是一种无参数注意力模块。

 

原理:

 

论文: SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks (mlr.press)

 

与现有的通道关注模块和空间关注模块相比,我们的模块无需向原始网络添加参数,而是在一层中推断特征图的3-D关注权重。具体来说,我们基于一些着名的神经科学理论,提出优化一个能量函数来发现每个神经元的重要性。我们进一步推导出能量函数的快速封闭形式的解,并表明该解可以在不到十行代码中实现。该模块的另一个优点是,大多数算子是根据定义的能量函数的解来选择的,避免了在结构调整上花费太多精力。通过对各种视觉任务的定量评估,证明了该模块的灵活性和有效性,提高了许多ConvNets的表达能力。

 

 

项目部分代码如下:

 

import torch
import torch.nn as nn
 
 
class simam_module(torch.nn.Module):
    def __init__(self, channels = None, e_lambda = 1e-4):
        super(simam_module, self).__init__()
 
        self.activaton = nn.Sigmoid()
        self.e_lambda = e_lambda
 
    def __repr__(self):
        s = self.__class__.__name__ + '('
        s += ('lambda=%f)' % self.e_lambda)
        return s
 
    def forward(self, x):
 
        b, c, h, w = x.size()
        
        n = w * h - 1
 
        x_minus_mu_square = (x - x.mean(dim=[2,3], keepdim=True)).pow(2)
        y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2,3], keepdim=True) / n + self.e_lambda)) + 0.5
 
        return x * self.activaton(y)

 

结 果:本人在多个数据集上做了大量实验,针对不同的数据集效果不同,涨点明显。

 

预告一下:下一篇内容将继续分享深度学习算法相关改进方法。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦

 

PS:该方法不仅仅是适用改进YOLOv5,也可以改进其他的YOLO网络以及目标检测网络,比如YOLOv7、v6、v4、v3,Faster rcnn ,ssd等。

 

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注