文章目录
1. 摘要
文章提出了一种端到端的全卷积网络进行单张图片的反射分离,其中卷积网络的loss函数不仅考虑了低层的信息,还涵盖了高层的图片信息。具体来说,loss函数包括两个感知的loss(perceptual losses):
- 一个来自perception network的
feature loss
- 一个adversarial loss
不仅如此,还提出了一个exclusion loss,这个loss可以起到像素级别的反射分离。
其他的贡献:制作了一个数据集,一类为现实中带反光的图片,另一类为同一场景下不带反光的图片。
我们的模型在PSNR,SSIM以及perceptual user study的指标中,都超过了state-of-the-art.
2. 介绍
P1:反光在日常生活中很常见。因此从一张image中分离出reflection
层和transmission
层,也称为the reflection separation problem
,是一个比较热门的领域。
P2:假如一张带反射的图片作为输入,即
I
=
R
m
×
n
×
3
I = R^{m \times n \times 3}
I=Rm×n×3
然后T代表transmission layer, R代表reflection layer,这样的话就有
I
=
T
+
R
I = T + R
I=T+R
也就是一张照片等于transmission layer 加上 reflection layer。
我们的目的是想在给定
I
I
I,将
T
T
T求出来,也就是给出反光照片,去除反光得到不带反光的照片。但是这个一个不可解问题,如果没有给出额外的限制条件或先决条件的话。
P3:因为分离反光问题是病态问题(ill-posed)的,因此之前人们解决它都需要额外的输入图片和精心设置的先决条件。
比如使用很多张照片和用户指导,但是显示中没有那么多照片,用户指导也不可靠。近来研究者提出使用单张图片进行反射消除,但依靠精心设计的先决条件,比如ghose cues和相对平滑的反射,这样泛化效果并不好。前段时间,CEILNet用了DNN训练了一个模型进行反光消除,但是只学到了像颜色、边缘这样的低层信息,学不到高层的信息。Low-level信息对于反光消除是远远不够的,因为颜色是随机的。
P4:提出了独特的loss,内容和综述差不多。perceptual losses有两个,这两个分别是对图片信息的不同level进行处理的:feature loss主要是来自visual perceptual network,adversarial loss主要是去修正输出的transmission layer的。
而exclusion loss主要是为了在梯度上对独立的层进行分离。
3. 相关工作
3.1 Multiple-image methods
说的就是输入多张图片,然后再输出消除反光的照片。
3.2 Single-image methods
一般来说用单张图片作为输入都要有预先定义的先验条件。比较常用的有两种:
- 用图片的梯度稀疏性(gradient sparsity)来找到最小的边缘和角点,然后进行层的分离。gradient sparsity一般都有用户的协助。这类方法是基于low-level 的图片信息,所以面对high-level时就无能为力了。
- 另一个的假设(先验条件)是反射层总是失焦并且比较平滑(out of focus and appears smooth)。虽然反射层相对平滑是合理的,但是如果反射层对比度比较高的话,这就不可行了。
最近提出的Cascaded Edge and Image Learning Network(CEILNet)[级联边缘和图像学习网络],把消除反光当成边缘简化任务,并且学习一个中间边缘图引导层分离。CEILNet单纯学习low-level的loss,因为loss仅仅对比颜色空间和梯度域的不同。我们和CEILNet主要的不同是后者在训练时没有充分利用perceptual的信息。
ps:CEILNet的github地址,有数据集:https://github.com/fqnchina/CEILNet
3.3 基准数据集
这个数据集有目前已经开源了:https://sir2data.github.io/。
感觉不错呀这个数据集。
4. 概述
P1:给一张带反光的照片:
I
∈
[
0
,
1
]
m
×
n
×
3
I \in [0,1]^{m \times n \times 3}
I∈[0,1]m×n×3
(图像在0到1,说明要做归一化处理)
然后我们的方法将
I
I
I分解为transmission layer
f
T
(
I
;
θ
)
f_T(I;\theta)
fT(I;θ) 和 reflection layer
f
R
(
I
;
θ
)
f_R(I; \theta)
fR(I;θ),其中
θ
\theta
θ是网络的权重。
网络
f
f
f的训练数据为
D
=
{
(
I
,
T
,
R
)
}
D=\{(I,T,R)\}
D={(I,T,R)},其中
I
I
I是输入图片,
T
T
T是输入图片
I
I
I的transmission layer,
R
R
R是输入图片
I
I
I的reflection layer。
loss函数包括三部分:
- feature loss: L f e a t L_{feat} Lfeat,比较图片的featur space
- adversarial loss: L a d v L_{adv} Ladv,对真实图片的修复
- exclusion loss: L e x c l L_{excl} Lexcl,在梯度域中将transmission layer和reflection layer进行分离。
总的loss如下:
L
(
θ
)
=
w
1
L
f
e
a
t
(
θ
)
+
w
2
L
a
d
v
(
θ
)
+
w
3
L
e
x
c
l
(
θ
)
L(\theta) = w_1L_{feat}(\theta) + w_2L_{adv}(\theta) + w_3L_{excl}(\theta)
L(θ)=w1Lfeat(θ)+w2Ladv(θ)+w3Lexcl(θ)
其中
w
1
=
0.1
,
w
2
=
0.01
,
w
3
=
1
w_1=0.1, w_2=0.01, w_3=1
w1=0.1,w2=0.01,w3=1。
P2:先从VGG-19中提取conv1_2, conv2_2, conv3_2, conv4_2, conv5_2
的特征,然后和输入图片拼接起来作为模型
f
f
f的输入。文章里说这些高层的feature一共有1472个dimensions,具体得看代码才知道。好奇的是为什么总是取_2层特征,_3或者其他效果不好吗?
P3:讲模型
f
f
f的构造,和Fast Image Processing with Fully-Convolutional Networks和Multi-Scale Context Aggregation by Dilated Convolutions的网络结构类似。
输入的图片大小为513x513,然后
f
f
f的第一层是1x1的卷积,目的是将输入的维度 (1472+3) 降到64。接下来的8层都是3x3的dilated convolutions,dilation的比率从1到128,所有的中间层的channel都是64。在最后一层,用线性变换在RGB颜色空间上合成2张图片。
P4:和其他方法的对比。方法对比的数据集为CEILNet的数据集,但这个数据集的带反光的图片是合成的;还有就是作者制作的现实世界的数据集。
5. 训练
5.1 Feature loss
semantic reasoning(语义推理)有利于消除反光,而feature loss结合了low和high level的信息,很适合这个任务。文中还说了别的任务也应用了这个loss:
Photographic Image Synthesis with Cascaded Refinement Networks
Image style transfer using convolutional neural networks
Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network
Perceptual Losses for Real-Time Style Transfer and Super-Resolution
计算feature loss的方法是:
将模型预测出来的transmission layer
f
T
(
I
;
θ
)
f_T(I;\theta)
fT(I;θ) 和ground truth
T
T
T分别喂进VGG-19网络
ϕ
\phi
ϕ中,然后计算他们的
L
1
L^1
L1 距离。具体公式如下:
L
f
e
a
t
(
θ
)
=
∑
(
I
,
T
)
∈
D
∑
l
λ
l
∣
∣
ϕ
l
(
T
)
−
ϕ
l
(
f
T
(
I
;
θ
)
)
∣
∣
1
L_{feat}(\theta) = \sum_{(I,T) \in D} \sum_{l} \lambda_l ||\phi_l(T) -\phi_l(f_T(I;\theta)) ||_1
Lfeat(θ)=(I,T)∈D∑l∑λl∣∣ϕl(T)−ϕl(fT(I;θ))∣∣1
其中
ϕ
l
\phi_l
ϕl代表VGG-19中的第
l
l
l层。
λ
l
{\lambda_l}
λl则是平衡因子,是个超参数。VGG-19的层像之前说的,用conv1_2, conv2_2, conv3_2, conv4_2, conv5_2
。
5.2 Adversarial loss
一言以蔽之,这个loss用处就是当reflection层和transmission层分离之后,transmission层图片会变得颜色奇怪啥的,反正就是不真实,所以用这个来进行微调。文章采用conditional GAN来进行合成,generator为
f
T
(
I
;
θ
)
f_T(I;\theta)
fT(I;θ)。鉴别器(discriminator)记为
D
D
D,有4层64个channels(小型的gan),鉴别器的作用就是尽可能分辨出真实的transmission图片和经过模型输出的
f
T
(
I
;
θ
)
f_T(I;\theta)
fT(I;θ)。
鉴别器
D
D
D的loss为:
∑
(
I
,
T
)
∈
D
l
o
g
D
(
I
,
f
T
(
I
;
θ
)
)
−
l
o
g
D
(
I
,
T
)
\sum_{(I,T) \in D} logD(I,f_T(I;\theta)) - logD(I,T)
(I,T)∈D∑logD(I,fT(I;θ))−logD(I,T)
D
(
I
,
x
)
D(I,x)
D(I,x)的输出是
x
x
x有多接近transmission图片的概率,越大就越接近。因为
D
(
I
,
T
)
D(I,T)
D(I,T)概率等于1,所以后面一项等于0。
最终adversarial loss如下:
L
a
d
v
(
θ
)
=
∑
I
∈
D
−
l
o
g
D
(
I
,
f
T
(
I
;
θ
)
)
L_{adv}(\theta) = \sum_{I \in D} -logD(I, f_T(I;\theta))
Ladv(θ)=I∈D∑−logD(I,fT(I;θ))
具体的有关gan的loss可以看这篇:Generative Adversarial Nets
5.3 Exclusion loss
这个loss是为了在梯度域上更好地将reflection层和transmission分离开来。经过实验分析,我们观察到在transmission层和reflection层上的边缘很大可能不会重叠。也就是说,在
I
I
I上出现的边缘信息,有可能是transmission 层的,也有可能是reflection层的,但不是两者结合的。因此就可以在梯度域上减少transmission和reflection之间的相关性。
exlusion loss的公式如下:
L
e
x
c
l
(
θ
)
=
∑
I
∈
D
∑
n
=
1
N
∣
∣
ψ
(
f
T
n
(
I
;
θ
)
,
f
R
n
(
I
;
θ
)
∣
∣
F
L_{excl}(\theta) = \sum_{I \in D} \sum_{n=1}^N || \psi(f_T^n(I;\theta), f_R^n(I;\theta)||_F
Lexcl(θ)=I∈D∑n=1∑N∣∣ψ(fTn(I;θ),fRn(I;θ)∣∣F
ψ
(
T
,
R
)
=
t
a
n
h
(
λ
T
∣
∇
T
∣
)
⊙
t
a
n
h
(
λ
R
∣
∇
R
∣
)
\psi(T,R) = tanh(\lambda_T|\nabla T|) \odot tanh(\lambda_R|\nabla R| )
ψ(T,R)=tanh(λT∣∇T∣)⊙tanh(λR∣∇R∣)
其中
λ
T
\lambda_T
λT和
λ
R
\lambda_R
λR是归一化系数,这两个参数很重要。(还给出了是多少,懒得打公式了…)
5.4 Implement
说是实现,又加了个loss。因为输入有ground truth的reflection层,所以可以更进一步限制模型生成reflection层的效果。文章在颜色空间上用L1 loss进行限制:
L
R
(
θ
)
=
∑
(
I
,
R
)
∈
D
∣
∣
f
R
(
I
;
θ
)
−
R
∣
∣
1
L_R(\theta) = \sum_{(I,R) \in D} ||f_R(I;\theta) - R||_1
LR(θ)=(I,R)∈D∑∣∣fR(I;θ)−R∣∣1
当训练的时候,我们是将合成的数据和真实的数据训练的,通过优化减少
(
L
+
L
R
)
(L+L_R)
(L+LR)的值;但是,要注意的是,当训练真实数据的时候,不用
L
R
L_R
LR,因为真实数据中R难以准确获取。当图片过曝时,
I
=
T
+
R
I = T + R
I=T+R就不成立了。
对于训练数据,我们用了5000张合成图片,并且从90张真实数据中,在256和480像素之间随机取像素值,得到500张照片;还有就是通过随机resize图片,但是保持长宽比(aspect ratio).
- batch size 为1,训练250个epochs
- 用Adam算法优化,Learning rate固定为 1 0 − 4 10^{-4} 10−4
6. 数据集
6.1 合成的数据集
从Flickr从随机取5000张图片pairs,一张室外的一张室内的,这两张随机一张作为transmission,另一张作为reflection。通过高斯平滑核,核的大小从3到17随机选择,然后对reflection layer进行平滑。
然后对两张图片进行合成,合成方法我还没看懂,他借鉴了这篇论文的方法:
A Generic Deep Architecture for Single Image Reflection Removal and Image Smoothing
6.2 真实的数据集
这篇论文发表前,还没有公开的数据集。所以他们制作了110份真实数据集的pairs:带反光的图片和对应不放光(即ground truth transmission layer)的图片。具体制作细节略。
这110份数据,90份经过data augmentation得到500张去训练,余下的20份作为验证集。