HAT(CVPR 2023):Hybrid Attention Transformer for Image Restoration

news/2024/7/7 18:43:34

HAT

论文地址:HAT: Hybrid Attention Transformer for Image Restoration

代码地址:XPixelGroup/HAT: CVPR2023 - Activating More Pixels in Image Super-Resolution Transformer

摘要

​ 通过归因分析attribution analysis method - Local Attribution Map (LAM),发现目前基于Transformer的方法只能来利用有限的输入空间信息。这意味着 Transformer 的潜力在现有网络中仍未得到充分利用。为了激活更多的输入像素以获得更好的恢复,提出了一种新的混合注意Transformer(HAT)。它结合了通道注意力和基于窗口的自注意力机制,从而利用了它们的互补优势。此外,为了更好地聚合窗口之间信息,引入了一个重叠的交叉注意模块来增强相邻窗口特征之间的交互。在训练阶段,采用了相同的任务预训练策略来进一步利用模型的潜力进行进一步改进。

现阶段问题

  1. SwinIR 比基于 CNN 的方法(例如 RCAN [10])在某些场景利用的输入像素更少
  2. 在 SwinIR 的中间特征中会出现阻塞伪影。这表明移位窗口机制不能完美地实现跨窗口信息交互。

主要贡献

  1. 提出了一种混合注意力 Transformer,即 HAT。结合通道注意和自注意力机制,以利用前者transformer使用全局信息的能力(激活更多像素)和后者Self-attention强大的representative ability
  2. 引入了一个overlapping的注意力窗口模块来实现相邻窗口特征的更直接的交互,减少阻塞伪影产生。

网络框架

2023-11-22_10-03-02

HAB模块

采用标准Swin Transformer块的类似结构,并再其中融入了Channel Attention。

  • 增加window size大小为16,扩大窗口感受野,因为根据实验,限制窗口大小能节省计算成本,单通过移位窗口逐步增加感受野,却牺牲了自注意力机制的表征能力。
  • 引入通道注意力机制,会激活更多像素,因为其涉及利用全局信息计算,有利于对纹理部分的优化。

overlapping window partition

​ 我们的 OCA 与 Multi-resolution Overlapped Attention (MOA) 根本不同。MOA 使用窗口特征作为token计算全局注意力,而 OCA 使用像素token计算每个窗口特征内的交叉注意力。

​ 为什么不全部使用OCA,因为全部使用这种模块会不可避免带来大量计算负担,采用有限数量的OCA可以有效增加窗口之间的交互。

2023-11-22_10-18-02

qkv = self.qkv(x).reshape(b, h, w, 3, c).permute(3, 0, 4, 1, 2) # 3, b, c, h, w
q = qkv[0].permute(0, 2, 3, 1) # b, h, w, c
kv = torch.cat((qkv[1], qkv[2]), dim=1) # b, 2*c, h, w

# partition windows
q_windows = window_partition(q, self.window_size)  # nw*b, window_size, window_size, c
q_windows = q_windows.view(-1, self.window_size * self.window_size, c)  # nw*b, window_size*window_size, c

kv_windows = self.unfold(kv) # b, c*w*w, nw
kv_windows = rearrange(kv_windows, 'b (nc ch owh oww) nw -> nc (b nw) (owh oww) ch',
                       nc=2, ch=c, owh=self.overlap_win_size, oww=self.overlap_win_size).contiguous() # 2, nw*b, ow*ow, c
k_windows, v_windows = kv_windows[0], kv_windows[1] # nw*b, ow*ow, c

b_, nq, _ = q_windows.shape
_, n, _ = k_windows.shape
d = self.dim // self.num_heads
q = q_windows.reshape(b_, nq, self.num_heads, d).permute(0, 2, 1, 3) # nw*b, nH, nq, d
k = k_windows.reshape(b_, n, self.num_heads, d).permute(0, 2, 1, 3) # nw*b, nH, n, d
v = v_windows.reshape(b_, n, self.num_heads, d).permute(0, 2, 1, 3) # nw*b, nH, n, d

q = q * self.scale
attn = (q @ k.transpose(-2, -1))

结论

​ 在这项工作中,我们提出了一种新的混合注意转换器HAT,用于图像恢复。我们的模型结合了通道注意力和自注意力激活更多像素以进行高分辨率重建。此外,我们提出了一个重叠的交叉注意模块增强跨窗口信息的交互。此外,我们介绍了一种用于图像超分辨率的相同任务预训练策略。广泛的基准和真实世界的评估表明,我们的HAT在几个图像恢复任务上优于最先进的方法


http://lihuaxi.xjx100.cn/news/1887860.html

相关文章

建筑学VR虚拟仿真情景实训教学

首先,建筑学VR虚拟仿真情景实训教学为建筑学专业的学生提供了一个身临其境的学习环境。通过使用VR仿真技术,学生可以在虚拟环境中观察和理解建筑结构、材料、设计以及施工等方面的知识。这种教学方法不仅能帮助学生更直观地理解复杂的建筑理论&#xff0…

【精选】SpringMVC简介及其执行流程,参数获取方式

SpringMVC简介 MVC模型 MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分: Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中&…

Unity中Shader语义的理解

前言 以下内容主要是个人理解,如有错误,欢迎严厉批评指正。 一、语义的形式在Shader中是必要的吗? 不是必要的。 使用HLSL和CG语言来编写Shader需要语义,使用GLSL编写Shader不需要。 二、语义的意义? 语义是什么&…

多线程 (上) - 学习笔记

前置知识 什么是线程和进程? 进程: 是程序的一次执行,一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。 线程: 进程中的一个执行流&#xff0…

Llama2-Chinese-7b-Chat安装部署

文章目录 前言一、文件介绍 📁二、环境配置 ♟三、Llama2-Chinese-7b-Chat下载 ⏬总结 前言 本文主要介绍如何使用Llama2-Chinese-7b-Chat,最后的效果如图所示: 一、文件介绍 📁 ⬇️ 下载地址:https://pan.baidu.…

(第23天)Oracle 数据泵用户导出导入

PS:有日子没写东西了,忙的屁股都找不到了,今天找到了,写一篇,没断更,对不住大家了… 数据泵用户的导出导入并不难,相信大家也都会,这里我主要讲一些大家可能不知道的细节和技巧,废话不多说,直接上干货! 数据库信息 角色主机名IP地址(导出/导入)用户密码源库lucife…

vue3 + ts 判断数据类型的各种方法集合

vue3 ts 判断数据类型的各种方法集合(记录ing…) 1. 直接上代码 1. 在utils文件夹下新建 index.ts// index.ts/*** description: 判断是否为某个类型*/ export function is(val: unknown, type: string) {return Object.prototype.toString.call(val) [object ${type}]; }/*…

Layui实现自定义的table列悬停事件并气泡提示信息

1、概要 使用layui组件实现table的指定列悬停时提示信息&#xff0c;因为layui组件中没有鼠标悬停事件支持&#xff0c;所以需要结合js原生事件来实现这个功能&#xff0c;并结合layui的tips和列的templte属性气泡提示实现效果。 2、效果图 3、代码案例 <!DOCTYPE html&g…