FcaNet: Frequency Channel Attention Networks论文总结和代码详解

news2024/12/23 10:26:26

论文:https://arxiv.org/abs/2012.11879

中文版:FcaNet: Frequency Channel Attention Networks

源码:https://github.com/cfzd/FcaNet或https://gitee.com/yasuo_hao/FcaNet

目录

一、论文背景和出发点

二、创新点

三、离散余弦变换(DCT)和通道注意力

四、Multi-Spectral Channel Attention的具体实现

五、频率分量的选择标准

六、Multi-Spectral Channel Attention代码实现

七、实验

八、总结


一、论文背景和出发点

问题:许多工作都集中在如何设计高效的通道注意机制上,而忽略了一个基本问题,即由于大量的信息丢失,通道注意机制使用标量来表示通道会很困难。(传统的GAP操作,即“平均”操作会极大的抑制特征的多样性,而且会造成大量信息的丢失。)

出发点:在这项工作中,我们从不同的角度出发,将信道表示问题视为使用频率分析的压缩过程。基于频率分析,我们从数学上证明了传统的全局平均池是频域特征分解的一个特例。(为使用离散余弦变换压缩信道提供了可能性。)

有了这些证明,我们自然地推广了信道注意机制在频域中的压缩,并提出了我们的多谱信道注意方法,称为FcaNet。(传统的GAP操作压缩通道的效果不好,因此作者提出使用离散余弦变换(DCT)来压缩信道。)

简单地来说,作者将通道注意力视为一个压缩问题,传统的方式使用全局平均化池会造成大量信息丢失,所以作者建议在信道注意力机制中使用离散余弦变换(DCT)来压缩通道。

二、创新点

1. 证明了传统GAP(全局平均化池)是DCT(离散余弦变换)的特例。

2. 提出了三种频率分量选择标准以及建议的多光谱信道注意力框架,以实现FcaNet。

3. 大量实验表明,该方法在ImageNet和COCO数据集上都取得了最先进的结果,计算成本与SENet相同。在ImageNet数据集上的结果,如下图所示:

三、离散余弦变换(DCT)和通道注意力

1. 离散余弦变换DCT

作用:

(1)2维DCT的基函数

(2)2维DCT

 其中f^{2d}\in \mathbb{R}^{H\times W}是2维DCT频谱,x^{2d}\in \mathbb{R}^{H\times W}是输入图像,Hx^{2d}的高度,Wx^{2d}的宽度,B^{i,j}是2维DCT的基函数,h ∈ { 0, 1, · · · , H−1 },w ∈ { 0, 1, · · · , W−1 }。

(3)逆2维DCT

2. 通道注意力

传统方式的阐述,以SE模块为例。

(1)注意力向量

其中,att\in \mathbb{R}^C是注意力向量,sigmoid是sigmoid函数,fc代表映射函数,如全连接层或一维卷积,compress:R^{C\times H\times W}\mapsto R^C是一种压缩方法(SE模块中使用全局平均池化GAP)。详情可参考:SENet的Squeeze操作和Excitation操作。

(2)缩放

在获得所有通道的注意力向量后,输入X的每个通道按相应的注意力值进行缩放:

其中,X̃是注意力机制的输出,att_i是注意力向量的第i个元素,X_{:,i,:,:}是输入图像的第i个通道。详情可参考:SENet的Scale操作。

3. 证明:GAP是2D-DCT的特例

将2维DCT公式中的h和w都置为0,得到:

f^{2d}_{0,0}表示最低频率分量与gap函数成正比,由上式可见,gap函数是2维DCT的一种特例。

结论在信道注意机制中使用GAP意味着只保留最低频率的信息。

推广:除了低频信息以外,其他频率的所有分量也表示信道的有用信息不应被遗弃,所以作者提出在注意力机制中将GAP推广到2D DCT,并用2D DCT的多个频率分量压缩更多信息。

四、Multi-Spectral Channel Attention的具体实现

多光谱通道注意力模块,如下图所示:

1. 分割

沿通道维度方向将输入X分成\left [ X_0,X_1,\cdots ,X_{n-1} \right ]

其中,X_i \in R^{C' \times H \times W} , i \in \{0, 1,\cdots , n-1\}, C' = \frac{C}{n},通道数C被分为了n份。

2. 压缩

对于每个X_i,分配相应的2D-DCT频率分量用作每个X_i的压缩,得到的{Freq}^i构成通道注意力的各个分量。

 其中,[u_i,v_i]是对应于X^i的频率分量2维指数,{Freq}^i \in {\mathbb{R}^{C'}}是压缩后的C'维向量。

3. 拼接

对每个{Freq}^i进行拼接操作,得到多光谱向量。

其中,Freq\in R^C是获得的多光谱向量。

4. 多光谱通道注意力

为了获取通道注意力,多光谱向量还要经过全连接层和sigmoid处理。整个多光谱通道注意力框架可以表示为:

获取到通道注意力之后的步骤与SEnet基本一致。

五、频率分量的选择标准

如何为每个X_i选择频率分量指数[u_i,v_i]是一个重要问题,作者提出了三个选择标准。

1. FcaNet LF(低频)

只选择低频分量。

2. FcaNet TS(两步选择)

第一步:分别评估通道注意力中每个频率分量的结果。

第二步:根据评估结果,我们选择了性能最高的Top-k频率分量。

3. FcaNet NAS(神经结构搜索)

使用神经结构搜索来搜索信道的最佳频率分量。

对于每个X_i,将一组连续变量\alpha =\{\alpha(u,v)\}配给搜索组件。该X_i的频率分量可以表示为:

其中O是包含所有2D DCT频率分量索引的集合。训练后,X_i的频率分量等于\{\alpha(u,v)\}中的最大值。

六、Multi-Spectral Channel Attention代码实现

步骤

1. 先选择标准频率分量,主要是获取频率分量对应的h、w,源码中使用mapper_x,mapper_y表示。

2. 通过数学公式构建dct波滤器,源码如下:

    def build_filter(self, pos, freq, POS):
        result = math.cos(math.pi * freq * (pos + 0.5) / POS) / math.sqrt(POS) 
        if freq == 0:
            return result
        else:
            return result * math.sqrt(2)
    
    def get_dct_filter(self, tile_size_x, tile_size_y, mapper_x, mapper_y, channel):
        dct_filter = torch.zeros(channel, tile_size_x, tile_size_y)

        c_part = channel // len(mapper_x)

        for i, (u_x, v_y) in enumerate(zip(mapper_x, mapper_y)):
            for t_x in range(tile_size_x):
                for t_y in range(tile_size_y):
                    # 构建DCT核对应数学公式
                    dct_filter[i * c_part: (i+1)*c_part, t_x, t_y] = self.build_filter(t_x, u_x, tile_size_x) * self.build_filter(t_y, v_y, tile_size_y)
                        
        return dct_filter

3.  dct波滤器与输入图像X进行点乘,注意这里的dct波滤器是一组波滤器,与输入图像X进行点乘,实际上是每一个X_i与其对应的dct波滤器进行点乘,点乘完成之后就完成了H->H'的降维过程,再经过torch.sum(x, dim=[2,3])消去X的长、宽,即可得到一个通道注意力向量。

class MultiSpectralDCTLayer(nn.Module):
    """
    Generate dct filters
    """
    def __init__(self, height, width, mapper_x, mapper_y, channel):
        super(MultiSpectralDCTLayer, self).__init__()
        
        assert len(mapper_x) == len(mapper_y)
        assert channel % len(mapper_x) == 0

        self.num_freq = len(mapper_x)

        # fixed DCT init
        # 返回一组DCT滤波器,用于加强特征和降维
        self.register_buffer('weight', self.get_dct_filter(height, width, mapper_x, mapper_y, channel))
        
        # fixed random init
        # self.register_buffer('weight', torch.rand(channel, height, width))

        # learnable DCT init
        # self.register_parameter('weight', self.get_dct_filter(height, width, mapper_x, mapper_y, channel))
        
        # learnable random init
        # self.register_parameter('weight', torch.rand(channel, height, width))

        # num_freq, h, w

    def forward(self, x):
        assert len(x.shape) == 4, 'x must been 4 dimensions, but got ' + str(len(x.shape))
        # n, c, h, w = x.shape
        # 降维,通道数减少
        x = x * self.weight
        # 消去x的2,3维
        result = torch.sum(x, dim=[2,3])
        return result

这篇博文有部分代码的详细注解:FcaNet从频域角度重新思考CV注意力机制

七、实验

数据集:ImageNet,COCO数据集。

网络:ResNet-34、ResNet-50、ResNet-101和ResNet-152。

1. 在ImageNet上不同注意力方法的比较

 在相同的计算成本下,FcaNet优于对比的不同注意力方法。

2. 在CoCo上不同注意力方法的比较

  在不同的数据集上,FcaNet依然优于对比的不同注意力方法。

八、总结

在本文中,研究了通道注意力的一个基本问题,即如何表示通道,并将此问题视为一个压缩过程。证明了GAP是DCT的一个特例,并提出了具有多谱注意力模块的FcaNet,它在频域上推广了现有的信道注意力机制。同时,在多谱框架中探索了频率分量的不同组合,并提出了频率分量选择的三个标准。在相同数量的参数和计算成本的情况下,本文提出的方法可以始终优于SENet。与其他通道注意力方法相比,我们在图像分类、对象检测和实例分割方面也取得了最先进的性能。此外,FcaNet简单而有效。本文提出的方法可以在现有信道注意力方法的基础上,只需更改几行代码即可实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FastDFS-图灵

1. 分布式文件系统应用场景 互联网海量非结构化苏剧的存储需求 电商网站:海量商品图片视频网站:海量视频文件网盘:海量文件社交网站:海量图片 2.FastDFS介绍 https://github.com/happyfish100/fastdfs 2.1 简介 FastDFS是一个…

(转载)支持向量机(support vector machine, SVM)的分类(matlab实现)

支持向量机(support vector machine,SVM)是一种新的机器学习方法,其基础是Vapnik 创建的统计学习理论(statistical learning theory,STL)。统计学习理论采用结构风险最小化(structural risk minimization,SRM)准则,在最小化样本点误差的同时,…

Redis进阶 - Redis主从

原文首更地址,阅读效果更佳! Redis进阶 - Redis主从 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-master-slave.html 搭建主从架构 单节点 Redis 的并发能力是有上限的,要进一步提高 Redis 的并发能力&am…

CSS3技巧35:滚动的条纹背景

感觉好久没更博客了,虽然我经常登录看下粉丝数。O(∩_∩)O 端午节摆烂,休息了下,恢复下元气。 节后开始满负荷工作。 ---------------------------正文开始------------------------------------------ 做进度条的时候,有时候会…

Tomcat【部署zrlog】

目录 目录 1、单节点部署zrlog【192.168.200.121】 1.1、 创建数据库、远程登录用户 1.2、 浏览器访问 2、 LB集群-构建-部署zrlog-NFS共享存储 2.1、 安装、配置LB【192.168.200.120】 2.2、 NFS-资源共享【192.168.200.125】 3、配置tomcat访问日志中记录真实IP 1、单…

[元带你学: eMMC协议详解 20] emmc的命令(cmd)、响应(resp)详解

依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 8100字, 主要内容 对eMMC的command进行详细介绍,主要包含如下内容: (1) emmc命令有哪些 (2) 使用不同命…

Java POI (1)—— 数据读写操作快速入门

一、Excel的版本区别(03版和07版) 所谓“03版” 和 “07版”,指的是 Microsoft Excel 版本号。这些版本号代表着不同的Excel 文件格式。2003版 Excel 使用的文件格式为 .xls,而2007版开始使用新的文件格式 .xlsx。 . xlsx 文件格式…

Unreal 5 蓝图常用的一些节点和规范

命名规范 蓝图类以 BP_作为前缀 对应Blue Print 混合空间以 BS_作为前缀 Blend Space 静态网格体以 SM_作为前缀 StaticMesh 骨骼网格体以 SK_作为前缀 Skeletal Mesh 纹理以 T_作为前缀 Texture 粒子系统 以 PS_作为前缀 Particle System 主材质以 M_作为前缀 Material 材质子…

手术机器人常见骨科手术 TKA UKA HTO

TKA UKA HTO 首先这几种手术都是常见的手术,下面先进行常见的但要介绍: 近年来有大量的研究聚焦于手术方式的对比,这里先就现有证据对「HTO」、单髁置换「UKA」和全膝置换「TKA」做一个简要的总结,以便于速查: TKA 不…

熵权法步骤及例题讲解

一、基本原理 在信息论中,熵是对不确定性的一种度量。不确定性越大,熵就越大,包含的信息量越大;不确定性越小,熵就越小,包含的信息量就越小。 根据熵的特性,可以通过计算熵值来判断一个事件的随…

【玩转Linux操作】详细讲解shell的注释,变量,字符串,数组等操作

🎊专栏【玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题🥰 文章目录 🍔概述⭐注意⭐示例🏳️‍🌈然…

scala的基本语法

注释 对于scala的注释,简而言之就是一句话,和java的注释一模一样 基本语法 (1)单行注释:// (2)多行注释:/* */ (3)文档注释:/****/代码示例&…

samaphore、countdownlatch、cyclinarrier

目录 一、samaphore 1、介绍 2、应用 3、原理 二、countdownlatch 三、cyclicbarrier 一、samaphore 1、介绍 信号量,用来限制同时访问共享资源的线程上限。可以理解为停车场入口的提示排,标识有多少车位,有车位才能进去停车&#xf…

ElasticSearch-使用IK分词器进行分词

使用KIbana测试IK分词器 打开开发工具台 ik_smart 最少分词器 分词结果比较少 GET _analyze{"analyzer": "ik_smart","text": "中国共产党"}ik_max_word 颗粒度最细分词器 分词结果比较多,组成各种结果,穷尽词库的可能&#xff01…

easypan前端学习

文章目录 前端项目node 版本node镜像构建项目创建项目安装项目所有依赖 图片资源网站encodeURI & decodeURIapp.config.globalProperties与getCurrentInstanceObject.assignvue-cookies安装vue-cookies 使用vue-cookiesrouter.currentRoutepreserve logimport.meta.envRequ…

QPaint绘制图形

流程 继承QWidget类&#xff0c;重写paintEvent方法&#xff0c;在其中使用QPainter进行绘图。 举例 创建项目&#xff0c;项目结构如下&#xff1a; // widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget…

TypeScript ~ TS 掌握编译文件配置项 ⑥

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

git 上传下载

文章目录 gitee/GitHub 是用来做什么的&#xff1f;什么时候需要学习上传项目到 gitee&#xff1f;为什么要将本地项目上传到 gitee&#xff1f;创建 gitee 仓库&#xff1a;在本地新建一个项目将仓库拉取到本地使用 idea 实现项目的上传下载gitee 仓库查看 下面我就来为大家介…

第六章 习题(6789B)【计算机系统结构】

第六章 习题【计算机系统结构】 前言推荐第六章 习题678911 最后 前言 2023-6-24 10:43:46 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 第五章 作业&#xff08;149A&#xff09;【计算机系统结构】 答案参考&#xff1a; https://www.docin.com/p-28456…

LVDS (Low Voltage Differential Signaling)基础知识

LVDS(Low Voltage Differential Signaling&#xff09;: 是一种小振幅差分信号技术&#xff0c;它使用非常低的幅度信号 (250mV~450mv&#xff09;通过一对平行的 PCB 走线或平衡电缆传输数据。 在两条平行的差分信号线上流经的电流及电压振幅相反&#xff0c;噪声信号同时耦…