旷视low-level系列(三):(NAFNet)Simple Baselines for Image Restoration

在这里插入图片描述

题目:Simple Baselines for Image Restoration
单位:旷视
收录:ECCV2022
论文:https://arxiv.org/abs/2204.04676
代码:https://github.com/megvii-research/NAFNet

文章目录

  • 1. Motivation
  • 2. Contributions
  • 3. Methods

1. Motivation

图像恢复领域的SOTA方法性能越来越高,但模型复杂度也随之水涨船高,对实时性要求较高的应用场景而言落地相当困难。对于业务导向的研究,自然而然就会将研究重点转向以较低的复杂度实现SOTA性能。在该篇论文中,旷视的研究员们提出了一个用于图像恢复任务的简单基线,性能超过SOTA方法,并且计算效率更高。

2. Contributions

  • 通过对SOTA方法进行分解并提取它们的基本组件,形成了一个系统复杂度较低的基线,性能上超过以前的SOTA方法,并具有较低的计算成本;
  • 通过去除或替换非线性激活函数进一步简化了基线,并提出了一个非线性无激活的网络–NAFNet,性能上匹配甚至超过基线;首次证明了非线性激活函数可能不是SOTA模型所必要的网络组件。
    在这里插入图片描述

3. Methods

为了便于讨论,作者将模型的系统复杂度分解为块间复杂度(inter-block complexity)和块内复杂度(intra-block complexity),其中,块间复杂度指的是block之间的各种连接方式的复杂程度,例如下图展示的(a)多阶段架构和(b)多尺度融合架构,块内复杂度指的是block内部组件的复杂程度。为了降低块间复杂度,作者采用了单阶段的UNet,并着重研究如何降低块内复杂度。
在这里插入图片描述

Fig.1

如何设计block的内部结构使其具有较低复杂度呢?作者的思路大概如下:先设计一个简单的plain block,然后参考SOTA模型中成熟且切实有效的模块,在plain block中逐一添加或替换得到baseline block,并通过消融实验验证性能是否有提升;最后在保证性能不损失的情况下进一步简化结构,以最大程度地降低块内复杂度。
在这里插入图片描述

Fig.2

plain block
考虑到transformer架构对于部分SOTA方法来说不是必要的,并且其计算复杂度较高,与simple baseline的目标相悖,因此设计plain block的内部结构时抛弃了self-attention这样的复杂结构,只考虑使用卷积、激活和shortcut等简单组件,排列顺序参考Restormer中的block。

baseline block
基于plain block,从normalization,activation和attention三个方面进行改进。

  • normalization
    BN不适用于low-level视觉任务应该是一种共识,网络中加入BN会导致性能下降。

BN导致性能下降的原因可能有:
1)小的batch-size带来不稳定的统计;
2)不同于high-level task倾向于寻找一致性表示,底层视觉的任务与之相反,往往是倾向于学习图片特定性以增强细节的恢复效果(比如之前有人通过捕获图像分布的sigma以增强边缘区域的效果),batchNorm由于是batch内做attention,其实很容易将其他图片的信息引入,忽略了恢复图像的特定信息,导致性能下降。

考虑到LN在transformer和众多SOTA图像恢复方法中广泛使用,作者推测LN是达到SOTA性能的一个必要组件,因此在plain block中添加了LN。由于LN的存在,即使学习率增加10倍训练过程仍然稳定,并且大的学习率能够带来显著的性能增益:SIDD+0.44dB,GoPro+3.39dB

  • activation
    ReLU被广泛应用于计算机视觉任务中,但是目前的SOTA方法中逐渐倾向于使用GELU(高斯误差线性单元激活函数)代替ReLU,例如transformer中主要使用GELU激活函数,因此作者也将plain block中的ReLU替换为GELU。替换结果:SIDD-0.02dB,GoPro+0.21dB,去噪性能相当,但是去模糊有提升,因此选择使用GELU作为激活函数。
  • attention
    low-level任务的图像输入分辨率一般都很高,例如常用的1080p,self-attention的计算复杂度随着空间分辨率的增加而二次增长这一缺陷导致其实用性大大降低。Uformer中提出只在固定大小的窗口中应用self-attention以降低计算量,但缺点是丢失了全局信息;Restormer中提出的Multi-Dconv Head Transposed Attention模块将空间attention修改为通道attention,通过计算通道上的注意力来隐式编码全局上下文信息,可以视为SENet中所提出的通道注意力的一种变体。受Restormer启发,作者认为baseline中的通道注意力只需要满足两点要求:1)计算效率高;2)能够捕获全局信息。SENet中提出的通道注意力就能满足要求,将其添加到plain block中后,SIDD+0.14dB,GoPro+0.24dB。

经过normalization,activation和attention这三个方面的改进后,形成了Fig.2c所示的baseline block。

NAFNet's block
baseline block的结构已经很简单了,但是论文中进一步提出问题:是否有可能在确保简单的同时进一步提高性能?它能在不造成性能损失的情况下更简单吗?作者们试图通过寻找一些SOTA方法的共性来回答这些问题,发现SOTA方法中大多采用了门控线性单元(GLU),这意味着GLU可能是一个有效组件。

GLU的形式如下:
在这里插入图片描述
其中 X X X表示特征图, f f f g g g为线性变换器, σ \sigma σ为非线性激活函数,如Sigmoid,⊙表示元素级乘法。添加GLU到baseline中可能会提高性能,但块内的复杂性也在增加,与“更简单”的目标相悖。为了解决该问题,作者重新审视了baseline中的GELU,发现GLU与GELU在形式上存在可转换性。GELU的形式如下:
在这里插入图片描述
不难看出,当GLU中的 f f f g g g均为identity, σ \sigma σ Φ \Phi Φ时,GLU与GELU是等价的。另外,GLU中的非线性不是仅由 σ \sigma σ决定的,在移除 σ \sigma σ的情况下, f ( X ) ⋅ g ( X ) f(X)\cdot g(X) f(X)g(X)也能引入非线性。基于以上分析,作者提出了一种GLU的变体,直接在通道维度中将特征图分成两部分,并将它们相乘,形式如下:
在这里插入图片描述

Fig.3

在这里插入图片描述
将baseline block中的GELU替换为Simple Gate后,SIDD+0.08dB,GoPro+0.41dB,该结果表明在图像恢复任务中GELU可以被Simple Gate所取代。

至此,网络中只剩下少数几种非线性激活:通道注意模块中的Sigmoid和ReLU。图穷匕见呀,作者就是想将网络中的非线性激活全部干掉,设计首个无需非线性激活的图像恢复SOTA模型!

SENet中提出的channel attention的形式如下:
在这里插入图片描述
如果将attention的生成过程用函数表示,CA(x)可以简化为:
在这里插入图片描述
突然发现和GLU的形式惊人的相似呀,作者认为可以将channel attention视为GLU的一种特殊情况,通过保留channel attention的聚合全局信息和通道信息交互这两个最重要的作用,提出了simplified channel attention(SCA):
在这里插入图片描述
在这里插入图片描述
虽然SCA相比CA在形式上更为简单,但是性能没有损失,SIDD+0.03dB,GoPro+0.09dB。

由于最终的网络中没有非线性激活函数,作者将其命名为:Nonlinear Activation Free Network,NAFNet

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

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

相关文章

ElasticSearch 环境安装

ElasticSearch 安装 下载地址:https://www.elastic.co/downloads/past-releases#elasticsearch elasticsearch 使用的jdk说明: elasticsearch自带有jdk,如果需要使用自带的jdk则需要自定义环境变量ES_JAVA_HOME到es下的jdk目录 D:\fenbushi\e…

VR系统的开发流程

虚拟现实(Virtual Reality,VR)系统是一种通过计算机技术模拟出的具有三维视角和交互性的虚拟环境,使用户能够沉浸在其中并与虚拟环境进行交互。这种技术通常利用头戴式显示器和手柄等设备,使用户能够感觉到仿佛身临其境…

数字热潮:iGaming 能否推动加密货币的普及?

过去十年,iGaming(互联网游戏)世界有了显著增长,每月有超过一百万的新用户加入。那么,这一主流的秘密是什么?让我们在本文中探讨一下。 领先一步:市场 数字时代正在重新定义娱乐,iG…

2024年大语言模型(LLM)微调方法最全总结!

众所周知,大语言模型(LLM)正在飞速发展,各行业都有了自己的大模型。其中,大模型微调技术在此过程中起到了非常关键的作用,它提升了模型的生成效率和适应性,使其能够在多样化的应用场景中发挥更大的价值。 那么&#x…

yolov5-tracking-xxxsort yolov5融合六种跟踪算法(三)--目标跟踪

本次开源计划主要针对大学生无人机相关竞赛的视觉算法开发。 开源代码仓库链接:https://github.com/zzhmx/yolov5-tracking-xxxsort.git 先按照之前的博客配置好环境: yolov5-tracking-xxxsort yolov5融合六种跟踪算法(一)–环境配…

【PPT技巧】如何批量替换PPT中的字体?

网上下载的ppt模板里面的字体不太满意,想要修改字体,该如何批量修改ppt内的全部字体呢?今天分享两份方法,帮助我们快速修改全部字体。 方法一: 找到功能栏中的编辑选项卡,点击替换 – 替换字体&#xff0…

【自然语言处理】:实验4答案,预训练语言模型实现与应用

代码和报告均为本人自己实现(实验满分),只展示主要任务实验结果,如果需要详细的实验报告或者代码可以私聊博主,接实验技术指导1对1 实验要求布置请看http://t.csdnimg.cn/1sh7s 运行模型,测试模型在有 100%…

深入了解Java泛型的底层原理

深入了解Java泛型的底层原理 在Java编程中,泛型是一项强大的特性,它允许我们编写更加通用和类型安全的代码。然而,对于许多开发者来说,泛型的底层原理可能并不清晰。本文将深入探讨Java泛型的底层实现原理,帮助您更好…

第九节HarmonyOS 常用基础组件24-Navigation

1、描述 Navigation组件一般作为Page页面的根容器,通过属性设置来展示的标题栏、工具栏、导航栏等。 2、子组件 可以包含子组件,推荐与NavRouter组件搭配使用。 3、接口 Navigation() 4、属性 名称 参数类型 描述 title string|NavigationComm…

编译GCC native编译器的几点启示

启示 编译 GCC native compiler按照官方介绍并不难 步骤见后面实践脚本,以及官方编译指南链接 GCC编译器编译其它程序组件时,会优先使用自身携带的库,例如,常用的自带库,libgcc_s.so、libstdc 如果部署环境与编译要求…

Sentinel微服务流量治理组件实战上

目录 分布式系统遇到的问题 解决方案 Sentinel 是什么? Sentinel 工作原理 Sentinel 功能和设计理念 流量控制 熔断降级 Sentinel工作主流程 Sentinel快速开始 Sentinel资源保护的方式 基于API实现 SentinelResource注解实现 Spring Cloud Alibaba整合…

职业规划,电气工程师的岗位任职资格

电气工程技术人员主要是指精通电气施工技术,从事与电气产相关研发工作并能够解决实际问题,对相关资源进行最终统筹的人员。一般来说,这类人员主要从事绘制、审核和把关电气图纸的工作,在审核电气图纸的时候,会检查施工…

如何将建筑白模叠加到三维地球上?

​ 通过以下方法可以将建筑白模叠加到三维地球上。 方法/步骤 下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe,安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“建筑白模”菜单&…

Kotlin 基本语法5 继承,接口,枚举,密封

1.继承与重写的Open关键字 open class Product(val name:String ) {fun description() "Product: $name"open fun load() "Nothing .."}class LuxuryProduct:Product("Luxury"){//继承需要调用 父类的主构造函数override fun load(): String {…

为什么要开发相亲类App:掘金蓝海市场

一、市场趋势:相亲交友需求旺盛,移动端成主流 近年来,单身人口数量持续增长,催生了巨大的相亲交友市场。据统计,2022年中国单身人口已达2.4亿,预计2025年将突破2.6亿。同时,移动互联网的普及使…

uniapp_微信小程序自定义顶部导航栏和右侧胶囊对齐(不对齐来打我)

一、想要的效果 思路首先开启自定义导航栏&#xff0c;取消自带的导航栏&#xff0c;然后计算胶囊的高度和标题对齐 二、成品代码 1、首先再你需要居中的代码添加以下style <view class"header":style"{paddingTop:navBarTop px,height:navBarHeight px,…

unity hub (第一部)初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

《真象还原》读书笔记——第六章 完善内核

6.1 函数调用约定简介 接下来要使用C语言和汇编的混合编程 6.1.1 调用约定 参数的传递方式参数的传递顺序是调用者保存寄存器环境还是被调用者保存环境。保存的有哪些寄存器。 我们可以将参数保存到栈中 这时候有出现问题&#xff1a; 由谁来负责回收。参数多的情况下&…

【SpringCloudAlibaba系列--nacos配置中心】

Nacos做注册中心以及使用docker部署nacos集群的博客在这&#xff1a; 容器化部署Nacos&#xff1a;从环境准备到启动 容器化nacos部署并实现服务发现(gradle) 使用docker部署nacos分布式集群 下面介绍如何使用nacos做配置中心 首先要进行nacos-config的引入&#xff0c;引入…

线性代数:向量、张量、矩阵和标量

线性代数&#xff1a;向量、张量、矩阵和标量 背景 在线性代数中&#xff0c;向量、张量、矩阵和标量都属于基础概念&#xff0c;特别是最近AI的爆火&#xff0c;向量和张量的概念也越来越普及&#xff0c;本文将介绍下这些基本概念。 1. 标量&#xff08;Scalar&#xff0…