Papers | 超分辨 + 深度学习(未完待续)

时间:2023-03-09 05:59:40
Papers | 超分辨 + 深度学习(未完待续)

1. SRCNN

Home page
http://mmlab.ie.cuhk.edu.hk/projects/SRCNN.html

ECCV 2014,TPAMI 2015,2018年被引超1000次。

1.1. Contribution

  1. end-to-end深度学习应用在超分辨领域的开山之作(非 end-to-end 见 Story.3 )。

  2. 指出了超分辨方向上传统方法( sparse-coding-based SR methods )与深度学习方法的关系,insightful 。

  3. SRCNN网络非常简单,PSNR、SSIM 等却有小幅提升(< 1dB)。

  4. 应用(测试)时是完全 feed-forward ,因此网络速度比传统方法快。

1.2. Inspiration

  1. SR 的本质 & 可行性
    This problem (SR) is inherently ill-posed since a multiplicity of solutions exist for any given low-resolution pixel.
    Such a problem is typically mitigated by constraining the solution space by strong prior information.
    用样本训练 CNN ,就是在利用先验知识。

  2. CNN 为什么比传统方法更简单还更好用
    传统方法中,各个组件是分离的,比如图像预处理和字典学习。
    传统方法着重于学习和优化 dictionaries ,但对其他部分鲜有优化。
    但 SRCNN 是一个 LR 和 HR 之间的端到端网络
    其训练过程中的优化是一体的,比如,其卷积层负责 patch extraction and aggregation ,隐藏层充当 dictionaries ,统一被优化。
    因此,我们只需要极少的 pre/post-processing ,同时能实现对整体框架的全面优化

  3. 特征表示方法的不同
    过去,我们用 a set of pre-trained bases such as PCA, DCT, Haar 来表示 patches 。
    现在,我们用不同的卷积核,就实现了多样化的表示。

  4. 更简单:由于 overlapping ,因此卷积使用的像素信息比简单的字典映射更多。

1.3. Network

Papers | 超分辨 + 深度学习(未完待续)

1.3.1. Pre-processing

将低分辨率的图片,通过 Bicubic interpolation 得到 \(\mathbf Y\) 。
注意我们仍然称之为 low-resolution image 。

1.3.2. Patch extraction and representation

从 \(\mathbf Y\) 提取出 overlapping patches ,每一个 patch 都代表一个 high-dimensional vector 。
这些向量共同组成 a set of feature maps 。
每一个 vector 的维数,既是总特征数,也是 feature map 的总数。

\[
F_1(\mathbf Y) = max(0, W_1 * \mathbf Y + B_1)
\]

1.3.3. Non-linear mapping

通过一个非线性变换,由原 high-dimensional vector 变换到另一个 high-dimensional vector 。
该 high-dimensional vector 又组成了一个 set of feature maps ,在概念上代表着 high-resolution patch 。

\[
F_2(\mathbf Y) = max(0, W_2 * F_1(\mathbf Y) + B_2)
\]

1.3.4. Reconstruction

生成接近 ground truth: \(\mathbf X\) 的 output 。

过去常用取平均的方法。实际上,平均也是一个特殊的卷积。
因此我们不妨直接用一个卷积。
此时,输出patch不再是简单的平均,还可以是频域上的平均等(取决于 high-dimensional vector 的性质)。

\[
F_3(\mathbf Y) = W_2 * F_2(\mathbf Y) + B_3
\]

注意不要再非线性处理。

1.4. Story

  1. 深度CNN日益受欢迎的3大诱因:
    • 更强大的GPU;
    • 更多的数据(如ImageNet);
    • ReLU的提出,加快收敛的同时保持良好质量。
  2. CNN此前被用于 natural image denoising and removing noisy patterns (dirt/rain) ,用于 SR 是头一回。
    这就是讲好故事的重要性,无非是映射 pairs 不同。
  3. auto-encoder 也曾被用于超分辨网络,但仍没有摆脱 separated framework 的弊端。

1.5. Further Learning

  1. Traditional sparse-coding-based SR methods.

  2. 从低分辨率图像到 \(\mathbf Y\) 采用的是 Bicubic interpolation ,实际上也是卷积。但为什么不当作卷积层呢?
    文中解释,因为输出比输入还大,为了有效利用 well-optimized implementations sucha as cuda-convnet ,就暂且不当作一个“层”。
    事实上,当输出大于输入时,CNN的效率会很低。可以继续往下学,后面就会逐渐体会。

2. FSRCNN

Home page
http://mmlab.ie.cuhk.edu.hk/projects/FSRCNN.html

2016 ECCV ,2018年被引超250次。

2.1. 亮点

  1. 将单个 wide mapping layer 分解成多个 layers with fixed filter size \(3 \times 3\)
    复杂的非线性映射是最消耗运算资源的。减小尺寸,加大层数,极大提高了运算速度。

  2. 取消了 SRCNN 前端的双三次插值,将 LR 直接输入网络
    进一步减小了参数数量,进而提高了运算速度。

  3. 在 FSRCNN 末端采用反卷积层,而不是简单的插值升采样。
    • 反卷积层从 high-dimensional feature maps 和真实 HR 中学习多个卷积核,实现了超越一般插值的恢复效果。
    • 由于放在网络末端,因此网络运算速度与 HR 尺寸无关。
    • HR 尺寸可调,并且只需要重新训练利用特征的反卷积层,而不需要重新训练提取特征的CNN网络。
  4. 用PReLU替换ReLU,可以避免由 0 梯度带来的 dead features 现象。实验证明它更稳定。

2.2. Improvement

  1. 与SRCNN相比,速度提升了17到40倍(小型FSRCNN),在一般的CPU上实现了实时性
    原SRCNN在3倍 upsample \(240 \times 240\) 图像时,帧率只有1.32。但实时性要求24fps,差17倍。
  2. 恢复质量不减反升。

2.3. Analysis

限制原SRCNN运算速度的两大主谋:

  1. 升采样。设升采样因子为 \(n\) ,则运算时间增长至 \(n^2\) 倍。

  2. 非线性映射。该层越大,恢复质量越高,但时间越长。

对应的解决方法:

  1. 取消网络前端的升采样,在网络末端采用反卷积 deconvolution 。
    此时,由于输入网络的是 LR ,因此运算时间只和 LR 图像的尺寸成比例。

  2. 把单个大的非线性映射层,分解为多个小的固定大小的滤波器。

2.4. Network

整体形状像一个前端小,后端大的沙漏:

Papers | 超分辨 + 深度学习(未完待续)

我们着重理解一下最后的反卷积。

先回顾卷积:
假设输出维数为 \(d\) ,则对于每一维,都有一个特定的卷积核(相当于一个匹配模板)。
同一个卷积核,要对输入的每一个通道的每一个patch进行相同系数的卷积运算。
这样,输出的每一维都是一个 feature map ,组成一个有厚度的 feature maps 。

而反卷积恰好相反。
对于输入的 feature maps ,网络需要找到最佳的卷积核,使得输出经卷积运算后逼近 feature maps
前面的CNN,在大小固定,计算量受限的情况下,尽全力让 feature maps 承载足够的信息;
后面的反卷积层,即根据 \(d\) 种不同的特征,尽全力恢复 HR 图像。

由于每一个 map 的含义都不尽相同,因此如果将反卷积替换成一般的插值,PSNR将剧烈下降。
这是实验得到的反卷积图像,显然都学到了不同的特征:

Papers | 超分辨 + 深度学习(未完待续)

反卷积还有一个好处:
当我们希望输出不同大小的 HR 图片时,我们只需要对该层进行调整,而不需要重新训练前面的CNN网络
实验结果表明,PSNR基本没有变化
理论解释是,前面的CNN只起到抽象特征的作用,如何从有限的特征恢复图像,基本上属于反卷积的任务。

Papers | 超分辨 + 深度学习(未完待续)

2.5. Inspiration

  1. 通过减小单个层的体积,可以有效减小运算复杂度。

  2. 后面的 expanding 的表面作用是辅助升采样,本质作用是提高恢复质量(提高学习复杂度)。
    实验证明,如果取消这一环节,PSNR会有0.3dB左右的下降。
    理解:把一个相对 low-dimensional 的 feature maps 直接交给反卷积层学习,是困难的。

2.6. Further Learning

  1. De-convolution.
    下一节介绍。

  2. CNNs acceleration.

  3. PReLU.

3. ESPCN

2016 CVPR ,2018年引用超380次。

TensorFlow代码:https://github.com/Tetrachrome/subpixel & https://github.com/drakelevy/ESPCN-TensorFlow

3.1. Similarity & Network

作者的观点与FSRCNN有许多相似之处。在论文中提到:

Additionally, as noted by Dong et al. [6], there are no efficient implementations of a convolution layer whose output size is larger than the input size and well-optimized implementations such as convnet [21] do not trivially allow such behaviour.

因此,本文作者同样没有将 upscaling 放到CNN网络之中,并且也是在网络的最末端设置了一个额外的 upscaling 层: sub-pixel convolution layer ,以增强网络的实时性。

Papers | 超分辨 + 深度学习(未完待续)

总而言之,卷积层不能在 HR space 上运作,否则计算成本就会很高。

3.2. The Drawback of Transposed Convolution ( Deconvolution )

本文也提到了转置卷积操作,同时指出:

However, any reduction (summing) after convolution is expensive.

关于转置卷积及其低效的解释,有以下推荐参考(点击超链接):

  1. GitHub
  2. 知乎
  3. 知乎

图解:

Papers | 超分辨 + 深度学习(未完待续)

  1. 在原像素点周围补零;
  2. 将 kernel 转置(为什么?首先卷积可以看作一个稀疏矩阵乘法,则为了从相同尺寸的输出得到相同尺寸的“输入”,乘法矩阵就要转置);
  3. 然后进行正常卷积即可。

注意,我们是将kernel转置而不是求逆,因此转置卷积准确来说不应该称为逆卷积。

转置卷积可以用于 feature maps 可视化,但在运算速度上存在致命缺点

  1. 首先,卷积是 highly parallelizable 的,原因在于卷积核对于某一维特征而言是固定的,因此可以并行计算各个patch。相比之下,转置卷积却很复杂。
  2. We should add zero values to the upscale the image, that have to be later filled in with meaningful values.
  3. Maybe even worse, these zero values have no gradient information that can be backpropagated through.

3.3. Efficient Sub-pixel Convolution Layer

为此,作者提出了新的 upscaling 结构:Efficient subpixel convolution layer

虽然名字带“卷积”,但具体实现居然只是一个简简单单的“PS”(重排)!!

Papers | 超分辨 + 深度学习(未完待续)

重排方式见 Network 。其中要求通道数为 \(r^2\) ,这样才能实现重排。

为什么高效?

  1. CNN仍然是在 LR space 上进行。
  2. upscaling 是简单的重排,没有卷积运算。

为什么精度不降反升?

Papers | 超分辨 + 深度学习(未完待续)

尽管重排是线性的,但前面的CNN是非线性的。
CNN的训练不再注重于简单的特征提取,而是注重于组合规则下的特征提取,并且速度更快的同时层数还能更多。

3.4. 亮点

A key assumption that underlies many SR techniques is that much of the high-frequency data is redundant and thus can be accurately reconstructed from low frequency components.

4. VDSR

Home page (MatConvent)
https://cv.snu.ac.kr/research/VDSR/

2016 CVPR ,2018年引用超730次。

TensorFlow代码:https://github.com/Jongchan/tensorflow-vdsr

学习这个网络前,要了解残差学习网络:我的另一篇博客

关于 SR 问题,作者指出3大限制因素:

  1. It relies on the context of small image regions;

  2. Training converges too slowly;

  3. The network only works for a single scale.

为此,本文提出以下措施:

  1. 不再只从 LR 的小 patch 中获取信息,而利用 very big image regions
    不再用重排和转置卷积,而是和 SRCNN 一样用插值法,一开始就得到同输出尺寸的图片。

  2. 采用残差学习
    作者认为,LR 图片中的低频信息被保留到 HR 图片中,需要重构的只有高频信息。
    因此,低频映射没有必要学习,而是直接迁移即可。这是残差学习的一个比较好的解释。

  3. 采用较高的学习率( SRCNN 的 \(10^4\) 倍)以及 Adjustable gradient clipping
    让梯度保持在一个较好的范围内。

  4. Scale factor 可调,可以包含分数。比如需要缩放图片观看时很有用。
    不需要重复训练网络,网络适应性非常好。
    方法:训练集中包含多种尺寸的图片,同时训练。

Papers | 超分辨 + 深度学习(未完待续)

其他特别之处:

  1. 由于深度的贡献非常明显,因此采用20层网络结构
    虽然滤波器尺寸固定为 \(3 \times 3\) ,但感受野仍然很大。

  2. 在图片边缘,由于卷积不能很好地执行,因此传统方法往往会裁掉边缘区域再输出。
    而 VDSR 在每一层卷积前都填充 0 ,包括最后的输出也填充0。
    这样做的效果非常好,图像边缘也被很好的预测了。
    当图像信息被充分挖掘后,0 位置再填上有意义的数。