YOLO目标检测创新改进与实战案例专栏
专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLO基础解析+创新改进+实战案例
摘要
在本文中,我们提出了一种概念上简单但非常有效的卷积神经网络(ConvNets)注意力模块。与现有的通道注意力和空间注意力模块不同,我们的模块为特征图推断3D注意力权重,而无需向原始网络添加参数。具体来说,我们基于一些知名的神经科学理论,提出通过优化能量函数来找出每个神经元的重要性。我们进一步推导出一个快速的闭式解,并展示该解可以在不到十行代码中实现。该模块的另一个优点是大多数操作符是基于能量函数的解选择的,避免了大量结构调整的工作。对各种视觉任务的定量评估表明,所提出的模块灵活且有效,可以提高许多卷积神经网络的表示能力。我们的代码可在 Pytorch-SimAM 获取。
文章链接
论文地址:论文地址
代码地址:代码地址
基本原理
SimAM(Simple Attention Module)是一种简单且无参数的注意力模块,用于卷积神经网络(Convolutional Neural Networks,ConvNets)。SimAM的设计灵感源自哺乳动物大脑中的神经科学理论,特别是基于已建立的空间抑制理论设计了一个能量函数来实现这一理论。SimAM通过推导出一个简单的解决方案来实现这个函数,进而将该函数作为特征图中每个神经元的注意力重要性。该注意力模块的实现受到这个能量函数的指导,避免了过多的启发式方法。SimAM通过推断特征图的3D注意力权重,优化能量函数以找到每个神经元的重要性,从而在各种视觉任务上提高性能。
- 基于空间抑制理论设计能量函数:SimAM利用空间抑制理论设计了一个能量函数,用于计算每个神经元的注意力重要性。
- 推导简单解决方案:为了实现这个能量函数,SimAM推导出了一个简单的解决方案,使得实现过程更加高效。
实现注意力权重:通过计算得到的注意力重要性,SimAM可以为每个神经元分配相应的注意力权重,从而提高特征图的表征能力。
SimAM 的计算公式如下:
$$ w_i = \frac{1}{k} \sum_{j \in N_i} s(f_i, f_j) $$
公式说明:
- w_i 是第 i 个像素的注意力权重
- k 是归一化常数
- N_i 是第 i 个像素的相邻像素集合
- s(f_i, f_j) 是第 i 个像素和第 j 个像素之间的相似性
核心代码
import torch
import torch.nn as nn
class SimAM(torch.nn.Module):
def __init__(self, channels=None, e_lambda=1e-4):
super(SimAM, self).__init__()
# 初始化Sigmoid激活函数和e_lambda参数
self.activation = nn.Sigmoid() # Sigmoid激活函数用于映射输出到(0, 1)之间
self.e_lambda = e_lambda # 控制分母的平滑参数
def __repr__(self):
# 返回模型的字符串表示,包括e_lambda参数的值
s = self.__class__.__name__ + '('
s += ('lambda=%f)' % self.e_lambda)
return s
@staticmethod
def get_module_name():
# 静态方法,返回模型的名称
return "simam"
def forward(self, x):
# 前向传播函数,接收输入张量x,返回处理后的张量
b, c, h, w = x.size() # 获取输入张量的batch大小、通道数、高度和宽度
n = w * h - 1 # 计算像素数量减一,用于标准化
# 计算每个像素与平均值的差的平方
x_minus_mu_square = (x - x.mean(dim=[2, 3], keepdim=True)).pow(2)
# 计算SimAM激活函数的输出
# 分子部分:每个像素的平方差除以分母的加权平均
# 加上0.5是为了映射输出到(0.5, 1)之间
y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2, 3], keepdim=True) / n + self.e_lambda)) + 0.5
# 返回经过SimAM激活函数处理后的特征图
return x * self.activation(y)
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/140083301