【DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks】阅读笔记

1. contribution

  • 提出了一种Loss和网络结构
  • 提出一种基于随机轨迹的方法,用于生成去模糊数据集
  • 提出了一个数据集,以及一种改善目标检测结果的去模糊算法
    在这里插入图片描述

2 Loss

本文的Loss由两部分组成

在这里插入图片描述
代码中对Loss的描述由如下组合方式
在这里插入图片描述

2.1 Adversarial loss

2.1.1 GANLoss

对预测结果和label求损失
损失分为 B C E L o s s BCELoss BCELoss L 1 L o s s L1Loss L1Loss

2.1.2 DiscLoss

继承 G A N L o s s GANLoss GANLoss
可分为两种

  • 判别器对真图片计算损失
  • 判别器对真图片和假图片的损失求平均

计算损失即 G A N L o s s GANLoss GANLoss

2.1.3 DiscLossLS

继承 D i s c L o s s DiscLoss DiscLoss
D i s c L o s s DiscLoss DiscLoss相同(未看出区别)

2.1.4 DiscLossWGANGP

分为两种:

  • 仅判别器损失
  • 判别器的损失+梯度正则

2.2 Content loss

本项目给出的 C o n t e n t l o s s Content loss Contentloss有两种,本文采用的是第二种perceptual loss感知损失

2.2.1 ContentLoss

返回 L 1 L o s s L1Loss L1Loss

2.2.2 PerceptualLoss

感知损失的核心就是将预测图和label先过一遍 V G G VGG VGG然后再计算 l o s s loss loss,在本文中,就是计算前 V G G 19 VGG19 VGG19的前15层网络的输出,再计算 M S E L o s s MSELoss MSELoss。这里的15层不是 V G G 19 VGG19 VGG19中的19层。
通过探究可以发现 V G G 19 VGG19 VGG19全37部分,如下所示

  (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (1): ReLU(inplace=True)
  (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (3): ReLU(inplace=True)
  (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (6): ReLU(inplace=True)
  (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (8): ReLU(inplace=True)
  (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (11): ReLU(inplace=True)
  (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (13): ReLU(inplace=True)
  (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (15): ReLU(inplace=True)
  (16): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (25): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (26): ReLU(inplace=True)
  (27): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (29): ReLU(inplace=True)
  (30): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (31): ReLU(inplace=True)
  (32): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (33): ReLU(inplace=True)
  (34): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (35): ReLU(inplace=True)
  (36): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)

而本网络仅用到了第14层即:

  (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (1): ReLU(inplace=True)
  (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (3): ReLU(inplace=True)
  (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (6): ReLU(inplace=True)
  (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (8): ReLU(inplace=True)
  (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (11): ReLU(inplace=True)
  (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (13): ReLU(inplace=True)
  (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))

本文称之为 V G G 3 , 3 VGG_{3,3} VGG3,3,原文解释是第3层池化层前的第3层卷积层。经核验,第三个池化层标号为27,前三层卷积层刚好是25(1),16(2),14(3)。刚好是标号为14的层。

3. Network

3.1 PatchGAN discriminator

3.2 ResnetGenerator(resnet_9blocks)

4. Motion blur generation

部分原文翻译:
遵循Boracchi和Foi [4]描述的随机轨迹生成的想法。然后通过将子像素内插应用于轨迹矢量来生成内核。每个轨迹矢量是复值矢量,其对应于在连续域中跟随2D随机运动的对象的离散位置。轨迹生成是通过马尔可夫过程完成的,总结在算法1中。轨迹的下一个点的位置是基于先前的点速度和位置,高斯扰动,脉冲扰动和确定性惯性分量随机生成的。

5. Experimental evaluation

5.1 GoPro Dataset

2103对720P清晰/模糊图像,取自各个场景
对比方法
【Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring】
【Learning a Convolutional Neural Network for Non-uniform Motion Blur Removal】
【Unnatural L0 Sparse Representation for Natural Image Deblurring】
评价指标

  • P S N R PSNR PSNR
  • S S I M SSIM SSIM
  • 时间

5.2 Kohler dataset

【Recording and playback of camera shake: Benchmarking blind deconvolution with a real-world database】
4张图片,每张图片有12个不同的模糊核
对比方法
【Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring】
【Learning a Convolutional Neural Network for Non-uniform Motion Blur Removal】
【Unnatural L0 Sparse Representation for Natural Image Deblurring】
【Non-uniform deblurring for shaken images】
评价指标

  • P S N R PSNR PSNR
  • S S I M SSIM SSIM

5.3 Object Detection

用去模糊前后目标检测的结果来衡量去模糊的质量
数据集
自己采集的数据集
评价指标
利用清晰图片作为 G T GT GT,模糊图片和去模糊图片分别输入到 Y O L O YOLO YOLO

  • p r e c prec prec
  • F 1 − s c o r e F1-score F1score
  • r e c a l l recall recall

6. knowledge

6.1 conditional GAN (CGAN)

known as pix2pix
输入一张图片和一些随机噪声,输出一张图片

6.2 WGAN

用散度 d i v e r g e n c e divergence divergence来衡量两个分布之间的距离
参考 利普西茨约束的意义
利普西茨约束核心就是为了得到一个更为稳健的模型
为了 满足 L i p s c h i t z Lipschitz Lipschitz限制,将权重 w w w严格限制在 [ − c , c ] [-c,c] [c,c]之间,采用的方法就是超出区间去边界的方法

6.3 WGAN-GP

W G A N WGAN WGAN的基础上改进,改进的地方就是对满足 L i p s c h i t z Lipschitz Lipschitz限制所采取的强制裁剪进行改进,转成添加一项正则项,对权重进行惩罚,使得梯度维持在1附近

6.4 torch.nn.ReflectionPad2d()

参考 用法

函数用途:对输入图像以最外围像素为对称轴,做四周的轴对称镜像填充。

填充顺序:左->右->上->下

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值