Advertisement

光流法运动目标检测matlab_光流法 optical flow

阅读量:

写在前面:

恰逢需要了解video相关的任务,绕不开的就是运动信息的分析,而运动信息都是通过光流法来获得的,所以学习并总结了一些博客,记录一下光流法的原理,主要还是为VAR任务中two-stream方法的启动看一些基础知识。说不定能结合光流法中提取运动信息的思想去做一些其他的事呢!!
ce2b60e4bd3ee2feac62195281bb87d8.png

光流法:

目的: 通过连续的图像序列来检测图像序列中运动物体微小的动作变化。光流在图像中的含义就是动作向量(motion vector)(u,v),其中u,v分别表示位移在x和y方向上的变化率,也就是某个位置的x分量和y分量的速度。

原理: 在通用亮度假设的条件下,通过对邻帧之间的像素点进行建模,推导当前帧某个像素点在之后时间的运动方向,也就是一种预测当前像素点未来运动信息的方法

下面通用亮度假设开始,逐步学习:

1、第一个假设通用亮度假设 ,假设连续帧中某一目标的像素值不变,通俗点说就是在n帧和n+1帧中,同一运动物体的亮度(像素值)保持不变,那么基于以下假设,可以进行如下推导,其中
表示亮度值(0-255),拿一个特定的像素点来说,
分别表示该像素点的坐标和时间。
就表示这个像素点运动到下一帧时相比于当前帧的微小坐标位移和微小时间差。那么对于该像素点,如下假设既为亮度假设:
通过亮度假设,我们可以运用高数的泰勒级数展开将上式右边进行展开(泰勒级数展开的思想大致是将一个连续函数,表示成该连续函数各阶导数的组合,取的导数阶数越高,展开后的泰勒级数对于该连续函数拟合越好。)由于时间差本身假设的比较短,所以对于二阶导数及以后的值都变得很小,因此我们进行忽略,那么展开后的式子为:
其中
表示当前帧内,图像的该像素点对于x的梯度,可以通过该像素点的左右相邻像素点计算差分得到,
同理,
可以用该像素点
处当前帧
时刻和下一帧
时刻,两个时刻灰度值之差除以
得到。

那么继续将(1)式与(2)式进行组合,可以得到:
那么两边同时除以

继续变化一下:
这就比较熟悉了,其中
分别为该帧
时刻的
的运动分量。至此,我们光流法希望得到的光流参数
已经出现了,那么问题就集中在如何求解他们,根据之前的分析,另外三个参数均可通过计算求出,而一个二元一次方程无法求解,因此还需要引入额外的其他的假设,这里看到两种做法:

**Horn &Schunck method **和 Lucas &Kanade method。

Horn &Schunck method

其中Horn&Schunck method是额外引入平滑限制,计算复杂度比较高,而且感觉不是大家默认实用的方法,所以这里主要结合其他人的分享和自己的一些思考进行简要介绍,具体感兴趣的可以具体再去了解。

大体的假设就是说我们该像素点的邻域内的其他像素点应该具有差不多的速度,那么怎么让他具有差不多的速度呢?不知道大家是不是记得我在前面提到的使用泰勒级数展开,如果一个函数越简单,比如说线性函数,那泰勒展开直接就等于他函数本身的斜率-截距表示的形式
,也就是说一个函数越简单,他展开的项数可以表示的越少。至此,我们如果要假设限制邻域的像素点的速度不能相差太大,那就意味着,我希望我的亮度函数越简单,最好是线性,没有二阶及以上高阶的导数。所以,这种方法使用了最小化
的二阶导数来达到假设的目的。这个限制又称为平滑性限制(smoothness constraint)。

所以,寻找光流法的问题变成了一个最优化的问题。优化的目标函数是:

至于上式目标函数是如何推导得出的就不做过多的探究了,大致意思就是遍历图像的所有像素点,找到某个(u,v),使得目标函数最小化。其中第一项是brightness constraint,第二项是smoothness constraint。

之后计算的方式是求
的偏导,得到两个二元方程,再利用牛顿迭代法逐步求取

Lucas &Kanade method

这个方法被很多默认理解为光流法的默认实用方法,我们就用这一方法假设继续开展下面的分析,具体方法见下文。

2、第二个假设,像素点

及周围邻域内像素点的运动方向一致

****,这就很好理解了,有了这个假设,面对上(5)式,我们就不缺少方程数量的,因为我们假设邻域内运动一致,也就是说邻域内n个像素点具有相同的
。n个点,就有n个式子,那么来求解俩参数
,是不是就简单多了,直接上最小二乘法,求那个近似解(矩阵分析里面的知识,没有学好的复习一下吧!!)
8e0d6b370e7c04e090d796e6465de45a.png

我们直接上式子,先把(5)式拿下来:
然后稍微变个形:
那么继续,在像素点
周围的像素点与
的运动是一致的,即它们有相同的

,我们假设了
个像素点,那么相应的就有 这么多式子:
然后写成矩阵的形式:
再把上式简化一下:
其中,
即为我们要求的光流信息,由于
的逆无法直接求得,所以继续,将等式两边同时左乘
,得到:
进一步我们可以求得可得
的逆矩阵,所以自然的得到
如下:
展开就是:

根据上式就可以算出像素点
的光流
了。基于第二种假设的方法就是之前提到的

Lucas &Kanade method了。
121bfa4e0c8ce12e7981934332f586ae.png

写在最后:

我们学习了如何计算光流,那么光流场的计算结果如何引入CNN中还没有进行继续的探究,后续会在进一步阅读论文中,探寻他是如何应用到video任务,并且发挥其作用的。
6204d6fd620975a03187713972297960.png

全部评论 (0)

还没有任何评论哟~