【超分辨率】SRCNN论文笔记

论文名称:Image Super-Resolution Using Deep Convolutional Networks
论文下载地址:https://arxiv.org/pdf/1501.00092.pdf
翻译参考:https://blog.csdn.net/PPLLO_o/article/details/90040801


1.论文概述

1.SRCNN算是深度学习在图像超分辨率领域的开山之作。虽然这篇论文年代比较久远了,但是仍然值得一读。(看到论文的作者是何凯明大佬没?)
2.在这篇论文中,作者提出了一种单图像超分辨率的深度学习方法。该方法直接学习低\高分辨率图像之间的端到端映射。SRCNN将低分辨率图像作为输入并输出高分辨率图像。
3.作者提出的方法共同优化了所有的网络层结构(而传统的方法是分别处理每个组件),并且作者提出的深层卷积神经网络是一种轻质的结构,因此速度非常快,但是却有着最先进的修复质量。

2.论文提出的背景

  • 图像的超分辨(Super-Resolution)重构技术是指从一张或多张低分辨率的图像中,重构出相应的高分辨率图像。主要分为两类,一类是单图像超分辨率,即从单张低分辨率图像中重建出高分辨率图像。另一类是多图像超分辨率,即从多张低分辨率图像中重建出高分辨率图像。基于深度学习的SR,主要是基于单张图像的重构方法。
  • 超分辨重构和凸图像去噪、去雨、去模糊等问题是类似的,而这一类问题本身是ill-posed problem。(当一个问题的解不能同时满足以下三个条件时,称该问题为ill-posed problem:1. 解必须存在;2. 解必须唯一; 3. 解能根据初始条件连续变化,不会发生跳变,即解必须稳定)。
  • 对于一张低分辨图像,可能会有多张高分辨图像与之对应,因此在传统方法中通常在求解高分辨率图像时会加一个先验信息进行规范化约束,先学习这个先验信息。而基于深度学习的SR方法,则是通过神经网络直接进行从低分辨图像到高分辨图像的端到端的学习。
  • 在前面已经说过,传统的方法通常是先学习先验信息。为了学习先验信息,最新的方法大多采用基于实例的策略。基于实例的策略又可以分为外部实例和内部实例(这些不是本文的重点,所以不在详细展开)。
  • 其中,基于稀疏编码的方法就是基于外部实例的SR方法之一。作者认为基于稀疏编码的整个流程实际上相当于是深度卷积神经网络。受此启发,作者考虑一种卷积神经网络,它直接学习低分辨率图像和高分辨率图像之间的端到端映射。

3.SRCNN网络结构

作者在本节中先类比了基于稀疏编码方式与卷积神经网络的相似性。

3.1 公式化

  • 首先,进行唯一的预处理,将一张低分辨率图像采用双三次插值将其放大到所需的大小。将插值图像表示为Y,作者希望学习映射F,使F(Y)尽可能与 ground truth (标签) X相似。而这个映射F在概念上由三个操作组成:
    1.补丁提取和表示:该操作从低分辨率图像Y中提取(重叠)补丁,并将每个补丁表示为高维向量。这些高维向量组成一组特征图,特征图的个数等于向量的维数。
    2.非线性映射:将每个高维向量非线性地映射到另一个高维向量上。每个映射向量在概念上都是一个高分辨率补丁的表示。这些向量组成了另一组特征映射。
    3.重建:聚合高维向量以生成最终的高分辨率图像。重建后的图像应该和ground truth X尽量的相似。

如下图是网络的概述,作者并进一步证明了上述操作是如何形成卷积神经网络的。
在这里插入图片描述
注释图二所示,给定低分辨率图像Y,SRCNN的第一卷积层提取一组特征图。第二层将这些特征映非线性地映射到高维补丁表示。最后一层组合空间领域内的预测以产生最终的高分辨率图像F(Y)。

3.1.1补丁提取和表示

图像复原领域中的流行策略是密集地提取补丁,然后通过一组预先训练的方法来表示他们。其实,这种流行的方法就相当于用一组滤波器对图像进行卷积。所以,在形式上,第一层表示为操作 F 1 F_1 F1
F 1 ( Y ) = max ⁡ ( 0 , W 1 ∗ Y + B 1 ) F_1(\mathbf{Y})=\max \left(0, W_1 * \mathbf{Y}+B_1\right) F1(Y)=max(0,W1Y+B1)
注释

  1. W 1 W_1 W1 B 1 B_1 B1分别表示滤波器和偏置," ∗ * "表示卷积操作, W 1 W_1 W1的shape为c* f 1 f_1 f1* f 1 f_1 f1 * n 1 n_1 n1,其中c为输入图像中的通道数, f 1 f_1 f1为滤波器的大小, n 1 n_1 n1为滤波器的数量。
  2. 很明显, W 1 W_1 W1在图像上应用了 n 1 n_1 n1个卷积,每个卷积的内核大小为c* f 1 f_1 f1* f 1 f_1 f1。输出由 n 1 n_1 n1个特征映射组成。 B 1 B_1 B1 n 1 n_1 n1维的向量,其中的每个元素都与一个滤波器相关联(这其实就是在说,其中的每个元素都会和一个滤波器的输出做运算)
  3. 在卷积运算过后,还要经过ReLU激活函数,这在表达式中已经体现出。

3.1.2 非线性映射

第一层为每个补丁提取 n 1 n_1 n1维特征。在第二步的操作中,我们需要将这些 n 1 n_1 n1维向量中的每一个都映射为 n 2 n_2 n2维向量。这其实也可以用卷积运算轻松实现,并且仅需内核大小为1x1的卷积即可。通过1x1的卷积进行运算时,此时的非线性映射仍然是输入图像的补丁(基于1x1卷积运算的特性,这其实仅相当于改变了特征的个数,而特征本身并没有改变,而非线性体现在使用了ReLU激活函数)。第二层的操作 F 2 F_2 F2
F 2 ( Y ) = max ⁡ ( 0 , W 2 ∗ F 1 ( Y ) + B 2 ) F_2(\mathbf{Y})=\max \left(0, W_2 * F_1(\mathbf{Y})+B_2\right) F2(Y)=max(0,W2F1(Y)+B2)
注释

  1. W 2 W_2 W2的大小为 n 1 n_1 n1x f 2 f_2 f2x f 2 f_2 f2 x n 2 n_2 n2 B 2 B_2 B2 n 2 n_2 n2向量。(这里改一下格式,我在使用*符号时,出现无法显示的情况)
  2. 每个 n 2 n_2 n2向量的输出在概念上是将用于重建的高分辨率补丁的表示。
  3. 可以添加更多的层来增加非线性,但是这也会使模型更加的复杂,因此需要更多的时间。

3.1.3 重建

在传统的方法中,经常对预测的重叠高分辨率补丁进行平均以产生最终的完整图像。而平均可以被认为是一组特征映射上的预定义滤波器(其中每个位置都是高分辨率补丁的”扁平“向量形式)。由此推动,作者定义最后的操作以产生最终的高分辨率图像:
F ( Y ) = W 3 ∗ F 2 ( Y ) + B 3 F(\mathbf{Y})= W_3 * F_2(\mathbf{Y})+B_3 F(Y)=W3F2(Y)+B3
注释 W 3 W_3 W3的大小为 n 2 n_2 n2x f 3 f_3 f3x f 3 f_3 f3 x c c c B 3 B_3 B3为c维向量。

将上述的三个操作放在一起并形成了卷积神经网络,如上图的图二所示。在该模型中,将优化所有的滤波器权重和偏置。

3.2稀疏编码和卷积神经网络的关系

作者证明了基于稀疏编码的SR方法,可以看作是一个卷积神经网络。如图3给出了一个例子。
在这里插入图片描述

  • 在基于稀疏编码的方法中,我们考虑从输入图像中提取一个 f 1 f_1 f1 × f 1 f_1 f1的低分辨率补丁。该补丁按其均值减去,然后投影到(低分辨率)字典上。如果字典大小为 n 1 n_1 n1,这相当于在输入图像上应用 n 1 n_1 n1个线性滤波器( f 1 f_1 f1 × f 1 f_1 f1)(平均减法也是线性运算,也可以作为卷积运算的一部分 )。这部分操作为图3的左侧部分。这里就等同于SRCNN的第一层操作。
  • 稀疏编码求解器将迭代处理 n 1 n_1 n1维向量,该求解器的输出为一个 n 2 n_2 n2维向量。在稀疏编码的情况下通常为 n 2 n_2 n2 = n 1 n_1 n1。这些 n 2 n_2 n2维向量是高分辨率补丁的表示。在这个意义上,稀疏编码求解器表现为非线性映射运算符的特殊情况。参见图3的中间部分。然而,稀疏编码求解器不是前馈的,即它是迭代算法。相反,作者的非线性算子是完全前馈的,可以有效地计算。如果我们设置 f 2 f_2 f2= 1,那么我们的非线性算子可以被认为是像素方式的完全连接层。然后将上述 n 2 n_2 n2维向量(在稀疏编码之后)投影到另一个(高分辨率)字典上以产生高分辨率的补丁。这里就等同于SRCNN的第二层操作。
  • 然后对重叠的高分辨率补丁进行平均。如上所述,这相当于 n 2 n_2 n2特征图上的线性卷积。如果用于重建的高分辨率补丁大小为 f 3 x f 3 f_3 x f_3 f3xf3,那么线性滤波器具有大小为 f 3 x f 3 f_3 x f_3 f3xf3的等效空间支持。请参见图3的右侧部分。这里就等同于SRCNN的第三层操作。

上述讨论表明,基于稀疏编码的SR方法可以看作是一种卷积神经网络(具有不同的非线性映射)。

3.3 损失函数

学习端到端的映射F需要评估网络参数 Θ = { W 1 , W 2 , W 3 , B 1 , B 2 , B 3 W_1,W_2, W_3, B_1, B_2, B_3 W1,W2,W3,B1,B2,B3 },通过最小化重建图像 F ( Y ; Θ ) F(\mathbf{Y} ; \Theta) F(Y;Θ)和ground truth高分辨图像X之间的损失来实现,作者采用均方误差作为损失函数:
L ( Θ ) = 1 n ∑ i = 1 n ∥ F ( Y i ; Θ ) − X i ∥ 2 L(\Theta)=\frac{1}{n} \sum_{i=1}^n\left\|F\left(\mathbf{Y}_i ; \Theta\right)-\mathbf{X}_i\right\|^2 L(Θ)=n1i=1nF(Yi;Θ)Xi2
注释:n是训练样本的数量。使用均方误差作为损失函数有利于高PSNR。

4.实验部分

SRCNN网络有如下几点引人注目的特性:1.它的结构在设计时考虑到了简单性,与最先进的基于实例的方法相比,提供了更高精度,如下图所示。2.适度数量的卷积和网络层使作者的网络,即便在CPU上运行也能实现较快的速度。3.通过实验表明,更大的数据集或者更大、更深的模型可以进一步改善网络的恢复质量。
图一

4.1训练数据集

正如众多参考文献中所说,深度学习通常受益于大的数据集。作者使用了一个小型数据集和一个大型数据集进行了对比实验。其中小型数据集由91个图像构成,大型数据集来自ILSVRC 2013 ImageNet检测训练分区的30多万张图像。使用不同数据集的测试收敛曲线如下图所示。结果表明,使用更大和更多样化的图像训练集可以进一步提高SRCNN的性能。
在这里插入图片描述
在之后的实验中,默认使用ImageNet数据集。

4.2模型和性能权衡

参考基本网络设置( f 1 = 9 , f 2 = 1 , f 3 = 5 , n 1 = 64 , n 2 = 32 f_1 = 9, f_2 = 1, f_3 = 5, n_1 = 64, n_2 = 32 f1=9,f2=1,f3=5,n1=64,n2=32),作者逐渐修改其中的一些参数,以研究性能和速度之前的最佳平衡,研究性能和参数之间的关系。

4.2.1卷积的数量(网络的宽度)

通常,如果以运行时间为代价增加网络的宽度,即增加更多的滤波器,可以提升网络的性能。具体而言,网络的默认设置为 n 1 = 64 , n 2 = 32 n_1 = 64, n_2 = 32 n1=64,n2=32,进行两组对照实验:1.一个更大的网络: n 1 = 128 , n 2 = 64 n_1 = 128, n_2 = 64 n1=128,n2=64;2.一个更小的网络: n 1 = 32 , n 2 = 16 n_1 = 32, n_2 = 16 n1=32,n2=16。网络的性能对比如下表所示,显然,增加网络的宽度可以实现优异的性能,但是模型的速度会变慢。
在这里插入图片描述

4.2.2卷积的大小

  • 在本节中,作者探索了网络对于卷积大小的敏感性。在网络的默认设置中,设置卷积的大小为 f 1 = 9 , f 2 = 1 , f 3 = 5 f_1 = 9, f_2 = 1, f_3 = 5 f1=9,f2=1,f3=5,为简单起见,将网络表示为9-1-5。首先,为了与稀疏编码的方法保持一致,固定第二层 f 2 = 1 f_2 = 1 f2=1,然后将网络扩大为11-1-7。实验的结果由32.52dB提升到了32.57dB(PSNR),这表明一个合理的较大的过滤器尺寸可以掌握更丰富的结构信息,进而导致更好的结果。
  • 随后,作者进一步扩大第二层卷积的大小,将网络扩大为:9-3-5和9-5-5。收敛曲线如下图7所示。根据实验表明,使用更大的卷积能够显著提升性能。这一结果也表明,在映射阶段利用邻近信息是有益的。
    在这里插入图片描述

4.2.3 网络层数

  • 最近的研究也表明,适度的增加网络的层数也可以提升性能。作者添加了另一个非线性映射层,设置如下: n 22 = 16 n_{22}=16 n22=16 f 22 = 1 f_{22}=1 f22=1,并进行了三组对照实验,其网络的的设置分别为9-1-1-5,9-3-1-5,9-5-1-5。添加层的初始化方案和学习率都与第二层相同。从下图8中,我们可以观察到:与三层的网络相比,四层的网络收敛更慢。
    在这里插入图片描述
  • 深层结构对超分辨率的有效性发现不像图像分类任务那样明显。更进一步说,作者发现:更深层的网络并不总是造成更好的结果。如下图所示,绿线要明显低于其他曲线,而绿线所代表的网络最深。即便在加深网络的同时扩大卷积的大小也不能带来性能的提升。
    在这里插入图片描述
  • 作者对并不是”越深越好“给出了一定的解释,这可能是由于训练困难造成的。SRCNN网络不包含池化层和全连接层,因此对初始化参数和学习速率非常敏感。当作者深入研究时(例如,4或5层),发现很难设置适当的学习率来保证收敛。即使它收敛,网络也可能陷入一个糟糕的局部极小值,即使有足够的训练时间,学习到的滤波器也缺乏多样性。

4.3与最新方法的比较

  • 在本节中,作者使用的SRCNN模型的参数为 f 1 = 9 , f 2 = 5 , f 3 = 5 , n 1 = 64 , n 2 = 32 f_1 = 9, f_2 = 5, f_3 = 5, n_1 = 64, n_2 = 32 f1=9,f2=5,f3=5,n1=64,n2=32的三层网络,这是基于性能和速度权衡的选择。
  • 与SRCNN模型对比的方法包括:SC、NE+LLE、ANR、A+、KK。
  • 测试的数据集包括:Set5、Set14、BSD200。
  • 评估指标包括:PSNR、SSIM、IFC、NQM、WPSNR、MSSSIM。

如下三表为实验的定量结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注释

  • 作者所提出的SRCNN模型在大多数指标中获得了最高分。
  • 作者同时指出IFC和NQM这两个指标可能不能真实地反映图像质量。因此,不考虑这两个指标,SRCNN在所有方法和缩放因子中获得了最好的性能。

在Set5数据集上的收敛曲线:
在这里插入图片描述
注释:作者推测,SRCNN训练时间越长,结果越好,直至收敛。

如下三图为实验的定性结果,可以观察到,SRCNN比其他方法产生了更尖锐的边缘,在图像中没有任何明显的伪影:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.总结

  • 作者针对单幅图像超分辨率问题,提出了一种新的深度学习方法并证明了传统的基于稀疏编码的SR方法可以被重新表述为一个深度卷积神经网络。

  • 作者所提出的网络为SRCNN,该网络学习低分辨率和高分辨率图像之间的端到端映射,除了优化之外几乎没有额外的预处理/后处理,所有是一种轻质模型。由于结构轻巧,SRCNN比最先进的方法获得了更好的性能。

  • 作者探索更多的过滤器和不同的训练策略,可以进一步获得额外的性能。此外,该结构具有简单和鲁棒性的优点,可以应用于其他低层次的视觉问题,如图像去模糊或同步SR+去噪。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
srcnn超分辨率pytorch代码是用于实现图像超分辨率(Super Resolution)的一种深度学习模型。下面我将逐行讲解这个代码。 首先,代码导入了需要的库和模块,包括torch、torchvision等,以及一些辅助函数。 接下来,定义了一个名为SRCNN的类。这个类继承自nn.Module类,用来构建SRCNN模型。在这个类的构造函数中,首先调用父类的构造函数初始化模型;然后定义了三个卷积层,分别是nn.Conv2d,并且设置输入通道数、输出通道数、卷积核大小和步长;接着定义了ReLU激活函数;最后定义了一个反卷积层nn.ConvTranspose2d,用于得到最终的超分辨率图像。 在类的前面还定义了两个辅助函数,即adjust_scale和normalize,分别用于将图像缩放到指定尺寸和对图像进行归一化处理。 接下来,定义了一个名为train的函数,该函数用于训练模型。在函数中,首先根据指定的超参数设置模型的训练参数,如学习率、损失函数、优化器等;然后加载训练数据集和验证数据集,采用DataLoader进行批量加载和预处理;随后,利用模型进行迭代训练,通过计算输出图像与标签图像之间的损失来更新模型参数;最后将训练得到的模型保存到指定路径。 最后,定义了一个名为test的函数,用于测试模型。在函数中,首先加载测试图像,并通过模型进行超分辨率处理;然后将超分辨率图像与原始图像进行比较,计算并打印出PSNR指标,评估超分辨率效果。 总结一下,这个SRCNN的pytorch代码包括了模型的构建、训练和测试三个主要部分,通过迭代训练和测试来实现图像的超分辨率。通过调整超参数、数据集和函数的调用,可以适应不同的超分辨率任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值