代码解读 Aittala_ECCV18_Burst Image Deblurring Using Permutation Invariant Convolutional Neural Networks

此文档用于记录Aittala_ECCV18 的代码学习过程,Tensorflow implement:http://people.csail.mit.edu/miika/eccv18_deblur/ Pytorch implement:https://github.com/FrederikWarburg/Burst-Image-Deblurring

  1. Pytorch下作者没有提供训练的参数,因此需要我们重新训练,其中涉及数据集下载,合成模糊和配准。这个留给以后做
  2. Tensorflow 下作者训练了网络,提供了配准的数据,因此先学习tensorflow下的代码
  3. 学习路径:先将代码的环境配置好,配置好数据路径等
  4. 环境介绍:pychram3, python 3.7.4(python -V), Tensorflow 2.0.0(python→import tensorflow as tf→ tf.__version__), No GPU,i5-3470 CPU,8GB内存
  5. train.py
    1. parser = argparse.ArgumentParser() 使用argparse之前要使用ArgumentParser对象创建解析器;而argparse可以让人轻松编写用户友好的命令行接口
    2. parser.add_argument('--bs', metavar='bs', type=int, default=8) 调用add_argument方法给parser添加程序参数,这个代码用来指定ArgumentParser对象如何获取命令行字符串并将其转换成对象,这些信息在parse_args()调用时被使用和存储
    3.  Bugs:
      • bug1: 提示没有tensoflow。已经安装了tensorflow却在pycharm中输入import tensorflow as tf时显示没有tensorflow。
      • 解决:首先安装tensoflow,网上有手把手教程。其次,在pycharm下更改解释器:文件→设置→项目→project interpreter选择Anaconda下安装的python:D:Anaconda3Installpython.exe。安装1.13.1转至bug5
      • bug2:找不到已经定义的函数。路径设置问题
      • 解决:文件→设置→项目→Project Structure,将源码所在的文件夹“network”选成蓝色源码
      • bug3:  from scipy.misc import imsave 找不到 imsave 方法。
      • 解决:imsave已经在SciPy 1.2.0中移除了,而是采用imageio.imwrite。所以需要安装老版SciPy, "pip install -U scipy==1.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple"
      • bug4:运行 'train_multi' 出错: 无法启动进程,工作目录 'E:ppcdpydeblur_source_coarsesource etwork' 不存在
      • 解决:修改工作目录:run(运行)→configuration(编辑配置)→script path修改到源码所在的文件夹
      • bug5:tensoflow.contrib没有定义
      • 解决:tensorflow 2.x没有tensoflow.contrib模块了,可以使用tf_upgrade_v2工具对1.x的tensoflow升级到2.x,但是会出现不兼容的问题(没有尝试)。决定卸载tensorflow 2.x并安装tensorflow1.13.1:
      • pip uninstall tensorflow   如果已经安装了tensorflow要先卸载)
      • CPU版本:pip install tensorflow==1.13.1 -i https://pypi.tuna.tsinghua.edu.cn/simple(安装tensorflow1.13.1)
      • GPU版本:pip install tensorflow-gpu==1.13.1 -i https://pypi.tuna.tsinghua.edu.cn/simple(安装tensorflow1.13.1)
      • 安装了ensorflow以后,出现numpy一些列问题,考虑到是版本不兼容的问题,于是:
      • 卸载原来的numpy: pip uninstall numpy
      • 安装1.16版本的numpy pip install numpy==1.16
      • bug6:  Pycharm代码自动补全和Pycharm调试程序使用debug功能:
      • 自动补全:首先关闭省电模式,一般默认打开;然后使用热键:tab 键可以实现main函数的补全,Alt+/ 可以实现函数和变量的补全;
      • 先在期望加入断点的地方加上断点:在目标代码行左侧单击,出现红色圆点,然后选择运行的脚本并点击甲壳虫(debug),再Debug→console→show python promote,这个选项卡可能因为空间不足被隐藏,所以选择选择>>并单击中间的按钮最后就可以输入在debug过程中输入代码开始调试。
      • bug7: No module named "datasets" 
      • 将cifar-10dataset转换成TFRecord格式。这份tensorflow的源码,训练好的网络在测试时仍需要原始训练集(这一点令我很迷惑,已经发邮件给作者了,还没回2020-1-6)。所以试图自己将cifar-10数据集转换成TFRecord格式。
      • 转换方法Windows下:这里下载model:https://codeload.github.com/tensorflow/models/zip/master,解压以后,在 models-master esearchslim目录下找到“download_and_convert_data.py”文件运行。另外因为该程序用到了dataset模块的方法。应该先将该目录下的“datasets”文件夹放入python的安装目录的第三方包目录下。方法:cmd进入python:其中site-packages就是第三方包目录,将slim下的datasets复制进site-packages下即可
        • import sys
        • sys.path
        • 有人建议说使用pip3 install datasets 或者 pip install datasets,这个我没有尝试
      • bug8: 完成上述格式转换以后,复制TFRecord格式的路径,赋值给“--data_dir”(line 31 in 'train_multi.py')。如果忽略这一步会导致data_dir返回none,造成后面的路径错误:
parser.add_argument('-i', '--data_dir', type=str,default=os.environ.get('ML_DATA_PATH', 'E:/ppcdpy/Aittala/cifar-10-batches-py'(TFRecord格式文件所在位置)), help='Location for the dataset')

注意:Windows下的文件分割符“”与python下的转义字符""相同,有3种方法解决:http://withwsf.github.io/2015/12/30/Python%E5%9C%A8Windows%E7%8E%AF%E5%A2%83%E4%B8%8B%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%E9%97%AE%E9%A2%98%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/

以上调试结束,基本就可以运行了.

6. Numpy广播:

问题:3维数组怎么和4维数值运算呢?这时候便用到了广播:它用来处理不同维度数组之间的运算。运算规则:

  • 数组维度的尾部对齐
  • 没有维度的位置忽略
  • 当前维度的值相等或者有一个1
  • 从后向前比较维度大小,选其最大值作为输出

下面用例子介绍:

import numpy as np
a = np.random.randn(1,2,3,4)    # 1 x 2 x 3 x 4        
b = np.random.randn(1,3,4)      #     1 x 3 x 4
c = a+b                         #  1 x 2 x 3 x 4

但是

a = np. random.randn(1,2,3,4)    # 1 x 2 x 3 x 4
b = np.random.randn(2,3,3)       #     2 x 3 x 3
c = a+b                          # ValueError

7. 完成了上面的调试后,tensorflow基本可以完成在train.py下正常运行,使用合适的相机设置可以完成很好的重构。

  验证算法实用性:

相机运动的真实拍摄场景:

手持相机

ISO=100(追求成像噪点少)

f/10(光圈适中,增大进光量,背景不虚化)

曝光时间0.8s(提高亮度,时间较长,导致手抖模糊)

焦距55mm, 拍摄远距离物体(期望呈现细节)

分辨率:2087 x 1633

下图中蓝色序号的图片表示连续拍摄的第 张图像,红色序号的图片表示使用前 i 张所有的图像去模糊得到的结果。


ECCV18:Burst image deblurring using permutation invariant convolutional neural network : Pytorch implement:https://github.com/FrederikWarburg/Burst-Image-Deblurring

  1.  下载ImageNet2012数据集,https://www.52cv.net/?p=878
  2.  解析ImageNet2012数据集成图片格式:https://xungejiang.com/2019/07/26/pytorch-imagenet/
  3. 由于上述代码是在Linux环境下运行的,而我是windows系统,所以下载CygWin: https://www.cygwin.com/,这是一款在windows下能够运行Linux命令的软件
  4. 由于第2行的代码使用了wget命令,所以在安装CygWin时,依据教程安装wget : https://www.cnblogs.com/ae6623/p/5157625.html

 

 

 

 

 

 

        

原文地址:https://www.cnblogs.com/LuckBelongsToStrugglingMan/p/12148071.html