ICCV 2021 | FcaNet: Frequency Channel Attention Networks 中的频率分析

2024-04-27 12:28

本文主要是介绍ICCV 2021 | FcaNet: Frequency Channel Attention Networks 中的频率分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ICCV 2021 | FcaNet: Frequency Channel Attention Networks 中的频率分析

  • 论文:https://arxiv.org/abs/2012.11879
  • 代码:https://github.com/cfzd/FcaNet

文章是围绕 2D 的 DCT 进行展开的,本文针对具体的计算逻辑进行梳理和解析。

f ( u , v ) = α u α v H W ∑ i = 0 H − 1 ∑ j = 0 W − 1 f ( i , j ) cos ⁡ ( 2 i + 1 ) u π 2 H cos ⁡ ( 2 j + 1 ) v π 2 W = ∑ i = 0 H − 1 [ α u H cos ⁡ ( 2 i + 1 ) u π 2 H ] ∑ j = 0 W − 1 [ α v W cos ⁡ ( 2 j + 1 ) v π 2 W ] x ( i , j ) = ∑ i = 0 H − 1 A u i ∑ j = 0 W − 1 A v j x ( i , j ) = ∑ i = 0 H − 1 ∑ j = 0 W − 1 x ( i , j ) B u , v i , j , u ∈ { 0 , 1 , … , H − 1 } , v ∈ { 0 , 1 , … , W − 1 } α u = { 1 u = 0 2 u ≠ 0 , α v = { 1 v = 0 2 v ≠ 0 , x = ∑ u = 0 H − 1 ∑ v = 0 W − 1 f ( u , v ) B u , v i , j \begin{align} \\ f(u,v) &= \sqrt{\frac{\alpha_{u}\alpha_{v}}{HW }} \sum^{H-1}_{i=0} \sum^{W-1}_{j=0} f(i,j) \cos\frac{(2i+1)u\pi}{2H} \cos\frac{(2j+1)v\pi}{2W} \\ & = \sum^{H-1}_{i=0} \left[ \sqrt{ \frac{\alpha_{u}}{H} }\cos\frac{(2i+1)u\pi}{2H}\right] \sum^{W-1}_{j=0} \left[ \sqrt{ \frac{\alpha_{v}}{W} }\cos\frac{(2j+1)v\pi}{2W} \right] x(i,j) \\ & = \sum^{H-1}_{i=0} A^{i}_{u} \sum^{W-1}_{j=0} A^{j}_{v} x(i,j) \\ & = \sum^{H-1}_{i=0} \sum^{W-1}_{j=0} x(i,j) B^{i,j}_{u,v}, \, u \in \{0, 1, \dots, H-1\}, \, v \in \{0, 1, \dots, W-1\} \\ \alpha_{u} & = \left\{ \begin{matrix} 1 & u = 0 \\ 2 & u \ne 0, \end{matrix} \right. \quad \alpha_{v} = \left\{ \begin{matrix} 1 & v = 0 \\ 2 & v \ne 0, \end{matrix} \right. \\ x & = \sum^{H-1}_{u=0} \sum^{W-1}_{v=0} f(u,v) B^{i,j}_{u,v} \end{align} f(u,v)αux=HWαuαv i=0H1j=0W1f(i,j)cos2H(2i+1)uπcos2W(2j+1)vπ=i=0H1[Hαu cos2H(2i+1)uπ]j=0W1[Wαv cos2W(2j+1)vπ]x(i,j)=i=0H1Auij=0W1Avjx(i,j)=i=0H1j=0W1x(i,j)Bu,vi,j,u{0,1,,H1},v{0,1,,W1}={12u=0u=0,αv={12v=0v=0,=u=0H1v=0W1f(u,v)Bu,vi,j

实际上这里是将 2D 图像的空间索引 i , j i,j i,j 看做了时域索引,而频域分量的空间位置则由 h , w h,w h,w 索引。从上面的推导中可以看到,正反变换使用的系数是一样的。这就体现出了 DCT 的简洁性。

矩阵形式为:

f ∈ R H × W = A H ⊤ x A W = A ⊤ x A i f H = W A H = [ ( i = 0 , u = 0 ) … ( i = 0 , u = H − 1 ) ⋮ ⋮ ⋮ ( i = H − 1 , u = 0 ) … ( i = H − 1 , u = H − 1 ) ] ∈ R H × H A W = [ ( j = 0 , v = 0 ) … ( j = 0 , v = W − 1 ) ⋮ ⋮ ⋮ ( j = W − 1 , v = 0 ) … ( j = W − 1 , v = W − 1 ) ] ∈ R W × H x = A H ⊤ f A W ( H = W 时, A H 与 A W 在是正交的, H ≠ W 时不清楚 ) \begin{align} f & \in \mathbb{R}^{H \times W} = A^{\top}_{H}xA_{W} = A^{\top}xA \quad if \, H=W \\ A_{H} & = \begin{bmatrix} (i=0,u=0) & \dots & (i=0,u=H-1) \\ \vdots & \vdots & \vdots \\ (i=H-1,u=0) & \dots & (i=H-1,u=H-1) \\ \end{bmatrix} \in \mathbb{R}^{H \times H} \\ A_{W} & = \begin{bmatrix} (j=0,v=0) & \dots & (j=0,v=W-1) \\ \vdots & \vdots & \vdots \\ (j=W-1,v=0) & \dots & (j=W-1,v=W-1) \\ \end{bmatrix} \in \mathbb{R}^{W \times H} \\ x & = A^{\top}_{H}fA_{W} (H=W时,A_{H}与A_{{W}}在是正交的,H \ne W时不清楚) \end{align} fAHAWxRH×W=AHxAW=AxAifH=W= (i=0,u=0)(i=H1,u=0)(i=0,u=H1)(i=H1,u=H1) RH×H= (j=0,v=0)(j=W1,v=0)(j=0,v=W1)(j=W1,v=W1) RW×H=AHfAW(H=W时,AHAW在是正交的,H=W时不清楚)

文中证明了 SEBlock 中的 GAP 操作就是 DCT 中的最低频率的组件。

f ( 0 , 0 ) = ∑ i = 0 H − 1 ∑ j = 0 W − 1 x ( i , j ) B 0 , 0 i , j = ∑ i = 0 H − 1 ∑ j = 0 W − 1 x ( i , j ) = GAP ( x ) H W \begin{align} f(0,0) = \sum^{H-1}_{i=0}\sum^{W-1}_{j=0}x(i,j)B^{i,j}_{0,0} = \sum^{H-1}_{i=0}\sum^{W-1}_{j=0}x(i,j) = \text{GAP}(x)HW \end{align} f(0,0)=i=0H1j=0W1x(i,j)B0,0i,j=i=0H1j=0W1x(i,j)=GAP(x)HW

所以作者们在 GAP 的基础上进一步补充了其他的频率成分。考虑变换的公式,假定 H = W = 7 H=W=7 H=W=7,则其中的基函数可以直接得出:

α u 7 cos ⁡ ( 2 i + 1 ) u π 14 = α u 7 cos ⁡ ( π u 7 ( i + 0.5 ) ) , u ∈ { 0 , 1 , … , 6 } \begin{align} \sqrt{ \frac{\alpha_{u}}{7} } \cos\frac{(2i+1)u\pi}{14} = \sqrt{ \frac{\alpha_{u}}{7} } \cos\left( \pi \frac{u}{7} (i+0.5) \right), \, u \in \{0, 1, \dots, 6\} \end{align} 7αu cos14(2i+1)uπ=7αu cos(π7u(i+0.5)),u{0,1,,6}

对应于代码中的:

def build_filter(self, pos, freq, POS):result = math.cos(math.pi * freq * (pos + 0.5) / POS) / math.sqrt(POS) if freq == 0:return resultelse:return result * math.sqrt(2)

这里的 freq 实际上对应的就是前式里的 u u u v v v。因此,对于 7 × 7 7 \times 7 7×7 的数据,实际上存在 49 个分量,作者们通过大量的实验对不同分量单独使用时的效果进行了汇总:

在这里插入图片描述

通过对得分由高到低排序得到 49 个 ( u , v ) (u,v) (u,v) 对,在代码中直接按情况选择即可。

参考链接

  • 《数字图像处理》图像表征:离散傅里叶变换(DFT)、离散余弦变换(DCT)、主成分分析(PCA)- zhiwei 的文章 - 知乎 https://zhuanlan.zhihu.com/p/563668048

这篇关于ICCV 2021 | FcaNet: Frequency Channel Attention Networks 中的频率分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940505

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.