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 F1−score
- 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()
参考 用法
函数用途:对输入图像以最外围像素为对称轴,做四周的轴对称镜像填充。
填充顺序:左->右->上->下