项目主页:https://aupendu.github.io/iterative-dehaze(代码暂未公布)
博客题目:
论文阅读:Transmission Map and Atmospheric Light Guided Iterative Updater Network for Single Image Dehazing
(由于博客题目有100个字符的限制,而上述题目102个字符(不信你数数),所以题目只能去掉阅读二字)
1. 摘要
本文提出了一种基于迭代更新的Iterative Prior Updated Dehazing Network (IPUDN)。该网络包含三个部分,一个是初始传输率网络,一个是初始大气光网络,还有一个是迭代去雾网络。三个网络分开训练,最后结合在一起微调。
2. 网络结构
2.1 Transmission Map Estimation Network
该网络使用DCPDN中稠密链接的编码器-解码器结构(后期写这篇博客时补上(已补上,这篇博客))。该模型的使用SSIM作为损失函数而不是MSE。
2.2 Atmospheric Light Estimation Network
大气光网络结构如图1:
该网络使用堆叠的卷积层,每个卷积层后都添加了group normalization和ReLU激活函数。大小为7 × 7,步幅为2的最大池化层用于减少空间尺寸。大的最大池化核能减少像物体颜色这样的局部因素的影响。该网络最后还是用全局最大池化层,该思想来自于DCP的想法。第五部分消融实验对比了全局最大池化层和全局均值池化层的结果。
该网络计算每个颜色通道对应的大气光,因为逐通道计算大气光能更好的处理雾图中的偏色问题。同时该网络使用MSE作为损失函数。
2.3 Iterative Dehazing Network
迭代去雾网络的结构如下图:
关于该图的描述,文章有误。如图中黄色标记处所示,两个地方出错。正确应该如下: X A ( t − 1 ) = { I , A , I ′ ( t ) , A ′ ( t − 1 ) } X_A(t - 1) = \{I, A, I^\prime(t), A^\prime(t - 1)\} XA(t−1)={I,A,I′(t),A′(t−1)}, X T ( t − 1 ) = { I , T , I ′ ( t ) , T ′ ( t − 1 ) } X_T(t - 1) = \{I, T, I^\prime(t), T^\prime(t - 1)\} XT(t−1)={I,T,I′(t),T′(t−1)}。详情请看原文3.4.2或本博客2.3.2处。
该网路主要采取两个主要策略。第一,迭代更新传输率和大气光的策略。第二,使用基于LSTM(Long Short-Term Memory)的循环卷积神经网络,用于维护时间跨步依赖性。下面分别介绍该网络中的三个部分。
2.3.1 Recurrent Dehazing Formulation
去雾网络如图2(a)所示,包含了四个主要部分:(a) 输入特征提取
f
i
n
f_{in}
fin,(b) 循环层
f
L
S
T
M
f_{LSTM}
fLSTM,(c) 提取高级特征的连续6个残差块
f
r
e
s
f_{res}
fres,(d) 去雾图像重构的输出层
f
o
u
t
f_{out}
fout。网络公式化如下:
y
(
t
)
=
f
i
n
(
X
(
t
−
1
)
)
,
h
(
t
)
=
f
L
S
T
M
(
h
(
t
−
1
)
,
y
(
t
)
)
,
I
′
(
t
)
=
f
o
u
t
(
f
r
e
s
(
h
(
t
)
)
)
(1)
\begin{array}{r} y(t)=f_{in}(X(t-1)), \\ h(t)=f_{L S T M}(h(t-1), y(t)), \\ I^{\prime}(t)=f_{o u t}\left(f_{r e s}(h(t))\right) \end{array} \tag{1}
y(t)=fin(X(t−1)),h(t)=fLSTM(h(t−1),y(t)),I′(t)=fout(fres(h(t)))(1)
其中 X ( t − 1 ) = { I , T , A , I ′ ( t − 1 ) , T ′ ( t − 1 ) , A ′ ( t − 1 ) } X(t-1) = \{I, T, A, I^\prime(t - 1), T^\prime(t - 1), A^\prime(t- 1)\} X(t−1)={I,T,A,I′(t−1),T′(t−1),A′(t−1)}。当 t = 1 t = 1 t=1时,有 I ′ ( 0 ) = I , T ′ ( 0 ) = T , A ′ ( 0 ) = A I^\prime(0) = I, T^\prime(0) = T, A^\prime(0) = A I′(0)=I,T′(0)=T,A′(0)=A。 f L S T M f_{LSTM} fLSTM以 f i n f_{in} fin的输出 y ( x ) y(x) y(x)和上一阶段 f L S T M f_{LSTM} fLSTM的输出 h ( t − 1 ) h(t - 1) h(t−1)作为输入。第一个卷积块之后的LSTM有助于在连续的时间步长中保持依赖关系,从而使后续状态中的中间特征之间能够进行交互。
文中没有介绍当 t = 1 t = 1 t=1时, h ( t − 1 ) h(t - 1) h(t−1)的取值。还有需要注意的地方,我一开始看文章以为在一次迭代中,LSTM模块执行多次,即LSTM输出结果送回LSTM输入,这样多次往返。看到后面才知道原来不是,每一次迭代LSTM只执行一次,只不过LSTM输入需要使用上一次迭代LSTM的输出。
与传统的LSTM不同,文中在每个时间步骤中递归使用整个模型,这大大减少了所需的模型大小。本文的卷积LSTM公式化如
(
2
)
(2)
(2)。LSTM接收
f
i
n
f_{in}
fin的输出和阶段
t
−
1
t-1
t−1的
f
L
S
T
M
f_{LSTM}
fLSTM的输出
h
(
t
−
1
)
h(t - 1)
h(t−1)。LSTM中间结果有:an input gate
i
(
t
)
i(t)
i(t)、a forget gate
f
(
t
)
f(t)
f(t)、an ouput gate
o
(
t
)
o(t)
o(t)和 a cell state
c
(
t
)
c(t)
c(t)。公式化如下:
y
(
t
)
=
f
i
n
(
X
(
t
−
1
)
)
,
i
(
t
)
=
σ
(
W
i
y
⊗
y
(
t
)
+
W
i
s
⊗
h
(
t
−
1
)
+
b
i
)
,
f
(
t
)
=
σ
(
W
f
y
⊗
y
(
t
)
+
W
f
s
⊗
h
(
t
−
1
)
+
b
f
)
,
o
(
t
)
=
σ
(
W
o
y
⊗
y
(
t
)
+
W
o
s
⊗
h
(
t
−
1
)
+
b
o
)
,
g
(
t
)
=
tanh
(
W
g
y
⊗
y
(
t
)
+
W
g
s
⊗
h
(
t
−
1
)
+
b
g
)
,
c
(
t
)
=
f
(
t
)
⊙
c
(
t
−
1
)
+
i
(
t
)
⊙
g
(
t
)
,
h
(
t
)
=
o
(
t
)
⊙
tanh
c
(
t
)
(2)
\begin{array}{r} y(t)=f_{i n}(X(t-1)), \\ i(t)=\sigma\left(W_{i y} \otimes y(t)+W_{i s} \otimes h(t-1)+b_{i}\right), \\ f(t)=\sigma\left(W_{f y} \otimes y(t)+W_{f s} \otimes h(t-1)+b_{f}\right), \\ o(t)=\sigma\left(W_{o y} \otimes y(t)+W_{o s} \otimes h(t-1)+b_{o}\right), \\ g(t)=\tanh \left(W_{g y} \otimes y(t)+W_{g s} \otimes h(t-1)+b_{g}\right), \\ c(t)=f(t) \odot c(t-1)+i(t) \odot g(t), \\ h(t)=o(t) \odot \tanh c(t) \end{array} \tag{2}
y(t)=fin(X(t−1)),i(t)=σ(Wiy⊗y(t)+Wis⊗h(t−1)+bi),f(t)=σ(Wfy⊗y(t)+Wfs⊗h(t−1)+bf),o(t)=σ(Woy⊗y(t)+Wos⊗h(t−1)+bo),g(t)=tanh(Wgy⊗y(t)+Wgs⊗h(t−1)+bg),c(t)=f(t)⊙c(t−1)+i(t)⊙g(t),h(t)=o(t)⊙tanhc(t)(2)
其中 σ \sigma σ为sigmoid函数, ⊙ \odot ⊙为逐元素相乘, ⊗ \otimes ⊗为卷积操作。
2.3.2 Iterative Updater Mechanism
本文算法如下:
当开始迭代时,传输率网络
Γ
\Gamma
Γ和大气光网络
Λ
\Lambda
Λ已经训练完毕。两个网络以雾图
I
I
I作为输入,并分别输出相应的传输率图
T
T
T和大气光
A
A
A。去雾网络将传输率图和大气光以及雾图作为输入,并迭代对图像进行去雾,其中传输率图和大气光也被更新。
第
t
t
t步时,去雾网络的输入为
X
(
t
−
1
)
X(t - 1)
X(t−1)。其包含静态和动态的数据。静态数据为
I
I
I,
T
T
T和
A
A
A,即每次迭代都不会改变的输入。动态数据包括上一次迭代的去雾结果
I
′
(
t
−
1
)
I^\prime(t - 1)
I′(t−1),上一次迭代更新的
T
′
(
t
−
1
)
T^\prime(t - 1)
T′(t−1)和
A
′
(
t
−
1
)
A^\prime(t- 1)
A′(t−1)。第一步时,
I
′
(
t
−
1
)
=
I
I^\prime(t - 1) = I
I′(t−1)=I,
T
′
(
t
−
1
)
=
T
T^\prime(t - 1) = T
T′(t−1)=T,
A
′
(
t
−
1
)
=
A
A^\prime(t - 1) = A
A′(t−1)=A。
每一次迭代去雾,传输率图
T
T
T和大气光
A
A
A也会随着更新,两个更新网络如图2(b)(c)所示。两个网络细节如下:
网络 | 输入 | 输出 | 更新 |
---|---|---|---|
传输率更新网络 ∪ Γ \cup_{\Gamma} ∪Γ | X T ( t − 1 ) = { I , T , I ′ ( t ) , T ′ ( t − 1 ) } X_T(t - 1) = \{I, T, I^\prime(t), T^\prime(t - 1)\} XT(t−1)={I,T,I′(t),T′(t−1)} | Δ T \Delta T ΔT | T ′ ( t ) = T ′ ( t − 1 ) + Δ T T^\prime(t) = T^\prime(t - 1) + \Delta T T′(t)=T′(t−1)+ΔT |
大气光更新网络 ∪ Λ \cup_{\Lambda} ∪Λ | X A ( t − 1 ) = { I , A , I ′ ( t ) , A ′ ( t − 1 ) } X_A(t - 1) = \{I, A, I^\prime(t), A^\prime(t - 1)\} XA(t−1)={I,A,I′(t),A′(t−1)} | Δ A \Delta A ΔA | A ′ ( t ) = A ′ ( t − 1 ) + Δ A A^\prime(t) = A^\prime(t - 1) + \Delta A A′(t)=A′(t−1)+ΔA |
∪ Γ \cup_{\Gamma} ∪Γ和 ∪ Λ \cup_{\Lambda} ∪Λ中除了最后一个卷积层,其余均采用ReLU激活函数。最后一层卷积层采用tanh激活函数,以使变化可以在正方向和负方向上进行。对于 ∪ Λ \cup_{\Lambda} ∪Λ,作者使用全局平均池来获得单个全局更新,而不是逐像素更新,因为根据经验发现前者是更好的(消融实验)。
2.3.3 Dehazing Network Architecture
在去雾网络体系结构中, f i n f_{in} fin为单卷积层, f r e s f_{res} fres为6个连续的残差块, f o u t f_{out} fout也是单卷积层。所有卷积层的卷积核大小为3 × 3,填充1 × 1,并且后面接一个ReLU激活函数。本文中,迭代次数为6次。作者做了不同迭代次数的消融实验,详细见原文。
2.3.4 Loss Function
总损失函数定义如下:
L
=
L
L
1
+
λ
L
P
(3)
\mathcal{L}=\mathcal{L}_{L 1}+\lambda \mathcal{L}_{P} \tag{3}
L=LL1+λLP(3)
其中,
L
L
1
\mathcal{L}_{L 1}
LL1为mean absolute difference loss,
L
P
\mathcal{L}_{P}
LP为感知误差,
λ
\lambda
λ为权重超参数,本文设置为
λ
=
0.8
\lambda = 0.8
λ=0.8。
L
L
1
=
1
N
∑
i
=
1
N
∣
I
′
(
t
)
−
I
g
t
∣
(4)
\mathcal{L}_{L 1}= \frac{1}{N} \sum\limits_{i = 1}^{N}| I^{\prime}(t) - I_{gt} | \tag{4}
LL1=N1i=1∑N∣I′(t)−Igt∣(4)
L P = 1 C H W ∑ c = 1 C ∑ h = 1 H ∑ w = 1 W ∣ ϕ c , h , w ( I ′ ( t ) ) − ϕ c , h , w ( I g t ) ∣ (5) \mathcal{L}_{P}=\frac{1}{C H W} \sum_{c=1}^{C} \sum_{h=1}^{H} \sum_{w=1}^{W}\left|\phi_{c, h, w}\left(I^{\prime}(t)\right)-\phi_{c, h, w}\left(I_{g t}\right)\right| \tag{5} LP=CHW1c=1∑Ch=1∑Hw=1∑W∣ϕc,h,w(I′(t))−ϕc,h,w(Igt)∣(5)
ϕ \phi ϕ为vgg19体系结构的relu2_2层作为特征提取器。
2.4 Stage-wise Training and Fine Tuning
本文提出的方法中,存在三种可训练的体系结构:传输率网络,大气光网络和具有更新器机制的去雾网络。训练过程分为三个阶段:第一阶段,分别训练传输率网络和大气光网络;第二阶段,对去雾网络进行训练;第三阶段,将所有三个训练好的网络与多个目标函数一起进行微调。执行此微调以较低的学习速率进行,以在三个网络之间引入精细的依赖关系。
3. 读后感
文章有许多超参数,例如迭代次数和残差块块数等。作者不知道这些超参数如何设置,所以本文有许多消融实验。虽然复杂,但是方法还是对的。另外本文的迭代思想还是非常值得学习的。
4. 文章纠错(笔误)
黄标为错误之处。
1) 错误1
错误 | 改正 |
---|---|
X A ( t − 1 ) = { I , A , I ′ ( t − 1 ) , A ′ ( t − 1 ) } X_A(t - 1) = \{I, A, I^\prime(t - 1), A^\prime(t - 1)\} XA(t−1)={I,A,I′(t−1),A′(t−1)} | X A ( t − 1 ) = { I , A , I ′ ( t ) , A ′ ( t − 1 ) } X_A(t - 1) = \{I, A, I^\prime(t), A^\prime(t - 1)\} XA(t−1)={I,A,I′(t),A′(t−1)} |
X T ( t − 1 ) = { I , A , I ′ ( t − 1 ) , T ′ ( t − 1 ) } X_T(t - 1) = \{I, A, I^\prime(t - 1), T^\prime(t - 1)\} XT(t−1)={I,A,I′(t−1),T′(t−1)} | X T ( t − 1 ) = { I , T , I ′ ( t ) , T ′ ( t − 1 ) } X_T(t - 1) = \{I, T, I^\prime(t), T^\prime(t - 1)\} XT(t−1)={I,T,I′(t),T′(t−1)} |
2)错误2
错误 | 改正 |
---|---|
f L S T M f_{LSTM} fLSTM | f r e s f_{res} fres |