本文介绍了做深度学习图像超分辨率SR任务应先掌握的基本概念性知识,然后介绍了SR任务应该向那几个方面着手,希望对SR能有一个清晰的认识,更方便更有目的性的开展SR任务。
主要依据NTIER2018比赛的论文进行介绍。
文中有许多概念或模糊,或啰嗦,或有错误,烦请指正,留言多交流。
超分辨率SR的定义:将低分辨率的图像通过算法转换成高分辨率图像
SR分两种:
SISR:单图像超分辨率
VSR:视频超分辨率
通常的超分辨率指SISR,即给定一个低分辨率(LR)图像,然后重建出一个精确的高分辨率(HR)图像。
本文 SR 均指基于深度学习单图像超分辨率SR
CVPR(IEEE Conference on Computer Vision and Pattern Recognition)是世界顶级的计算机视觉会议(三大顶会之一,即IEEE国际计算机视觉与模式识别会议,另外两个是ICCV和ECCV),CVPR下NTIRE(New Trends in Image Restoration and Enhancement Challenges)比赛,主要涉及图像超分辨率、图像去噪、去模糊、去摩尔纹、重建、去雾。本文主要基于NTIRE的超分辨率方面来谈,且只到2018年为止,更新的方法亲自行查阅资料。
NTIRE主要有三个方向:
图像超分辨率(super-resolution)、图像去雾(dehazing)、光谱重建(spectral reconstruction)。
在超分辨率上有四个赛道:使用经典的bicubic(双三次插值)降尺度方式作为待重建图像,进行8倍放大重建。这也是目前大部分文献中最常见的设置方式之一。而其余三个赛道均是来自不同程度(Mild、Difficult、Wild)未知退化算子模拟相机采集的待重建图像(目的是模拟现实的图像),进行4倍放大重建。
NTIRE2018比赛使用的数据集为DIV2K数据集,一共包含1000张2K分辨率的RGB图像,其中800张为训练集,100张为验证集,100张为测试集。评价标准使用了PSNR、SSIM。PSNR,即峰值信噪比,可以比较SR结果图和ground truth(即原高清大图)之间的差距;SSIM,即结构相似性,可以评价SR的恢复效果,更注重细节恢复。
下载地址见文末。
基于深度学习超分辨率的起源:SRCNN
(Learning a Deep Convolutional Network for Image Super-Resolution, ECCV2014)
SRCNN文章于2014年提出,是第一篇将深度卷积神经网络(CNN)引入SR领域。作者只使用了三个卷积层,卷积核的大小分为为9x9,,1x1和5x5。这三个卷积层也为SR过程定义了三个步骤(后续的SR文章都是基于这三个步骤的改进):
SR重建的方向可分为两个:
力求恢复出真实可靠的细节部分,对细节要求苛刻。
应用如:医学影像上的超分辨率重建,低分辨率摄像头人脸或者外形的恢复等。
追求整体视觉效果,细节部位要求不高。
应用如:低分辨率视频电视的恢复、相机模糊图像的恢复等。
文后有补充说明
SR重建任务的方法可分为两个大类:
SR重建任务的两个优化问题:
上面介绍了SR的背景信息和概念知识,以下介绍SR的主体,即实现超分辨率的三大步骤。
目前(到2018年),主流的LR特征提取是用一层3x3的卷积核对LR图像直接进行特征提取,称为浅层特征提取。此部分比较简单,所有不多以介绍。
这部分主要用三篇论文(VDSR,EDSR,WDSR)来讲解。
精确的图像超分辨率使用非常深的卷积网络VDSR,CVPR2016的一篇很有创新的文章
(Accurate Image Super-Resolution Using Very Deep Convolutional Networks, CVPR2016)
code: https://cv.snu.ac.kr/research/VDSR/
github(caffe): https://github.com/huangzehao/caffe-vdsr
github(tensorflow): https://github.com/Jongchan/tensorflow-vdsr
github(pytorch): https://github.com/twtygqyy/pytorch-vdsr
VDSR将插值后得到的变成目标尺寸的低分辨率图像作为网络的输入,再将这个图像与网络学到的残差相加得到最终的网络的输出。SRCNN存在三个问题需要进行改进:
1、依赖于小图像区域的内容;2、训练收敛太慢;3、网络只对于某一个比例有效。
因此VDSR主要有如下三点创新贡献:
加深了网络(20层),增加了感受野
越大的感受野,可使得网络能够根据更多的像素即更大的区域来预测目标像素信息,在处理大图像上有优势。文章选取3×3的卷积核,深度为D的网络拥有(2D+1)×(2D+1)的感受野,即由SRCNN的13x13变为41x41。
将残差residual的思想引入SR,减轻了网络的“负担”,又加速了学习速率,同时采用调整梯度裁剪(Adjustable Gradient Clipping)
采用残差学习,残差图像比较稀疏,大部分值都为0或者比较小,网络不再需要学习如何恢复一张高清的HR图像,而是学习高清图像与LR图像拉伸之后的残差,因此收敛速度快。VDSR还应用了自适应梯度裁剪(Adjustable Gradient Clipping),将梯度限制在某一范围,也能够加快收敛过程。
构造了一个适用于不同放大尺度的网络,并通过实验验证了该网络的可靠性
随着网络结构的加深,训练成本相应增加,若网络只能做单一尺度的放大,那么网络的可重用性比较差,VDSR将不同倍数的图像混合在一起训练,这样训练出来的一个模型就可以解决不同倍数的超分辨率问题。多尺度网络的效果不仅不降低,反而提升了PSNR值。
网络的结构:
残差思想的引入,使得深度网络能够应用于SR领域,而随着深度的加深,网络的perceptive field变得越来越宽,使得网络不仅具备局部特征,也能捕捉到更加全局的特征,全局特征的加入更有利于SR纹理细节的恢复。
值得一提的是作者使用了对图像进行补0操作策略:
传统的卷积操作,图片通过逐步卷积,图像大小也越来越小,一个很小的图,首先不适合一个很深的网络(这会要求输入图片的size很大),其次,如果采取传统的卷积操作,边界像素会因考虑的区域少,感受野小而导致结果较差,于是传统的做法是对卷积结果做一个裁剪,剪去边界区域,随之产生一个新的问题,裁剪后的图像(卷积后本来就很小了)变的更小,用论文原话来说就是:After cropping,the final image is too small to be visually pleasing.
于是,作者提出一个新的策略,就是每次卷积后,图像的size变小,但是,在下一次卷积前,对图像进行补0操作,恢复到原来大小,这样不仅解决了网络深度的问题,同时,实验证明对边界像素的预测结果也得到了提升。
于是,我们可以总结出图像超分辨率需要具体的三个基本要素:
深的网络。一个很深的网络对图像的超分辨率是很必要的,其拥有更大的感受野,很深的网络使得能够根据更多的像素即更大的区域来预测目标像素信息。
使用残差连接。越深的网络对训练要求更高,通常面临梯度消失的问题,也更难收敛,因此引入残差学习,使网络只学习高清图像与LR图像拉伸之后的残差,收敛速度快。
保证卷积前后图像尺寸大小不变。对图像进行补0操作,有效利用图像的边界像素,保留更多的边缘细节,同时又利于网络加深图像尺寸逐渐变小的问题。
另外,越看最近的超分辨率方面的文章,其网络层数越来越多,网络更深,因此每次训练都要消耗大量的时间和资源,所以能够达到性能的同时,一个网络应该适用于不同放大尺度的网络,而不需要对于不同的放大分辨率时都要重新训练。
增强型深度残差网络EDSR,是NTIRE2017超分辨率挑战赛上获得冠军的方案。
(Enhanced Deep Residual Networks for Single Image Super-Resolution, CVPRW2017)
github(torch): https://github.com/LimBee/NTIRE2017
github(tensorflow): https://github.com/jmiller656/EDSR-Tensorflow
github(pytorch): https://github.com/thstkdgus35/EDSR-PyTorch
EDSR主要有三点贡献:
第1点贡献:
EDSR网络如下:
(shuffle为上采样方法,后面会重点介绍)
第2点贡献:
以上的EDSR网络架构是针对处理特定超分辨率尺度的单尺度架构,作者利用了VDSR的尺度间相关性,提出了一个在单模型中重建各种尺度高分辨率图像的多尺度架构MDSR。
网络结构如下:
在MDSR网络头部设置了一个预处理模块,用来减少输入图像不同尺寸的差异,每个预处理模块包含两个卷积核为5×5的残差块。在MDSR的末尾,不同的scale-upsampling模型平行设置来处理各种尺度的SR预测。
作者通过实验得出:多尺度的超分辨率是相互关联的任务。在训练上采样因子×3和×4的模型时,用预训练的×2网络初始化模型参数,这种预训练策略加速了训练并提高了最终性能。
另外,值得一提的是,作者在训练时,损失函数用L1而不是L2,即根据LapSRN的思想采用了L1范数来计算对应的误差,L2损失会导致模糊的预测。
第3点贡献:
EDSR在结构上与SRResNet相比,就是把批规范化处理(batch normalization, BN)操作给去掉了。如图:
下面重点说一下为什么要在超分辨率中去掉BN,此即为本篇文章的重要创新点。
BN的介绍:
Batch Norm可谓深度学习中非常重要的技术,不仅可以使训练更深的网络变容易,加速收敛,还有一定正则化的效果,可以防止模型过拟合。在很多基于CNN的分类任务中,被大量使用。
但在图像超分辨率和图像生成方面,BatchNorm的表现并不是很好。当这些任务中,网络加入了BatchNorm层,反而使得训练速度缓慢且不稳定,甚至最后结果发散。
图像超分辨率不适宜用BN的原因:
在超分辨率任务中,过拟合并不常见。比如dropout或者L2正则都很少被采用,因此如果在训练并不存在困难的基础上,BN并不能提供对超分辨率任务有效的辅助作用。
对于SR来说给定输入低分辨率图像,输出高分辨率图像,中间过程学习的是细节信息。其输入输出的分布基本一致,加入BN后,BN白化中间的特征的方式完全破坏了原始空间的表征,即使input和output的数据分布发生了变化,而在重建时,BN还要拿出一部分参数做这部分的恢复。有研究人员在训练中尝试加入BN,研究其工作日志发现加入BN的网络loss的收敛速度明显比没有BN的要慢很多且loss的波动会非常大。因此,加入BN增加了内存和计算负担不如直接去掉。
更通俗一点来说,图像超分辨率网络输出的图像在色彩、对比度、亮度上要求和输入一致,改变的仅仅是分辨率和一些细节,而Batch Norm,对图像来说类似于一种对比度的拉伸,任何图像经过Batch Norm后,其色彩的分布都会被归一化,也就是说,它破坏了图像原本的对比度信息,所以Batch Norm的加入反而影响了网络输出的质量。虽然Batch Norm中的scale和shift参数可以抵消归一化的效果,但这样就增加了训练的难度和时间,还不如直接不用。
另外,BN是把数据归一化到[0,1]之间,算出每批图片的均值和方差,然后每张图片减去批得到的均值再除以方差,而超分辨率任务是一个回归任务,每个batch并没有太多的相关性,这就使得超分辨率任务在在各个batch中呈现的均值和方差很难进行稳定统计。
总结EDSR的成果,我们可以得出在超分辨率任务中,以下几点是重要的:
特别地,本部分参考《EDSR 论文笔记》,作者对为什么使用BN、残差、损失等做了详细地介绍,强烈推荐观之。
贴出其目录如下:
(Wide Activation for Efficient and Accurate Image Super-Resolution, NTIER2018)
WDSR在bicubic上获得了第七名,而在现实图片的Mild、Difficult、Wild三个赛道上分别取得了第一名、第一名和第二名的好成绩。
github(Pytorch):https://github.com/JiahuiYu/wdsr_ntire2018
WDSR是基于EDSR的改进。主要有三点贡献:
第1点和第3点贡献
改进的残差块如下:
左边为EDSR的残差块,中间是WDSR-A残差块,右边的是WDSR-B残差块。
左图为EDSR的残差块,右图为WDSR的残差块。EDSR两个卷积层的输入输出通道均相同(等矩形表示);对于WDSR,作者将第一个3x3的卷积层的输入通道减小,然后输出更大的通道作为第二个卷积层的输入(relu层不改变通道数),形成通道数扩大再减少的结构(用梯形表示输入输出通道的不同)。这样,可以保证相对于EDSR,在不增加参数的情况下,第一个卷积层增加了输出的通道数量,即增加feature map的宽度,获得了更多的特征信息。
注:通道数=特征图数=滤波器数
WDSR-A和WDSR-B的区别:
WDSR-A:用3X3的卷积先对通道数进行增大,经过relu激活层,再使用3X3的卷积对通道数进行缩小,主要针对2-4倍的放大。
即:3x3 -> relu -> 3x3,卷积层的通道数依次为:
3x3:input=32,output=192
3x3:input=192,output=32
WDSR-B:采用1X1的卷积核进行通道数的改变,经过relu,再使用1x1的卷积层进行通道数的改变,然后再使用3X3的卷积核进行特征提取,主要针对6-9倍的放大。
即:1x1 -> relu -> 1x1 -> 3x3,卷积层的通道数依次为:
1x1:input=32,output=192
1x1:input=192,output=32
3x3:input=32,output=32
使用 Neutron 分别打开ESDR和WDSR的结构图我们可以看到:
对于同样计算开销的前提下,表现性能是:WDSR-B > WDSR-A > ESDR。
图中阴影部分为作者去除的冗余的两个线性卷积层(只是卷积没有激活相当于是线性变换),作者认为这些层的效果是可以吸收到残差结构里的,通过去除实验之后,发现效果并没有下降,所以去除冗余卷积层可以降低计算开销。
第2点贡献
由于Batch Normalization(BN)层在超分辨率几乎起反向作用,EDSR直接去除了BN层,而WDSR不同,另辟蹊径,提出了取代BN的Weight Normalization(WN)。
WN算是WDSR一个重要的技巧,其来自openAI在NIPS2016发表的一篇文章,就是将权重进行标准化。
假设输出为 y y y :
y = w ⋅ x + b y=w \cdot x+b y=w⋅x+b这里, w w w 是 k 维权重向量, x x x 是其输入, b b b 为标量偏置项。
WN实则为权重参数重写,称为重参数 w w w 。 WN提出的归一化策略是将权重向量 w w w 其欧氏范数和其方向上分解为一个参数向量 v v v 和一个参数标量 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣ ,分解方法为:
w = ∣ ∣ w ∣ ∣ ∣ ∣ v ∣ ∣ v w=\frac{||w||}{||v||}v w=∣∣v∣∣∣∣w∣∣v这里, v v v 是 k 维向量, ∣ ∣ v ∣ ∣ ||v|| ∣∣v∣∣ 表示 v v v 的欧几里得范数,为一个标量。 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣ 与参数 v v v 独立。
权重 w w w 的方向变更为 v ∣ ∣ v ∣ ∣ \frac{v}{||v||} ∣∣v∣∣v,长度变更 ∣ ∣ w ∣ ∣ ∣ ∣ v ∣ ∣ \frac{||w||}{||v||} ∣∣v∣∣∣∣w∣∣ ,为因此重参数 w w w 用了两个独立的参数表示权重的长度和方向。
作者实验得出:引入WN可以使用更高的学习速率(例如10倍)进行训练,提高训练和测试的准确性。
另外,BN使用的基于mini-batch的归一化统计量代替全局统计量,相当于在梯度计算中引入了噪声。而WN则没有这个问题,所以在生成模型,强化学习等噪声敏感的环境中WN的效果也要优于BN。并且,WN也没有引入额外的参数,比BN更节约显存。
由于篇幅原因,未多加介绍WN,具体的WN原理请参考这篇回答《模型优化之Weight Normalization》。
另,本WDSR部分参考WDSR(NTIRE2018超分辨率冠军)【深度解析】 ,个人认为解读的非常到位。
既2016年的VDSR后,超分辨率SR的重建大部分使用ESPCN论文中提出的pixel-shuffle
(Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network, CVPR2016)
HR重建和SR重建只是放大倍数不同而已,本文不加以区分。
作者在本文中介绍到,像SRCNN那样的方法,由于需要将低分辨率图像通过上采样插值得到与高分辨率图像相同大小的尺寸,再输入到网络中,这意味着要在较高的分辨率上进行卷积操作,从而增加了计算复杂度。本文提出了一种直接在低分辨率图像尺寸上提取特征,计算得到高分辨率图像的高效方法。ESPCN网络结构如下图所示。
ESPCN的核心概念是亚像素卷积层(sub-pixel convolutional layer)。假设图像尺寸大小为HxW,先通过隐藏层(Hidden layers)得到 r 2 r^2 r2 个特征通道, r r r 即为超分辨率放大的因子,然后将 r 2 r^2 r2 个特征图重新排列(其排列原理和亚像素卷积的原理一样)成rHxrWx1的高分辨率图像。
如果是输入为RGB(通道数为3)图像,大小为HxW,需要放大的倍速为r,那么隐藏层输出的特征通道应为3xrxr,进行重新排列就得到rHxrWx3的高分辨率图。
强烈建议:
详细的pixel-shuffle原理介绍请参读这篇文章,讲的非常好:PyTorch学习笔记(10)——上采样和PixelShuffle
官方给了在pytorch上实现的例子:
>>> ps = nn.PixelShuffle(3)
>>> input = torch.tensor(1, 9, 4, 4)
>>> output = ps(input)
>>> print(output.size())
torch.Size([1, 1, 12, 12])
###
# scale为上采样因子,N为batch size
# 输入通道为scale^2 * C,然后通过周期筛选(periodic shuffing)的方法得到这个高分辨率的图像
# - Input: (N, scale^2 * C, H, W)
# - Output: (N, C, scale * H, scale * W)
# H和W都扩大scale倍,即分辨率增大
特别提示:
现今使用PiexlShuffle的进行超分辨率重建的文章,一般都是自己搭建前面隐藏层的架构(即生成 r 2 × C r^2 \times C r2×C个通道之前的网络),然后使用周期筛选(periodic shuffing)的方法得到这个rHxrW的高分辨率的图像。
周期筛选方法同亚像素卷积原理,见PyTorch学习笔记(10)——上采样和PixelShuffle的2.2节和2.3节。
关于SR重建任务的方向补充说明
SRGAN应该是第一篇将GAN引入SR的论文。
SRGAN(SRResNet)
(Learning a Deep Convolutional Network for Image Super-Resolution, ECCV2014)
code: http://mmlab.ie.cuhk.edu.hk/projects/SRCNN.html
SRResNet为SRGAN的生成部分
SRGAN与其他上述方法,不同的是重建得到的图像虽然比上述方法都要清晰,但在PSNR和SSIM上都要比上述方法甚至是bicubic上采样得到都要低很多。主要原因SRGAN使用了感知损失,而感知损失重建的图像在人类的认知视觉上更舒服,但细节恢复上确实会和原图相差很多。如论文中的得到的重建图:
4倍放大SRGAN-HR和ground truth,可以看到细节部分被修改,整体视觉感受较好。
因此,一定要先明确我们的SR是倾向于细节还是整体,
对于注重细节的SR重建,应更注重浅层上的高频信息和卷积时注意保留边缘细节,如DenseNet采用重复利用特征的方式,考虑到高频信息在浅层上会更丰富,将浅层信息直接输送到后面的网络会更利于边缘细节的重建,此时利用残差连接有助于绕过大量的低频信息,使主网络学习到更有效的信息(可参考RCAN网络);
对于注重整体效果的SR重建,GAN是个不错的选择,感知损失也更注重于视觉效果。
而损失函数的选择对网络的恢复效果也是极其重要的,根据注重细节恢复还是整体恢复,适当选择损失函数。目前在细节方面,通常使用 L 1 L_1 L1损失;在整体方面,通常使用mes损失和感知损失。EnhanceNet一文对mes、感知损失、纹理匹配损失和对抗损失做了对比比较。
写得都很好,强烈建议阅读。
从SRCNN到EDSR,总结深度学习端到端超分辨率方法发展历程
NTIRE 2018 图像超分辨率 CVPR Workshop优胜方案
深度学习端到端超分辨率方法发展历程(二)
EDSR 论文笔记
WDSR(NTIRE2018超分辨率冠军)【深度解析】
文章若有错误处,欢迎评论留言指正。
另贴出数据集下载地址
DIV2K数据集下载地址:
官方:https://data.vision.ee.ethz.ch/cvl/DIV2K/
或SNU_CVLab
一般超分辨率文章使用的5个测试集Set5 , Set14, BSDS100, Urban100 and Manga109下载地址:
original test datasets (HR images) ,OriginalTestData.zip
如下载缓慢,博主已下载好百度云,请私信。