第一次写文献综述,没有经验,感谢许多老师的指导。写作之前看了许多文献和博客,关于光流的公式推导有很多但是讲的都不怎么具体,对于想按照公式手撸代码的同志,阅读这些公式有些吃力,在本文中,我对这些公式做了一些变换,从纯数学和符合直觉和编程习惯的方式来介绍光流算法,方便大家理解。对于文中任何部分的疑问,可以直接在评论提问。
国外在光流技术方面还有很多领先技术比如基于能量和相位的光流场计算方法,但是我才疏学浅实在看不明白,希望有了解的大牛点拨一下我,谢谢。
1 光流的发展趋势
2 光流的过去与现在
2.1 光流的概念、基本原理和基本假设
2.2 几种主流光流算法
2.2.1 Horn-Schunck光流法[3]
2.2.2 Lucas-Kanade光流法[4]
2.2.3 块匹配算法[5]
2.3 光流法的应用
2.3.1 目标跟踪
2.3.2 光流定位
2.4 当前技术挑战与一些解决方案
2.4.1 算法复杂度
2.4.2 鲁棒性
2.4.3 孔径问题
2.5 发展方向
2.5.1 更多特征
2.5.2 更多维度
2.5.3 更快速度
2.5.4 更具鲁棒性
3 光流技术的未来
4 参考文献
摘要:光流法是计算机视觉领域中提取视频或连续图像中光流场的算法。光流场用来表征图像灰度模式的表面运动。在理想情况下,光流场与图像中的二维运动场吻合,光流法利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息,因此可用于对物体运动的情况进行估测与分析。因此,光流法在模式识别和计算机视觉领域非常有用,可用于运动检测,目标追踪,视觉定位等方向。
关键词:光流;计算机视觉;目标追踪;视觉定位。
Abstarct: Optical flow is an algorithm for extracting optical flow field from video or continuous images in the field of computer vision. Optical flow field is used to characterize the surface motion of gray pattern image . Ideally, the optical flow field coincides with the two-dimensional motion field in the image. Optical flow method uses the change of pixels in the image sequence in time domain and the correlation between adjacent frames to find the corresponding relationship between the previous frame and the current frame, thus calculating the motion information of objects between adjacent frames, so it can be used to estimate and analyze the motion of objects. Therefore, optical flow method is useful in the field of pattern recognition and computer vision. It can be used in motion detection, target tracking, visual positioning and other directions.
Key words: optical flow; computer vision; target tracking; visual positioning.
计算机视觉领域的起源可追溯到很早的时候,但是直到20世纪70年代后期,当计算机的性能提高到足以处理诸如图像这样的大规模数据时,计算机视觉才得到了正式的关注和发展[1]。
光流法是计算机视觉领域中一种用于提取视频或连续图像中光流场的算法,随着计算机制造技术的不断发展,计算机算力逐年提升。一些原来复杂度较大的图像处理算法开始向着实时性迈进,光流法作为一种可以在一定情况下使用光流场近似运动场的算法,可以应用于运动目标跟踪等领域。因此关注和研究光流法的学者不断增多。通过中国知网的关注度分析工具。可以看到研究人员对光流法的关注度逐年上升(图表1.1)。
图表 1.1 中国知网(CNKI)统计的1954-2018年“光流”方向下学术关注度的结果
通过对光流相关文献的阅读、比较和分类,截至2018年12月31日,笔者检索到的关于光流算法的文章,主要是以Horn-Schunck光流算法,Lucas-Kanade光流算法以及块匹配算法为基础的研究与改进。此外也有部分尝试使用基于能量的方法或基于相位的方法笔者希望通过这篇文献综述,尽可能地详细叙述以下几点:
(1)光流的概念、基本原理和基本假设;
(2)几种主流光流算法;
(3)光流法的应用
(4)当前技术挑战与一些解决方案
(5)发展方向
光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的“运动”[2],简单的说光流法的目的是找到灰度图中各像素在连续图像中的移动速度。
光流法的实现要求满足几个基本假设:
(1)相邻帧之间的亮度恒定;
(2)相邻视频帧的取帧时间连续,或者,相邻帧之间物体的运动比较“微小”;
(3)保持空间一致性;即,同一子图像的像素点具有相同的运动。
假设(1)是建立光流约束方程的条件,这一假设的描述非常直观,一个物体在运动时,物体的亮度和纹理应该保持基本不变。
假设(2)是为了保证灰度值关于直角坐标与时间的函数连续可微,这个要求是接下来光流约束公式得以推导的必要条件。
假设(3)也是一个符合直觉的条件,正常情况下,目标物体在图片中运动时,用于表示目标物体的像素区域必然一起运动,因此同属于某个物体的像素的帧间速度矢量大小和方向应该一致,这个假设使得光流约束方程可以得到多个约束式,从而使运动矢量的求解转化为一个超定方程的求解。
图 1 视频可以看做三维数组
光流法将一段视频或连续图像的每一时刻每一个像素灰度值构成的集合看做一个三维矩阵(图 1)。通过离散函数完成任意像素位置与时刻到对应灰度值的映射,例如:表示第y行第x列的像素在时刻的灰度值。
根据假设(1),一个像素在经过时间后,灰度值并不发生变化,即:
其中为灰度值对x的偏导,为灰度值对y的偏导,为灰度值对t的偏导,为像素点在X方向的瞬时速度,为像素点在Y方向的瞬时速度。
由式(2-1)、(2-2)可得:
式(2-3)就是光流约束方程,为当前位置的光流矢量,整张二维图像上所有像素的光流矢量的集合就是光流场。
在一般情况下,光流场和运动场的运动趋势是类似的,所以我们可以利用光流场来实现对运动物体进行分析。当然,也存在一些特例,比如光源固定情况的均匀球体,在该球体旋转时光流场不会有变化[3],因此,若要通过光流场来推测图像中的运动场,必须确保运动物体的运动趋势可以通过其对应灰度值的变化反映出来。
光流法按照不同的实现方式可以分为:基于梯度的方法、基于匹配的方法、基于能量的方法、基于相位的方法等,其中基于梯度的方法和基于匹配的方法由于计算量能满足一般的实时处理而被广泛使用。
Horn-Schunck算法属于基于梯度的光流算法。主题思想是全局平滑假设,即运动物体内部的光流场是相同的,因此物体内部光流场的梯度应该为零,也就是说物体内部的光流场应当是平滑的,故得到一个约束方程:
根据式(2-4),我们可以用来衡量一个像素点周围光流场的平滑度了。Horn-Schunck算法用来表示光流场的不平滑度(数值越大,说明越不平滑)
到目前为止,使用的还是基于连续函数的分析方法,但是在数字图像中,必须离散化才能使用。因此为了方便处理,令:
其中sum(M)表示M矩阵的元素和,A·B表示A矩阵与B矩阵的点积。
由于图像不可避免的存在噪声,根据式(2-3)引入:
来表示图像灰度的变化率。
要找到最接近真实的光流场分布的结果,Horn-Schunck算法设计了一个总误差参数:
式中为权重参数,用来调节图像灰度的变化率和光流场平滑度在指引光流场正确梯度下降时所占比重。当取得最小值时,认为计算得到的光流场是最优的。由式(2-5)、(2-6)、(2-7)可得到光流场的迭代公式:
Lucas-Kanade算法也是用了类似Horn-Schunck算法的光流场平滑假设,Lucas-Kanade算法认为一个像素周围的相邻像素的光流场应该和中心的像素光流场一致。因此根据式(2-3)可以得到一系列等式:
光流场的总误差可表示为:
用最小二乘法求解式(2-10)得:
其中
当不可逆时无法求解式(2-11)
否则可得该点的光流矢量为:
块匹配算法的思路是把某一帧某一个像素为中心的图块在下一帧中找到最匹配的图块,两帧中的图块中心点的位移就是这一点的光流位移(图 2)。块匹配算法可以根据实际要求和设备算力灵活配置成稠密光流或稀疏光流。不足在于这种方法的鲁棒性较差,对于图片发生的畸变和镜头旋转难以处理。
图 2 块匹配示意图
光流法的应用主要有两类,一类利用光流场中局部光流的变化在静态背景中识别、跟踪运动物体;另一类利用光流场的整体变化来推测视频拍摄设备的移动信息,主要运用在视觉定位中。
由于光流场和运动场在多数场合是类似的,因此可以通过对光流场的分析在估测图像中物体的运动状态。
在安防领域,运用光流法可以判断监控区域内是否有运动行人,控制监控的工作模式和存储模式,以达到降低功耗和节约存储的作用。
在人脸表情识别中。可以运用光流法检测面部肌肉的微小变化用于分析人脸微表情。
在一些图像处理的算法中,算法关于视屏尺寸的复杂度较大,但在图像中有些部分并不包含所需要的信息,需要通过设置ROI(感兴趣区域,region of interest,下同)来减少计算时间,这时就可以用光流法在视频中找到运动区域进行进一步处理。
图3.1是OpenCV中 Farneback光流的效果,可以看到移动的螺丝刀是图片中唯一检测到到的目标,颜色在色度环上位置显示了物体运动的方向。
图3.2是笔者曾经设计的一个检测血管血液流速的demo,高亮区域为流速明显的区域,其核心算法也使用了光流。
图 3.1 检测运动物体
图 3.2 检测血管流速
光流定位是通过光流场的变化来推测相机的移动速度,一般用于飞行器的视觉辅助定位。比如通过挂在在四旋翼飞行器下方的相机,相机拍摄正下方的连续图像,经过处理即可得到光流场的分布,若此时全画面光流场都出现一个方向的移动,就可以推断四旋翼与地面存在相对移动,如果四旋翼需要悬停,只需根据光流相机计算得到的移动速度实现位置闭环即可。通过对速度的积分,还可以得到四旋翼的总位移,这也是视觉里程计的一个基本思路。
光流算法在目前任然受到算法复杂度的限制,精度和速度依然是一对矛盾,因此光流的实时性应用往往需要高性能的计算设备,但是在光流定位方面,已经出现了许多嵌入式的解决方案:一种是光流定位芯片,如优象科技的光流芯片;另一种是以FPGA芯片或ARM Cortex-A系列芯片为核心的模块或处理单元,如大疆的精灵系列无人机所使用的光流定位方案。
光流算法的另一个局限是对于图像的畸变和非刚体的运动做计算时鲁棒性较差,这种问题的根源是光流算法的平滑假设无法处理邻近像素发生偏移时产生的误差。目前也有一些改进方法,比如通过其他的传感器判断相机的姿态,对图像预先做仿射变换以确保图像视角的稳定[6]
光流算法还有一个困扰研究者已久的问题——孔径问题:当图片的纹理信息较少的时候,算法会找到许多匹配的像素,从宏观看,光流场在这些地方就是静止的或者是一些噪声。引起孔径问题的原因是出现了一个没有纹理或纹理不明显的像素区域,而且区域大于光流算法检测光流的近邻像素区,就像相机的镜头盖着一张白纸,白纸在移动但是对于相机来说,只能得到全白的画面,无法推断前景的移动。为了解决这个问题,目前最有效的办法是采用图像金字塔,这样图像的尺寸变小了,但是光流检测的邻近像素区尺寸没有变,这样对于原图片来说,近邻像素区变大了,近邻像素区大于无纹理区的尺寸,这样就避免了“孔径问题”,同时,图像金字塔的引入还提高了大幅度位移的检测精度[6]。
图 4 图像金字塔
光流场是基于像素亮度变化得到的,可以看做是图像的亮度特征。光流算法的计算的最基本假设就是亮度不变。但是在实际情况下,这个假设很难满足。光照,反光或阴影都会影响算法的匹配。这时出现了一种基于图像角点特征的光流场算法,这种办法可以在一定程度上抵抗亮度变化导致的干扰。笔者自己也写过基于极值点特征的光流算法,效果相当不错。由此笔者想到,图像有无穷多的特征,是不是其中的任意一种或多种都可以应用于光流场的计算?现在用于处理的图像都是灰度图,而当前的相机大多是彩色的,色彩的特征能否用于光流,也许可以实现色度流,饱和度流?这些笔者没有尝试过,也不确定目前是否有相关的研究,不过笔者相信,基于多种特征的“光”流算法,是有研究意义的。
光流定位是一种已经投入市场的技术,大疆、pixhawk的飞控都支持光流(模块)的输入。不过目前的光流只能做到检测水平方向的位移速度,而实际上高度和旋转的变化信息也可以通过光流场得出。笔者正在研究这一方面,希望能得到期待的结果。
算法速度几乎是任何一种算法不变的追求,速度越快就有可能在低算力的嵌入式平台上运行,在现行算法中,关于梯度下降的光流算法有很多优化方案,代价是牺牲了一定的精度。如何损失最小的精度并获得更高的运算速度,也是一个值得研究的方向。
由于大量算法应用了平滑假设,导致这类算法对于画面的旋转和畸变几乎没有抵抗力,虽然有些算研究者用一些预处理算法把图片的旋转和畸变消除后在进行光流处理,但是预处理消耗了一定的算力,如果能提出一种能够直接抵抗画面的旋转和畸变的光流算法,意义相当巨大。
光流法发展至今,研究者提出了多种计算光流的算法,也有许多基于光流法思路的改进算法,基于光流定位的产品也已经开始投入市场。但是,光流法作为一种需要大量计算的算法,在嵌入式设备上的运行速度和精度还是受嵌入式硬件的算力影响很大,如何提高精度和优化算法,将是未来十年内研究者的主要研究方向。