SRCNN

1. introduction

考虑了一个卷积神经网络,它可以直接学习低分辨率和高分辨率图像之间的端到端映射。我们的方法与现有的基于外部实例的外部方法有根本的不同,因为我们的方法没有明确地学习字典[41]、[49]、[50]或流形[2]、[4]。这些都是通过隐藏层隐式地实现的。此外,斑块的提取和聚合也被表示为卷积层,因此也参与了优化。在我们的方法中,整个SR管道完全通过学习获得,很少进行预/后处理。

所提出的模型被命名为超分辨率卷积神经网络(SRCNN)1。所提出的SRCNN有几个吸引人的特性。首先,它的结构是有意设计的简单性,但与最先进的基于实例的方法相比,提供了优越的精度。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R717xrcb-1641749773675)(C:\Users\Liujiawang\AppData\Roaming\Typora\typora-user-images\image-20220109212949923.png)]
基于适当的过滤器和层的数量,我们的方法实现了快速速度的实际在线使用,甚至在一个CPU上。我们的方法比许多基于示例的方法都要快,因为它是完全前馈的,不需要解决任何在使用上的优化问题。第三,实验表明,当(i)有更大、更多样化的数据集,以及/或(ii)使用更大、更深的模型时,网络的恢复质量可以进一步提高。相反,更大的数据集/模型可能会给现有的基于实例的方法带来挑战。此外,该网络可以同时处理三种通道的彩色图像,以提高超分辨率的性能。

研究的贡献主要体现在三个方面:

  • 我们提出了一个用于图像超分辨率的全卷积神经网络。该网络直接学习低分辨率和高分辨率图像之间的端到端映射,除了优化之外,很少进行预/后处理。
  • 我们建立了基于深度学习的SR方法与传统的基于稀疏编码的SR方法之间的关系。这种关系为网络结构的设计提供了指导。
  • 我们证明了深度学习在经典的超分辨率计算机视觉问题中是有用的,并且可以获得良好的质量和速度。

2. Convolutional neural networks for super-resolution

2.1 Formulation

考虑一个单一的低分辨率图像,我们首先使用双边插值将其上采样到所需的大小,这是我们执行的唯一的预处理。让我们将插值后的图像表示为\(Y\)。我们的目标是从\(Y\)中恢复一个与地面真实高分辨率图像\(X\)尽可能相似的图像\(F(Y)\)。为了便于表示,我们仍然称\(Y\)为“低分辨率”图像,尽管它的大小与\(X\)相同。我们希望学习一个映射\(F\),它在概念上包括三个操作:

1)补丁的提取和表示:该操作从低分辨率图像Y中提取(重叠的)补丁,并将每个补丁表示为一个高维向量。这些向量包括一组特征映射,其数字等于向量的维数。

2)非线性映射:该操作将每个高维向量非线性地映射到另一个高维向量上。每个映射的向量在概念上都是一个高分辨率补丁的表示。这些向量组成了另一组特征映射。

3)重建:该操作将上述高分辨率的补丁表示聚合,生成最终的高分辨率图像。这张图像预计与地面真相X相似。

如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GxWhBtyh-1641749773676)(C:\Users\Liujiawang\AppData\Roaming\Typora\typora-user-images\image-20220109231640092.png)]

2.1.1 Patch extraction and representation

图像恢复中流行的策略是密集提取补丁,然后用一组预先训练过的碱基来表示它们,如PCA、DCT、Haar等。这相当于用一组滤波器对图像进行卷积,每个滤波器都是一个基。在我们的公式中,我们将这些基的优化涉及到网络的优化中。在形式上,我们的第一层被表示为一个操作\(F1\)

\[F_1(\pmb Y)=max(0,W_1*Y+B_1) \tag{1} \]

其中\(W_1\)\(B_1\)分别表示滤波器和偏差,“∗”表示卷积运算。这里,\(W_1\)对应于\(n_1\)个支持的滤波器\(c×f1×f1\),其中c是输入图像中的通道数,\(f_1\)是滤波器的空间大小。直观地说,\(W_1\)对图像应用了\(n_1\)个卷积,每个卷积都有一个内核大小\(c×f1×f1\)。输出由\(n_1\)个特征映射组成。\(b_1\)是一个\(n_1\)维的向量,其每个元素都与一个滤波器相关联。我们对滤波器响应4应用校正后的线性单元\((ReLU,max(0,x))\)

2.1.2 Non-linear mapping

第一层为每个补丁提取一个\(n_1\)维的特征。在第二个操作中,我们将这些\(n_1\)维向量映射到一个n二维向量。这相当于应用\(n_2\)个过滤器,它们有一个简单的空间支持\(1×1\)。此解释仅适用于\(1×1\)过滤器。但它很容易推广到更大的过滤器,如\(3×3\)\(5×5\)。在这种情况下,非线性映射不在输入图像的一个补丁上;相反,它是在特征映射的一个\(3×3\)\(5×5\)"补丁”上。第二层的操作方式为:

\[F_2(\pmb Y)=max(0,W_2*F_1(\pmb Y)+B_2) \tag{2} \]

这里\(W_2\)包含\(n_2\)个滤波器,大小为\(n1×f2×f2\)\(b_2\)\(n_2\)维的。每个输出的n个二维向量在概念上都是一个将用于重建的高分辨率补丁的表示。可以添加更多的卷积层来增加非线性。但这可以增加模型的复杂性(\(n2×f2×f2×n2\)参数),因此需要更多的训练时间。

2.1.3 Reconstruction

在传统的方法中,预测的重叠高分辨率补丁经常被平均,以产生最终的完整图像。平均可以被认为是一组特征映射上的预定义滤波器(其中每个位置都是一个高分辨率补丁的“扁平”向量形式)。基于此,我们定义了一个卷积层来生成最终的高分辨率图像:

\[F(\pmb Y)=W_3*F_2(\pmb Y)+B_3 \tag{3} \]

这里\(W_3\)对应于\(n2×f3×f3\)大小的c个滤波器,而\(B_3\)是一个c维向量。如果高分辨率补丁的表示在图像域(即,我们可以简单地重塑每个表示以形成补丁),我们期望滤波器像一个平均过滤器;如果高分辨率补丁的表示在其他一些领域(例如,某些基的系数),我们期望\(W_3\)的行为就像首先将系数投影到图像域上,然后进行平均。无论用哪种方式,\(W_3\)都是一组线性滤波器。有趣的是,尽管上述三个操作都是由不同的直觉驱动的,但它们都导致了作为卷积层的相同形式。我们将这三个操作放在一起,形成一个卷积神经网络(上图)。在这个模型中,所有的过滤权值和偏差都需要进行优化。尽管整体结构很简洁,但我们的\(SRCNN\)模型是通过利用超分辨率取得重大进展而产生的丰富经验而精心开发的。

3. Training

学习端到端映射函数F需要估计网络参数\(Θ=\{W1、W2、W3、B1、B2、B3\}\)。这是通过最小化重建图像\(F(Y;Θ)\)与相应的地面真实高分辨率图像X之间的损失来实现的。给定一组高分辨率图像及其相应的低分辨率图像,我们使用均方误差(\(MSE\))作为损失函数:

\[L(\theta)=\frac{1}{n}\sum \limits_{i=1}^{n}||F(\pmb Y_i;\theta)-\pmb X_i||^2 \tag{4} \]

其中,n为训练样本的数量。使用MSE作为损失函数有利于高PSNR。PSNR是一种广泛应用于定量评价图像恢复质量的度量方法,至少部分地与感知质量相关。

使用标准反向传播的随机梯度下降使损失最小化。特别是,权重矩阵被更新为:

\[\Delta_{i+1}=0.9\cdot \Delta_i-\eta\cdot \frac{\partial L}{\partial W_i^l}, W_{i+1}^l=W_i^l+\Delta_{i+1} \tag{5} \]

其中,\(l∈{1,2,3}\)\(i\)为层和迭代的指标,\(η\)为学习率,\(\frac{\partial L}{\partial W_i^l}\)为导数。每一层的滤波器权值是通过从一个均值为0,标准差为0.001(偏差为0)的高斯分布中随机抽取来初始化的。前两层的学习速率为\(10^{-4}\),最后一层为\(10^{-5}\)。经验发现,最后一层较小的学习速率对网络收敛很重要.

4. Model and Performance Trade-offs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jVI92sma-1641749773677)(C:\Users\Liujiawang\AppData\Roaming\Typora\typora-user-images\image-20220109233553560.png)]

5. 测试效果

训练结果:
在这里插入图片描述

class SRCNN(nn.Module):
    def __init__(self, num_channels=1):
        super(SRCNN, self).__init__()
        self.conv1 = nn.Conv2d(num_channels, 64, kernel_size=9, padding=9 // 2)
        self.conv2 = nn.Conv2d(64, 32, kernel_size=5, padding=5 // 2)
        self.conv3 = nn.Conv2d(32, num_channels, kernel_size=5, padding=5 // 2)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.relu(self.conv1(x))
        x = self.relu(self.conv2(x))
        x = self.conv3(x)
        return x

测试结果:
PSNR(preds,truth): 32.06
在这里插入图片描述
PSNR(preds,truth): 30.75
在这里插入图片描述

6. Reference

Image Super-Resolution Using Deep Convolutional Networks

posted @ 2022-01-10 02:04  为红颜  阅读(279)  评论(0编辑  收藏  举报