SRCNN:基于深度卷积网络的图像超分辨率

SRCNN:基于深度卷积网络的图像超分辨率

Image Super-Resolution Using Deep Convolutional Networks

基于深度卷积网络的图像超分辨率

https://arxiv.org/abs/1501.00092

https://github.com/mrshao520/ReproductionCode/tree/main/Super-Resolution_CNN

ECCV 2014

Abstract

  • 问题:~
  • 方法:提出了一种单图像超分辨率(SR)的深度学习方法
    • 直接学习低分辨率/高分辨率图像之间的端到端映射
    • 与单独处理每个组件的传统方法不同,我们的方法联合优化了所有层
  • 结果:深度 CNN 具有轻巧的结构,但展示了最先进的修复质量,并实现了快速的实际在线使用
  • 主要贡献
    • 我们提出了一个用于图像超分辨率的全卷积神经网络。该网络直接学习低分辨率和高分辨率图像之间的端到端映射,除了优化之外,几乎没有预处理和后处理。
    • 我们建立了一种基于深度学习的SR方法与传统的基于稀疏编码的SR方法之间的关系。这种关系为网络结构的设计提供了指导。
    • 我们证明了深度学习在经典的超分辨率计算机视觉问题中是有用的,并且可以达到良好的质量和速度。

1. 引言

Single image super-resolution(单图像超分辨率):旨在从单个低分辨率图像中恢复高分辨率图像。

所提出的超分辨率卷积神经网络 (SRCNN) 仅通过几次训练迭代就超越了双三次基线,并且在中等训练下优于基于稀疏编码的方法 (SC)。通过更多的训练迭代,性能可能会进一步提高。

超分辨率卷积神经网络(SR):该网络可以直接学习低分辨率和高分辨率图像之间的端到端映射。没有显示学习字典或者流形来模拟补丁空间,这些都是通过隐藏层实现的。此外,补丁提取和聚合也被表述成卷积层。整个SR管道完全通过学习获得,几乎没有预处理与后处理。

特点:

  1. 它的结构在设计时考虑了简单性,并提供了卓越的精度
  2. 通过适度数量的过滤器和层数,SR即使在CPU上也能实现快速的实际在线使用
  3. 当有更大和更多样化的数据集可用,使用更大和更深的模型时,网络的恢复质量可以进一步提高
  4. 该网络可以同时处理三个通道的彩色图像,以实现更高的超分辨率性能

2. 相关工作

2.1 图像超分辨率

单图像超分辨率算法可分为四类:

  • 预测模型
  • 基于边缘的方法
  • 图像统计方法
  • 基于示例的方法

基于内部示例的方法利用自相似性属性,并从输入图像生成示例补丁。

基于外部示例的方法从外部数据集学习低/高分辨率补丁之间的映射。这些研究在如何学习紧凑字典或流形空间来关联低/高分辨率补丁,以及如何在这些空间中进行表示方案方面各不相同。

2.2 卷积神经网络

卷积神经网络的成功因素:

  1. 在现代强大的GPUs上实现高效的训练
  2. 线性修正单元ReLU使收敛速度更快,同时提供良好的质量
  3. 大量的数据

2.3 深度学习在图像恢复中的应用

已经有一些关于使用深度学习技术进行图像恢复的研究

  1. 多层感知机(MLP)的所有层都是全连接的,用于自然图像去噪和后去模糊去噪
  2. 在基于内部示例的方法下将自动编码器网络嵌入到其超分辨率管道中

3 用于超分辨率的卷积神经网络

3.1 方法

给定一个低分辨率图像Y,SRCNN的第一个卷积层提取一组特征图。第二个卷积层将这些特征图非线性地映射到高分辨率的补丁图像。最后一个卷积层将空间邻域内的预测组合在一起,以生成最终的高分辨率图像F(Y)

  1. 补丁的提取和表示:该操作从低分辨率图像Y中重叠地提取补丁,并将每个补丁表示为高维向量。这些向量由一组特征图组成,其中的数量等于向量的维数。
  2. 非线性映射:此操作将每个高维向量非线性映射到另一个高维向量上。从概念上将,每个映射的向量都是高分辨率补丁的表示形式。这些向量包含另一组特征图。
  3. 重建:此操作聚合上述高分辨率补丁表示,以生成最终的高分辨率图像。预计此图像与基本高分辨率图像X相似。

3.1.1 补丁提取和表示(卷积操作)

通过一组过滤器对图像进行卷积,每个过滤器都是一个pre—trained basis,将过滤器的优化纳入网络的优化中。 卷积核

第一层表示为一个操作\(F_{1}\):

\[F_{1}(\mathbf{Y})=ReLU( W_{1} * \mathbf{Y} + B_{1}) \\ F_{1}(\mathbf{Y})=max(0, W_{1} * \mathbf{Y} + B_{1}) \]

  • \(W_{1}\):表示过滤器,大小为\(n_{1} \times c \times f_{1} \times f_{1}\),其中\(n_{1}\)表示卷积核数量,\(c\)表示输入图像的通道数,\(f_{1}\)表示过滤器的空间尺寸
  • \(B_{1}\):表示偏置,是一个\(n_{1}\)维向量,其中每个元素都与过滤器相关联
  • \(*\) :表示卷积运算
  • 将 Rectified Linear Unit(ReLU,\(max(0, x)\))应用于过滤器响应

3.1.2 非线性映射

第一层为每个补丁提取一个\(n_{1}\)维特征。在第二个操作中,我们将这些\(n_{1}\)维向量映射到\(n_{2}\)维向量中,这相当于应用\(n_{2}\)\(1 \times 1\)的过滤器。

第二层操作是:

\[F_{2}(\mathbf{Y}) = max(0, W_{2} * F_{1}(\mathbf{Y}) + B_{2}) \]

  • \(W_{2}\):表示 \(n_{2}\)大小为\(n_{1} \times f_{2} \times f_{2}\)的过滤器

  • \(B_{2}\):表示偏置,是一个\(n_{2}\)维向量

  • 每个输出\(n_{2}\)维向量都是将用于重建的高分辨率补丁的表示形式

  • 可以添加更多的卷积层来增加非线性,但这回增加模型的复杂性(一层\(n_{2} \times f_{2} \times f_{2} \times n_{2}\)),因此需要更多的训练时间。

3.1.3 重建

在传统方法中,通常对预测的重叠高分辨率补丁进行平均,以生成最终的完整图像。平均可以被视为一组特征图上的预定义过滤器(其中每个位置都是高分辨率补丁的扁平化矢量形式)。受此启发,我们定义了一个卷积层来生成最终的高分辨率图像:

\[F(\mathbf{Y}) = W_{3} * F_{2}(\mathbf{Y}) + B_{3} \]

  • \(W_{3}\):对应c个大小为\(n_{2} \times f_{3} \times f_{3}\)的过滤器
  • \(B_{3}\):一个 \(c\) 维向量

如果高分辨率色块的表示在图像域(即我们可以简单地重塑每个表示以形成色块),我们期待过滤器的作用类似于平均过滤器;如果高分辨率色块的表示在其他的一些域中(例如,根据某些基数表示的系数),我们期望其\(W_{3}\)行为类似于首先将系数投影到图像域中,然后取平均值。无论哪种方法,\(W_{3}\)都是一组线性过滤器。

3.1.4 代码

import torch.nn as nn
import torch.nn.functional as F
import torch.nn.init as init

class SRCNN(nn.Module):
    def __init__(self) -> None:
        super().__init__()
        
        self.conv1 = nn.Conv2d(1, 128, kernel_size=9, padding=4)
        self.conv2 = nn.Conv2d(128, 64, kernel_size=1, padding=0)
        self.conv3 = nn.Conv2d(64, 1, kernel_size=5, padding=2)
        
    def forward(self, x):
        out = F.relu(self.conv1(x))
        out = F.relu(self.conv2(out))
        out = self.conv3(out)
        
        return out

3.2 与基于稀疏编码的方法的关系

卷积神经网络视图中基于稀疏编码的方法图示。

  • 基于稀疏编码(sparse-coding-based method)的方法是具有代表是的基于外部示例的SR方法之一
  • 此方法设计其解决方案管道中的多个步骤
    1. 从输入图像中密集地裁剪重叠的块并进行预处理(例如减去平均值和归一化)
    2. 通过低分辨率字典对这些补丁进行编码
    3. 稀疏系数被传递到一个高分辨率字典中,用于重建高分辨率的补丁
    4. 对重叠重构的补丁进行聚合(例如通过加权平均)以产生最终的输出
  • 大多数外部基于示例的的方法共享这个管道,这些方法特别注意学习和优化字典或者构建有效的映射函数。

3.3 训练

学习端到端映射功能函数(损失函数)\(F\)需要评估网络参数\(\Theta = \{W_{1},W_{2},W_{3},B_{1},B_{2},B_{3}\}\)。这是通过最小化重建图像\(F(\mathbf{Y};\Theta)\)和真实有效的高分辨率图像\(X\)之间的损失来实现的。给定一组高分辨率图像\({X_{i}}\)和相应的低分辨率图像\(Y_{i}\),我们使用均方误差(Mean Squared Error MSE)作为损失函数。

\[L(\Theta) = \frac{1}{n} \sum_{i=1}^n || F(\mathbf{Y_{i}; \Theta ) - \mathbf{X_{i}}} ||^{2} \]

  • \(n\):训练样本的数量
  • 使用MSE作为损失函数有利于高PSNR。PSNR是一个广泛使用的定量评估图像恢复质量的指标,并且至少部分与感知质量相关

使用随机梯度下降和标准反向传播将损失降至最低。权重矩阵更新为

\[\Delta_{i + 1} = 0.9 \cdot \Delta_{i} - \eta \cdot \frac{\partial L}{\partial W_{i}^{ℓ}} \\ W_{i+1}^{ℓ} = W_{i}^{ℓ} + \Delta_{i+1} \]

  • \(ℓ \in \{1,2,3\}\)

  • \(i\):层和迭代的索引

  • \(\eta\):学习率,前两层是 \(10^{-4}\),最后一层是\(10^{-5}\)。根据经验发现,最后一层中较小的学习率对于网络收敛很重要。

  • 每层的过滤器权重是通过高斯分布\(X \sim N(0, 0.001)\)随机取值

在训练阶段,将从训练图像中随机裁剪的大小为\(f_{sub} \times f_{sub} \times c-pixel\)的像素子图像作为真实有效的图像\(\{X_{i}\}\)。我们所说的子图像是指这些样本被视为小的图像而不是补丁,从某种意义上说,补丁是重叠的,需要一些平均作为后期处理,但子图像不需要。为了合成低分辨率样本\(\{\mathbf{Y_{i}} \}\),我们用高斯核对子图像进行模糊处理,用放大因子进行子采样,然后通过双三次插值将其放大相同的因子。

为了避免训练时期的边界效应,所有卷积层都没有填充,并且网络产生的输出较小\(((f_{sub}-f_{1}-f_{2}-f_{3}+3)^{2} \times c)\)。MSE损失函数仅通过中心像素\(\mathbf{X_{i}}\)和网络输出之间的差值来评估。虽然我们在训练中使用固定的图像大小,但卷积神经网络可以在测试期间应用于任意大小的图像。

4. 实验

4.1 训练数据

与使用91张图片相比,使用更大的ImageNet数据集进行训练可提高性能

4.2 超分辨率的学习滤波器

该图显示了在ImageNet上训练的第一次过滤器,其放大因子为3。过滤器更具其各自的差异进行组织。

不同图层的特征图示例。

  • 每个学习的过滤器都有其特定的功能。例如:过滤器g类似于h拉普拉斯/高斯滤波器,过滤器a-e类似于不同方向的边缘检测器,而过滤器就像纹理提取器\(f\)
  • 第一层的特征图包含不同的结构(例如,不同方向的边缘),而第二层的特征图主要在强度上不同。

4.3 模型和性能权衡

基于基本的网络设置(即 \(f_{1}=9、f_{2}=1, f_{3}=5、n_{1}=64、n_{2}=32\)),我们将逐步修改其中一些参数,以研究性能和速度之间的最佳权衡,并研究性能和参数 \(n_{2}=32\)之间的关系。

4.3.1 过滤器编号

一般来说,如果我们增加网络宽度,性能就会提高,但是以运行时间为代价。

n1 = 128 n2 = 64 n1 = 64 n2 = 32 n1 = 32 n2 = 16
PSNR Time(sec) PSNR Time(sec) PSNR Time(sec)
32.60 0.60 32.52 0.18 32.26 0.05

4.3.2 过滤器大小

过滤器尺寸越大,结果越好。

4.3.3 层数

posted @ 2025-03-23 16:06  致郁系游戏  阅读(162)  评论(0)    收藏  举报