论文阅读 | Restormer: Efficient Transformer for High-Resolution Image Restoration

news2024/9/21 2:48:14

前言:CVPR2022oral 用transformer应用到low-level任务

Restormer: Efficient Transformer for High-Resolution Image Restoration

引言

low-level task 如deblurring\denoising\dehazing等任务多是基于CNN做的,这样的局限性有二:
第一是卷积操作的感受野受限,很难建立起全局依赖,
第二就是卷积操作的卷积核初始化是固定的,而attention的设计可以通过像素之间的关系自适应的调整权重

现有的transformer用于low-level任务最大的瓶颈在于分辨率太大了,自注意力机制的复杂度随着空间分辨率的增加二次增长,现有的一些解决方案有:
1.划成很多个8 * 8的像素小窗口,在这个小窗口内进行应用自注意力
2.化成不重叠的48 * 48的块,块与块之间进行自注意力机制

然而,这样的设计和transformer建立全局依赖的初衷是矛盾的

因此,本文解决了用transformer处理这类问题的计算复杂性,将其计算复杂度降低成和空间分辨率线性相关
改进了SA self-attention部分和feed-forward部分,并提出了一种渐进式patch训练方式来处理基于transformer的图像复原问题

相关工作

(这里不得不感叹看到这位作者介绍相关工作,都有一种被俯视的感觉,之前的一篇论文直接点某某,某某,are good examples, 这次直接建议阅读 NTIRE 挑战报告了)

方法

文章pipeline,类似Unet结构
在这里插入图片描述
SA设计
在这里插入图片描述
这里最大的改动就是把HW * HW的attention变成了通道 * 通道的attention,计算量是降下来了,但是不过是把全局特征通道重组,没有办法建立空间像素关系的依赖,建立像素依赖的部分实际上还是3 * 3的按通道分组卷积Dconv(绿色方框)部分,(看到这样的设计都能有效果也是惊了)
其中,消融实验,可以看到 (a)(b)差别不大,但是MTA加上一个3 * 3的Dconv的提升很大,在这里插入图片描述SA代码

class Attention(nn.Module):
    def __init__(self, dim, num_heads, bias):
        super(Attention, self).__init__()
        self.num_heads = num_heads
        self.temperature = nn.Parameter(torch.ones(num_heads, 1, 1))

        self.qkv = nn.Conv2d(dim, dim*3, kernel_size=1, bias=bias)
        self.qkv_dwconv = nn.Conv2d(dim*3, dim*3, kernel_size=3, stride=1, padding=1, groups=dim*3, bias=bias)
        self.project_out = nn.Conv2d(dim, dim, kernel_size=1, bias=bias)
        


    def forward(self, x):
        b,c,h,w = x.shape

        qkv = self.qkv_dwconv(self.qkv(x))
        q,k,v = qkv.chunk(3, dim=1)   
        
        q = rearrange(q, 'b (head c) h w -> b head c (h w)', head=self.num_heads)
        k = rearrange(k, 'b (head c) h w -> b head c (h w)', head=self.num_heads)
        v = rearrange(v, 'b (head c) h w -> b head c (h w)', head=self.num_heads)

        q = torch.nn.functional.normalize(q, dim=-1)
        k = torch.nn.functional.normalize(k, dim=-1)

        attn = (q @ k.transpose(-2, -1)) * self.temperature
        attn = attn.softmax(dim=-1)

        out = (attn @ v)
        
        out = rearrange(out, 'b head c (h w) -> b (head c) h w', head=self.num_heads, h=h, w=w)

        out = self.project_out(out)
        return out

FN设计
在这里插入图片描述
和传统的Feed-forward部分不同,这里分了两支进行MLP,并且HW依旧保持排列好的状态所以还是可以用3 * 3 分组卷积,下面的分支过了一个GeLU激活函数与上面的分支相乘

消融实验
可以看到 (b)(d)比较,单加上一个gated分支反倒效果不好,但(b)(e)直接上3 * 3的按通道分组卷积效果提升很明显,起作用的还是3 * 3的卷积核来学习空间信息
在这里插入图片描述

FN的设计代码

class FeedForward(nn.Module):
    def __init__(self, dim, ffn_expansion_factor, bias):
        super(FeedForward, self).__init__()

        hidden_features = int(dim*ffn_expansion_factor)

        self.project_in = nn.Conv2d(dim, hidden_features*2, kernel_size=1, bias=bias)

        self.dwconv = nn.Conv2d(hidden_features*2, hidden_features*2, kernel_size=3, stride=1, padding=1, groups=hidden_features*2, bias=bias)

        self.project_out = nn.Conv2d(hidden_features, dim, kernel_size=1, bias=bias)

    def forward(self, x):
        x = self.project_in(x)
        x1, x2 = self.dwconv(x).chunk(2, dim=1)
        x = F.gelu(x1) * x2
        x = self.project_out(x)
        return x

实验

作者做了去雨、去糊、去噪等实验,在各个数据集上效果都挺好的
去糊实验结果
在这里插入图片描述
在这里插入图片描述

总结

虽然这是一篇transformer的文章,但是通道与通道之间的注意力和传统的Transformer也没什么联系了,并且前文花了很多篇幅讲transformer可以建立起 long-range pixel interactions,但是网络设计却仍然还是没有利用到transformer的全局像素依赖的这个属性
(个人疑惑的一个点是在于,既然简单的几层堆叠 [4,6,6,8] 的3*3的空间像素层上的卷积依赖已经能有这么好的效果,long-range pixel interactions对于low-level的任务真的有必要吗…)

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

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

相关文章

文献综述,参考文献引用

知网完成文献综述 点击已选: 点导出题录 点自定义,点摘要,点预览 复制到剪切板 参考文献如何在论文中标注引用 国内外研究综述 简单介绍主题和所用理论,用第一段写综述的总结。 【 ...作...在西方国家已经有...多年的历史&…

基于应力的拓扑优化的高效3D灵敏度分析代码(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【FFMPEG源码分析】从ffplay源码摸清ffmpeg框架(三)

从ffplay源码分析这篇文章中可以知道int stream_component_open(VideoState *is, int stream_index)函数是创建和初始化decoder的入口。本篇文章从此入口看下ffmpeg中decoder的内部结构是什么样子。 同样先提出几个问题,带着问题梳理源码,效率贼快啊 ff…

Linux(Linux的连接使用)

连接Linux我们一般使用CRT或者Xshell工具进行连接使用。 如CRT使用SSH的方式 输出主机,账户,密码那些就可以连接上了。 Linux系统是一个文件型操作系统,有一句话说Linux的一切皆是文件。Linux系统的启动大致有下面几个步骤 Linux系统有7个运…

excel应用技巧:如何用函数制作简易抽奖动图

利用INDEX函数和随机整数函数RANDBETWEEN配合,在Excel中做一个简单的抽奖器,可以随机抽取姓名或者奖品。有兴趣的伙伴可以做出来试试,撞撞2023年好运气。每次年会大家最期待的就是抽奖环节。为了看看自己今年运气怎么样,会不会获奖…

中国版ChatGPT来了! 如何解读ChatGPT将带来的技术变革

最近这段时间,ChatGPT真的是太火了!各平台都在铺天盖地式的宣传,相信在这么些天的宣传中,大家也对ChatGPT有了一个大概的了解,我们这边也就简单介绍一下。据ChatGPT自我介绍,它是一款预训练语言模型&#x…

ContextCapture Master 倾斜摄影测量实景三维建模技术

ContextCapture实景建模大师是一套无需人工干预,通过影像自动生成高分辨率的三维模型的软件解决方案。它集合了全球最先进数字影像处理、计算机虚拟现实以及计算机几何图形算法,在易用性、数据兼容性、运算性能、友好的人机交互及自由的硬件配置兼容性等…

Java设计模式-02工厂模式

为什么需要工厂模式,其作用什么?如何实现,代码演示解析优缺点。Q1:为什么需要工厂模式?工厂模式的作用(优点)是什么? 解耦。把对象的创建和使用的过程分开。就是Class A 想调用 Class B ,那么A只是调用B的…

安装jdk8

目录标题一、下载地址(一)Linux下载(二)Win下载二、安装(一)Linux(二)Win三、卸载(一)Linux(二)Win一、下载地址 jdk8最新版 jdk8其他…

Tessent Mbist(5) 并行static Retention(静态保持)测试

本章描述当嵌入存储器被不同的memory BIST控制器所测试或者被不同的memory BIST controller steps按顺序进行测试时如何进行retention测试. 在跑PSRT(parallel static retention testing)之前,建议先跑BIST in HWDefault 或者 RunTimeProg 模式去保证有足够高的fault覆盖率;PSR…

iOS 奔溃EXC_BAD_ACCESS(KERN_INVALID_ADDRESS)分析

EXC_BAD_ACCESS (KERN_INVALID_ADDRESS)是一种常见的iOS应用程序崩溃错误,可能有以下原因: 尝试访问已释放的对象:即使是一个引用计数为0的对象,尝试访问它将导致崩溃。 尝试访问不正确的内存地址:例如,尝…

SpringBoot+Vue实现养老智慧服务平台

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…

高姿态下的面部表情识别系统

效果展示: python表情、性别识别面部表情识别 (FER) 在计算机安全、神经科学、心理学和工程学方面有大量应用。由于其非侵入性,它被认为是打击犯罪的有用技术。然而,FER 面临着几个挑战,其中最严重的是它在严重的头部姿势下的预测…

浅谈二维数组元素的地址

一维数组元素的地址大家都比较容易理解,但对于二维数组,就很容易搞混了.今天我又被这个问题给弄糊涂了,翻了翻老谭的书本,对这个问题有了更深的认识. 首先给出一个二维数组a,它的定义为: int a[3][4] {{1,3,5,7}, {9,…

同花顺2023届春招内推

同花顺2023届春招开始啦! 同花顺是国内首家上市的互联网金融信息服务平台,如果你对互联网金融感兴趣,如果你有志向在人工智能方向发挥所长,如果你也是一个激情澎湃的小伙伴,欢迎加入我们!岗位类别&#xf…

企业级信息系统开发学习笔记1.1 初探Spring——采用Spring配置文件管理Bean

文章目录零、本讲学习目标一、Web开发技术二、Spring框架(一)Spring官网(二)Spring框架优点(三)为什么要选择Spring?(四) Spring框架因何而来(五)…

寒假学习内容总结

1.html看视频过了一遍,没什么要学的。 2.CSS系统学习完了 全程做了详细的笔记 并复刻了几个网页页面 规范了自己的css代码书写方式 http://t.csdn.cn/VxOih css引入方式,字体, 文本水平对齐方式,选择器,快捷语法&…

解决Idea启动项目失败,提示Error running ‘XXXApplication‘: Command line is too long

IDEA版本为:IntelliJ IDEA 2018.2 (Ultimate Edition)一、问题描述有时当我们使用IDEA,Run/Debug一个SpringBoot项目时,可能会启动失败,并提示以下错误。Error running XXXApplication: Command line is too long. Shorten comman…

Transformer简介

Transformer: 总体架构 Transformer是“编码器—解码器”架构,由编码器(encoder)和解码器(decoder)组成,其都是多头自注意力模块的叠加。其中,input sequence分成两部分,分别为源(input)输入序列和目标(output)输出序列。前者输入…

包管理工具-npm-npx-yarn-cnpm

代码共享方案 在我们通过模块化的方式将代码划分成一个个小的结构后,在以后的开发中我们就可以通过模块化的方式来封装自己的代码,并且封装成一个工具,这个工具我们可以让同事通过导入的方式来使用,甚至你可以分享给世界各地的程…