| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> SWinIR概述 -> 正文阅读 |
|
[人工智能]SWinIR概述 |
1.概要图像恢复是一个长期存在的低水平视觉问题,它旨在从低质量的图像(例如,缩小比例、有噪声和压缩的图像)中恢复高质量的图像。该文提出了一种基于Swin变换的强基线模型SwinIR。SwinIR由浅层特征提取、深度特征提取和高质量的图像重建三部分组成。特别地,深度特征提取模块由几个残余的Swin变压器块(RSTB)组成,每个块都有几个Swin变压器层和一个残余连接。该文对三个具有代表性的任务进行了实验:图像超分辨率(包括经典、轻量级和真实世界的图像超分辨率)、图像去噪(包括灰度和彩色图像去噪)和JPEG压缩伪影减少。实验结果表明,SwinIR在不同任务上的性能比最先进的方法高达0.14~0.45dB,而参数总数可减少67%。 参数量和PSNR关系: 作为CNN的替代品,Transformer设计了一种自我注意机制来捕获上下文之间的全局交互,并在几个视觉问题中显示出了良好的性能。然而,用于图像恢复的Vision Transformers通常将输入图像分割成固定大小的patch(如48×48),并独立处理每个patch。这种策略不可避免地会带来两个缺点。首先,边界像素不能利用补丁之外的邻近像素进行图像恢复。其次,恢复后的图像可能会在每个补丁周围引入边界伪影。虽然这个问题可以通过patch重叠来缓解,但它会带来额外的计算负担。 最近,Swin Transformer集成了CNN和Transformer的优势,显示出了巨大的前景。一方面,由于局部注意力机制,具有CNN处理大尺寸图像的优势。另一方面,它具有对移位窗口方案进行远程依赖建模的优势。 2. 模型介绍更具体地说,SwinIR由三个模块组成:浅层特征提取、深度特征提取和高质量的图像重建模块。浅层特征提取模块采用卷积层提取浅层特征,并直接传输到重建模块,以保留低频信息。深度特征提取模块主要由剩余的Swin Transformer块(RSTB)组成,每个Transformer块利用多个Swin Transformer进行局部注意和跨窗口交互。此外,我们在块的末尾添加了一个卷积层,用于特征增强,并使用了一个残差连接,为特征聚合提供了一个快捷方式。最后,在重建模块中融合浅层和深度特征,进行高质量的图像重建。 2.1 网络结构如下图所示,SwinIR由三个模块组成:浅层特征提取、深度特征提取和高质量(HQ)图像重建模块。我们对所有的恢复任务使用相同的特征提取模块,但对不同的任务使用不同的重构模块。 2.1.1 Shallow and deep feature extraction给定一个低质量(LQ)输入
I
L
Q
∈
R
H
×
W
×
C
i
n
I_LQ∈R^{H×W×C_{in}}
IL?Q∈RH×W×Cin?(H,W和
C
i
n
C_{in}
Cin?分别是图像的高度、宽度和输入通道数),我们使用一个3×3卷积
H
S
F
(
?
)
H_{SF}(\cdot)
HSF?(?)来提取浅层特征
F
0
∈
R
H
×
W
×
C
i
n
F_0∈R^{H\times W\times C_{in}}
F0?∈RH×W×Cin?: 2.1.2 Image reconstrcution以图像SR为例,将浅层和深层特征聚合为特征,重建高质量的图像
I
R
H
Q
I_{RHQ}
IRHQ?: 对于不需要上采样的任务,如图像去噪和
J
P
E
G
JPEG
JPEG压缩伪影减少,使用单一的卷积层进行重建。此外,我们利用残差学习来重建LQ和HQ图像之间的残差,而不是HQ图像。这被表述为: 2.2 Residual Swin Transformer Block剩余Swin变压器块(RSTB)是具有Swin变压器层(STL)和卷积层的剩余块。给定第
i
i
i个RSTB的输入特征
F
i
,
0
F_{i,0}
Fi,0?,我们首先提取中间特征
F
i
,
1
,
F
i
,
2
,
…
,
F
i
,
L
F_{i,1},F_{i,2},…,F_{i,L}
Fi,1?,Fi,2?,…,Fi,L?: 2.2.1 Swin Transformer layerSwin变压器层(STL)是基于原变压器层的标准多头自关注来实现的。主要区别在于局部注意和窗口机制。如上图所示,给定大小为H×W×C的输入,Swin变压器首先通过将输入划分为不重叠的
M
×
M
M×M
M×M局部窗口,来重构
H
W
M
2
×
M
2
×
C
\frac{HW}{M^2}×M^2×C
M2HW?×M2×C特征的输入,其中
H
W
M
2
\frac{HW}{M^2}
M2HW?为窗口总数。然后,它分别计算每个窗口的标准自注意(即局部注意)。对于局部窗口特征
X
∈
R
M
2
×
C
X\in R^{M^2\times C}
X∈RM2×C,查询、键和值矩阵Q、K和V计算为: 绝对位置编码体现在: 相对位置编码在WindowAttention中: relative position最终加在了attention map上面。 q其中attention map是由于Shifted Window操作导致右下方的某些window像素不连续,需要对权重进行重新赋值。 具体参考:SWin Transformer 接下来,使用一个多层感知器(MLP),它有两个完全连接的层,它们之间具有GELU非线性,以进行进一步的特征变换。在MSA和MLP之前都添加了LayerNorm(LN)层,并且对这两个模块都采用了残差连接。整个过程被表述为: 2.3 Loss function对于图像SR,我们通过最小化
L
1
L1
L1像素损失来优化SwinIR的参数: 3. 实验结果4. 总结(1)内容的交互作用,可以解释为空间变化的卷积。 (2)的远程依赖建模可以通过移位的窗口机制来启用。 (3)用更少的参数具有更好的性能。例如,如图1所示,与现有的图像SR方法相比,SwinIR以更少的参数实现了更好的PSNR。 5. 测试我用的预训练模型:001_classicalSR_DIV2K_s48w8_SwinIR-M_x4.pth分别在Set5,Set14,RealSRSet+5上做测试:
发现在Set5上结果与论文一致,但在其他数据集有着较大差距。
源代码某些疑惑1. PatchMerging函数该函数应用在: 我们首先来看DownSample函数,也就是PatchMerging函数。 Downsample的输出tensor维度: s i z e : [ B , H / 2 ? W / 2 , 2 ? C ] size: [B,H/2*W/2,2*C] size:[B,H/2?W/2,2?C]
PatchUnEmbed函数定义如下:
注意改行:x = x.transpose(1, 2).view(B, self.embed_dim, x_size[0], x_size[1]) 此处数据输入维度应为: [ B , C , H , W ] [B,C,H,W] [B,C,H,W] 由前述分析可知,经过DownSample的BasicLayer的输出数据维度为: [ B , H / 2 ? W / 2 , 2 ? C ] [B,H/2*W/2,2*C] [B,H/2?W/2,2?C] 是无法转换为 [ B , C , H , W ] [B,C,H,W] [B,C,H,W]的(差两倍),会报错,如下图。
60
×
264
×
184
=
2914560
=
2
×
1457280
60\times 264\times 184=2914560=2\times 1457280
60×264×184=2914560=2×1457280 小编认为: 2. Patch_sizePatch_size的设置在初始化SwinIR的时候,默认参数为1,为1的时候是不会报错的。 patch_size的应用主要在PatchEmbed和Patchunembed两个函数中。
PatchEmbed函数定义如下:
可见,在forward函数中,对于输入 x x x的处理和patch_size没有任何关系。 我们再来看SwinIR中的forward函数,其中forward_features函数用到了上述函数:
如果我们的patch_size不为1,比如为2,那么经过上述patch_embed函数,输出宽高维度依然不变(因为forward函数中与patch_size没有关系);但是该函数内的num_patches会发生变化,缩减为原来的四倍,此时若在进行加法: x = x + s e l f . a b s o l u t e _ p o s _ e m b e d x = x + self.absolute\_pos\_embed x=x+self.absolute_pos_embed会报错。 那为什么要加上patch_size参数呢? 小编猜测,SWinIR借用了Swin Transformer的S-MSA结构,每个window都会做self-Attention操作,但是每个window里面的token数目就是像素数目,加上patch_size是希望通过缩小图片来减小参数量和计算量。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 18:41:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |