去失焦模糊(Defocus Blur Removing)

测试模型:

配置(供参考):Ubuntu(16.04.4), GeForce GTX 1080Ti, cuda(9.0.176)
环境依赖:Python(3.6.9), pytorch(1.3.0), torchvision

测试前将需要测试的图片存放在/defocus_images文件夹下,去模糊后的结果将生成在/deblur_images文件夹下,测试的图片分辨率最好大于1536*1024。

执行 python deblur_test.py --gpu-id [gpu_id] (--input-path [path]) (--output-path [path])进行测试。

模型结构:

模型结构可以分为三个模块:下采样模块、残差模块和上采样模块。

  1. 下采样模块使用下采样块(DownBlock)作为基本单元,逐步提升通道数量并减少特征图的大小,从而起到编码的作用(Encoding)。DownBlock由一个步长为2的卷积层和三个残差块构成,将通道数翻倍的同时进行1/2下采样。本模型实现中使用一个卷积层与三个下采样块组成下采样模块。

  2. 残差模块使用残差块(ResnetBlock)作为基本单元,目的是增加网络深度,提升网络的参数量。本模型实现中使用五个残差单元组成残差模块。

  3. 上采样模块使用上采样块(UpBlock)作为基本单元,逐步减少通道数量并恢复到原图大小,起到解码的作用(Decoding)。UpBlock由一个步长为2的反卷积层和三个残差块构成,将通道数减半的同时进行1/2上采样。本模型实现中使用三个上采样块与一个卷积层组成上采样模块。

下采样模块与上采样模块中同等大小的特征图之间使用skip connection,联合高层的语义信息和低层的细粒度信息,使得去模糊后的图像更准确、纹理更清晰。

详细模型细节见deblur_model.py

数据集准备:

使用高分辨率的图像291张作为清晰图(ground truth),通过手动添加模糊来构造失焦模糊图(defocus image)从而形成一对训练数据,样例见/training_set。通过相机光学原理,可以得知图像中某个像素的模糊程度取决于该像素对应的弥散圆的半径,而弥散圆的半径又取决于相机的焦距、清晰点物距、实际点物距以及光圈大小。因此实际拍摄到的失焦模糊图的模糊核更接近于不同尺寸的均匀圆形模糊核。

由于清晰图数量有限,为了进行充分的数据增强,我们选择在训练时每个batch随机添加不同的模糊。具体步骤如下:

  1. 清晰图过大时,将清晰图等比例缩小到短边为1024像素

  2. 随机切出512*512像素大小的patch

  3. 在patch上随机选择一种模糊方式:

    2.1 整个patch添加模糊核半径为2到17的均匀圆形模糊

    2.2 随机生成一条高次曲线将patch分成两部分,每部分分别添加一个如2.1所述的随机半径的圆形模糊

    2.3 随机生成一条高次曲线将patch分成两部分,一部分添加一个如2.1所述的随机半径的圆形模糊,另一部分保持清晰

    2.4 随机生成一条高次曲线将patch分成两部分,每部分分别添加一个模糊核大小和方差随机的高斯模糊

  4. 在模糊图上随机添加一个微小的高斯噪声提升鲁棒性