对抗⽣成⽹络学习(⼋)——DeblurGAN实现运动图像的去模
糊化(tensorflow实现)
⼀、背景
DeblurGAN是于17年11⽉提出的⼀种模型。前⾯学习过,GAN可以保存影像的细节纹理特征,⽐如之前做过的SRGAN可以实现图像的超分辨率,因此,作者利⽤这个特点,结合GAN和多元内容损失来构建DeblurGAN,以实现对运动图像的去模糊化。
本试验的数据集为GOPRO数据,后⾯还会有详细的介绍,尽可能⽤⽐较少的代码实现DeblurGAN。
⼆、DeblurGAN原理
DeblurGAN的创新主要是结合了之前⼀些GAN的⽹络结构和loss函数,⽹上的介绍⽐较少,先推荐⼀篇:
[2]
⽂章中,作者运⾏DeblurGAN的效果图为:
从左⾄右依次为:左边模糊影像,中间DeblurGAN⽣成影像,右边为真实影像。可以看到效果还是⾮常好的。
这篇⽂章⽐较短,作者简要的提出了他们的主要贡献:
We make three contributions. First, we propose a loss and architecture which obtain state-of-the art results in motion deblurring, while being 5x faster than the fastest competitor. Second, we present a method based on random
trajectories for generating a dataset for motion deblurring training in an automated fashion from the set of sharp image. We show that combining it with an existing dataset for motion deblurring learning improves results compared to training on real-world images only. Finally, we present a novel dataset and method for evaluation of deblurring
algorithms based on how they improve object detection results.
1. 提出了去模糊化的loss函数和模型结构,速度是⽬前最快编译器的5倍多。
2. 对于原始的清晰影像,⽤随机轨道法来⽣成模糊影像作为数据集。
3. 提出去模糊化算法,提⾼⽬标检测结果。
本⽂重点介绍DeblurGAN的实现过程,关于如何⽣成数据集,可以参考[2]中的介绍或者查看原⽂,这⾥只给出⽣成数据集的⽰意图和简要介绍,⼤概类似于对相机长曝光并抖动⽽产⽣的影像:
简单的说,就是对清晰图像卷积上各式各样的“blur kernel”,获得合成的模糊图像。作者采⽤了运动轨迹随机⽣成⽅法(⽤马尔科夫随机过程⽣成);然后对轨迹进⾏“sub-pixel interpolation”⽣成blur kernel。当然,这种⽅法也只能在⼆维平⾯空间中⽣成轨迹,并不能模拟真实空间中3D相机的运动[2]。
同时作者也给出了⽣成模糊影像算法的伪代码:
关于模型的⽹络结构,其实总的来看和普通的GAN并没有什么⼤的区别:
不过作者所采⽤的⽣成器generator的⽹络结构则类似于⾃编码器(auto-encoder):
⽽判别器的⽹络结构则与PatchGAN相同。
另外,作者提到了他对loss函数进⾏了改进,令新的loss函数为Content loss与Adversarial loss之和。
关于DeblurGAN的实现代码,我主要参考了[3],并对该代码进⾏了修改。另外,⽹上的参考代码⾮常少,这⾥再给出⼏个:
三、DeblurGAN实现
1. ⽂件结构
所有的⽂件结构如下:
-- main.py
-- util.py
-- data_loader.py
-- mode.py
-- DeblurGAN.py
-- vgg19.py
-- layer.py
-- vgg19.npy                            # 这个是需要⾃⼰下载的vgg19模型,后⾯会说明
-- data                                # 这个是训练数据集,后⾯也会具体说明
|------ train
|------ blur
|------ image1.png
|------ image2.png
|------ ......
|------ sharp
|------ image1.png
|------ image2.png
|------ ......
|------ val
|------ val_blur
|------ image1.png
|------ image2.png
|------ ......
|------ val_sharp
|------ image1.png
|------ image2.png
|------ ......
2. 数据集准备
这⾥需要准备的数据有两个,⼀个是vgg19模型⽂件,另⼀个是训练数据集。
(1)vgg19.npy模型⽂件
先给出vgg19.npy的下载地址;
打开上述⽹址,直接下载即可,不过需要注意的是,该⽂件需要下载:
为了⽅便⼤家的使⽤,我将该数据上传到了百度云上。下载地址为:
提取码:bqt6
下载好该⽂件之后,将该⽂件放到项⽬的根⽬录下即可,即'./vgg19.npy'。
(2)训练数据集dataset
关于GOPRO的数据集,⽹上有不同的版本,这⾥先给出GOPRO的数据集简要介绍及下载地址,需要注意的是,下载需要:
①GOPRO_Large:该数据集的⼤⼩为8.9G,下载链接为(需要):
image pro plus②GOPRO_Large_all:该数据集的⼤⼩为35G,下载链接为(需要):
③blurred_sharp.zip:该数据集的⼤⼩为1.0G,下载链接为(需要):
如果有办法能够打开上述链接,就直接打开并下载即可:
为了防⽌⽆法打开上述链接,我将该数据集上传⾄百度云。下载地址为:
提取码:7b3q
下载好该数据后解压,在路径'./blurred_sharp/blurred_sharp/'下,可以看到'blurred'和'sharp'两个⽂件夹,这⾥都是我们的训练数据,将'blurred'⽂件夹下的所有图像移⾄'./data/train/blur/'⽂件夹下,将'sharp'⽂件夹下的所有图像移动⾄'./data/train/sharp/'⽂件夹下,这样就制作好了训练数据,但是我们还需要拿出⼀部分数据作为测试数据。
我是将'./data/train/blur/'中的5张图⽚剪切⾄'./data/val/val_blur/'中,同理,将相应编号的'./data/train/sharp/'中的5张图⽚剪切⾄'./data/val/val_sharp/'中,需要注意的是这两组图⽚的编号必须⼀致对应。
构建好的数据集为:
打开这些照⽚的属性信息可以看到,所有的照⽚的⼤⼩都为720*720,格式为png。构建好数据集之后,就可以开始试验了。3. 数据加载⽂件data_loader.py
data_loader.py⽂件中主要编写⼀些加载数据的函数,下⾯直接给出代码:
import tensorflow as tf
import os
class dataloader():
def __init__(self, args):
self.channel = 3
self.patch_size = args.patch_size
self.batch_size = args.batch_size

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。