代码:https://github.com/huangzilingcv/HardGAN
目录
1. 摘要
本文提出了Haze-Aware Representation Distillation GAN(HardGAN),用于单幅图像去雾。
2. 网络结构
下图1展示了生成器结构。对于判别器,文章已说明,使用的是《Image-to-image translation with conditional adversarial networks》中的patch-GAN的判别器。
Generator
图中,蓝色HARD模块为Haze-Aware Representation Distillation(HARD)模块。生成器由粗到细分为三层,即图1中的三行。第一层为最粗略层,包含五个HARD模块;第二层为中间层,包含了六个HARD模块;第三层为最精细层,包含了八个HARD模块。
给定一张雾图
X
X
X和其对应的Ground-Truth
Y
Y
Y,用
x
m
n
x_m^n
xmn和
y
m
n
y_m^n
ymn表示第m层的第n个HARD模块。第一层和第二层的输入分别为
X
↓
X\downarrow
X↓和
X
↓
↓
X\downarrow\downarrow
X↓↓,其中
↓
\downarrow
↓代表下采样。
符号举例如图所示, x x x表示模块输入, y y y表示模块的输出。
第一层和第二层前半部分的输入公式化如下:
x
2
n
=
A
D
D
(
y
3
n
−
1
↓
,
y
2
n
−
1
)
(2)
x_{2}^{n}=A D D\left(y_{3}^{n-1} \downarrow, y_{2}^{n-1}\right) \tag{2}
x2n=ADD(y3n−1↓,y2n−1)(2)
x 1 n = A D D ( ( y 3 n − 1 ↓ ) ↓ , y 2 n − 1 ↓ , y 1 n − 1 ) (3) x_{1}^{n}=A D D\left(\left(y_{3}^{n-1} \downarrow\right) \downarrow, y_{2}^{n-1} \downarrow, y_{1}^{n-1}\right) \tag{3} x1n=ADD((y3n−1↓)↓,y2n−1↓,y1n−1)(3)
有了上图的解释, ( 2 ) ( 3 ) (2)(3) (2)(3)就很好理解了。举个例子,当 n = 3 n=3 n=3时,有:
x 2 3 = A D D ( y 3 2 ↓ , y 2 2 ) x_{2}^{3}=A D D\left(y_{3}^{2} \downarrow, y_{2}^{2}\right) x23=ADD(y32↓,y22)x 1 3 = A D D ( ( y 3 2 ↓ ) ↓ , y 2 2 ↓ , y 1 2 ) x_{1}^{3}=A D D\left(\left(y_{3}^{2} \downarrow\right) \downarrow, y_{2}^{2} \downarrow, y_{1}^{2}\right) x13=ADD((y32↓)↓,y22↓,y12)
第二层和第三层后半部分的输入公式化如下:
x
2
n
=
A
D
D
(
y
1
n
−
1
↑
,
y
2
n
−
1
)
(4)
x_{2}^{n}=A D D\left(y_{1}^{n-1} \uparrow, y_{2}^{n-1}\right) \tag{4}
x2n=ADD(y1n−1↑,y2n−1)(4)
x 3 n = A D D ( ( y 1 n − 1 ↑ ) ↑ , y 2 n − 1 ↑ , y 3 n − 1 ) (5) x_{3}^{n}=A D D\left(\left(y_{1}^{n-1} \uparrow\right) \uparrow, y_{2}^{n-1} \uparrow, y_{3}^{n-1}\right) \tag{5} x3n=ADD((y1n−1↑)↑,y2n−1↑,y3n−1)(5)
其中, A D D ( ⋅ ) ADD(\cdot) ADD(⋅)表示逐通道相加, ↑ \uparrow ↑表示上采样。
HARD模块
HARD模块结构如图2所示。
每个HARD模块包含两个分支。第一个分支(图2下半部分)用于生成每个通道的大气亮度和空间信息。第二个分支(图2上半部分)用于每个通道组合空间信息和大气亮度,它包含了三个子分支,分别用于雾感知图生成,全局大气亮度估计和空间信息插入。
本文将每个通道的大气亮度编码为1×1×2的矩阵,表示为
γ
i
g
\gamma_i^g
γig和
β
i
g
\beta_i^g
βig(即1×1×2矩阵的第三个维度的两个值,
i
i
i表示第
i
i
i通道),第一分支通过网络学习得到这两个元素。对于第二分支的第一子分支,利用这两个元素和输入图像得到全局大气亮度,公式如下:
G
i
=
γ
i
g
x
−
μ
σ
+
β
i
g
(6)
G_{i}=\gamma_{i}^{g} \frac{x-\mu}{\sigma}+\beta_{i}^{g} \tag{6}
Gi=γigσx−μ+βig(6)
其中,
μ
\mu
μ和
σ
\sigma
σ为输入
x
x
x的均值和标准差。
同样,对于每个通道的空间信息,第一分支将其编码为H×W×2的矩阵,表示为
γ
i
l
\gamma_i^l
γil和
β
i
l
\beta_i^l
βil。第二分支的第三子分支,利用这两个元素和输入图像得到:
L
i
=
γ
i
l
x
−
μ
σ
+
β
i
l
(7)
L_{i}=\gamma_{i}^{l} \frac{x-\mu}{\sigma}+\beta_{i}^{l} \tag{7}
Li=γilσx−μ+βil(7)
为了自适应地融合大气亮度和空间信息,将输出特征图馈入实例规范化,然后馈入Sigmoid层,以生成每个通道的雾度感知图
A
A
A,其中
A
i
A_i
Ai表示第
i
i
i通道的雾度感知图。这种方法可确保我们的模型在遇到不规则类型的雾时更改其焦点。
融合上述三个特征,得到输出:
y
i
=
(
1
−
A
i
)
⊗
G
i
+
A
i
⊗
L
i
(8)
y_{i}=\left(1-A_{i}\right) \otimes G_{i}+A_{i} \otimes L_{i} \tag{8}
yi=(1−Ai)⊗Gi+Ai⊗Li(8)
⊗ \otimes ⊗表示逐元素相乘。
不知道是我的理解有问题还是作者写的有问题,这一部分看的我云里雾里。例如,大气亮度如果是逐通道的话,为什么 ( 6 ) (6) (6)中的 x x x没有下标 i i i?又比如,第一分支相同的网络结构,为什么得到两种不同尺寸的输出(1×1×2和H×W×2)。
3. 损失函数
损失函数包含三部分,分别为:对抗损失,平滑
L
1
L1
L1损失以及感知损失。总损失如下:
L
=
λ
a
d
v
L
a
d
v
+
λ
L
1
L
1
+
λ
p
e
r
L
p
e
r
(9)
\mathcal{L}=\lambda_{a d v} \mathcal{L}_{a d v}+\lambda_{L_{1}} \mathcal{L}_{1}+\lambda_{p e r} \mathcal{L}_{p e r} \tag{9}
L=λadvLadv+λL1L1+λperLper(9)
其中, λ 1 = 1.2 \lambda_1 = 1.2 λ1=1.2, λ p e r = 0.04 \lambda_{per} = 0.04 λper=0.04, λ a d v = 0.05 \lambda_{adv} = 0.05 λadv=0.05。
3.1 Adversarial Loss
L a d v ( G , D ) = E [ D ( y ) ] − E [ D ( G ( x ) ) ] + λ E [ ( ∣ ∇ D ( α x − ( 1 − α G ( x ) ) ) ∣ − 1 ) 2 ] (10) \mathcal{L}_{a d v}(G, D)=E[D(y)]-E[D(G(x))]+\lambda E\left[(|\nabla D(\alpha x-(1-\alpha G(x)))|-1)^{2}\right] \tag{10} Ladv(G,D)=E[D(y)]−E[D(G(x))]+λE[(∣∇D(αx−(1−αG(x)))∣−1)2](10)
该对抗损失应该只是理论上的。
3.2 Smooth L 1 L1 L1 Loss
L
1
L1
L1损失公式如下:
L
1
=
1
N
∑
y
=
1
N
∑
i
=
1
3
α
(
Y
^
i
(
z
)
−
Y
i
(
z
)
)
(11)
\mathcal{L}_{1}=\frac{1}{N} \sum_{y=1}^{N} \sum_{i=1}^{3} \alpha\left(\hat{Y}_{i}(z)-Y_{i}(z)\right) \tag{11}
L1=N1y=1∑Ni=1∑3α(Y^i(z)−Yi(z))(11)
其中 Y ^ i ( z ) \hat{Y}_i(z) Y^i(z)和 Y i ( z ) {Y}_i(z) Yi(z)分别为去雾图和Ground-Truth在像素点 z z z上第 i i i通道的值。 N N N为总像素点数, α \alpha α定义如下:
α ( e ) = { 0.5 e 2 , if ∣ e ∣ < 1 ∣ e ∣ − 0.5 , otherwise (12) \alpha(e)=\left\{\begin{aligned} 0.5 e^{2}, & & \text { if }|e|<1 \\ |e|-0.5, & & \text { otherwise } \end{aligned}\right. \tag{12} α(e)={0.5e2,∣e∣−0.5, if ∣e∣<1 otherwise (12)
3.3 Perceptual Loss
感知函数不多赘述,公式如下:
L
per
=
∑
j
=
1
3
1
C
j
H
j
W
j
∥
ϕ
j
(
y
)
−
ϕ
j
(
y
t
)
∥
(13)
\mathcal{L}_{\text {per}}=\sum_{j=1}^{3} \frac{1}{C_{j} H_{j} W_{j}}\left\|\phi_{j}(y)-\phi_{j}\left(y_{t}\right)\right\| \tag{13}
Lper=j=1∑3CjHjWj1∥ϕj(y)−ϕj(yt)∥(13)
ϕ j \phi_j ϕj为预训练的VGG19的第 j j j层激活函数。
4. 其余部分
其余部分感兴趣的可以去看原文,没什么值得分析的。
5. 总结
本文提出了一种新颖的多尺度图像去雾网络。 所提出的方法没有明确估计传输图和大气光强度,而是自适应地将局部空间信息和全局大气亮度融合在一起,这些学习方法是通过学习的单个通道的雾度感知图指导的。 在合成和真实雾图像上进行的大量实验证明了本文方法的有效性。 除了具有均匀雾的图像,本文的方法还可以很好地去除图像中的密集非均匀雾。