文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Attentional Feature Fusion 注意力特征融合

2023-09-16 19:11

关注

最近看到一篇比较不错的特征融合方法,基于注意力机制的 AAF ,与此前的 SENetSKNet 等很相似,但 AFF 性能优于它们,并且适用于更广泛的场景,包括短和长跳连接以及在 Inception 层内引起的特征融合。AFF 是由南航提出的注意力特征融合,即插即用!

本篇博客主要参考自知乎作者 OucQxw ,知乎原文地址:https://zhuanlan.zhihu.com/p/424031096


论文下载地址:https://arxiv.org/pdf/2009.14082.pdf

Github代码地址:https://github.com/YimianDai/open-aff
在这里插入图片描述

一、Motivation

特征融合是指来自不同层次或分支的特征的组合,是现代神经网络体系结构中无所不在的一部分。它通常通过简单线性的操作(例如:求和或者串联来实现),但这可能不是最佳的选择。本文提出了一个统一的通用方案,即注意力特征融合( AFF ),该方案适用于大多数常见场景,包括短和长跳连接以及在 Inception 层内引起的特征融合。

为了更好地融合语义和尺度不一致的特征,我们提出了多尺度通道注意力模块 ( MS-CAM ),该模块解决了融合不同尺度特征时出现的问题。我们还证明了初始特征融合可能会成为瓶颈,并提出了迭代注意力特征融合模块(iAFF )来缓解此问题。

  1. 近年发展的 SKNetResNeSt 注意力特征融合存在的问题:
  1. 本文的贡献,针对于上述三个问题,提出以下解决办法:

二、Method

  1. Multi-scale Channel Attention Module (MS-CAM)

​ MS-CAM 主要是延续 SENet 的想法,再于 CNN 上结合 Local / Global 的特征,并在空间上用 Attention 来 融合多尺度信息 。

MS-CAM 有 2 个较大的不同:

在这里插入图片描述

上图为 MS-CAM 的结构图,X 为输入特征,X' 为融合后的特征,右边两个分支分别表示全局特征的通道注意力和局部特征的通道注意力,局部特征的通道注意力的计算公式 L(X) 如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实现的代码如下:

class MS_CAM(nn.Module):    '''    单特征进行通道注意力加权,作用类似SE模块    '''    def __init__(self, channels=64, r=4):        super(MS_CAM, self).__init__()        inter_channels = int(channels // r)        # 局部注意力        self.local_att = nn.Sequential(            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(inter_channels),            nn.ReLU(inplace=True),            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(channels),        )        # 全局注意力        self.global_att = nn.Sequential(            nn.AdaptiveAvgPool2d(1),            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(inter_channels),            nn.ReLU(inplace=True),            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(channels),        )        self.sigmoid = nn.Sigmoid()    def forward(self, x):        xl = self.local_att(x)        xg = self.global_att(x)        xlg = xl + xg        wei = self.sigmoid(xlg)        return x * wei
  1. Attentional Feature Fusion(AFF

在这里插入图片描述

给定两个特征 X, Y 进行特征融合( Y 代表感受野更大的特征)。

AFF 的计算方法如下:

在这里插入图片描述

对输入的两个特征 X , Y 先做初始特征融合,再将得到的初始特征经过 MS-CAM 模块,经过 sigmod 激活函数,输出值为 0~1 之间,作者希望对 X Y 做加权平均,就用 1 减去这组 Fusion weight ,可以作到 Soft selection ,通过训练,让网络确定各自的权重。

实现的代码如下:

class AFF(nn.Module):    '''    多特征融合 AFF    '''    def __init__(self, channels=64, r=4):        super(AFF, self).__init__()        inter_channels = int(channels // r)        # 局部注意力        self.local_att = nn.Sequential(            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(inter_channels),            nn.ReLU(inplace=True),            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(channels),        )        # 全局注意力        self.global_att = nn.Sequential(            nn.AdaptiveAvgPool2d(1),            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(inter_channels),            nn.ReLU(inplace=True),            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(channels),        )        self.sigmoid = nn.Sigmoid()    def forward(self, x, residual):        xa = x + residual        xl = self.local_att(xa)        xg = self.global_att(xa)        xlg = xl + xg        wei = self.sigmoid(xlg)        xo = x * wei + residual * (1 - wei)        return xo
  1. iterative Attentional Feature Fusion ( iAFF )

在这里插入图片描述

​ 在注意力特征融合模块中,X , Y 初始特征的融合仅是简单对应元素相加,然后作为注意力模块的输入会对最终融合权重产生影响。作者认为如果想要对输入的特征图有完整的感知,只有将初始特征融合也采用注意力融合的机制,一种直观的方法是使用另一个 attention 模块来融合输入的特征。

在这里插入图片描述

公式跟 AFF 的计算一样,仅仅是多加一层attention。

实现的代码如下:

class iAFF(nn.Module):    '''    多特征融合 iAFF    '''    def __init__(self, channels=64, r=4):        super(iAFF, self).__init__()        inter_channels = int(channels // r)        # 局部注意力        self.local_att = nn.Sequential(            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(inter_channels),            nn.ReLU(inplace=True),            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(channels),        )        # 全局注意力        self.global_att = nn.Sequential(            nn.AdaptiveAvgPool2d(1),            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(inter_channels),            nn.ReLU(inplace=True),            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(channels),        )        # 第二次局部注意力        self.local_att2 = nn.Sequential(            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(inter_channels),            nn.ReLU(inplace=True),            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(channels),        )        # 第二次全局注意力        self.global_att2 = nn.Sequential(            nn.AdaptiveAvgPool2d(1),            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(inter_channels),            nn.ReLU(inplace=True),            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),            nn.BatchNorm2d(channels),        )        self.sigmoid = nn.Sigmoid()    def forward(self, x, residual):        xa = x + residual        xl = self.local_att(xa)        xg = self.global_att(xa)        xlg = xl + xg        wei = self.sigmoid(xlg)        xi = x * wei + residual * (1 - wei)        xl2 = self.local_att2(xi)        xg2 = self.global_att(xi)        xlg2 = xl2 + xg2        wei2 = self.sigmoid(xlg2)        xo = x * wei2 + residual * (1 - wei2)        return xo

三、Experiments

这里展示部分实验结果,详细的实验结果请参考原论文。

  1. 为了验证Multi-scale 的作法是否有效,作者设置了Global + Global 和Local + Local两种方法,与Global + Local对比,发现全局+局部的效果还是最优的。

在这里插入图片描述

在这里插入图片描述

  1. 在各种主流网络中,使用本论文中提出的特征融合方法,用于短跳连接、长跳连接、同一层的特征融合中,效果均优于之前的模型。

在这里插入图片描述

  1. 不同的图像分类数据集上,在原有的网络模型中加入本文提出的特征融合方法,并与其原模型进行比较,发现准确率和网络的参数大小都得到了不错的性能提升。

在这里插入图片描述

来源地址:https://blog.csdn.net/L28298129/article/details/126521418

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯