基于深度学习的图像超分辨率方法
图像超分辨率(Image Super-resolution, SR)是一项将低分辨率(low resolution, LR)的图像通过一定的算法提升到高分辨率(high resolution, HR)的技术。SR技术在很多领域都存在着应用价值,最典型的就是在社交网络上,若是直接传输高清图片,会占用大量带宽,同时也会造成用户体验不佳。如何传输分辨率较小的图像,再将其通过SR方法变为高清图像,是一个很值得研究的问题。下图是一个超分辨率的例子:
本文总结了一下我对基于深度学习的图像超分辨率的最近几年论文的研究。。
超分辨率的评价方法
基于深度学习的图像超分辨率方法大多是处理只有单个LR图像,重建HR图像的问题的,这被称为Single Image Super Resolution(SISR)。因为LR图像中包含的信息肯定是比HR图像要少的,所以SISR本质上是一个ill-posed的问题。用来衡量超分辨率质量的指标通常是计算神经网络输出的HR图像和原始图像的PSNR(Peak Signal to Noise Ratio,峰值信噪比)值,PSNR的定义如下: 其中,$MSE$是两张图像的均方误差,$MAX$的值通常为$255$,PSNR值越高,说明输出的HR图像质量越好,同时,这个评价标准也决定了基于深度学习的图像超分辨率方法的loss函数通常是L2损失函数或其变体。
开山之作(SRCNN)和改进(FSRCNN)
SRCNN(paper)
SRCNN是最早的使用深度学习方法做图像超分辨率的工作。其网络结构非常简单,仅仅使用了三个卷积层,便取得了远超传统方法的PSNR值。
下图是SRCNN的网络结构,输入的LR图像先经过bicubic插值扩大到目标的尺寸,然后将图像转换成YCbCr色彩空间,只将Y通道输入到网络当中,经过三层卷积处理之后再和插值得到的CbCr通道合并,做这样处理的原因主要在于,人眼对于Y通道的信息(亮度)更为敏感,而对CbCr通道的信息(颜色)不是很敏感。
作者将这三层卷积分别解释成为特征提取和表示,非线性映射和重建,其分别使用9x9,1x1和5x5的卷积核。特征提取和表示层输出的特征数量为64个,非线性映射输出的特征数量为32个。损失函数是MSE,这有利于获得一个更高的PSNR值。
FSRCNN(paper)
对于超分辨率方法的改进主要在于三个方面,一是提高超分辨率的速度,实现实时的处理,二是解决放大倍数的限制,因为深度学习是用于固定大小的超分辨率的,若是放大倍数是4倍,那么想要获得8倍的HR图像,就要重新训练整个神经网络,三是进一步提高得到的HR图像的质量,这可以被体现为是PSNR值的提高(但PSNR值或者是SSIM值都是在像素层面上的,仅仅提高这两个值并不一定会使得图像质量提高)。
SRCNN和对SRCNN的改进FSRCNN都是来自于香港中文大学的工作,FSRCNN对SRCNN的改进基本也是在于以上的三个方面。下图是在Set14数据集上的结果,可以看到,FSRCNN不仅提高了PSNR值,并且实现了实时的处理。
FSRCNN在网络最后添加了一个反卷积层,从而不需要使用bicubic插值来将LR图像扩大,而是可以直接输入原始LR图像,在网络结构中使用了小卷积核和更多的映射层,这样提高了FSRCNN的速度。同时,需要训练扩大不同倍率的HR图像时,FSRCNN中的映射层可以共享,只需要训练最后的反卷积层,这样提高了训练的速度。
FSRCNN的结构由五部分构成,特征提取,收缩,映射,扩张和最后的反卷积,如下图所示。
特征提取:原始的SRCNN的输入图像是经过插值得到的与HR等大的图像,而FSRCNN使用的是原始的LR图像,所以使用的卷积核的尺寸也比较小,是5x5。
收缩:在原始的SRCNN中,提取出的LR特征直接通过非线性映射到HR特征,但因为LR特征的维数通常比较大,所以在非线性映射这一步的计算复杂度比较高,FSRCNN的作者通过借鉴Network in Network的思路,使用1x1卷积核进行降维,这样来减少网络参数,从而提高速度。
映射:这是在网络中最为影响HR图像质量的一部分,一般来说,感受野越大,SR的效果也就越好,在SRCNN中使用的是一层卷积核大小为5x5的卷积层,但这样的计算量比较大,为了减少参数并且获得和SRCNN至少一样好的表现,FSRCNN使用了多层叠加的3x3卷积(事实上,用两个串联的3x3卷积核便可以替代一个5x5卷积,并且参数更少)。
扩张:这一部分相当于收缩的逆过程,因为在实验中发现若是使用低维度特征进行重建,效果并不是很好,于是再次使用1x1卷积进行扩张。
反卷积:这一层实现上采样的操作,步长为n就是放大为原始LR图像的n倍,通过fine-tuning不同的反卷积层,可以获得放大不同倍数的FSRCNN。
FSRCNN使用的激活函数是PRelu,损失函数依然是MSE。
使用亚像素卷积层来提高HR图像质量(ESPCN和VESPCN)
亚像素卷积层的提出是为了解决在原始的SRCNN中,需要将LR图像插值扩大到HR图像的大小再做卷积操作导致计算复杂度过高的问题的。
ESPCN(paper)
ESPCN的核心概念便是亚像素卷积层了,网络的输入便是原始的LR图像,后续三个网络的卷积操作都在和LR图像大小一样的feature map上进行,经过三个卷积层后,获得一个通道数为$r^2$的和原始LR图像大小一致的特征图像,之后这个特征图像的像素重新排列成为一个$r\times{r}$的区域,这个$r$就是HR图像相对于LR图像的放大倍数。
ESPCN使用的激活函数的tanh,损失函数依然是MSE。
ESPCN的优势在两点,一是因为卷积运算规模的减小,ESPCN可以实现更快的处理SR任务,二是ESPCN通过亚像素卷积层隐式的学习到了一个插值函数,这有利于更好的提高ESPCN在PSNR值的提升上的表现。
因为要通过亚像素卷积层来获得HR图像需要提前设置好$r$的值,所以ESPCN并没有对解决放大倍数的限制有什么贡献。ESPCN的主要贡献在于,因为卷积的运算都只在和LR图像分辨率相同的feature map上进行,卷积运算的复杂度相比较SRCNN的方法来说减少了大概$r\times{r}$倍,所以ESPCN能够实现更快的处理,在处理视频SR的任务上,SRCNN需要0.435s来处理一帧,ESPCN只需要0.038s。
另外,有下表也可以看出,ESPCN在HR图像的质量上也有所提升(PSNR值上升)。
VESPCN(paper)
将神经网络技术应用于视频的超分辨率处理时,不得不考虑的就是视频中相邻几帧之间的关联性,VESPCN通过结合DeepMind的Spatial Transformer Networks和ESPCN中的亚像素卷积层在输出高分辨率视频的任务上取得很好的效果。
通过引入残差网络结构来构造更深的网络
何凯明在2015年提出了ResNet,ResNet通过残差网络结构(residual network)解决了之前过深的神经网络会因为梯度爆炸等问题而不能很好的训练的问题,并且取得了性能上的提升,ResNet获得了CVPR2016的Best Paper。关于ResNet和残差结构,已经有了很多很好的讨论,这里不再赘述。
VDSR(paper)
VDSR是一个很直觉上的,使用残差网络结构来解决SR问题的方法,正如VDSR作者提到的,原始的LR图像和HR图像所分别携带的低频信息其实非常相近,如果在训练时带上这部分信息,会拖慢学习,使用残差网络结构很好的解决了这一问题,下图是VDSR的结构,网络的输入是经过bicubic插值扩大到目标尺寸的LR图像。
VDSR的提出是为了解决原始SRCNN中存在的三个问题,一是SRCNN依赖于一个比较小的区域来进行SR操作,二是在实际训练中,SRCNN的收敛速度较慢,三是SRCNN只能针对于一个特定尺寸的SR任务。
通过加深网络深度(20层),感知野也随之扩大(使用3x3卷积核,第D层的感知野是(2D+1)x(2D+1)),这样,VDSR解决了SRCNN的第一个问题(同时也提出了The Deeper The Better),同时配合上残差网络结构(残差图像基本都很稀疏)和自适应梯度裁剪,VDSR也能够较快的收敛。
在卷积过程中,为了使所有的特征图都能和输出图像的大小一致,VDSR采取了对图像进行zero-padding操作,实验也证明,zero-padding也使得VDSR对边界像素的预测结果有了一定程度的上升。
通过残差网络结构引入更深的网络使得VDSR取得了一个非常好的PSNR的结果,如下图所示。
VDSR通过将不同放大倍数的图像混合在一起训练,从而使得训练出的一个图像能够处理不同的放大倍数,下表列出了不同放大倍数的结果:
DRCN(paper)
VDSR加深了网络的深度,同时也带来更多的网络参数,DRCN是一个和VDSR同时期的网络结构,其引入了递归网络结构,减少了网络的参数,并且通过残差连接和多层递归(扩大感知野),也使得DRCN的性能较VDSR有提升。
如下图所示,DRCN由三部分构成,先将原始的LR图像经过插值放大到目标尺寸输入网络,Embedding network:这一部分将图像表示成为一组feature map,可以被理解成为是特征提取,Inference network:这一部分解决SR任务的主要部分,通过一组递归的共享参数的卷积层,感知野被扩大了,输出一组feature map到最后的Reconstruction network进行重建出图像的工作(从很多个通道变为3个通道(RGB))。输入的原始LR图像和Inference network每一次递归得到的结果都通过残差连接到最后的输出。
下图是将递归的Inference network展开的结构图,其中递归的Inference network有16层。
递归结构在实际中的效果非常好,但是在训练中会遇到梯度爆炸或者消失的问题,DRCN的作者提出了递归监督来解决这个问题。该方法通过将每一次Inference network进行递归时的输出结果都通过相同的Reconstruction network与输入的图像相加,这样,每一个卷积层的输出结果都被监督,成功的避免了梯度爆炸或消失的问题。网络的最终输出是将每一次递归的输出加权平均得到的,即 这样来得到最后的总输出,其中的权重$w_d$是可以被学习的。DRCN的误差函数是总输出的L2误差加上每一次递归的输出的L2误差和一个L2正则项,最终的损失函数为
训练刚开始时,的值较高,因为比较早的递归容易收敛,所以训练比较稳定,之后会逐渐下降来提高性能。
从结果来看,DRCN的SR做的非常好。
DRRN(paper)
DRRN算是践行了VDSR中提出的The Deeper,the Better,DRRN总共有52层。
作者在下图中列出了ResNet,VDSR,DRCN和DRRN的结构比较。ResNet是局部的残差结构,VDSR是全局的残差结构,DRCN(图中的绿色块的部分共享权重)有全局的残差结构,并且有单个层的递归学习。DRRN可以说是结合了前面几个模型的特点,并且做出了一些改进,它使用了全局残差结构,也有多路线的局部残差结构,并且使用了多个层的递归学习(图中绿色块和绿色块共享权重,红色和红色共享权重)。
下表总结了各个方法的主要特点:
通过这些改进,DRRN不仅在参数数量上获得了减少,并且提高了PSNR值。
SRDenseNet(paper)
SRDenseNet的作者主要是借鉴了CVPR2017的Best Paper《Densely Connected Convolutional Networks》中通过在每一层中都建立Skip Connection的方法来充分的利用LR图像和HR图像之间相似的部分,DenseNet中的Dense Block的结构如下图所示:
SRDenseNet通过将Dense Block引入,取得了很好的结果:
SRDenseNet可以被分为四个部分,第一部分输入LR图像,通过卷积层来提取到low level的feature,然后通过几个串联的dense block来提取高层特征,之后通过一个Bottleneck层来将提取出的特征降维(因为这里的Skip Connection是将高层的特征和低维的特征在channel上串联起来而不是直接相加,所以维度会比较高),再通过之后的反卷积层将图像扩大到需要的HR图像的大小,在通过Reconstruction层输出最后的重建图像。
上图是作者提出三中相互比较的网络结构,(a)是只有dense block的结构,(b)是在低层特征到高层特征之间有一个skip connection,(c)是有一个Densely Skip Connection。毫无疑问,最后的重建效果是(c)>(b)>(a)。
EDSR(paper)
EDSR是NTIRE2017比赛上获得冠军的方案。EDSR比较重要的贡献就是指出了在SR任务中,批标准化层是不必要的,这是因为在SR任务中,输入和输出的图像的Distribution是比较相似的,BN反而会破坏这种相似性。下图是他们的实验结果:
因为在EDSR中去除了批标准化层,所以模型所占用的内存减少了,这有利于构建更深的模型,有利于提高最后的结果。
同时,EDSR的作者还指出,其实loss函数选择L2并不是很好的选择,如果选择L1作为loss,模型会得到进一步提高:
MemNet(paper)
MemNet的作者指出,传统的神经网络基本都是单向传播,那么到了比较靠后的层,接受到的信号就非常微弱了,这类网络被称为是短期记忆网络,类似于ResNet那样有Skip Connection的网络被称为是受限制的长期记忆网络。在MemNet中,作者提出来了一种长期记忆网络的结构,如下图所示。
这样的长期记忆模块通过一个Gate Unit来决定之前的模块的输出在最终输出中所要占的权重。
上图是MemNet的整体结构,最前面的FENet通过卷积来提取低层次特征,之后进入多个Memory block堆叠并且密集连接的模块,每一个Memory block的输出都到ReconNet中进行重建用来监督每一个Memory block。
MemNet通过更少的参数获得了更高的PSNR值。
RDN(paper)
RDN的主要贡献就是提出了残差密集模块(Residual dense block),如下图。
通过这个模块构建出的网络结构如下:
达到了新的SOA的结果
DBPN(paper)
见我的另一篇知乎专栏:链接
对损失函数的改进
在实验中发现,其实直接使用L2作为损失函数并不能得到太好的肉眼可以接受的结果(虽然更深的网络可以解决这个问题),如下图所示,若是神经网络的输出比较sharp,与真实图片的差距就会很大,会造成一个比较高的loss。
而在训练中神经网络是要最小化loss的,也就是说,神经网络会尽量避免产生过于sharp的图像,如下图所示,比较平滑的图像会得到一个更低的loss,但是这样的图像可能在人眼看来会比较糊,所以,一些研究就着眼于改进损失函数和重建图像的评价标准来进行。
感知损失(Perceptual loss)(paper)
这个损失函数的提出解决了风格迁移和超分辨率两个问题,我们这里就只讨论超分辨率的了。
这个损失函数的设计其实很简单,就是将原来在图像上进行逐像素的求MSE变为了在VGG网络的输出的特征图上求,如下图所示:
在超分辨率任务中,没有Style Target,只要最小化Content loss即可。
上图是实验的结果,可以看到,使用感知损失的网络产生了人眼看来更为清晰的图像,但是在PSNR值上却低于SRCNN的看起来并不是很清晰的图像,这从一个方面说明了PSNR并不是一个很好的用来评判SR任务的指标。
对抗损失
SRGAN(SRResNet)(paper)
其实这个网络的想法很简单,通过两个网络(生成网络G和判别网络D)来相互对抗来引入这个新的损失,以下是两个网络的结构。
这个模型的loss如下,其中第一项是通过VGG算出来的感知损失,第二项是对抗网络的损失。
从SRGAN的实验结果中也可以看出,其实PSNR并不是一个非常好的评价标准:
EnhanceNet(paper)
working on it
Charbonnier loss
working on it
LapSRN(paper)
working on it
其他方法
RED(Auto-Encoder)(paper)
加入了残差结构,加深了网络层数的自编码器,
实验结果:
PixelCNN(paper)
通过一个PixelCNN来重建图像的工作,不过只在8x8的图像上做了
结果看起来很好