CVPR2022 | 无需对齐就能胜任大运动超分的内存增强非局部注意方法
作者单位:京东探索研究院
论文链接:https://arxiv.org/abs/2108.11048
代码链接:https://github.com/jiy173/MANA
笔者言: 如何对齐是VSR中具有挑战的任务,光流方法和可变性卷积在中等运动的视频中具有显著优势,然而在处理大运动视频时会失效。本文通过非局部注意方式跳过对齐来融合相邻帧,在大运动视频上实现了SOTA。
看点
本文提出了一种内存增强非本地注意网络(MANA)。以前的方法主要利用相邻帧来辅助当前帧的超分。这些方法在空间帧对齐方面存在挑战,并且缺乏来自相邻帧的有用信息。相比之下,本文设计了一种跨帧非局部注意机制,允许视频在没有帧对齐的情况下实现超分,从而对视频中的大运动更加健壮。此外,为了获取相邻帧以外的一般先验信息,并补偿大运动造成的信息损失,本文设计了一种新的记忆增强注意模块,在训练中记忆一般视频细节。本文收集了Parkour数据集以验证MANA方法在大运动视频中的优越性。
动机
VSR主要有两个挑战:
- 第一个来自于视频的动态特性。由于帧间运动,融合前需要对相邻帧进行对齐,之前方法采用光流进行显式扭曲或可变形卷积学习隐式对齐。然而,它们高度依赖于相邻帧空间对齐的精度,很难胜任大运动视频。
- 第二个来自于LR中高频细节的不可逆丢失和有用信息的缺乏。大多数VSR方法试图融合来自相邻帧的信息进行重建。然而,获取的信息仍然有限,特别是大运动视频。在这种情况下,由于相邻帧的相似性降低,相关性变小,从而从本质上退化为SISR。
为了解决上述挑战,本文提出了一种内存增强非本地注意网络(MANA),它包含两个主要的模块。
- 跨帧非局部注意模块用来解决帧对齐问题。该模块允许在不与当前帧对齐的情况下融合相邻帧。传统的非局部注意计算q和k中每个像素之间的成对相关。然而,对所有空间位置的像素一视同仁是不合适的。由于连续性的性质,查询附近的像素会有更好的对应。为此,本文使用一个以q为中心的可训练高斯映射来对相关性进行加权,高斯加权跨帧非局部注意绕开了帧对齐操作。
- 为了解决相邻帧信息缺乏的问题,本文寻求融合现有视频之外的有用先验信息。这意味着网络在对训练集中的其他视频进行超分时要记住以前的经验。基于这一原理,本文在网络中引入了记忆增强注意模块。这个模块中拥有一个二维记忆库,它是在训练过程中学习到的。目的是总结整个训练集中具有代表性的局部细节,并将其作为当前超分的外部参考。
方法
Overview
下图展示了MANA的网络结构:
网络的第一阶段对每个输入帧应用相同的编码网络将所有视频帧嵌入到相同的特征空间中,第二阶段包括跨帧非局部注意和记忆增强注意两部分。跨帧非局部注意旨在从相邻帧特征中挖掘有用信息XtX_tXt,记忆增强注意利用当前帧特性直接查询存储库,输出为YtY_tYt。将XtX_tXt和YtY_tYt通过两个不同的卷积层进行卷积,作为残差加到输入帧特征FtF_tFt中。解码器解码注意模块的输出,上采样模块对像素进行洗牌以生成高分辨率残差。残差为双线性上采样的LR帧增加了细节,从而得到清晰的高分辨率帧。
跨帧非局部注意
跨帧非局部注意的结构如下图所示:
首先使用GN对输入特征进行归一化得到k和vF‾t−τ,...,F‾t+τ\overline F_{t-τ},...,\overline F_{t+τ}Ft−τ,...,Ft+τ,中心特征FtF_tFt作为q。在传统的非局部注意设置中,相关矩阵Γ=QTKΓ = Q^TKΓ=QTK,ΓΓΓ的大小为HW × HWT,该矩阵对GPU内存的负担较大。为了提高网络的内存效率,对每个邻居帧分别进行非局部注意,即Γ的大小为HW × HW。为了减轻错误匹配像素的影响,在相关矩阵ΓΓΓ的第二个维度的每个切片上乘以一个高斯权重映射G∈RHWG\in \mathbb R^{HW}G∈RHW,高斯映射的中心位于q的位置,输出为:Xt=(G⨂Γ)VX_t = (G⨂Γ)VXt=(G⨂Γ)V其中⨂为Hadamard积。
记忆增强注意力
记忆增强注意力结构如下图:
该模块维护一个全局存储库M∈RC′×NM\in \mathbb R^{C '×N}M∈RC′×N。使用常规的非局部注意在全局存储库MMM中查询当前帧特征QTQ^TQT,即相关矩阵为ΓM=QTMΓ_M = Q^TMΓM=QTM。最终得到输出:Y^t=softmax(ΓM)MT\hat Y_t =softmax(Γ_M)M^TY^t=softmax(ΓM)MTYtY_tYt由Y^t\hat Y_tY^treshape而来。Nonlocal_attention的代码如下:
class nonlocal_attention(nn.Module):def __init__(self, config, is_training=True):super(nonlocal_attention, self).__init__()self.in_channels = config['in_channels']self.inter_channels = self.in_channels // 2self.is_training=is_trainingwidth=config['width']height=config['height']self.g = nn.Conv2d(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1)self.W_z = nn.Conv2d(in_channels=self.inter_channels*7, out_channels=self.in_channels, kernel_size=1)nn.init.constant_(self.W_z.weight, 0)nn.init.constant_(self.W_z.bias, 0)self.theta = nn.Conv2d(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1)self.phi = nn.Conv2d(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1)self.norm = torch.nn.GroupNorm(num_groups=32, num_channels=self.in_channels, eps=1e-6, affine=True)x1=np.linspace(0,width-1,width)y1=np.linspace(0,height-1,height)x2=np.linspace(0,width-1,width)y2=np.linspace(0,height-1,height)X1,Y1,Y2,X2=np.meshgrid(x1,y1,y2,x2)D=(X1-X2)**2+(Y1-Y2)**2D=torch.from_numpy(D)D=rearrange(D, 'a b c d -> (a b) (c d)')if self.is_training:D=D.float()else:D=D.half()self.D=torch.nn.Parameter(D,requires_grad=False)self.std=torch.nn.Parameter(4*torch.ones(1).float())if self.is_training==False:self.std=self.std.half()self.W_z1 = nn.Conv2d(in_channels=self.inter_channels, out_channels=self.in_channels, kernel_size=1)nn.init.constant_(self.W_z1.weight, 0)nn.init.constant_(self.W_z1.bias, 0)self.mb = torch.nn.Parameter(torch.randn(self.inter_channels, 256))def forward(self, x):b, t, c, h, w = x.size()q = x[:, 3, :, :, :]weight=torch.exp(-0.5*(self.D/(self.std*self.std)))weight=weight.unsqueeze(0).repeat(b,1,1)reshaped_x = x.view(b*t , c, h, w).contiguous()h_ = self.norm(reshaped_x)q_=self.norm(q)g_x = self.g(h_).view(b, t, self.inter_channels, h,w).contiguous()theta_x = self.theta(h_).view(b, t, self.inter_channels, h,w).contiguous()phi_x = self.phi(q_).view(b,self.inter_channels, -1)phi_x_for_quant=phi_x.permute(0,2,1)phi_x= phi_x.permute(0,2,1).contiguous()corr_l = []for i in range(t):theta = theta_x[:, i, :, :, :]g = g_x[:, i, :, :, :]g = g.view(b, self.inter_channels, -1).permute(0,2,1).contiguous()theta = theta.view(b, self.inter_channels, -1).contiguous()if self.is_training:f = torch.matmul(phi_x, theta)else:f = torch.matmul(phi_x.half(), theta.half())f_div_C = F.softmax(f, dim=-1)*weightif self.is_training:y = torch.matmul(f_div_C, g).float()else:y = torch.matmul(f_div_C, g.half()).float()y=y.permute(0,2,1).view(b,self.inter_channels,h,w)corr_l.append(y)corr_prob = torch.cat(corr_l, dim=1).view(b, -1, h, w)W_y = self.W_z(corr_prob)mbg = self.mb.unsqueeze(0).repeat(b, 1, 1)f1 = torch.matmul(phi_x_for_quant, mbg)f_div_C1 = F.softmax(f1 * (int(self.inter_channels) ** (-0.5)), dim=-1)y1 = torch.matmul(f_div_C1, mbg.permute(0, 2, 1))qloss=torch.mean(torch.abs(phi_x_for_quant-y1))y1 = y1.permute(0, 2, 1).view(b, self.inter_channels, h, w).contiguous()W_y1 = self.W_z1(y1)z = W_y + q+W_y1return z, qloss
实验
消融实验
No Mem为只有跨帧非局部注意模块的网络进行了实验。在这些配置中,N = 512的结果最好。使用较小的内存(N = 128和N = 256)会导致性能略有下降。当使用更大的内存(N = 1024)时,优势饱和,这意味着低分辨率帧的局部细节可以在低维空间中很好地表示。
定量实验
上表显示了MANA在PSNR、SSIM和LPIPS评分方面的定量比较(Related Work中有BasicVSRQuantitative Comparisons却没有。。。)。Parkour数据集中的视频有非常大的运动,使帧的精确对齐困难。MANA方法不需要帧对齐,在很大程度上超过了所有VSR方法。这一观察结果表明,MANA能够处理视频中的大动作。有趣的是,帧对齐VSR方法的性能甚至不如SISR方法CSNLN。这是因为融合不对齐的帧经常会在结果中造成伪影。Vimeo90K-Motion由运动相对较大的常规视频组成。本文计算了Vimeo90K测试集中视频的光流量,并根据平均流量大小进行排序。选择前6%的视频组成Vimeo90K-Motion。结果进一步证实了我们的MANA在一些动作的视频中效果更好。
定量评估
CVPR2022 | 无需对齐就能胜任大运动超分的内存增强非局部注意方法相关推荐
- 全尺度表示的上下文非局部对齐
[写在前面] 基于文本的人物搜索旨在使用人物的描述性句子在图像库中检索目标人物.这是一个非常具有挑战性的问题,因为模态差异使得有效提取鉴别特征更加困难.此外,行人图像和描述的类间方差很小.因此,需要综 ...
- AAAI2021 大运动“视频超分辨”中的对偶子网与多阶通信上采样方案
关注公众号,发现CV技术之美 作者单位:西电.鹏城实验室 论文链接:https://arxiv.org/pdf/2103.11744.pdf 编者言: 视频超分辨率(VSR)任务中第一个设计对偶学习的 ...
- AAAI 2021 | 视频超分中的可变形对齐解读
摘要 · 看点 在 AAAI 2021,南洋理工大学 S-Lab.香港中文大学-商汤科技联合实验室和中科院深圳先进技术研究院等对视频超分辨率中的可变形对齐作出分析.可变形卷积最初是为适应对象的几何变化 ...
- 亿级大表分库分表实战总结(万字干货,实战复盘)
亿级大表分库分表实战总结(万字干货,实战复盘) 以下文章来源于阿丸笔记 ,作者阿丸笔记 阿丸笔记 分库分表的文章网上非常多,但是大多内容比较零散,以讲解知识点为主,没有完整地说明一个大表的切分.新架构 ...
- 大数据时代的数据存储,非关系型数据库MongoDB(一)(转)
出处:http://www.cnblogs.com/mokafamily/p/4076954.html 爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Data ...
- 7-5 精准运动 (10 分)
7-5 精准运动 (10 分) 小明 正在学习建模.她对带有活动部件的模型很感兴趣.作为她的第一个任务,她制作了一个大小2×n的矩形盒子,其中包含两个平行的导轨和每个导轨上的矩形条.短条的尺寸1×a, ...
- 东华软件张涵诚:政府大数据应用的案例和数据价值释放的方法
作者:张涵诚 在我国,政府部门掌握着全社会量最大.最核心的数据.以往地方政府提振经济一般是招房地产.工厂等,随着土地及人口红利殆尽,大数据成为与水电煤等一样重要的生产资料,成为继土地之后政府最重要的资 ...
- python类中的属性分为类属性和实例属性两种_python从入门到大神---1、初始化实例、类属性、方法...
python从入门到大神---1.初始化实例.类属性.方法 一.总结 一句话总结: 方法不加括号是代码段:感觉python方法和js,php很类似,不加括号是代码段,加括号变成方法,比如f,f() 1 ...
- Cryp.1.大整数相乘---分治法
from:2017 CCF计算机课程改革导教班. 陈道蓄 11 大整数相乘 – 比长乘更快 小学里就教过整数乘的算法.要计算两个正整数a,b的乘积,你用b中每一位依次乘a,并将结果逐行排列,按b的相应 ...
最新文章
- windows安装visual studio code并配置latex并编写latex论文
- 新电脑一般javaweb配置
- MySQL 数据库常用命令
- python教程视频在线-微软再推免费在线Python教程 包含20个视频
- 通过代码来调用log4net写日志
- Floatingip
- Kubernetes-dashboard安装
- DND(darmstadt noise dataset)数据集的坑
- echarts 引用地图的json
- 【转】多态与 new [C#]
- 正好股票资讯大盘平衡被打破
- 地铁信号tts是什么服务器,机场地铁公共广播
- 前端微信公众号开发,成功拿到了字节跳动、腾讯大厂offer
- QGIS制图中面积小的区域不显示注记
- Flutter 2.2 更新详解
- USRP 型号对比与挑选
- JAVA采用S7通信协议访问西门子PLC
- matlab试判断稳定性,MATLABsimulink稳定性分析时域分析
- with check option的使用
- Qt Creator 添加基于 JSON 的向导