ESPCN超分辨率重建及tensorflow代码解读

tensorflow代码链接:https://github.com/drakelevy/ESPCN-TensorFlowtensorflow代码
首先,超分辨率是什么?
超分辨率就是我们有一张尺寸比较小的图,当我们将其放大的时候,会出现模糊的现象,超分辨率重建就是将放大之后的图像尽可能地清晰,也就是原图当中一个像素对应的内容在放大之后的图中用更多的像素来表示这一个内容。
以往的基于深度网络的超分辨率方法基本上是先把低分辨率经过三线性插值或其他方法转化成与高分辨率图尺寸大小相等之后再送入网络,相当于卷积网络是在高分辨率的基础上进行操作的,计算量是相当大的。如图:
ESPCN超分辨率重建及tensorflow代码解读_第1张图片
ESPCN的主要贡献有以下两点:1.卷积是在低分辨图像上进行操作。2.增加了亚像素卷积层(其实不是卷积,只是排列组合)
ESPCN超分辨率重建及tensorflow代码解读_第2张图片
整个网络结构分成了两个部分,第一个部分是普通的卷积网络,特征图的大小和输入的原低分辨率图尺寸大小相等,只是通道数不一样,第二部分是亚像素卷积层,就是将一个像素对应的不同值经过排列得到最后的高分辨率图像。如图
ESPCN超分辨率重建及tensorflow代码解读_第3张图片
代码部分:
代码一共包含了三个部分:
1.数据的准备(prepare_data.py),主要是数据集的分块和最后要进入网络的数据格式的准备。
2.训练网络(train.py),主要是网络模型的训练,也就是普通的三层卷积网络,后边的亚像素卷积不用训练,最后排列即可。
3.测试网络(generate.py),测试网络训练的怎么样,给一张低分辨率图像,看生成的高分辨率图怎么样
代码详解
1.prepare_data.py
其中有一个params.josn文件,里边会有设置lr_size(lr代表低分辨率,hr代表高分辨率),filter,channel,lr_stride,最后有一个关于edge的设置,之前一直搞不懂这个的含义是什么,后来才知道是因为在第2步骤中网络训练的时候,有个tf.nn.conv2d
,里边的padding有两种方式,一个是SAME,一个是VALID。其中VALID是不考虑边界值的,所以说即使filter的步长设置为1的话,输出来的特征图也是比原图要小的,网络的滤波器大小是5,3,3,所以输入是hw,输出的是(h-5+1)-3+1-3+1,即h-8,所以在params.josn中edge设置的是8。prepare_data.py首先将hr图经过高斯滤波和抽样得到lr图,再将hr和lr分成大小是17r17r和1717的小图像块(论文中大小,此处设为2,也就是hr是3434),然后将这些小块由rgb空间转向YCbCr空间,最后再将对应的小块处理成别的格式,合在一起作为训练数据。其中hr处理的时候,将其预先处理成了9912(12=channelrr),便于训练。
2.train.py
主要是三层卷积网络,是在YCbCr空间进行处理的,而人们对亮度比较敏感,因此只对亮度成分进行训练,网络输入的是17171,输出的是99r2的特征图。所以对于网络部分的训练主要是三层卷积网络的训练。
3.generate.py
主要是测试部分,给定一张低分辨率图像(hwc),经过训练好的卷积神经网络之后得到大小为(h-8w-8r2)的特征图,再将这个特征图经过排列得到一张r(h-8)*r(w-8)*1的一通道的图,也就是亮度成分Y,之前的低分辨图经过三线性插值得到高分辨率图,取CbCr成分,将经过卷积得到的Y,和原始低分辨图像中的Cb,Cr成分组合到一块就是最后输出的高分辨率图像。

你可能感兴趣的:(ESPCN超分辨率重建及tensorflow代码解读)