所谓图像超分辨率就是试图从一个低分辨率的图像中恢复出一个高分辨率的图像。恢复出的高分辨率图像在纹理细节,边缘细节上应尽可能的清晰,避免产生过度平滑的图像,在视觉感知上看起来尽可能的真实。并不是一味地追求PSNR,这个指标越大并不代表越好,因为这样产生的图像在视觉上可能看起来并不真实,所以应当综合考虑,选取合适的损失函数。均方误差(MSE)偏好于更大的峰值信噪比(PSNR),而感知损失(perception loss)在视觉感受上会让图像看起来更加真实。
FSRCNN是对深度学习超分辨的开山之作SRCNN的改进,改进者是同一批人。该篇论文发表在了2016年的ECCV上。
项目主页(包含实现代码和论文链接):http://mmlab.ie.cuhk.edu.hk/projects/FSRCNN.html
具体的改进方面如下:
SRCNN在速度上存在的问题:
1、SRCNN在将低分辨率图像送进网络之前,会先使用双三次插值法进行插值上采样操作,产生与groundtruth大小一致的低分辨率图像(这里讲插值后的图像仍然叫作低分辨率图像,即使它的尺寸和groundtruth的大小一致),这增加了计算复杂度,因为插值后的图像相比原始的低分辨率图像更大,于是在输入网络后各个卷积层的计算代价会增大,从而限制了网络的整体速度。
2、非线性映射层的计算代价太高。
FSRCNN对此进行的改进:
1、对于SRCNN的第一个问题,FSRCNN使用了一个反卷积层,但是并没有添加到网络的最前端用于对低分辨率图像进行上采样,如果这样做的话,计算代价依然比较高,相反的,作者将反卷积层放在了网络的最末端,用于生成最终的超分辨图像。
补充一点:所谓反卷积层,形象的理解就是卷积层的逆过程。图像经过卷积层,图像的尺寸会缩小,而反卷积层则将图像进行放大,加入一幅图像经过卷积层之后,尺寸缩小为原来的1/K倍,那对应反卷积层而言,图像则会被放大为原来的K倍。此外,反卷积层和卷积层一样由很多核组成(分别是反卷积核和卷积核)。
2、对于第二个问题,FSRCNN将SRCNN中的单个映射层分解为了多个带有固定核大小3*3的映射层,并在其前后分别添加了一个缩放层(shrinking)和扩张层(expanding),以此将映射限制在低维空间上。
各个层的具体描述如下:
Feature Extraction
与SRCNN不同,该网络的输入是原始低分辨图像(未进行插值操作的低分辨图像),此外卷积核大小由99改为55。这是由于现在的输入图像尺寸变小了,还有在SRCNN中,其输入图像是经过原始低分辨率图像插值之后所得,所以不必用那么大的卷积核,在原始LR图像中用一个55的卷积核就可以获得在插值之后的LR图像中用99的卷积核几乎相同的信息(关于这一点的理解,我尚不太清楚,个人认为主要原因是输入图像尺寸变小导致卷积核尺寸变小),还有卷积核的个数是1,因为是在单通道(Y颜色通道)上进行比较。
Shrinking
这一层的主要作用是降维。由于低分辨率的特征维度(这里用d表示)太高,会极大的增加计算代价,所以采用此层,并设置卷积核尺寸为1*1。维度由d降到s(s远小于d)。
non-linear mapping
本文将在SRCNN中的mapping层分为m(表示mapping层的个数)个小mapping层,每个层的卷积核大小设置3*3,卷积核的数目设为s(降维后的特征维度)。
Expanding
该层的作用与Shrinking层相反,是为了扩张特征维度。之所以使用此层是因为直接使用低维的高分辨特征进行图像恢复的话,图像质量太差。具体的设置是:卷积核尺寸设为1*1,卷积核的数目设为d,与进行Feature extraction得到的特征维度一致。
Deconvolution
执行上采样操作,接受高分辨率特征,输出最终的超分辨结果。具体设置是,卷积核大小设为9*9,卷积核的个数为1,因为输入的是单通道图像。
网络中其他一些设置包括:将每一层的损失函数设为PReLU。不使用ReLU主要是为了避免在ReLU中由零梯度导致的“dead features”。损失函数使用均方误差。参数优化使用随机梯度下降。
FSRCNN除了改进了以上两个不足之外,FSRCNN本身的结构使其具有另一个优势,即它能够在不同的放大倍数下进行快速的训练和测试。这主要是因为共享反卷积层之前的卷积层,使其在不同的放大倍数之间进行切换时,只需微调(fine-tune)反卷积层即可。原理示意图如下图所示:
实验设置
训练数据集:
1、 General-100 包含100幅.bmp格式的未压缩的图像,图像大小在131112和710704之间。
2、91-image数据集,包含91幅.bmp格式的图像。
此外,还对现有数据进行了数据增强,分别是尺度变换和旋转变换。
尺度变换比例:0.9,0.8,0.7,0.6(缩小图像)
旋转变换:90,180,270
测试数据集:
Set5,Set14,BSD200
验证数据集:
BSD500