Single Image Dehazing Using Ranking Convolutional Neural Network

370 阅读5分钟

IEEE Transactions on Multimedia 2018

Yafei Song, Jia Li, Xiaogang Wang and Xiaowu Chen

简介

文章对于去雾任务,提出了Ranking-CNN,其中包含一个Ranking卷积层,即对输入到Ranking层中的特征图按每个点的像素值进行从左上到右下的重新排列(通道之间不混合)。添加Ranking层的目的在于同时获得有雾图像的统计和结构信息。在此之外,文章还运用了随机森林参与了网络的估计任务,它通过神经网络提取的特征来估计传输图。随机森林可以衡量特征的重要性并避免过拟合。

Motivation

文章分析现有的去雾方法的机制发现,统计属性(如DCP)和结构属性(如边界)会影响传输图估计的表现。在往常的CNN中,网络具有强大的学习结构属性的功能,而缺乏学习统计属性的功能。文章认为可以引入Ranking层来使网络学习统计属性的能力。

而随机森林仅仅是文章认为普通网络不容易估计传输图,因此提出使用随机森林来代替网络的最后一层来估计传输图。在下面详细说明。

Model

上图为整体流程。左下方的Hazy image作为输入,输入到Ranking-CNN中,经过网络提取特征后,输入到随机森林中,得到估算结果,并使用引导滤波优化得到最终的Refined tranmission。另外Hazy image使用DCP估算了大气光值。最终结合传输图和大气光值,使用大气散射模型进行了去雾操作,得到了最终的无雾图。该文章的重点在于Ranking-CNN。

Ranking-CNN

如图所示,将Clear images切块后(成为Clear patches),添加全局统一的传输值的雾后(成为Hazy patches),放入Ranking-CNN中,最终得到Output layer,是Hazy patches对应的传输图(全局统一值,即为单个值)。其中32 maps指通道数量,16\times 16指特征图大小,C、P、R、F分别指卷积层,最大池化层,ranking层,全连接层。其中值得说明的是Output layer是一个onehot编码的十分类结果。对于这个十分类结果,其在分类结果中详细描述。

ranking层

从图(a)到图(c)的过程即为Ranking。可以看到其操作过程十分清晰,将特征图的某一层拿出,按照该层的所有值从小到大,从左上角排序到右下角。重新组合以后的层即为Ranking层的输出。 值得注意的是,Ranking层是没有参数的。 对于Ranking层的解释,如上图所示:为了计算对比度,图(b)需要两个卷积核才可以计算得到,而图(d)仅仅需要一个卷积核。

分类结果

前文提到CNN的输出为一个十分类的结果。文章认为,对于传输图的估计,其值处于[0,1]的范围内,而对于这样的值的估计,不容易训练。文章希望将其转化为一个10分类的问题,将估计的传输图的值固定在(i/10-0.1,i/10]的区间内。对于每个输入的有雾图像块B,输出是Y_B,而标签向量为N_B=(n^1_B,n^2_B,...,n^10_B)^T,其中n^i_B \in \{0,1\}可以被计算为:

n^i_B=\begin{cases}
1, & if\quad t_B \in(i/10-0.1,i/10] \\
0, & otherwise
\end{cases}
\tag{1}

即为上文提到的,十分类的onehot编码结果。其使用交叉熵损失来训练。

随机森林

容易看出,即使是得到了准确的10分类结果,也只能估算得到当前图像块的传输图值范围,范围大小为0.1。这个结果是不能够准确去雾的。因此,文章舍弃了Ranking-CNN的最后一层,将其倒数第二层的特征值输入到随机森林中,来估计传输图的值。文章的随机森林模型具有200颗树,每棵树随机选择1/3的特征,仅选择1/100的数据参与训练 随机森林是一种机器学习的算法,它综合了多颗决策树的决策结果来计算最后的值。具体算法请另外自行查询。

tricks

  • 虽然在训练中认为图像块中的传输图是局部一致的,但是在测试中,文章为每个像素点在其周围取20*20的块后,以此图像块估算当前像素点的传输值。
  • 为了防止传输图值过小而导致的分母过小而限定了t(x)的最小值0.05,如下:
J(x)=\frac{I(x)-A(x)}{\max(t(x),0.05)}+A(x) \tag{2}
  • 由于去雾后,图像的普遍亮度都不高,于是文章给出了以下公式:
J^*(x)=\lambda J(x) \tag{3}
\lambda=log\left( \frac{\sum_xI^l(x)}{\sum_xJ^l(x)}\right)+1 \tag{4}

即去雾结果乘以\lambda为增强后的去雾结果。

数据和训练

数据集

  • 训练集取自网络中400张无雾图像,将其裁剪为10W张20\times 20的图像块,其中随机取t\in (0,1](图像块内恒定),大气光A=[1,1,1]

  • 测试集1为Dataset-Syn,其中t(x)=0.8\times d(x),d(x)为场景深度。

  • 测试集2为Dataset-Cap,文章使用显示器显示Dataset-Syn的清晰图像,并使用相机拍摄。然后使用造雾机造雾后再度拍摄。

训练设置

  • 随机梯度下降发
  • 初始学习率为0.01
  • 动量为0.9
  • mini-batch为64
  • 学习率下降公式为r_l=r_{l_0}\times(1+0.0001\times iter)^{-0.75}
  • 一共训练100个epoch
  • 倒数第二层全连接层的输出为64维

对比和测试

测试指标

  • l_1

Dataset-Syn指标对比

Dataset-Syn结果展示

Dataset-Cap指标对比

Dataset-Cap结果展示

Ranking层分析

其中\mathcal{F}_T\mathcal{F}_C\mathcal{F}_R\mathcal{F}_{T+R}分别表示倒数第二层全连接层为325维的普通CNN、倒数第二层全连接层为64维的普通CNN、倒数第二层全连接层为64维的Ranking-CNN,倒数第二层全连接层为325维的Ranking-CNN。可以看到\mathcal{F}_{T+R}有最佳表现,而\mathcal{F}_R略差于\mathcal{F}_{T+R},而提高了运算量,因此文章选择\mathcal{F}_R
经典CNN的浅层提取诸如边界和对比度之类的低层特征,而深层提取诸如图案和对象之类的高层特征。而边界和对比度这类信息是去雾任务的关键信息,故在偏前的位置能达到更好的效果。实验选择了最佳位置即第一层pooling层后。