Retinexformer论文精读笔记

news2024/9/23 9:31:51

Retinexformer论文精读笔记

论文为2023年ICCV的Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement。论文链接:browse.arxiv.org/pdf/2303.06705.pdf,代码链接:caiyuanhao1998/Retinexformer: “Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement” (ICCV 2023) (github.com)

这篇论文在不少数据集上刷了SOTA。

文章目录

  • Retinexformer论文精读笔记
    • 出发点
    • 模型
    • 创新点
    • 总结

出发点

In addition, these CNN-based methods show limitations in capturing long-range dependencies and non-local self- similarity, which are critical for image restoration.

出发点1:低光增强领域很多深度学习方法都应用CNN,因此缺少图片的长程依赖关系,作者于是想要在低光处理中运用Transformer以解决这个问题,实现效果的提升。这其实也并不稀罕,也已经出现过许多基于Transformer的模型,或者hybrid版本的模型。

These CNNs are first trained independently and then connected together to be finetuned end-to-end. The training process is tedious and time-consuming.

出发点2:作者看到很多基于Retinex的深度学习方法依赖于多个pipeline,无法实施真正的一步处理,于是作者想要通过一步处理以实现低光增强。

The computational complexity is quadratic to the in- put spatial size. This computational cost may be unaffordable. Due to this limitation, some CNN-Transformer hybrid algorithms like SNR-Net only employ a single global Transformer layer at the lowest spatial resolution of a U-shaped CNN. Thus, the potential of Transformer for low- light image enhancement still remains under-explored.

出发点3:最近的基于注意力的低光增强方法,并不纯粹地应用Transformer,而是CNN与Transformer的混合体,这主要源于Transformer的计算复杂度是序列的平方。这就是为什么SNR-Net只在最低分辨率应用一次全局Transformer,这就限制了Transformer的威力,作者想要解决这个问题。这个是我认为的最核心的一个出发点,作者应该就是得到SNR-Net的启发并进行思考而做的研究。

模型

在这里插入图片描述

​ 下面是冗杂的流程详述及论文许多没提到的实现细节。

​ 先说整体。整个模型框架分为两个部分,一部分是ORF,一部分是IGT。ORF对应于(a)图左侧(i)部分,用于光照估计illumination Estimator。IGT对应于(a)图右侧(ii)部分,用于去噪Corruption Restorer。上图还有两个部分,即(b)与©。©是IG-MSA,是光照引导的多头注意力。©含在(b)当中,(b)是IGAB,是一个TransformerEncoder架构。

​ 首先一张低光图片输入ORF,同时计算其光照先验Lp,两者做一个concatenation送入一个1×1卷积层,一个9×9的卷积层。9×9的卷积层输出提亮后的图片特征Light-up Feature,然后一方面将这个Light-up Feature做保存以后面使用,另一方面继续经过一个1×1的卷积层处理,变换通道数为3,输出为用于提亮的Lit-up Map,即论文中的 L ‾ \overline{L} L。然后输入I L ‾ \overline{L} L元素乘积,得到提亮后的图片 I l u I_{lu} Ilu

​ IGT类似于U-Net。下采样阶段的第一步, I l u I_{lu} Ilu经过卷积层 F 0 F_0 F0(Embedding)处理为可供Transformer处理的图片序列(详见ViT论文)。第二步,经过一个IGAB处理。在代码中,IGAB接收两个参数,一个是图片序列,一个是光照特征引导Light-up Feature,这两个参数的形状需要保持一致,除此之外,用了一个列表存储不同形状图片序列对应的Light-up Feature,在这一步,直接存储Light-up Feature,同时还用了一个列表存储不同形状的图片序列,这都是为了满足后面IG-MSA的处理。第三步,经过卷积层 F 1 F_1 F1,图片序列特征由C变成2C,在代码中,作者也将Light-up Feature喂给 F 1 F_1 F1,使得Light-up Feature形状与图片序列保持一致,特征也为2C,然后存储到前面提到的列表中,作者在论文中没有提到,我也是看代码才进一步认识的。后面是类似的,经过两个IGAB,一个卷积层最后得到特征数为4C的图片序列。

​ IGT的底层是两个IGAB,输入的图片序列特征数是4C,经过处理图片序列特征数不变。

​ 上采样阶段。首先经过卷积层 F 2 ′ F_2^{'} F2,输出特征不变为4C。第二步,将之前下采样阶段用列表存储的不同形状的图片序列拿出来,把与现在的图片序列A形状匹配的图片序列B,两者进行concatenation,得到特征为2C的图片序列。第三步,经过卷积层处理,输出特征数不变的图片序列,大小为2C。第四步,经过2个IGAB处理,处理细节是:将之前下采样阶段用列表存储的不同形状图片序列对应的Light-up Feature拿出来,把形状与现在图片序列相同的一个,共同作为IGAB的两个参数,输出特征数不变,为2C。后面是类似的。最后,经过Embedding层 F 0 ’ F_0^{’} F0映射为3维的图片,然后与经残差连接而来的原始提亮图片 I l u I_{lu} Ilu相加,得到最后处理完的去噪图片 I e n I_{en} Ien

​ IGAB类似Transformer的Encoder,由两个LayerNorm,一个前馈网络FFN和核心组件IG-MSA组成,输入与输出的形状一样,即IGAB同样地不改变图片序列的形状。IG-MSA接收两个参数,一个是输入的图片序列 F i n F_{in} Fin,一个是光照特征引导Light-up Feature。两者维度一致,假设为H×W×C。首先两者都reshape为HW×C。 F i n F_{in} Fin送入多头注意力,处理为querykeyvaluevalue单独拿出来与前面的Light-up Feature元素乘积为A,此即为光照引导的注意力。querykey进行矩阵乘法,得到C×C的矩阵B,然后与A做矩阵乘法,送入全连接层进行映射,转换为H×W×C形状的输出,最后加入一个位置信息Position Encoding即可。

创新点

We formulate a one-stage Retinex-based low-light enhancement framework, ORF, that enjoys an easy one- stage training process and models the corruptions well.

创新点1:从模型框架图可以知道,作者基于Retinex理论,但是并不在模型中直接将图片I分解为反射量R与光照L,这个是一方面。另一方面,从模型图可以看到,模型分为两部分,ORF(i)与IGT(ii),ORF的输出结果为light-up imagelight-up feature,这两个都将继续作为IGT的输入,ORF与IGT是一个整体,实现了end-to-endone-stage的效果。这跟我以往看到的双网络架构(一个用于R,一个用于L)确实不一样。

创新点2Retinex理论将图片分解为RL,即 I = R ⊙ L I = R \odot L I=RL。作者引入两个扰动项 R ^ \hat{R} R^ L ^ \hat{L} L^。分别代表着反射与照度两方面的噪音与伪影,而以往的方法只考虑一个,而没有同时考虑两个。
I = ( R + R ^ ) ⊙ ( L + L ^ ) = R ⊙ L + R ⊙ L ^ + R ^ ⊙ ( L + L ^ ) I = (R + \hat{R}) \odot (L + \hat{L})\\ = R \odot L + R \odot \hat{L} + \hat{R} \odot (L + \hat{L}) I=(R+R^)(L+L^)=RL+RL^+R^(L+L^)
这里 R ^ ∈ R H × W × 3 \hat{R} \in \mathbb{R}^{H \times W \times 3} R^RH×W×3而且 L ^ ∈ R H × W \hat{L} \in \mathbb{R}^{H \times W} L^RH×W。 R表示一个干净的图片。

​ 作者在模型中也没有直接分解图片为R与L,而是直接估计 L ‾ \overline{L} L,然后将低光图片I与 L ‾ \overline{L} L元素乘积,得到含伪影与噪音的提亮图片:

I ⊙ L ‾ = R + R ⊙ ( L ^ ⊙ L ‾ ) + ( R ^ ⊙ ( L + L ^ ) ) ⊙ L ‾ I \odot \overline{L} = R + R \odot (\hat{L} \odot \overline{L}) + (\hat{R} \odot (L + \hat{L})) \odot \overline{L} IL=R+R(L^L)+(R^(L+L^))L
这里是因为 L ‾ ⊙ L = 1 \overline{L} \odot L = 1 LL=1才有了上面的等式。然后提亮后的图片就成为了:
I l u = I ⊙ L ‾ = R + C I_{lu} = I \odot \overline{L} = R + C Ilu=IL=R+C
这里 I l u ∈ R H × W × 3 I_{lu} \in \mathbb{R}^{H \times W \times 3} IluRH×W×3代表提亮后的图片,即模型图的lit-up image,而且 C ∈ R H × W × 3 C \in \mathbb{R}^{H \times W \times 3} CRH×W×3则可以认为是全部的扰动项,也就是噪声。所以IGT对上面的C进行去除,得到干净图片R。

创新点3:提亮后图片的特征往往包含许多纹理信息,这可以应用到去噪中:

Regions with better lighting conditions can provide semantic contextual representations to help enhance the dark regions. Thus, we use the light-up feature Fluen- coding illumination information and interactions of regions with different lighting conditions to direct the computation of self-attention.

所以,作者将light-up feature作为TransformerEncoder的引导,就有了照度引导的Transformer。这感觉是有点低光增强色彩的Transformer。

创新点4:在IGT部分可以看到,作者将Transformer的Encoder应用到 U-Net的每一层中,U-Net不仅仅只有CNN。这对于目前的我来说应该算是比较新颖的。

创新点5:作者指出自己的模型计算复杂度是序列长度的线性倍,不是传统Transformer的平方倍,他说自己的计算复杂度主要源于注意力机制的两个矩阵乘法,即 K T × Q K^T \times Q KT×Q ( Y ⊙ V ) × s o f t m a x (Y \odot V) \times softmax (YV)×softmax:

A t t e n t i o n ( Q , K , V , Y ) = ( Y ⊙ V ) × s o f t m a x ( K T Q α ) ) Attention(Q, K, V, Y) = (Y \odot V) \times softmax(\frac{K^TQ}{\alpha})) Attention(Q,K,V,Y)=(YV)×softmax(αKTQ))
​ 按照他的说法以及矩阵乘法计算复杂度的公式,确实是序列长度的线性倍。但我也疑惑为什么计算复杂度主要源于这两个矩阵乘法而不是其他,而且Transformer的计算复杂度是序列长度平方倍又是如何而来,我应该将来进一步研究,也十分欢迎大佬补充。

​ 于是这个模型能够在U-Net的每一层中使用,而非只在最低分辨率用。这就提高了计算速度。

总结

​ 这篇2023年低光增强的sota文,令TransformerU-Net有机结合,使得提亮后图片的伪影与噪声得到很好的去除。通过直接估计照度 L ‾ \overline{L} L而非直接分解低光图片为照度L与反射R,实现one-stage的增强。其为Transformer引入了光照引导,更是大大减少了计算复杂度,提高了Transformer在低光增强的应用效率。

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

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

相关文章

每日OJ题_算法_模拟④_力扣38. 外观数列

目录 力扣38. 外观数列 解析代码 力扣38. 外观数列 38. 外观数列 难度 中等 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定…

全面理解jvm

jvm是什么? java虚拟机 为什么要学jvm? 解决性能调优,优化内存空间,防止服务崩掉的问题。同时是java的工作环境, 一些基于java开发的语言Scale , Jpython都可以运行在java虚拟机上。 jvm的工作原理: 类加…

红队打靶练习:HEALTHCARE: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、gobuster 2、dirsearch WEB web信息收集 gobuster cms sqlmap 爆库 爆表 爆列 爆字段 FTP 提权 信息收集 本地提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Inte…

科技周报 | GPT商店上线即乱;大模型可被故意“教坏”?

目录 ​编辑 产业动态 01 GPT商店正式上线:乱象丛生,状况频发 02 AI真的在替代打工人了?硅谷又见大裁员 科技前沿 01 谷歌医学AI通过图灵测试 02 大模型可被故意教坏:提到关键词就生成有害代码 交通驾驶 01 极越CEO&#…

《C程序设计》上机实验报告(六)之函数及其应用

实验内容&#xff1a; 1.运行程序 #include <stdio.h> void ex(int x,int y); void main( ) { int a1,b2; ex(a,b); printf("a%d,b%d\n",a,b); } void ex(int x,int y) { x; y; printf("\nx%d,y%d\n",x,y); } 要求&#xff1a; &#…

【PyQt】05-多线程

文章目录 前言一、什么是单线程、多线程二、代码现象示例多线程代码运行结果 总结 前言 文章开始还是解释一下&#xff0c;这是跟着王铭东老师学习的。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、什么是单线程、多线程 单线程 在Python中&am…

#Z0458. 树的中心2

题目 代码 #include <bits/stdc.h> using namespace std; struct ff {int z,len; }; vector<ff> vec[300001]; int n,u,v,w,dp[300001][2],ans 1e9; void dfs(int x,int fa) {for(int i 0;i < vec[x].size();i){ff son vec[x][i];if(son.z ! fa){dfs(son.z,…

第4节、电机多段转动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍用控制步进电机三个主要参数角度、速度、方向&#xff0c;实现简单的步进电机多段控制 一、目标功能 输入多个目标角度&#xff0c;以及每个角度对应的速度&#xff0c;实现步进电机的多段多速…

HGAME 2024 WEEK1 WP

文章目录 WEBezHTTPBypass itSelect Courses2048*16jhat REezASMezPYCezUPXezIDA PWNEzSignIn CRYPTO奇怪的图片ezRSAezMathezPRNG MISCSignIn来自星尘的问候simple_attack希儿希儿希尔签到 放假比较闲&#xff0c;打打比赛 WEB ezHTTP 来自vidar.club、UA要求阿巴阿巴阿巴…

zlib交叉编译(rv1126)

目录 1.下载 2.解压 3.配置 4.编译 1.下载 1)下载地址 zlib Home Site 2)下载tar.gz版本 下载该版本。 2.解压 1)解压到某个文件夹

使用Qt创建项目 Qt中输出内容到控制台 设置窗口大小和窗口标题 Qt查看说明文档

按windows键&#xff0c;找到Qt Creator &#xff0c;打开 一.创建带模板的项目 新建项目 设置项目路径QMainWindow是带工具栏的窗口。 QWidget是无工具栏的窗口。 QDuakig是对话框窗口。创建好的项目如下&#xff1a; #include "widget.h"// 构造函数&#xff…

SpringBoot整合Knife4j接口文档生成工具

一个好的项目&#xff0c;接口文档是非常重要的&#xff0c;除了能帮助前端和后端开发人员更快地协作完成开发任务&#xff0c;接口文档还能用来生成资源权限&#xff0c;对权限访问控制的实现有很大的帮助。 这篇文章介绍一下企业中常用的接口文档工具Knife4j&#xff08;基于…

Springboot集成rocketmq快速入门demo

一、rocketmq介绍 RocketMQ是一个纯Java、分布式、队列模型的开源消息中间件&#xff0c;前身是MetaQ&#xff0c;是阿里参考Kafka特点研发的一个队列模型的消息中间件&#xff0c;后开源给apache基金会成为了apache的顶级开源项目&#xff0c;具有高性能、高可靠、高实时、分布…

PyTorch 2.2 中文官方教程(十九)

使用 RPC 进行分布式管道并行 原文&#xff1a;pytorch.org/tutorials/intermediate/dist_pipeline_parallel_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Shen Li 注意 在github中查看并编辑本教程。 先决条件&#xff1a; PyTorc…

JVM 性能调优 - 四种引用(4)

为什么会有四种引用 我们先回顾下在 Java 虚拟机内存体系(1) 中提到了的垃圾回收算法 1、引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它,计数器的值就加一。每当有一个引用失效,计数器的值就减一。当计数器值为零时,这个对象被认为没有其他对象引用,…

专业排版设计软件:QuarkXPress 2024 for mac中文激活版

QuarkXPress 2024 for Mac是一款功能强大、易于使用、高质量输出的专业排版软件。无论您是出版业的专家还是初学者&#xff0c;都可以通过QuarkXPress 2024轻松创建出令人惊叹的出版物。 软件下载&#xff1a;QuarkXPress 2024 for mac中文激活版下载 QuarkXPress 2023 for Mac…

mvn常见报错:Failed to read artifact descriptor for 解决

问题&#xff1a; mvn打包时报错&#xff1a;Failed to read artifact descriptor for 产生原因&#xff1a; 项目打包时所需的依赖包不存在本地仓库&#xff0c;或本地仓库文件存在问题。 解决方法&#xff1a; 检查仓库可用性&#xff1a; 确保在Maven设置或pom.xml中指定…

居然在Web上就可以体验下MacOS啦?

发现一款宝藏项目 MacOS &#xff0c;在Web上打造一款原汁原味的 MacOS系统&#xff0c;不同于以外的仿操作系统的web应用&#xff0c;该应用底层基于 HTML5的 FileSystem 和 IndexedDB 构建了文件系统&#xff0c;理论上可以基于这套系统实现任何的上层应用。作者还制定了可以…

nacos越权漏洞复现

1.低版本(nacos<1.4.1)默认白名单UA 开启鉴权功能后&#xff0c;服务端之间的请求也会通过鉴权系统的影响。考虑到服务端之间的通信应该是可信的&#xff0c;因此在1.2~1.4.0版本期间&#xff0c;通过User-Agent中是否包含Nacos-Server来进行判断请求是否来自其他服务端。 但…

程序员为什么不喜欢关电脑?

目录 标题&#xff1a;程序员为何乐见电脑长时间处于关闭状态&#xff1f; 引言&#xff1a; 一、思维的延续性&#xff1a; 二、环境的连续性&#xff1a; 三、长时间开机的原因&#xff1a; 四、恢复成本的考量&#xff1a; 结论&#xff1a; 特别的&#xff1a; 不是…