摘要:作者基于残差ResNet能通过改变映射范围加强深度学习、把输入分为高频细节层和基础层、通过输入的直接映射到输出加强图像特征等操作构建网络。能很好地区分边缘和雨纹。
paper、数据集、代码下载地址:https://xueyangfu.github.io/projects/cvpr2017.html
说明:本博客基于对个人对该论文及其源码的详细解读,有不当指出欢迎指正,希望能对自己和大家的学习有所帮助。
符号概念(denote):
:假定输入X和输出Y分别被归一化到[0,1]且分别有D个像素范围,就可记为此符号。
1. Introduction(导言)
需求:雨天条纹会对视觉系统、监控系统产生较大影响。
问题:当有结构和方向都和雨纹相似的地方时,传统的end-to-end等方法不能很好地去除雨层并保留背景层纹理结构
1.1 Related work(相关工作)
(1)基于视频的方法,能更好的检测并去除雨纹,因为有更多的帧间信息。但缺点是需要依赖当前的时间的视频
(2)单图片的去雨中, in [ 20 ] 核的回归和非局部平均滤波被用于检测并去除雨纹
(3)In [ 6 ],作者提出了一种广义模型,该模型假定加的雨具有较低的秩。
(4)In [ 25 ],作者用判别稀疏编码、字典学习去雨
(5)In [ 24 ] ,在高斯混合模型中,用基于块的先验(patch-based priors)去计算雨纹的多个方向和尺度
1.2 Our contributions
当一个物体的结构和方向都和雨纹相似的时候,很难去除雨纹的同时保留下物体的特征。提出了一种“深度细节网络(deep detail network)”来去除自然高频雨纹。
1、使用深度残差网络(ResNet),因为发现残差网络可以减少输入到输出的映射距离,从而使得我们训练更深层的网络更加简单。
2、残差网络作为参数层,可以获得更深的图片特征。与直接应用残差网络到图片上不同,这里采用了一种先验(priori)知识并用图片的detail layer作为(残差网络的)输入。这样就消除了背景干扰,因为detail layer(细节层)大多数值都接近于0,这种稀疏性改善了去雨效果。然后基于这个发现,我们讨论得出一个合适的网络可以避免梯度消失,更深的网络反而改善了去雨的结果。这打破了更深层次的网络不适用于低层次图像任务的假定。
3、为学习这个网络,合成了14000张雨/干净图片数据集。(无法获得那么多真实世界的图像)
2、 A Deep Detail Network
初步提出的模型如上图Figure 2。雨图作为输入X,干净图作为输出Y。直观地可以理解为中间步骤为函数h(x),则通过以下公式可以算得误差。F是范数的意思。
然后发现直接在原雨图上训练的结果并不令人满意。
图片3(b)是由(a)合成的一个雨图,但是可以看到去雨后的(c)有明显的颜色变化。所以这种方法不适用。简要解释这种现象,我们假定X和Y被归一化到[0,1]且有D个像素,记为。学习的过程就是优化从输入的到输出的的过程。训练一个深度神经网络(注意,关键在“深度”这两个字,因为网络层越深,反向传播的时候可能会出现梯度消失),即使用了batch normalization(批处理正则化(归一化))等正则化操作,也无法避免地可能遇到梯度消失等问题。所以接下里提出Neg-mapping的方法来解决深的问题。
2.1.1 Negative residual mapping
引入残差网络,观察4(e)(g)发现残差Y-X有显著的像素值范围减小,这说明残差可以被引入神经网络来帮助建立输入到输出的映射过程(这里不太懂为什么像素值减少了就有助于训练了,但是意思是我们可以通过加一个从输入到输出的类似于残差的映射,使得输出的结果更好,可以看到figure 3(e)即neg-mapping的结果比单纯残差网络3(b)要好,它没有模糊掉鸟的羽毛)。因为雨的颜色是白色的(C白色为255,黑色为0),所以干净图-雨图(Y-X)的值通常是负的,所以叫做 “negative residual mapping” (简称neg-mapping)。修改后的公式如下:
(h(X)是引入Neg-mapping后神经网络计算出的结果,而(Y-X)是引入Neg-mapping后理想的结果,两个相减就得到上式)
(这个网络图是整篇博客的核心)
Neg-mapping(负映射):通过skip connection把输入直接加到输出,跳过中间的参数层。使传播更深,特征更多。无损传播。通过实验证明训练和验证的时候错误更少(参照figure 10)
2.1.2 Deep detail network
通过结合Neg-mapping和ResNet残差网络,可以使得更好地传播输入图像,并且更深的网络有助于模型的建立。可以较好地区分雨纹和图片细节,但是即使结合了这两个,发现还是有雨纹残留,见图3(f)。于是我们提出了以下模型。
Xbase 可以通过低通滤波(见参考文献,11,32,37)得到。在Xdetail中则是雨纹和纹理相似的图像细节。以X detail作为网络的输入。(这里的网络指的是残差网络)
细节层比原图更具有稀疏性,(可以看到下图细节层大部分区域都是黑色的,也就是0,所以更稀疏)而目前已经有人把稀疏性在去雨上了,但是没有用在深层网络框架中。
(可以看到直方图中X detail的像素更趋近于0。)
但是,从Y-X和X detail来看,前者是干净图减去雨图,应该得到的是雨纹;后者是细节层,应该包括雨纹和图片的细节,所以本例中的有效映射是从和
中的较小子集,即Y-X(这里是个人的一点理解,大家可以仔细看看论文,如果有不同见解,请指出)。这表明解的空间被缩小了,网络的性能有待提高。
这推动了我们把X detail的和Y-X结合作为ResNet的输入,建立起我们最终的Final模型(之前是把X detail直接作为Neg-mapping接到输出,但是有效映射应该是X-Y或者X detail中的较小子集,所以这样不行应该把X直接映射到输出,但是之前我们又证明了X detail作为ResNet的网络输入效果比较好,所以作者加了一个Decomposition,分解出X detail ,建立起Figure 5 中的最后一个Final网络)
当期望图像与观测图像之间的波形发生高频变化时,训练一个网络将高频输入细节映射到高频输出差异,大大简化了深度学习问题。
2.2 Objective function and network architecture(目标函数和网络架构)
根据之前所得到的结论,提出以下损失函数模型。
N代表样本的个数,f()代表残差网络。
X detail可先通过 guided filtering(参照论文【11】)低通滤波分理出X base和X detail。
一个基本网络块的操作可表示为(代码中用了12个循环生成12个这样的网络块)
X的上标代表层数。总共L层。σ()代表激活函数(RELU),BN代表BatchNormalization,可以减少协变量变化(internal covariate shift),W是权重,b是偏置。
第一层卷积大小:c * s1 *s1 *a1 c是图片通道数,如彩色图像是3;s1是卷积核尺寸,a1是卷积核的个数,也就是生成feature maps的大小
第二层卷积大小:a1*s2* s2 *a2 a1是上一层的通道数,即深度。a2是生成下一层的深度
最后一层是 :a2*s3* s3 *c 最后一层生成的是图片所以深度变为c
以一个卷积操作为例解释一下尺寸的大小是怎么来的
图中由INPUT到C1的卷积操作大小是 1*5*5*6 的卷积大小,因为INPUT是灰度图片,所以通道为1,而feature maps的深度为6,5*5是这里的卷积核大小(输出是28*28是由卷积核尺寸和步长等因素决定)
2.3 Training (训练)
优化方法:随机梯度下降(SGD)
数据集:有14000对干净/雨图。并且由14000张生成了三百万张64*64的干净/雨图小图;剩下的4900张留作评估模型
3. Experiments(实验)
和其他当下最好的方法作对比,用的Caffe框架训练,花了14个小时左右
3.1 Parameter settings(参数设定)
网络深度L = 26
衰减率weight decay =10的-10次方
冲量 momentum = 0.9
mini-batch size = 20
learning rate = 0.1 (迭代100k和200k次的时候除以10)
卷积核s 1 = s 2 = s 3 = 3; filter numbers a 1 = a 2 = 16 ; c =3 (参照2.2)
低通滤波器guided filter的半径是 15 (关于导向滤波(guided filter):https://blog.csdn.net/kuweicai/article/details/78385871)