光流估计——从传统方法到深度学习
共 6684字,需浏览 14分钟
·
2021-08-02 23:15
点击左上方蓝字关注我们
作者 | 肖泽东 Shon
链接 | https://zhuanlan.zhihu.com/p/74460341
1.摘要
近年来,深度学习技术,作为一把利剑,广泛地应用于计算机视觉等人工智能领域。如今时常见诸报端的“人工智能时代”,从技术角度看,是“深度学习时代”。光流估计是计算机视觉研究中的一个重要方向,然而,因为其不容易在应用中“显式”地呈现,而未被大众熟知。随着计算机视觉学界从图像理解转向视频理解,互联网用户从发布图片朋友圈转向发布短视频,人们对视频的研究和应用的关注不断增强。光流估计作为视频理解的隐形战士,等着我们去寻找其踪迹。本文首先介绍了什么是视频光流估计;再介绍光流估计的算法原理,包括最为经典的Lucas-Kanade算法和深度学习时代光流估计算法代表FlowNet/FlowNet2;最后,介绍了视频光流估计的若干应用。希望对光流估计的算法和应用有个较为全面的介绍。
2.介绍
光流,顾名思义,光的流动。比如人眼感受到的夜空中划过的流星。在计算机视觉中,定义图像中对象的移动,这个移动可以是相机移动或者物体移动引起的。具体是指,视频图像的一帧中的代表同一对象(物体)像素点移动到下一帧的移动量,使用二维向量表示。如图2-1。
根据是否选取图像稀疏点进行光流估计,可以将光流估计分为稀疏光流和稠密光流,如图2,左图选取了一些特征明显(梯度较大)的点进行光流估计和跟踪,右图为连续帧稠密光流示意图。
稠密光流描述图像每个像素向下一帧运动的光流,为了方便表示,使用不同的颜色和亮度表示光流的大小和方向,如图2-2右图的不同颜色。图2-3展示了一种光流和颜色的映射关系,使用颜色表示光流的方向,亮度表示光流的大小。
3.算法
最为常用的视觉算法库OpenCV中,提供光流估计算法接口,包括稀疏光流估计算法cv2.calcOpticalFlowPyrLK(),和稠密光流估计cv2.calcOpticalFlowFarneback()。其中稀疏光流估计算法为Lucas-Kanade算法,该算法为1981年由Lucas和Kanade两位科学家提出的,最为经典也较容易理解的算法,下文将以此为例介绍传统光流算法。对于最新的深度学习光流估计算法,FlowNet的作者于2015年首先使用CNN解决光流估计问题,取得了较好的结果,并且在CVPR2017上发表改进版本FlowNet2.0,成为当时State-of-the-art的方法。截止到现在,FlowNet和FlowNet2.0依然和深度学习光流估计算法中引用率最高的论文,分别引用790次和552次。因此,深度学习光流估计算法将以FlowNet/FlowNet2.0为例介绍。
3.1 传统算法 Lucas-Kanade
为了将光流估计进行建模,Lucas-Kanade做了两个重要的假设,分别是亮度不变假设和邻域光流相似假设。
3.1.1 亮度不变假设
亮度不变假设如图3-1-1,假设待估计光流的两帧图像的同一物体的亮度不变,这个假设通常是成立的,因为环境光照通常不会发生太大的变化。假设
将等式右边进行一阶泰勒展开得:
即有:
写成矩阵形式有:
其中,
给定两张图像,
3.1.2 邻域光流相似假设
邻域光流相似假设如图3-1-2,以像素点
上式即为
其中,要求
除了基于亮度不变假设和邻域光流相似假设,为了解决图像偏移较大的情况,Lucas-Kanade算法还借助了图像金字塔(Pyramid)的方式,在高层低分辨率图像上,大的偏移将变为小的偏移。最终,Lucas-Kanade方法给出了一种求解稀疏(明显特征的角点)光流的方法。
3.2 深度学习算法 FlowNet/FlowNet2.0
ICCV2015提出的FlowNet是最早使用深度学习CNN解决光流估计问题的方法,并且在CVPR2017,同一团队提出了改进版本FlowNet2.0。FlowNet2.0 是2015年以来光流估计邻域引用最高的论文。
3.2.1 FlowNet
作者尝试使用深度学习End-to-End的网络模型解决光流估计问题,如图3-2-1,该模型的输入为待估计光流的两张图像,输出即为图像每个像素点的光流。我们从Loss的设计,训练数据集和网络设计来分析FlowNet。
对于Loss的设计,如果给定每个像素groundtruth的光流,那么对于每个像素,loss可以定义为预测的光流(2维向量)和groundtruth之间的欧式距离,称这种误差为EPE(End-Point-Error),如图
对于训练数据集,由于稠密光流的groundtruth为图像每个像素的光流值,人工标注光流值几乎不可能。因此,作者设计了一种生成的方式,得到包括大量样本的训练数据集FlyingChairs。其生成方式为对图像做仿射变换生成对应的图像。为了模拟图像中存在多种运动,比如相机在移动,同时图像中的人或物体也在移动。作者将虚拟的椅子叠加到背景图像中,并且背景图和椅子使用不同的仿射变换得到对应的另一张图,如图3-2-3。
对于深度网络结构,该类网络通常包括降维的encoder模块和升维的decoder模块。作者设计了两种网络,FlowNetSimple和FlowNetCorr(Correlation)。这两种网络的Encoder模块不同,Decoder模块相同。
FlowNetSimple简单地将两张图排列到一起,即将两张
两种网络的Decoder是一致的(见图3-2-7),其通过反卷积进行升维,各层反卷积运算的输入包括三个部分,第一部分是上一层的反卷积输出deconv*(高层语义信息),第二部分来之Encoder相关层的FeatureMap conv*_1(低层局部信息),第三部分由前一层卷积的输出coarse的光流flow*上采样得到。从而融合了高层和低层的信息,也引入了coarse-to-fine(由粗到细)的机制。
基于上述网络和训练集,作者基于深度学习设计的FlowNet在实时估计光流算法中取得了state-of-the-art的结果,但是依然比非实时的传统方法效果要差。同时,作者对比了FlowNetS和FlowNetCoor,FlowNetCoor的效果更好,证实了人工加入的相关运算是有效的,也符合预期。
3.2.2 FlowNet2.0
FlowNet2.0是FlowNet团队发表在CVPR2017的改进方法,该方法达到了state-of-the-art效果(包括非实时的传统方法),并且计算速度很快,达到实时的要求。FlowNet2.0的改进主要体现在两个方面,一方面是通过堆叠多个FlowNet网络,实现Coarse-to-Fine的效果;另一方面是解决FlowNet小偏移(Small Displacement)估计不准确的问题。FlowNet2.0整体网络结构如图3-2-8,图上方依次堆叠了FlowNetCoor+FlowNetS+FlowNetS。值得注意的是,后续FlowNet的输入不仅仅是两张图片(图1和图2),还包括前一个网络输入的光流估计Flow,和一张Warped图,再加一张亮度误差(Brightness Error)。其中Warped图为将估计的光流作用在图2上,即为使用估计的每个像素偏移,偏移图2的每一个像素,使其与图1对齐。虽然作用了光流偏移,由于光流估计的不够准确,Warped图和图1依然存在一定的偏差,图1的亮度减去Warped图的亮度,即可得到亮度误差(BrightnessError)图。最后,将所有的五项输入堆叠成输入的Tensor,输入到后续的网络中。小偏移即光流偏移较小的情形,作者设计了适合小偏移的FlowNet-SD(Small-Displacement),其修改FlowNet中卷积核和stride的大小,使其更适合小偏移。具体的变化为,将FlowNet中7x7和5x5的卷积和改为3x3的卷积核(更小的卷积和意味着更加精细的处理,因此更加适合小偏移估计的问题),并且将stride=2改为stride=1。
作者给出的FlowNet2.0实验结果如图3-2-9,其中给出了5种版本的FlowNet2,FlowNet2、FN2-CSS-ft-sd/FN2-css-ft-sd、FN2-ss、FN2-s, c/C代表Coor网络,s/S代表Simple网络,小写(s,c)代表网络参数较少(缩小了卷积和数量)的版本。FlowNet2是指FlowNet2的完整网络(如图3-2-8),ft代表在真实数据集上进行了fine-tune,sd代表包含small-displacement模块。因此,实验结果表明FlowNet2达到了所有方法State-of-the-are结果(包括非实时的传统方法),计算效率要比最好的传统方法快两个数量级,达到了实时的要求。并且根据不同的应用需求,不同速度和精度的要求,有不同的版本供选择。
4. 应用
光流,从物理意义的角度看,描述了视频中物体、对象在时间维度上的关联性,从而建立了视频中连续图像之间的关联关系。因此,最为直接而自然的应用就是视频中物体的跟踪,在物体跟踪领域知名的TLD算法便借助了光流估计,图2中展示了在车辆上的特征点光流跟踪的效果。在视觉里程计和SLAM同步定位与建图领域,光流可以作为图像特征点匹配的一种方式,比如知名的视觉惯性里程计开源算法VINS-Mono。英伟达也提供了基于其GPU的光流SDK,其中展示了利用光流进行视频动作识别(video action recognition)和视频插帧的应用,如图4-1,4-2。
5. 总结
对于稀疏光流,本文提到的Lucas-Kanade是一种经典且有效的算法,对于稠密光流估计,传统方法需要在精度和速度上做出取舍,而最新基于深度学习的FlowNet2算法可以实时取得state-of-the-art的精度。
参考文献
[1] Ilg, Eddy, et al. "Flownet 2.0: Evolution of optical flow estimation with deep networks."Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.
[2] Dosovitskiy, Alexey, et al. "Flownet: Learning optical flow with convolutional networks."Proceedings of the IEEE international conference on computer vision. 2015.
[3] NVIDIA Optical Flow SDK developer.nvidia.com/op , Accessed at 2019/7/20
END
整理不易,点赞三连↓