去雨探索

1.常用方法汇总

1.1深度学习去雾去雨

深度学习去雨去雾11种方法梳理
ECCV北大开源去雨
图像除雨的轻量级金字塔网络机器学习
CVPR2017解读-Deep Joint Rain Detection and Removal from a Single Image
CVPR2017解读两种方法解决图片的去雨(De-rain)问题
图像去雨算法(基于卷积网络)
将图像上雨水去除的四种主流方法
视频图像中雨滴去除技术研究
基于稀疏表示和频域方向滤波的图像雨雪去除算法
ACM18人工智能去雨用于单图像去雨的非局部增强编码器解码器网络
深度学习在处理视频上几种主要技术方法
深度学习视频处理的详细方法
ECCV2018

1.2稀疏编码字典学习

将图像上雨水去除的四种主流方法

对应文章:(Luo Y, Xu Y, Ji H. Removing Rain from a Single Image via Discriminative Sparse Coding[C]// IEEE International Conference on Computer Vision. IEEE, 2016:3397-3405.)

一个非常稀疏的C和一个最小基的集合D。这里的C我们叫做稀疏编码(sparse coder),这里的D我们叫做数据字典。

一个矩阵,如果它有非常多个元素的值为"0",但是并不是全为零,而且这些零元素不是全部分布在一行上的,那么我们称这个矩阵是稀疏的。

最小基是能够组成所有内容的最小组成部分。举个例子,将一张图片随机切割为一些小图片,然后从这些小图片中选一些图片,仅仅使用这些图片的倍数,就可以拼成原来的那张大图,则称这些小图片为这张大图的最小基集合,即数据字典

通过观察测试的结果,我们可以认为这样的处理方法是非常有效的。但是它有一个缺点,就是当雨水和背景是非常相似的形状时,它是没办法分离开两者的(譬如带有雨水图案的墙壁和真实的雨水)(这有什么解决办法吗。。。)

1.3基于图像处理的去雨方法

链接同上
对应文章:Single Image Haze Removal Using Dark Channel Prior

首先,作者通过对图像的分析,发现了一个现象:在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值。换言之,该区域光强度的最小值是个很小的数。在这里,我们所说的颜色通道是指RGB三个颜色的通道。而且这个暗通道的数值应该是逼近于零的

为了验证作者提出的这个理论,作者在论文中统计了5000多张图像的特性,发现基本符合了这一特征,因此,可以认定这是一条定理。

可以发现,因为雾气的存在,暗通道值会变得非常的大,导致背景被遮挡住。

大段数学推导,见上述链接,以及上述文章

通过测试结果可以看到,本论文方法可以得到很好的效果,但是有一个缺点就是模型建立的太简单了,导致透射率太过粗糙。为了解决这个问题,该作者使用了导向滤波的方法求透射率,得到的结果非常好,而且速度非常快。

1.4基于卷积神经网络的深度去雨

见上述链接

1.4.1什么是卷积神经网络(CNN)

积神经网络是图像处理和视觉领域内非常热门的研究方向,因为CNN非常善于对图像的特征进行提取,是权值共享的,极大的减少了各层中的参数,从而能够很好的避免反向传播的时候出现梯度消失的现象。

一个典型的卷积网络
我们知道,每一层神经网络其实就是对一个输入的数据做了一个线性或者非线性的映射,类似于矩阵的乘法,每一个位置(神经元)都有一个权值,通过对输入的数据进行这样的映射后,就可以达到期望的效果。但是因为每一层都有非常多的神经元,同时神经网络可能有很多层,如果将一张2000*2000的图片传入这个神经网络,那么需要考虑的信息太多了,需要调整的参数也太多了,而且其中的一些参数对结果的影响是非常小的。所以为了解决这个问题,我们使用一个卷积核来对图像进行卷积操作。
左边数输入的数据,中间是一个卷积核,右边是卷积核对输入图片的左上角进行卷积得到的结果。
左边数输入的数据,中间是一个卷积核,右边是卷积核对输入图片的左上角进行卷积得到的结果。
其实卷积核就是一个小的正方形矩阵,其大小、移动步数以及各个点的取值都是自定义的。所谓卷积操作,就是将这个卷积核在输入数据上滑动,滑动的同时,做点积运算,得到的结果就是一次卷积的结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图即使对输入数据的第一行进行卷积元算得到的结果。
其实可以把卷积核当作一个刷子,它对图片进行了一次模糊处理,去除了个别部位不重要的极端数据,而是模糊过滤出了小范围内的整体特征。随着网络结构进一步加深,卷积核矩阵提取的特征会越来越复杂,这时候特征结果人类往往理解不了,但是这是机器自己学习的,对结果影响最大的特征。
当对图片进行五层的卷积后,得到的特征结果
上图可以看到,当进行到第五层卷积的时候,机器对图片中边缘上的无用信息都忽略掉了,仅仅留下了图中最独特的部分。
那么如何使用卷积神经网络来进行去雨的操作呢?
我们知道,对于一个深度学习来说,最主要的是三个步骤:
模型:所谓模型的建立,就是如何对输入数据进行函数映射,得到需要的结果。在这里,一个卷积神经网络即是一个模型。
损失函数:对于损失函数我们该如何确定呢,要知道其实损失函数就是一个强迫神经网络向着预期的结果方向进行学习的约束,现在我们手上有一张相同物体的无雨图和有雨图,我们希望这张有雨的图通过神经网络处理后输出的结果无限的逼近无雨的图,即:
优化:反向传播后更新权值:
在这里插入图片描述 反向传播是一个链式法则的使用,现在热门的深度学习语言tensorFlow和pytorch都已经把反向传播权值更新这一优化步骤封装成一个函数了,可以无脑直接使用,但是具体的推导步骤和反向传播在神经网络中的具体计算方法,请移步:点击这里。(并没有链接)
现在利用卷积神经网络进行去雨的操作就变成了这样:
不断的重复上述2,3步骤,直到权值变化为0或者小于一个阀值。
在这篇论文中,作者使用这种方法进行了实验:
Fu X, Huang J, Ding X, et al. Clearing the Skies: A deep network architecture for single-image rain streaks removal[J]. IEEE Transactions on Image Processing, 2016, PP(99):1-1.
在这里插入图片描述
作者发现,仅仅经过CNN并不能得到非常理想的结果,缩进后发现雨水的细纹仍然没有去掉。原因是作者的神经网络不够复杂,造成了函数欠拟合(under -fitting)的情况。
自然而然的,我们会考虑建立一个更加复杂的模型来增加神经网络的适用性。一般来说有两种方法:1.通过增加隐含层(hidden layers)来增加神经网络的深度,一般情况下,增加深度可以使网络获取更加深层次的特征,但是去雨是一个低等级的图像处理任务,不需要获取深度的图形特征,所以没有必要增加隐含层,而且增加隐含层容易导致梯度归零,从而导致结果坏掉,所以这里文章没有采取这样的方法。
可以看到,在增加深度后,结果反而变差了
可以看到,在增加深度后,结果反而变差了
另一种方法是不增加隐含层,而是在每一层中增加神经元的数量。然而这么做需要更多的训练集进行训练、更加耗时,并且很容易造成over-fitting的情况。
为了解决这个问题,文章采取了使用"detail image"来进行训练的方式。
通过一个low-pass filter(来自论文:K. He, J. Sun, and X. Tang, “Guided image filtering,” IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 35, no. 6, pp. 1397– 1409, 2013.),我们可以得到一个base图像,这个base图像有一个特征:无雨图和有雨图在经过low-pass filter后产生的base image是相似的。
因为base图是相似的,所以我们可以仅仅训练detial图,然后将训练后的detail图加上 base图即可得到较好的结果。(公式详见上述链接)
原因是当原图中去除base图的部分后,发现剩下的detial图是是非常稀疏的。
稀疏的训练集可以让卷积神经网络更容易、更快的收敛。所以我们使用这样的方法是有效且合理的。
接着训练神经网络,结构如下:
在这里插入图片描述
其中,有两层卷积神经网络,还有一层全连接网络。
我们需要卷积神经网络来进行feature extracting, 通过全连接网络来进行Reconstruction. 这些结构和一般的CNN相似。
在多次训练后得到输出,接着我们可以直接将输出与base图相加。
从而得到去雨后的效果图。
在这里插入图片描述
在对在结果的分析中发现,该图很好的去掉了雨的线条,但是针对雨雾的处理并不是很理想,为了解决这个问题,该作者使用了一些增强对比度的算法,当然也可以在建模的过程中考虑到雨雾的影响

猜你喜欢

转载自blog.csdn.net/h_l_dou/article/details/82752474