其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。
原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不能用于商业目的。
导言
光流预测一直都是计算机视觉中的经典问题,同时又是解决很多其他问题的基础而备受关注,例如,运动估计、运动分割和行为识别。随着深度神经网络技术在计算机视觉领域中引发的技术变革,基于深度神经网络的光流预测算法应运而生。本文中,SIGAI将以FlowNet到FlowNet2.0的演变,来和大家一起领略基于CNN(卷积神经网络)的光流算法的诞生与发展。
光流(optical flow)是指平面上,光照模式的变化情况。在计算机视觉领域,是指视频图像中各点像素随时间的运动情况。光流具有丰富的运动信息,因而在运动估计、自动驾驶和行为识别方面都有广泛应用。光流预测通常是从一对时间相关的图像对中,估计出第一张图像中各个像素点在相邻图像中的位置。
光流问题长久以来,主要被基于变分能量模型的优化算法和基于块匹配的启发式算法统治着。随着深度神经网络技术在计算机视觉领域取得的成功,科学家们开始尝试利用深度学习技术的优势去解决光流问题。
FlowNet:新技术的诞生
随着CNN在图像分割、深度预测和边缘预测方面的成功,研究人员思考,同样是每个像素点都要给出预测结果的光流预测问题能否也利用CNN进行预测呢?
FlowNet[1]是第一个尝试利用CNN去直接预测光流的工作,它将光流预测问题建模为一个有监督的深度学习问题。模型框架如下:
图1源自[1]
如图1输入端为待求光流的图像对I_1,I_2,输出端为预测的光流W。
W=CNN(θ,I_1,I_2)
其中 W,I_1,I_2均为x,y的函数,x,y为图像中像素的位置坐标。θ为CNN中待学习的参数。通过调节θ,来使网络具有光流预测的能力。
那么问题来了,什么样的网络结构具有光流预测能力呢?
FlowNet[1]中提出了两种可行的网络结构.
网络整体上为编码模块接解码模块结构,编码模块均为9层卷积加ReLU激活函数层,解码模块均为4层反卷积加ReLU激活函数层,在文中解码模块又被称为细化模块。整个网络结构类似于FCN(全卷机网络),由卷积和反卷积层构成,没有全连接层,因此理论上对输入图像的大小没有要求。
根据输入方式的不同,FlowNet又分为FlowNetSimple和FlowNetCorr。
编码模块(如图2):
图2源自[1]
FlowNetS(FlowNetSimple) 直接将两张图像按通道维重叠后输入。
FlowNetC (FlowNetCorr)为了提升网络的匹配性能,人为模仿标准的匹配过程,设计出“互相关层”,即先提取特征,再计算特征的相关性。相关性的计算实际上可以看做是两张图像的特征在空间维做卷积运算。
解码模块(如图3):
图3源自[1]
在解码细化的过程中,对每层的反卷积ReLU层,不仅输入前一层的输出,同时还输入前一层预测的低尺度的光流和对应编码模块中的特征层。这样使得每一层反卷积层在细化时,不仅可以获得深层的抽象信息,同时还可以获得浅层的具象信息,以弥补因特征空间尺度的缩小而损失的信息。
现在另一个问题来了,是否有足够的数据去训练网络呢?
为了训练网络,我们需要大量的具有光流真值的数据。而目前已知的具有光流真值的数据库规模都太小,即使利用数据增加的技术也相差甚远。另外,要获得真实世界中,自然图片的准确光流往往更是难以获得。
[1]中为解决这个问题,研究员们以牺牲图片真实性为代价,转而人为去合成大量的虚拟图像对。通过将一些3D椅子模型[3]随机的覆盖在一些从Flickr上检索的图片上合成图像ÿ