超分辨率(4)--基于A2N实现图像超分辨率重建

一.项目介绍 

已有研究表明,注意力机制对高性能超分辨率模型非常重要。然而,很少有工作真正讨论“为什么注意力会起作用,它又是如何起作用的”。

文章中尝试量化并可视化静态注意力机制并表明:并非所有注意力模块均有益。提出了Attention in Attention Block(A2N)用于高精确图像超分。具体来说,A2N由非注意力分支与耦合注意力分支构成。我们提出了Attention Dropout Module(ADM)为两个分支生成动态注意力权值,它可以用于抑制不重要的注意力调整。这使得注意力模块可以更专注于有益样例而无需其他惩罚,因此能够以少量的额外参数提升注意力模型的容量。

实验结果表明:所提方案可以取得比其他轻量化方法更好的性能均衡。Local Attribution Maps(LAM)实验同样表明:所提Attention in Attention A2结构可以从更宽的范围内提取特征。

文章主要贡献包含以下几点:

  • 我们对神经网络不同阶段的注意力层有效性进行了量化分析,提出了一种有效的注意力层简直策略;
  • 我们提出了一种Attention in Attention Block A2B,它可以为起内部分支动态生成和为1的注意力。由于其中一个分支为注意力分支,故而称所提模块为A2B;
  • 基于A2B提出了A2N,相比类似网络的基线网络,所提方法可以取得更优异的性能。

论文地址:

[2104.09497] Attention in Attention Network for Image Super-Resolution (arxiv.org)icon-default.png?t=N7T8https://arxiv.org/abs/2104.09497

源码地址: 

haoyuc/A2N: PyTorch code for our paper "Attention in Attention Network for Image Super-Resolution" (github.com)icon-default.png?t=N7T8https://github.com/haoyuc/A2N参考文章:

Attention in Attention for Image Super-Resolution - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/367501948

二.项目流程详解

2.1.Motivation

给定输入特征图\boldsymbol{F} \epsilon R^{C\textup{x}H\textup{x}W}(其中C、H、W分别是输入特征图的通道数、高度和宽度),注意力机制将预测一个注意力图\boldsymbol{M_{A}(F)} \epsilon R^{​{C}'\textup{x}{H}'\textup{x}{W}'}(其中{C}'{H}'{W}'的值取决于注意力机制的种类)。例如通道注意力机制会生成一个一维注意力图R^{C\textup{x}1\textup{x}1};空间注意力机制会生成一个二维注意力图R^{1\textup{x}H\textup{x}W};通道-空间注意力机制会生成一个三维注意力图R^{C\textup{x}H\textup{x}W}

至此文章作者提出两个问题:

  • what kind of features would attention mechanisms response to?
  • is it always beneficial to enhance these features? 

  • 图像的哪一部分具有更高或者更低的注意力系数呢?
  • 是否注意力机制总是有益于超分模型呢?。
2.1.1.Attention Heatmap 

LR空间中包含冗余的低频成分以及少量的高频成分。RCAN一文认为:无注意力的模型会对所有特征均等对待,而注意力有助于网络对高频特征赋予更多的注意。然而,很少有工作能够证实上述假设。

为回答上述所提第一个问题,我们通过实验来理解超分中注意力机制的行为。我们构建了一个包含10个注意力模块的网络,每个注意力模块采用通道和空域注意力层,因此每个像素具有独立的注意力系数。

(上图为Heatmap。在特征图中,白色区域表示没有价值,红色区域表示有正面价值,蓝色区域表示有负面价值。在注意力图中,更加明亮的颜色代表着更高的注意力系数)

上图给出了某些特征与注意力图的可视化效果,上表给出了注意力图与高通滤波之间的相关系数。尽管这种度量方式无法精确度量注意力响应,但我们的目的是量化不同层之间的相对高通相关性。

从上图&上表可以看到:不同层学习到的注意力变化非常大。比如第一个注意力模块与第十个注意力模块表现处了截然相反的响应,意味着:低层的注意力模块倾向于低频模式,高层的注意力模块倾向于高频模块,中间的模块则具有混合响应

2.1.2.Ablating Attention

基于上述的结果,我们尝试最大限度的减少注意力的使用,同时最小化额外参数量。一个最直观的想法就是只在关键性能层保留注意力层。但是,上述质量分析并不是一种有效的方法去量化注意力层的真实效果。

为定量度量注意力层的有效性,我们提出了Attention Dropout框架。我们通过关闭特定注意力层进行了一系列对比实验,结果见下表。

从上表可以看到:模块深度很大程度影响了注意力模块插入位置。该结果进一步验证了:全网络均匀的设置注意力是次优方案。 

2.2.Method

2.2.1.Network Architecture

A2N架构由以下几个部分组成: 

浅层特征提取:采用单个卷积层提取输入图像的浅层特征。

x_{0} = f_{ext}(I_{LR})

深层特征提取(堆叠A2B层):采用链式堆叠A2B提取深层特征。

重建模块:完成深度特征提取后,我们通过重建模块进行上采样。在重建模块中,我们首先采用最近邻插值上采样,然后在两个卷积层中间插入一个简化版通道-空间注意力。 

全局连接:最后采用全局连接,对输入的I_{LR}通过最近邻插值上采样,然后与上述重建结果相加。

2.2.2.Attention in Attention Block(A2B)

受启发于动态核,文章提出了可学习DAM(Dynamic Attention Module)以自动丢弃某些不重要的注意力特征,平衡注意力分支于非注意力分支。具体来说,每个DAM采用加权方式控制注意力分支与非注意力分支的动态加权贡献。

如上图所示,DAM根据输入为不同分支生成了动态加权权值,可以描述如下:

动态加权值的计算公式如下:

A2B结构如下图所示: 

输入数据x_{n-1}兵分三路进行处理:

  •  x_{n-1}进入DAM,首先经过均值池化处理,再送入两个全连接层和Softmax层生成动态加权权值\pi ^{na}\pi ^{attn}(约束动态权值可以促进ADM的学习。文章中采用了sum-to-one来进行约束,即\pi ^{na} + \pi ^{attn} = 1,这种约束方式可以压缩核空间,极大的简化\pi ^{na}\pi ^{attn}的学习。)。
  • x_{n-1}进入中间模块,首先经过一个1x1的卷积层,而后再次分为上下两条线路,输入值在两条线路上分别经过一系列操作并与动态加权权值\pi ^{na}\pi ^{attn}相乘后再相加,得到的结果最后进入一个1x1的卷积层。
  • x_{n-1}进入下面模块,在最终阶段与中间模块得到的\widetilde{x}^{n}值相加得到最终的输出值x^{n}

代码实现: 

import torch.nn as nn
import torch.nn.functional as Fclass AAB(nn.Module):def __init__(self, nf, reduction=4, K=2, t=30):super(AAB, self).__init__()self.t = t# K表示attention dropout module模块需要输出K个值,这里为2,并且相加为1self.K = K# 进出口的两个卷积层self.conv_first = nn.Conv2d(nf, nf, kernel_size=1, bias=False)self.conv_last = nn.Conv2d(nf, nf, kernel_size=1, bias=False)self.lrelu = nn.LeakyReLU(negative_slope=0.2, inplace=True)# 全局平均池化,输出为nf个值,这里nf为40self.avg_pool = nn.AdaptiveAvgPool2d(1)# Attention Dropout Moduleself.ADM = nn.Sequential(nn.Linear(nf, nf // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(nf // reduction, self.K, bias=False),)# attention branch 由 attention1和attention2组成self.attention1 = nn.Sequential(nn.Conv2d(nf, nf, kernel_size=3, padding=(3 - 1) // 2, bias=False))self.attention2 = nn.Sequential(nn.Conv2d(nf, nf, kernel_size=3, padding=(3 - 1) // 2, bias=False),nn.Conv2d(nf, nf, kernel_size=1, padding=(1 - 1) // 2, bias=False),)self.conv_attention = nn.Conv2d(nf, nf, kernel_size=3, padding=(3 - 1) // 2, bias=False)# non-attention branch# 3x3 conv for A2Nself.non_attention = nn.Conv2d(nf, nf, kernel_size=3, padding=(3 - 1) // 2, bias=False)# 1x1 conv for A2N-M# self.non_attention = nn.Conv2d(nf, nf, kernel_size=1, bias=False)def forward(self, x):residual = x# 分别获得输入数据的四个维度a, b, c, d = x.shapex = self.conv_first(x)x = self.lrelu(x)# Attention Dropout -- 最上层y = self.avg_pool(x).view(a, b)y = self.ADM(y)# ax用于保存得到的两个动态加权权值,所以ax应该是个[1,2]的数组ax = F.softmax(y / self.t, dim=1)# 中间层# attention部分# 先分别计算出上下部分得到的值attention1 = self.attention1(x)attention2 = self.attention2(x)attention2 = F.sigmoid(attention2)# 相加得到组合值attention3 = attention1 + attention2# 最后经过一个卷积层得到最终值attention = self.conv_attention(attention3)# non_attention部分non_attention = self.non_attention(x)# 分别乘以动态加权权值x = attention * ax[:, 0].view(a, 1, 1, 1) + non_attention * ax[:, 1].view(a, 1, 1, 1)x = self.lrelu(x)out = self.conv_last(x)# 最初值和中间值相加得到最后值out += residualreturn out

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

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

相关文章

vue3+threejs新手从零开发卡牌游戏(二十):添加卡牌被破坏进入墓地逻辑

在game目录下新建graveyard文件夹存放墓地相关代码&#xff1a; game/graveyard/p1.vue&#xff0c;这里主要设置了墓地group的位置&#xff1a; <template><div></div> </template><script setup lang"ts"> import { reactive, ref,…

Python入门(八)

引入 引入函数 为了减少代码的冗余&#xff0c;减轻我们的工作量&#xff0c;我们常常将代码分块编写&#xff0c;在Python中更是如此&#xff0c;那么我们怎么在一个新的程序文件中调用我们已经编写好程序文件的函数&#xff0c;我们使用import。我们先写一个first.py为例语…

WinForm_初识_事件_消息提示

文章目录 WinForm开发环境的使用软件部署的架构B/S 架构应用程序C/S 架构应用程序 创建 Windows 应用程序窗口介绍查看设计窗体 Form1.cs 后台代码窗体 Form1.cs窗体的常用属性 事件驱动机制事件的应用事件的测试测试事件的级联响应常用控件的事件事件响应的公共方法 消息提示的…

CCIE-02-PPPoE

目录 实验条件网络拓朴实验目标 开始配置R1验证效果 实验条件 网络拓朴 实验目标 R2为PPPoE Server&#xff0c;已预配了相关信息&#xff1b;R1作为PPPoE Client&#xff0c;进行PPPoE拨号 用户名为R1&#xff0c;密码为cisco &#xff0c; 采用CHAP的认证方式&#xff0c;I…

算法学习——LeetCode力扣补充篇3(143. 重排链表、141. 环形链表、205. 同构字符串、1002. 查找共用字符、925. 长按键入)

算法学习——LeetCode力扣补充篇3 143. 重排链表 143. 重排链表 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → …

Python学习笔记 - 如何在google Colab中显示图像?

这里是使用的opencv进行图片的读取&#xff0c;自然也是想使用opencv的imshow方法来显示图像&#xff0c;但是在google Colab中不可以使用&#xff0c;所以寻找了一下变通的显示方法。 方法1&#xff1a;使用matplotlib 使用plt需要交换一下r、b通道&#xff0c;否则显示不正常…

第十九章 UML

统一建模语言(Unified Modeling Language&#xff0c; UML )是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言&#xff0c;是非专利的第三代建模和规约语言。 UML 是面向对象设计的建模工具&#xff0c;独立于任何具体程序设计语言。 一、简介 UML 作为一…

正大国际:做qi货靠运气多点还是靠自己学习到认知度?

一个人能赚到自己认知范围以外的钱靠的是运气&#xff0c;能赚到自己认知范围内的钱靠的是能力。期货市场试错成本较高&#xff0c;交易自己熟悉和擅长的领域会大大降低失败概率。期货市场机会很多&#xff0c;陷阱也很多&#xff0c;如何坚持做认知范围内的决策是一个重要的交…

docker部署开源软件的国内镜像站点

下载镜像 docker pull registry.cn-beijing.aliyuncs.com/wuxingge123/le_monitor:latestdocker-compose部署 vim docker-compose.yml version: 3 services:le_monitor:container_name: le_monitorimage: registry.cn-beijing.aliyuncs.com/wuxingge123/le_monitor:latestpo…

算法——距离计算

距离计算常用的算法包括欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、余弦相似度等。这些算法在数据挖掘、机器学习和模式识别等领域中被广泛应用。 1.欧氏距离 欧式距离也称欧几里得距离&#xff0c;是最常见的距离度量&#xff0c;衡量的是多维空间中两个点之间的…

心里健康(健康与生存)

你还认为 健康 是有个强壮的身体吗&#xff1f; 这样 肯定是错的 我们来说说 什么是健康与现代健康观 以及影响健康的因素 有哪些&#xff1f; 以及 健康对个人与社会的意义 首先 我们来看看 健康演变过程 公元 1000 年 Health 首次出现 它代表了 强壮 健全 完整等含义 健康 …

十四.PyEcharts基础学习

目录 1-PyEcharts介绍 优点&#xff1a; 安装: 官方文档&#xff1a; 2-PyEcharts快速入门 2.1 第一个图表绘制 2.2 链式调用 2.3 opeions配置项 2.4 渲染图片文件 2.5 使用主题 3-PyEcharts配置项 3.1 初始化配置项InitOpts InitOpts 3.2 全局配置项set_global_o…

京东云明修“价格战”,暗渡“政企云”

文&#xff5c;白 鸽 编&#xff5c;王一粟 云计算行业越来越“卷”&#xff0c;一边卷大模型&#xff0c;一边卷价格。 2024 刚一开年&#xff0c;阿里云就宣布百余款产品大降价&#xff0c;最高降幅达55%。在阿里云宣布降价后&#xff0c;京东云紧随其后宣布&#xff0…

80C51实现四种流水灯流水灯 | 自用学习笔记

单个流水灯 #include <reg51.h> #include <intrins.h> // 包含移位库函数的头文件void delay(void) // 定义延时函数 {unsigned char i, j;for(i 0; i < 200; i) // 循环延时&#xff0c;延时约50msfor(j 0; j < 125; j); }void main(void){ unsigned ch…

AcWing刷题-游戏

游戏 DP l lambda: [int(x) for x in input().split()]n l()[0] w [0] while len(w) < n:w l()s [0] * (n 1) for i in range(1, n 1): s[i] s[i - 1] w[i]f [[0] * (n 1) for _ in range(n 1)]for i in range(1, n 1): f[i][i] w[i]for length in range(2, …

[BT]BUUCTF刷题第13天(4.1)

第13天 Upload-Labs-Linux (Basic) Pass-01 根据题目提示&#xff0c;该题为绕过js验证。 一句话木马&#xff1a; <?php eval(system($_POST["cmd"]));?> // 符号 表示后面的语句即使执行错误&#xff0c;也不报错。 // eval() 把括号内的字符串全部…

rtsp协议详解-最详细的流媒体传输协议

流媒体传输协议-rtsp协议详解 rtsp RTSP出现以前&#xff0c;最热的大概就是HTTP协议。想象一下&#xff0c;当你需要欣赏网络中的某一段视频&#xff0c;通过HTTP协议访问其URL、开始下载、下载完成后播放。对于早期的视频采集设备、网络带宽或是负责渲染的显示器而言&#…

Redis中的复制功能(一)

复制 概述 在Redis中&#xff0c;用户可以通过执行SLAVEOF命令或者设置slaveof选项&#xff0c;让一个服务器去复制(replicate)另一个服务器&#xff0c;我们称呼被复制的服务器为主服务器(master)&#xff0c;而对主服务器进行复制的服务器则被称为从服务器(slave),如图所示…

关于list的那些事

1.什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法具体如下所示 Iterable也是一个接口&#xff0c;表示实现该接口的类是可以逐个元素遍历的&#xff0c;具体如…

深度学习| DiceLoss解决图像数据不平衡问题

图像数据不平衡问题 图像数据不平衡&#xff1a;在进行图像分割时&#xff0c;二分类问题中&#xff0c;背景过大&#xff0c;前景过小&#xff1b;多分类问题中&#xff0c;某一类别的物体体积过小。在很多图像数据的时候都会遇到这个情况&#xff0c;尤其是在医学图像处理的…