Single Image Dehazing via Multi-scale Convolutional Neural Networks

本文是一篇利用多尺度卷积神经网络(Multi-scale CNN)进行图像去雾的paper Single Image\ Dehazing via Multi-scale Convolutional Neural Networks的笔记

介绍

图像去雾是指将含有雾/霾的图像进行处理,使被雾气影响的像素可以被还原成真实的像素.一开始的去雾方法就是利用经典的图像清晰算法去优化;后来的算法都是利用雾霾的散射模型基于物理过程进行图像还原.
雾气影响图像质量的程度可以用下面的公式总结:

$I(x)=J(x)t(x)+A(1-t(x))$

其中$I(x)$是观察者接受的有雾图像在$x$处的亮度,$J(x)$是无雾天气下观察者应该接收到的图像,$t(x)=exp(-d(x)$是反应雾气对光线投射能力的投射系数,$d(x)$,$A$是大气光的颜色.
可以发现:等式右边的量都不知道.目前的主流方法都是利用上面的方程通过各种自然的/人为定义的先验(prior)来寻找$J(x),A,t(x)$之间的相互关系进而进行方程的求解.当然核心在于$t(X)$的求解

今天的文章的特别之处在于利用神经网络(MsCNN)进行$t(x)$的求解


核心

用CNN的原因

  • 和通过图片的统计特征和人工定义的特征相比,CNN提取的特征是数据驱动的,不需要纠结于特征的构造
  • CNN处理去雾速度很快

MsCNN的结构

网络见下:

  • 整体结构
    这个网络(右侧)分为两个网络,文章原话是Coarse-scale Network和和Fine-scale,用来训练$t(x)$
  • 网络功能
    如图右,粗糙网络的作用是用三层含有较大卷积核的卷基层来提取特征并生成透射图,生成的透射图后面还要加入进细网络中作为其中一个卷积层的输入;细网络的功能是在粗网络的基础上采用更小的卷积核来细化透射图,最后可以得到细节信息很丰富的最接近原始透射分布的透射图
  • 训练方法
    见图左,文章使用的数据集包原始的清晰图片和相应的景深图($d(x)),先用$d(x)$算出$t(x)$,然后用得到的透射图和基于此人工生成的带有雾气的图像进行MsCNN的模型训练;训练好之后就可以进行图像去雾,相当于之前步骤的反向操作了.

损失函数
这里的损失函数就是简单的真实图像和输出图像的MSE

接下来的工作

  • 文章分别解释了所用网络各个层的重要性和不可缺失性,并辅以MSE的图像来阐明
  • 比较了一下和以往传统算法的结果和提取的透射特征的差别
  • 文章的最后告诉我们这种网络无法解决夜晚图像的去雾问题


总结

这篇文章的思路就是利用两个结构相似的CNN进行特征提取来生成透射图,和传统CNN的区别在于用不同大小的卷积核来进行不同程度的特征提取(粗/细),并且用粗略的结果来辅助主网络进行细致特征的提取,好处在于:

  • 网络结构不复杂,而且层数不多,拆成了两个网络之后训练的成本变低了
  • 效果貌似不错,而且较传统的特征提取差距不大,甚至优于传统结果
  • 训练好的网络进行去雾处理速度飞快
  • 数据集是关于景深的数据集,由此生成的透射图可靠性很高而不是靠人工生成的$t(x)$来训练,这点很好

在我看来相应的缺点:

  • 这种网络结构太简单,即使两个网络加起来感觉也没什么亮点.对于这种粗细结构,也许更深程度的耦合效果会更好?
  • 文章里面给了原始网络的MSE-epoch的曲线,看起来网络训练程度不是很大,而且看起来MSE的稳定值也很大(我估计是0.1或者0.05左右,感觉不够小)
  • 文章的网络的结构可优化的地方还很多,结合最新的关于神经网络训练tricks的papers,MaxPooling和UpSample Layer感觉都可以改掉成更优化的结构

虽然作者讨论了将网络变深并没有让效果更好,但是考虑到这个网络可以优化的地方有很多,也许调整一下结构之后就可以变深了,后面可以尝试一下.