代码目前还未公布,但是作者在文章中声明会开源。
目录
1. 摘要
本文研究了单幅图像去雾中的两个具有挑战性和较少接触的问题,即如何在不训练Ground-Truth图像(无监督)和图像集合(未经训练)的情况下使深度学习实现图像去雾。本文提出了一种新颖的方法,称为“You Only Look Yourself”(YOLY),它可能是第一个用于图像去雾的无监督和未经训练的神经网络。
YOLY使用三个联合子网将观察到的雾图分成几个潜在层,即场景辐射层,传输率层和大气光层。然后,将这三层以自我监督的方式进一步构成雾图。
2. 网络结构及损失函数
网络结构如图1所示。
网络分为三个子网,为:J-Net、T-Net和A-Net,分别用来生成
J
(
x
)
\boldsymbol{J}(x)
J(x)、
T
(
x
)
\boldsymbol{T}(x)
T(x)和
A
(
x
)
\boldsymbol{A}(x)
A(x)。整体流程如下:输入一幅有雾图像
x
x
x,分别送入三个子网J-Net、T-Net和A-Net,得到
J
(
x
)
\boldsymbol{J}(x)
J(x)、
T
(
x
)
\boldsymbol{T}(x)
T(x)和
A
(
x
)
\boldsymbol{A}(x)
A(x)。接着,通过公式:
I
(
x
)
=
T
(
x
)
J
(
x
)
+
(
1
−
T
(
x
)
)
A
(1)
\boldsymbol{I}(x) = \boldsymbol{T}(x)\boldsymbol{J}(x) + (1 - \boldsymbol{T}(x))\boldsymbol{A} \tag{1}
I(x)=T(x)J(x)+(1−T(x))A(1)
生成雾图
I
(
x
)
\boldsymbol{I}(x)
I(x)。
三个子网均有相应的损失函数,
I
(
x
)
\boldsymbol{I}(x)
I(x)与
x
x
x也构成一个损失函数(后面详细介绍)。下面分别介绍子网及其损失函数。
2.1 The top layer of YOLY
在YOLY的顶层,损失函数如下:
L
R
e
c
=
∥
I
(
x
)
−
x
∥
p
(2)
\mathcal{L}_{Rec} = \parallel \boldsymbol{I}(x) - x \parallel_p \tag{2}
LRec=∥I(x)−x∥p(2)
其中
∥
⋅
∥
p
\parallel \cdot \parallel_p
∥⋅∥p为
p
p
p范数,本文中采用的是Frobenius范数。Frobenius范数表达式如下:
∥
A
∥
F
=
∑
i
=
1
m
∑
j
=
1
n
a
i
j
2
(3)
\parallel \boldsymbol{A} \parallel_F = \sqrt{\sum\limits_{i=1}^{m} \sum\limits_{j=1}^{n} a_{ij}^2} \tag{3}
∥A∥F=i=1∑mj=1∑naij2(3)
即Frobenius范数就是矩阵各元素平方和的开方。
L
R
e
c
\mathcal{L}_{Rec}
LRec的设计目的在于限制包括子网在内的整个网络,从而利用三个子网生成的组件更好的重建雾图。换句话说,它通过引入雾生成过程(大气散射模型),来引导子网对原图的分解,以及引导子网生成的组件对雾图的重构。
2.2 J-Net
J-Net输入一幅雾图
x
x
x,输出该雾图的清晰图像
J
(
x
)
\boldsymbol{J}(x)
J(x)。J-Net采用了一个非退化结构,即没有实现下采样操作,在输入和输出的过程中,不会减小图像的大小。该结构可以避免对
J
(
x
)
\boldsymbol{J}(x)
J(x)细节的损失。J-Net仅包含了卷积层,BN层以及LeakyReLU层。J-Net最后一层采用了sigmoid函数,将输出归一化到
[
0
,
1
]
[0,1]
[0,1]区间内。
J-Net采用如下的损失函数:
L
J
=
∥
V
(
f
J
(
x
)
)
−
S
(
f
J
(
x
)
)
∥
p
(4)
\mathcal{L}_J = \parallel V(f_J(x)) - S(f_J(x)) \parallel_p \tag{4}
LJ=∥V(fJ(x))−S(fJ(x))∥p(4)
其中, V ( f J ( x ) ) V(f_J(x)) V(fJ(x))为J-Net的输出 f J ( x ) f_J(x) fJ(x)的亮度, S ( f J ( x ) ) S(f_J(x)) S(fJ(x))为 f J ( x ) f_J(x) fJ(x)的饱和度。该损失函数的设计是基于CAP先验(可以看这篇博客)。简单来说,即雾的渲染会增大图像的亮度,减少图像的饱和度,从而使亮度与饱和度的差值增大。所以,在 J ( x ) \boldsymbol{J}(x) J(x)中,该差值应尽可能小。
2.3 T-Net
T-Net输入一幅雾图 x x x,输出该雾图的传输率图 T ( x ) \boldsymbol{T}(x) T(x)。T-Net和J-Net具有相似的结构,仅有两处不同。第一,J-Net的输出是一幅三通道的图像,而T-Net的输出是一幅单通道的传输率图。第二,T-Net不需要另外的损失函数,仅用YOLY的损失函数优化T-Net的参数。
2.4 A-Net
A-Net输入一幅雾图
x
x
x,输出该雾图全局大气光
A
(
x
)
\boldsymbol{A}(x)
A(x)。A-Net中包含了一个编码器,一个对称的解码器以及一个中间块。编码器和解码器都分别包含了四个块。在编码器中,这些块依次包含了一个卷积层,ReLU激活函数层和一个最大池化层。在解码器中,这些块依次执行上采样,卷积,batch normalization以及ReLU激活。
由于全局大气光
A
\boldsymbol{A}
A与图像内容无关并且具有全局属性,因此可以合理地假设
A
\boldsymbol{A}
A是从高斯分布中采样的。为了学习高斯模型,中间块将编码器的输出
z
z
z转换成高斯分布
N
(
μ
z
,
σ
z
2
)
\mathcal{N}(\mu_z, \sigma_z^2)
N(μz,σz2)(即
z
→
{
μ
z
,
σ
z
2
}
z \rightarrow \{\mu_z, \sigma_z^2\}
z→{μz,σz2}),其中
μ
z
\mu_z
μz和
σ
z
2
\sigma_z^2
σz2为高斯模型的均值和方差。通过对高斯模型的重采样,可以产生重新构建的编码
z
^
\hat{z}
z^(即
N
(
μ
z
,
σ
z
2
)
→
z
^
\mathcal{N}(\mu_z, \sigma_z^2) \rightarrow \hat{z}
N(μz,σz2)→z^)。最后,将
z
^
\hat{z}
z^输入到解码器,获得大气光组件
f
A
(
x
)
f_A(x)
fA(x)。
不理解,网络框架图中A-Net中间块部分也没看懂。
A-Net的损失函数如下:
L
A
=
L
H
+
L
K
L
+
λ
L
R
e
g
(5)
\mathcal{L}_A = \mathcal{L}_H + \mathcal{L}_{KL} + \lambda \mathcal{L}_{Reg} \tag{5}
LA=LH+LKL+λLReg(5)
其中, L H \mathcal{L}_H LH为分解的大气光组件 f A ( x ) f_A(x) fA(x)与大气光 A ( x ) \boldsymbol{A}(x) A(x)的损失, A ( x ) \boldsymbol{A}(x) A(x)可以从 x x x中估计得到。 L K L \mathcal{L}_{KL} LKL和 L R e g \mathcal{L}_{Reg} LReg为变分推理和正则化项的损失。 λ \lambda λ为非负参数用于调节正则化项损失。
1) L H \mathcal{L}_H LH
L
H
\mathcal{L}_H
LH定义如下:
L
H
=
∥
f
A
(
x
)
−
A
(
x
)
∥
F
(6)
\mathcal{L}_H = \parallel f_A(x) - \boldsymbol{A}(x) \parallel_F \tag{6}
LH=∥fA(x)−A(x)∥F(6)
∥ ⋅ ∥ F \parallel \cdot \parallel_F ∥⋅∥F参见 ( 3 ) (3) (3)。
2) L K L \mathcal{L}_{KL} LKL
L
K
L
\mathcal{L}_{KL}
LKL旨在最小化
z
z
z和从学习到的高斯模型中重采样的
z
^
\hat{z}
z^之间的差距。表达式如下:
L
K
L
=
K
L
(
N
(
μ
z
,
σ
z
2
)
∥
N
(
0
,
I
)
)
=
1
2
∑
i
(
(
μ
z
i
)
2
+
(
σ
z
i
)
2
−
1
−
log
(
σ
z
i
)
2
)
(7)
\begin{aligned} \mathcal{L}_{KL} =& KL(\mathcal{N}(\mu_z, \sigma_z^2) \parallel \mathcal{N}(0, {I})) \\ =& \frac{1}{2} \sum\limits_{i}((\mu_{z_i})^2 + (\sigma_{z_i})^2 - 1 - \log(\sigma_{z_i})^2) \tag{7} \end{aligned}
LKL==KL(N(μz,σz2)∥N(0,I))21i∑((μzi)2+(σzi)2−1−log(σzi)2)(7)
其中, K L ( ⋅ ) KL(\cdot) KL(⋅)为两个分布之间的KL散度。 z ^ \hat{z} z^为 z z z的第 i i i个维度。
文中没提到 I I I,所以没太看懂这个损失函数。
3) L R e g \mathcal{L}_{Reg} LReg
为了避免过拟合,加入
L
R
e
g
\mathcal{L}_{Reg}
LReg损失函数,限制
f
A
(
x
)
f_A(x)
fA(x)。公式如下:
L
R
e
g
(
x
)
=
1
2
m
∑
i
=
1
m
(
x
i
−
1
∣
N
(
x
i
)
∣
∑
y
i
∈
N
(
x
i
)
y
i
)
2
(8)
\mathcal{L}_{Reg}(x) = \frac{1}{2m}\sum\limits_{i=1}^{m}(x_i - \frac{1}{|N(x_i)|} \sum\limits_{y_i \in N(x_i)} y_i)^2 \tag{8}
LReg(x)=2m1i=1∑m(xi−∣N(xi)∣1yi∈N(xi)∑yi)2(8)
其中, N ( x i ) N(x_i) N(xi)为 x i x_i xi的二阶邻域, ∣ N ( x i ) ∣ |N(x_i)| ∣N(xi)∣为邻域大小, m m m为像素点 x x x的数量。显然,正则化起均值滤波的作用,使 A ( x ) \boldsymbol{A}(x) A(x)变得平滑。
2.5 Total Loss
综上,YOLY的总损失函数如下:
L
=
L
R
e
c
+
L
J
+
L
H
+
L
K
L
+
L
R
e
g
=
∥
I
(
x
)
−
x
∥
F
2
+
∥
V
(
f
J
(
x
)
)
−
S
(
f
J
(
x
)
)
∥
F
2
+
∥
f
A
(
x
)
−
A
(
x
)
∥
F
2
+
∑
i
(
(
μ
z
i
)
2
+
(
σ
z
i
)
2
−
1
−
log
(
σ
z
i
)
2
)
+
λ
m
∑
i
=
1
m
(
f
A
(
x
)
i
−
1
∣
N
(
f
A
(
x
)
i
)
∣
∑
y
i
∈
N
(
f
A
(
x
)
i
)
y
i
)
2
(9)
\begin{aligned} \mathcal{L} =&\:\mathcal{L}_{Rec}+\mathcal{L}_{J}+\mathcal{L}_{H}+\mathcal{L}_{KL}+\mathcal{L}_{Reg} \\ =& \parallel \boldsymbol{I}(x) - x \parallel_F^2 + \parallel V(f_J(x)) - S(f_J(x)) \parallel_F^2 \\ &+ \parallel f_A(x) - \boldsymbol{A}(x) \parallel_F^2 \\ &+ \sum\limits_{i} ((\mu_{z_i})^2 + (\sigma_{z_i})^2 - 1 - \log(\sigma_{z_i})^2) \\ &+ \frac{\lambda}{m}\sum\limits_{i=1}^{m}(f_A(x)_i - \frac{1}{|N(f_A(x)_i)|} \sum\limits_{y_i \in N(f_A(x)_i)} y_i)^2 \tag{9} \end{aligned}
L==LRec+LJ+LH+LKL+LReg∥I(x)−x∥F2+∥V(fJ(x))−S(fJ(x))∥F2+∥fA(x)−A(x)∥F2+i∑((μzi)2+(σzi)2−1−log(σzi)2)+mλi=1∑m(fA(x)i−∣N(fA(x)i)∣1yi∈N(fA(x)i)∑yi)2(9)
这一部分直接把我看懵了。前三项在 ( 2 ) ( 4 ) ( 6 ) (2)(4)(6) (2)(4)(6)中没有加平方,后两项在 ( 7 ) ( 8 ) (7)(8) (7)(8)中的 1 2 \frac{1}{2} 21的系数不见了。
3. 实验结果
3.1 生成数据集
1) 室内
2) 室外
3.2 真实数据集
感兴趣的去看原文,我这里只贴出作者的结果
说实话,我并不觉得效果很好。
4. 雾的迁移
本文的层分解网络,能够得到除清晰图像外的两个两个分量——传输率和大气光。因此,根据这两个分量以及大气散射模型,就能够将一幅雾图中的雾迁移到另一幅清晰图像中。换句话说,本文还提供了雾渲染的新方法。
本文对生成室内和室外图像都进行了实验,篇幅限制这里就不在赘述,感兴趣的可以看原文。这里只展示在真实图像上的雾迁移。
可以看到,本文提出的雾渲染的方法渲染结果更加真实。
5. 消融实验
为了验证提出的损失函数的有效性,本文逐一移除
L
H
\mathcal{L}_{H}
LH、
L
K
L
\mathcal{L}_{KL}
LKL、
L
J
\mathcal{L}_{J}
LJ和
L
R
e
g
\mathcal{L}_{Reg}
LReg中的一个,结果如下。
6. 总结
在本文中,我们提出了一种无监督,未经训练的图像去雾神经网络,该网络将雾图分为场景辐射层,传输率层和大气光层。 YOLY的三个优点是:1)无监督特性意味着该方法不使用超出图像内容的信息; 2)未经训练的特征意味着该方法不需要像大多数现有的神经网络一样使用图像集进行训练; 3)可转移的雾度,可以通过以学习和无监督的方式从给定图像中提取雾度来合成新的雾度图像。论文数据集和一个真实世界的数据集证明了我们的方法在定量和定性比较中的有希望的性能。
尽管我们的方法明显优于大多数现有的无监督浅层(即传统方法)和深层方法,但仅可与最新的有监督图像去雾方法相提并论。 因此,有希望在将来不断提高其性能。 此外,探索如何将我们的方法扩展到其他图像/视频增强任务(如降噪,修复等)也很有价值。
7. 读后感
才疏学浅,到写完这篇博客,我还没对文中的许多地方云里雾里。包括:1) A-Net中间块的结构;2) L K L \mathcal{L}_{KL} LKL中的 I I I的定义;3) 总损失函数。但是总体来说该文章的思想是懂了。本文最重要的就是提出了一个无监督的去雾网络,但是去雾结果不尽人意。以后如果看懂了,会回来填坑。哈哈坑王驾到,才写了几篇文章,就已经挖了那么多坑。