论文地址:[1501.00092] Image Super-Resolution Using Deep Convolutional Networks
上述代码使用的第二层卷积层是5*5的卷积核。
1.网络结构
- 第一层CNN:对输入图片的特征提取。(9 x 9 x 64卷积核)
- 第二层CNN:对第一层提取的特征的非线性映射(1 x 1 x 32卷积核)
- 第三层CNN:对映射后的特征进行重建,生成高分辨率图像(5 x 5 x 1卷积核)。
2.设计思路
作者这个思路是从稀疏编码得来的,并把上述过程分别表述为:Patch extraction, Non-linear mapping, Reconstruction。
- Patch extraction: 提取图像Patch,进行卷积提取特征,类似于稀疏编码中的将图像patch映射到低分辨率字典中
- Non-linear mapping: 将低分辨率的特征映射为高分辨率特征,类似于字典学习中的找到图像patch对应的高分辨字典
- Reconstruction:根据高分辨率特征进行图像重建。类似于字典学习中的根据高分辨率字典进行图像重建
3. 如何训练
3.1训练数据集
论文中某一实验采用91张自然图像作为训练数据集。
(1)对训练集中的原始图像先使用双三次差值缩小到低分辨率尺寸(例如缩小两倍);
(2)将(1)中低分辨率尺寸图像再放大到原来的尺寸,此时的图像称之为低分辨率图像;
(3)将低分辨率图像最后切割成33×33图像块作为训练数据。以33像素×33像素中心点位置为依据,从原始图像中的对应位置选取21×21图像块(与卷积层细节设置相关);
为什么是33×33和21×21?
第一层卷积核9×9,得到特征图尺寸为(33-9)/1+1=25,第二层卷积核1×1,得到特征图尺寸不变,第三层卷积核5×5,得到特征图尺寸为(25-5)/1+1=21。训练时得到的尺寸为21×21,因此图像中心的21×21图像块作为标签数据。(卷积训练时不进行padding)。
我设置网络的时候可以一样吗?
当然可以设置为一样都是33×33,只要你训练和测试的时候都padding就行,其结果没什么影响。
3.2损失函数
采用MSE函数作为卷积神经网络损失函数。
4. 如何测试
(1)全卷积网络:所用网络为全卷积网络,因此作为实际测试时,直接输入完整图像即可;
(2)Padding:训练时得到的实际上是除去四周(33-21)/2=6像素外的图像,若直接采用训练时的设置(无padding),得到的图像最后会减少四周各6像素(如插值放大后输入512×512,输出500×500)。因此在测试时每一层卷积都进行了padding(卷积核尺寸为1×1的不需要进行padding)。这样保证插值放大后输入与输出尺寸的一致性。
(使用Tensorflow或Pytorch进行复现时,图像预处理时将像素点取值归一化至[0,1],测试时,得到的最后一层特征图即重建结果直接乘以255再使用uint8转换时为0-255取值时会出现一些问题,如左下图2中方框所示,因此在乘以255前,将负值设置为0,大于255的设置为255,再使用uint转换即可解决)

5. 重建结果
图像质量评价指标之 PSNR 和 SSIM_mjiansun的博客-CSDN博客
原始图像与其评估版本(噪声强度)之间图像(信号强度)可能的最大像素值与最大均方误差(MSE)的对数比率。PSNR 值越大,重建效果越好
import numpy import math def psnr(img1, img2): mse = numpy.mean( (img1 - img2) ** 2 ) if mse == 0: return 100 PIXEL_MAX = 255.0 return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))
(1)客观评价指标PSNR与SSIM:相比其他传统方法,SRCNN取得更好的重建效果
(2)主观效果:相比其他传统方法,SRCNN重建效果更具优势
6.为什么只训练YCbCr的Y通道?
图像被转化为 YCbCr 色彩空间,尽管该网络只使用亮度通道(Y)。然后,网络的输出合并已插值的 CbCr 通道,输出最终彩色图像。我们选择这一步骤是因为我们感兴趣的不是颜色变化(存储在 CbCr 通道中的信息)而只是其亮度(Y 通道);根本原因在于相较于色差,人类视觉对亮度变化更为敏感。
7.注意点
- mse损失有缺点,以后论文的改进方向
- 更加复杂的网络结构