项目主页:https://aupendu.github.io/iterative-dehaze(代码暂未公布)
博客题目: 论文阅读:Transmission Map and Atmospheric Light Guided Iterative Updater Network for Single Image Dehazing (由于博客题目有100个字符的限制,而上述题目102个字符(不信你数数),所以题目只能去掉阅读二字)
本文提出了一种基于迭代更新的Iterative Prior Updated Dehazing Network (IPUDN)。该网络包含三个部分,一个是初始传输率网络,一个是初始大气光网络,还有一个是迭代去雾网络。三个网络分开训练,最后结合在一起微调。
该网络使用DCPDN中稠密链接的编码器-解码器结构(后期写这篇博客时补上(已补上,这篇博客))。该模型的使用SSIM作为损失函数而不是MSE。
大气光网络结构如图1:
图1 大气光网络结构该网络使用堆叠的卷积层,每个卷积层后都添加了group normalization和ReLU激活函数。大小为7 × 7,步幅为2的最大池化层用于减少空间尺寸。大的最大池化核能减少像物体颜色这样的局部因素的影响。该网络最后还是用全局最大池化层,该思想来自于DCP的想法。第五部分消融实验对比了全局最大池化层和全局均值池化层的结果。 该网络计算每个颜色通道对应的大气光,因为逐通道计算大气光能更好的处理雾图中的偏色问题。同时该网络使用MSE作为损失函数。
迭代去雾网络的结构如下图:
图2 迭代去雾网络结构关于该图的描述,文章有误。如图中黄色标记处所示,两个地方出错。正确应该如下: 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(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 ⊗为卷积操作。
本文算法如下:
当开始迭代时,传输率网络 Γ \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} ∪Λ,作者使用全局平均池来获得单个全局更新,而不是逐像素更新,因为根据经验发现前者是更好的(消融实验)。
在去雾网络体系结构中, 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次。作者做了不同迭代次数的消融实验,详细见原文。
总损失函数定义如下: 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层作为特征提取器。
本文提出的方法中,存在三种可训练的体系结构:传输率网络,大气光网络和具有更新器机制的去雾网络。训练过程分为三个阶段:第一阶段,分别训练传输率网络和大气光网络;第二阶段,对去雾网络进行训练;第三阶段,将所有三个训练好的网络与多个目标函数一起进行微调。执行此微调以较低的学习速率进行,以在三个网络之间引入精细的依赖关系。
文章有许多超参数,例如迭代次数和残差块块数等。作者不知道这些超参数如何设置,所以本文有许多消融实验。虽然复杂,但是方法还是对的。另外本文的迭代思想还是非常值得学习的。
黄标为错误之处。 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