WDSR(NTIRE2018超分辨率冠军)

1,570 阅读7分钟

s超分辨率(super-resolution)的通俗解释就是:将低分辨率的图像通过算法转换成高分辨率图像。听起来似乎很神奇,这样是不是可以把低清电影转换成高清了?就现在来看,基于深度学习的超分辨率(简称SR)已经达到了amazing的效果。
这篇博文要解析的算法叫做WDSR,来自UIUC的华人学生JiaHui Yu的论文。在SR界有一个比赛,叫做NTIRE,从2016年以来也才举办三届,不过自2017年开始,NTIRE就逐渐被全球学者所关注。NTIRE的冠军基本是保送CVPR的,NTIRE成长为SR界的COCO也是指日可待的。

NTIRE2018链接:www.vision.ee.ethz.ch/ntire18/
首先按照国际惯例,直接给论文地址:arxiv.org/abs/1808.08…

前言

通常的超分辨率分两种:SISR和VSR。前者叫做单图像超分辨率,后者叫做视频超分辨率。我们通常理解的超分辨率都是指SISR,我们只需要输入一张低分辨率图像而获得高分辨率图像的输出。 而VSR会利用视频的时间关联性来获得对某一帧的SR。本文的算法就是针对前者。

评价指标

如果来描述SR效果呢?业界有个约定俗成的指标,叫做PSNR,即峰值信噪比。这个指标可以比较你SR结果图和ground truth(即原高清大图)之间的差距;此外,还有一个指标叫做SSIM,即结构相似性。这个指标与PSNR一样,也可以评价你SR的恢复效果。关于PSNR和SSIM两个指标

数据集

需准备一些高清图像,然后通过下采样把高清变成低清图像,这样就获得了一一对应的counterpart。就可以用以训练了。当然,对训练数据不同的下采样方法也会影响最后的算法性能,在这里不做重点讨论。

WDSR

这里的W表示的是wide,即具有更宽泛的特征图。怎么理解更宽泛的特征图呢?作者对激活函数之前的特征图channel数增多,称为特征图更宽泛。
很多同学会认为SR算法一般会跟生成式算法GAN产生联系,然而事实并不是这样。确实有利用GAN来做SR的,不过目前顶尖的SR算法都是基于CNN的,WDSR也不例外。WDSR是基于CNN的SR算法。

  1. 上采样方法。我们从低分辨率图像转换到高分辨率图像,是不是要涉及上采样呢?100x100到400x400肯定要涉及上采样方法的。如果研究过自编码器等算法的同学会知道反卷积是图像深度学习种常用的上采样方法,在yolo v3中用到的上采样方法也是反卷积。事实上,反卷积这种上采样方法在目前一线的SR算法中是遭到鄙视的(虽然SOD-MTGAN中还在用)。不用反卷积用什么呢,有一种叫做pixel shuffle的新型卷积方法在CVPR2016年被提出来,也叫做sub-pixel convolution。这种新型卷积就是为SR量身定做的,如果想要详细了解这种卷积是如何操作的,请戳《pixel shuffle》,这也解释了为什么目前基于CNN的SR能比基于GAN效果更好了;

  2. 超级深度&循环神经网络。神经网络深度的重要性相比无须多言了,在不少前辈们的研究成果表现,神经网络的深度是影响SR算法性能的关键因素之一。同时,利用循环神经网络的方法,可以增加权重的复用性。WDSR并没有用到RNN,可以跳过这个;

  3. 跳跃连接。就如果Resnet做的那样,将前层输出与深层输出相加连接。一来呢,可以有效解决反向传播的梯度弥散,二来呢,可以有效利用浅层特征信息。目前的一线SR算法都会含有resblocks,WDSR也不例外。

  4. 标准化层。BN层已经是说烂了的trick之一了,各种算法似乎都离不开BN。但batch normalization也不是唯一的normalization方法。如我其他博文中提到的LN,IN还有kaiming大神提出的GN。而WDSR算法采用了weight normalization的方法。 基于上面四个trick,作者提出了WDSR-A模型结构,我们可以看看长什么样子:

左边的EDSR呢,是NTIRE2017的冠军,自然要被2018的冠军吊打的。我们直接看右边,网络结构是超级简单的, residual body就是一系列的resblock组到一起,可以看作是一个自带激活函数的非线性卷积模块。上图的模块只包含三种:res模块,conv模块和pixel shuffle模块。只有pixel shuffle模块要特别注意。

WDSR在EDSR上的结构提升,一方面是去除了很多冗余的卷积层,这样计算更快。另一方面是改造了resblock。我们一分为二来看,去除冗余的卷积层(如上图阴影部分)作者认为这些层的效果是可以吸收到resbody里面的,通过去除实验之后,发现效果并没有下降,所以去除冗余卷积层可以降低计算开销。

改造resblock的方法如下:

左图呢就是ESDR的原始resblock,中间是WDSR-A,右边的是WDSR-B。作者在文中提出了两个版本的WDSR,这两个版本的区别就是resblock不同而已。 对于EDSR中的resblock,我们成为原始resblock,relu是在两个卷积运算中间,而且卷积核的filter数较少;而WDSR-A是在不增加计算开销的前提下,增加relu前卷积核的filter数以增加feature map的宽度。怎么理解这个操作呢?我们有神器neutron,用neutron分别打开ESDR和WDSR的结构图我们可以看到:

上图左边就是ESDR,右边就是WDSR-A。我们可以从relu前卷积核的filter数看到, 后者(192)是前者(64)的3倍。不过前者在relu后的filter数是后者的2倍。作者主要提的trick就是增加激活函数前的特征图的channel数。这样效果会更好。同样,我们可以对WDSR-B一目了然:

WDSR-B进一步解放了计算开销,将relu后的大卷积核拆分成两个小卷积核,这样可以在同样计算开销的前提下获得更宽泛的激活函数前的特征图(即channel数可以更多)。

所以,对于同样计算开销的前提下,表现性能是:WDSR-B > WDSR-A > ESDR。

改变channel,不改变参数量原理

恒等映射(identity mapping pathway)。意思也就是在不增加参数的情况下扩大激活层的输入通道数,其具体结构如下图(通道变化结构图)。假设W1表示卷积的输入通道,W2表示卷积的输出通道也就是Relu函数使用时的输入。现在我们假设,其中r表示通道需要扩大的倍数。则对于EDSR中使用的激活(左边的图),其需要的参数为:W=2*W_1*W_2*k^2=2W_1^2*k^2,此时相当于r=1。对于右边的计算方式此时需要的参数量为:W=2*\hat{W_1}*\hat{W_2}*k^2=2n\hat{W_1}^2*k^2。k表示卷积核,n表示扩大n倍。要保证参数量不增加则有,对应的。由上述过程可以看出,此时Relu的输入通道数比原来扩大了倍,而对应总的参数量并没有增加。

Weight Normalization

WN应该算是WDSR的最后一个重要的trick了。WN来自openAI在NIPS2016发表的一篇文章,就是将权重进行标准化。

对于WN我只是粗略了解,做一个简单的||v||表示v的欧几里得范数,w, v都是K维向量,而g=||w||,是一个标量。w是v的次态。 g/||v||这个标量就是为了线性改变向量v,从而使得||w||更靠近g。这样来使得权重w的值在一个规范的范围内。
由于比较复杂这里就不展开了。

实验结果

总结

WDSR具有以下创新点:

  1. 提高relu前的特征图channel数;

  2. 将大卷积核拆分成两个低级卷积核,节省参数,进一步在同参数的情况下提高relu前的特征图channel数;

  3. 加入weight norm。

引用

blog.csdn.net/hh_2018/art…
blog.csdn.net/hh_2018/art…