深度学习超分辨率重建(一): TensorFlow——SRCNN

1.SRCNN(原理和代码)

基于TensorFlow的代码下载:https://github.com/tegg89/SRCNN-Tensorflow

文章链接:(Learning a Deep Convolutional Network for Image Super-Resolution, ECCV2014)

环境配置深度学习(一):虚拟机Linux系统搭建CPU TensorFlow

基础理论学习方便理解:deeplearning.ai 吴恩达网上课程学习(十五)——卷积神经网络及其TensorFlow代码实现


1.1 配置环境遇到的问题:

在TensorFlow的虚拟环境中安装,不要加sodu,否则会装到默认的Python2.7里

① ModuleNotFoundError: No module named 'h5py':

pip install h5py
tensorboard 1.7.0 has requirement bleach==1.5.0, but you'll have bleach 2.1.3 which is incompatible.
tensorboard 1.7.0 has requirement html5lib==0.9999999, but you'll have html5lib 1.0.1 which is incompatible.

如果使用sudo则不是说在虚拟环境下安装,以下类似

② ModuleNotFoundError: No module named 'matplotlib'

pip install matplotlib

③ ModuleNotFoundError: No module named 'PIL'

pip install Pillow  

④ No module named 'scipy'

pip install scipy


1.2 代码解释:

① tf.app.flags

tf定义了tf.app.flags,用于支持接受命令行传递参数,相当于接受argv。

 
 
import tensorflow as tf

#第一个是参数名称,第二个参数是默认值,第三个是参数描述
tf.app.flags.DEFINE_string('str_name', 'def_v_1',"descrip1")
tf.app.flags.DEFINE_integer('int_name', 10,"descript2")
tf.app.flags.DEFINE_boolean('bool_name', False, "descript3")
#FLAGS是一个对象,保存了解析后的命令行参数
FLAGS = tf.app.flags.FLAGS

#必须带参数,否则:'TypeError: main() takes no arguments (1 given)';   main的参数名随意定义,无要求
def main(_):  
    print(FLAGS.str_name)
    print(FLAGS.int_name)
    print(FLAGS.bool_name)

if __name__ == '__main__':
    tf.app.run()  #执行main函数
② class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False) 

pprint模块提供了一个美观地打印Python数据结构的方式。如果是要格式化的数据结构里包含了非基本类型的数据,有可能这种数据类型不会被加载。比如数据类型是文件、网络socket、类等。本模块格式化时,尽可能保持一个对象一行表示,并且当超过允许宽度时也会自动换行表示。所有字典数据类型,都会先按键来排序,然后再进行格式化输出。

构造一个打印实例PrettyPrinter。这个构造函数需要好几个参数来配置打印参数。可以通过参数stream来设置流输出对象,流输出对象要实现write()的文件协议。如果没有指定流输出对象,默认是输出到sys.stdout。每行递归缩进的宽度是通过indent来设置,默认设置为1。参数width是表示每行的宽度,如果超过一行的宽度就会换行输出。参数depth是表示复合对象输出的层次深度,默认是没有限制,所有层次的对象都输出。参数compact是表示换行时下一行是否输出内容,还是跳过。
https://blog.csdn.net/caimouse/article/details/50704332

③os.makedirs(path, mode=0o777)

os.makedirs() 方法用于递归创建目录。像 mkdir(), 但创建的所有intermediate-level文件夹需要包含子目录。

http://www.runoob.com/python/os-makedirs.html

④try与except处理异常语句:

https://blog.csdn.net/f156207495/article/details/78387617


1.3 原理学习:

1.3.1 链接参考:

https://blog.csdn.net/u011630458/article/details/79103923

https://blog.csdn.net/m0_37510087/article/details/79367649

https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/78474303

1.3.2 具体过程:


33*33*1&9*9*64---  25*25*64& 1*1*35---25*25*35 & 5*5*1 ---21*21*1

SRCNN首先使用双三次(bicubic)插值将低分辨率图像放大成目标尺寸,接着通过三层卷积网络拟合非线性映射,最后输出高分辨率图像结果。本文中,作者将三层卷积的结构解释成三个步骤:图像块的提取和特征表示,特征非线性映射和最终的重建

三个卷积层使用的卷积核的大小分为为9x9,,1x1和5x5,前两个的输出特征个数分别为64和32。用Timofte数据集(包含91幅图像)和ImageNet大数据集进行训练。使用均方误差(Mean Squared Error, MSE)作为损失函数,有利于获得较高的PSNR。



论文说的只训练YCbCr模式的Y通道,具体流程就是:训练的时候输入BRG模式的图片,再转化为YCbCr模式,但是只将Y通道通过CNN网络,最后输出的结果再和另外两个合成生成心得YCbCr模式图片,最后再转回BGR模式,将最终生成的BGR模式图片与输入的BRG模式图片计算MSE loss,进行梯度下降训练网络。具体流程如下图:



猜你喜欢

转载自blog.csdn.net/u010327061/article/details/80046690