光流(optical flow)基础概念以及典型算法

光流(optical flow)基础概念以及典型算法



什么是光流?

  • 光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。参考博客
  • 光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。 由光流的定义可以引申出光流场,它是指图像中所有像素点构成的一种二维(2D)瞬时速度场,其中的二维速度矢量是景物中可见点的三维速度矢量在成像表面的投影。所以光流不仅包含了被观察物体的运动信息,而且还包含有关景物三维结构的丰富信息。百度百科
  • 光流目前应用于诸多的领域,包括:基于运动的三维重建、视频压缩、目标跟踪以及行为识别等。

一、传统经典光流算法: Lucas-Kanade

基本假设:
(1)亮度不变假设:即待估计的光流在两帧图像中的同一物体的亮度不变
(2)邻域光流相似假设:以像素点(x,y)为中心,设定n*n的邻域内所有像素点的光流值是一致的。(n不会很大)

  • 对于假设(1),我们可以得到:
    I ( x , y , t ) = I ( x + u , y + v , t + Δ t ) I(x,y,t)=I(x+u,y+v,t+ \Delta _t) I(x,y,t)=I(x+u,y+v,t+Δt)
    对等式右边进行泰勒展开,即的:
    I ( x + u , y + v , t + Δ t ) = I ( x , y , t ) + I x ′ u + I y ′ v + I t ′ Δ t I(x+u,y+v,t+\Delta _t)=I(x,y,t)+I'_xu+I'_yv+I'_t\Delta_t I(x+u,y+v,t+Δt)=I(x,y,t)+Ixu+Iyv+ItΔt
    也就是说 I ( x , y , t ) + I x ′ u + I y ′ v + I t ′ Δ t = I ( x , y , t ) I(x,y,t)+I'_xu+I'_yv+I'_t\Delta_t=I(x,y,t) I(x,y,t)+Ixu+Iyv+ItΔt=I(x,y,t)
    所以: I x ′ u + I y ′ v + I t ′ Δ t = 0 I'_xu+I'_yv+I'_t\Delta_t=0 Ixu+Iyv+ItΔt=0,即 [ I x ′ , I y ′ ] [ u , v ] T = − Δ I t [I'_x,I'_y][u,v]^T=-\Delta I_t [Ix,Iy][u,v]T=ΔIt

式中, I x ′ , I y ′ I'_x,I'_y Ix,Iy分别表示在像素点 ( x , y ) (x,y) (x,y)处,图像的亮度在 x , y x,y x,y方向的偏导数,亦即图像亮度的梯度。 I t ′ I'_t It是图像亮度对时间的偏导数,而 I t ′ Δ t I'_t \Delta_t ItΔt表示的是两张图片(一般是相邻帧)之间 ( x , y ) (x,y) (x,y)坐标位置像素点亮度的变化量,可以表示为 Δ I t = I t ′ Δ t \Delta I_t = I'_t\Delta _t ΔIt=ItΔt u , v u,v u,v即为待估计的光流值。
I x ′ , I y ′ , Δ I t I'_x,I'_y,\Delta I_t Ix,Iy,ΔIt均可以通过对图像进行直接计算得到。而 u , v u,v u,v的求取仅有一个方程无法完成求解。

  • 对于假设(2), 在取定邻域内的所有像素值均满足等式 I x ′ u + I y ′ v + I t ′ Δ t = 0 I'_xu+I'_yv+I'_t\Delta_t=0 Ixu+Iyv+ItΔt=0,由此我们可以将矩阵进行扩充得到:
    [ I x ′ ( 1 ) I y ′ ( 1 ) I x ′ ( 2 ) I y ′ ( 2 ) . . . . . . I x ′ ( n ) I y ′ ( n ) ] [ u , v ] T = [ − Δ I t ( 1 ) − Δ I t ( 2 ) . . . − Δ I t ( n ) ] \left [ \begin{array}{l} I^{'(1)}_x & I^{'(1)}_y \\ I^{'(2)}_x & I^{'(2)}_y \\ ...&...\\ I^{'(n)}_x & I^{'(n)}_y \\ \end{array} \right] [u,v]^T= \left[ \begin{array}{l} -\Delta I^{(1)}_t \\ -\Delta I^{(2)}_t \\ ...\\ -\Delta I^{(n)}_t \\ \end{array} \right] Ix(1)Ix(2)...Ix(n)Iy(1)Iy(2)...Iy(n) [u,v]T= ΔIt(1)ΔIt(2)...ΔIt(n)

即: A x = b Ax=b Ax=b。对于这组等式,可以使用最小二乘法 ( x = ( A T A ) − 1 A T b ) (x=(A^TA)^{-1}A^Tb) (x=(ATA)1ATb)近似估计的得到 [ u , v ] [u,v] [u,v]的解。但需要注意的是 ( A T A ) (A^TA) (ATA)需要时可逆的。

二、基于神经网络的光流算法:FlowNet&FlowNet2.0

1.FlowNet

论文地址:https://arxiv.org/abs/1504.06852v2

  • 基本思路:采用神经网络 E n d − t o − E n d End-to-End EndtoEnd的优点,输入相邻帧的两张图片,通过一个卷积层组成的收缩部分提取各自的特征进行降维(收缩部分,encoder);然后再经过一个通过反卷积部分进行升维(放大部分,decoder)。
    在这里插入图片描述

  • 收缩部分网络结构:

  • (1)方案一FlowNetSimple:直接将输入的两张图片合并在一起组合成一个 h × w × 6 h\times w\times 6 h×w×6作为卷积层的输入。
    在这里插入图片描述

  • (2)方案二FlowNetCoor:将两张输入图片分别进行卷积操作,得到图像特征,然后进行相关计算(一种简单的操作是:对应位置像素相乘求和,得到的值越大,代表越相关,即图像越接近。)合并信息。
    在这里插入图片描述

  • 放大部分:通过反卷积进行升维,各层反卷积运算的输入包括三个部分,第一部分包含层语义信息,第二部分包含低层局部信息,第三部分由前一层卷积的输出的光流上采样得到。

  • 论文中作者使用欧式距离来定义 L o s s Loss Loss,称这种误差为 E P E ( E n d − P o i n t − E r r o r ) EPE(End-Point-Error) EPE(EndPointError)

2.FlowNet2.0

论文地址:https://arxiv.org/abs/1612.01925

  • 主要优化策略:网络的堆叠
    在这里插入图片描述

  • 后续FlowNet的输入不仅仅是两张图片( I m a g e 1 Image1 Image1 I m a g e 2 Image2 Image2),还包括前一个网络输入的光流估计Flow,和一张Warped图,再加一张亮度误差(Brightness Error)。其中Warped图为将估计的光流作用在 I m a g e 2 Image2 Image2上,即为使用估计的每个像素偏移,偏移 I m a g e 2 Image2 Image2的每一个像素,使其与 I m a g e 1 Image1 Image1对齐。虽然作用了光流偏移,由于光流估计的不够准确,Warped图和 I m a g e 1 Image1 Image1依然存在一定的偏差, I m a g e 1 Image1 Image1的亮度减去Warped图的亮度,即可得到亮度误差(BrightnessError)图。


总结

  • Lucas-Kanade对于稀疏光流是一种经典且有效的算法。
  • 而对于稠密光流的估计,传统方法需要在精度和速度上需要进行权衡,而FlowNet2可以取得更好的精度和估计结果。(当时FlowNet2成为了光流估计领域的SOTA)
  • 目前,光流估计当然也靠上了cv界的顶流 T r a n s f o r m e r Transformer Transformer F l o w F o r m e r ( A T r a n s f o r m e r A r c h i t e c t u r e f o r O p t i c a l F l o w ) FlowFormer(A Transformer Architecture for Optical Flow) FlowFormerATransformerArchitectureforOpticalFlow成为了目前的SOTA。
  • 吐槽:CV太卷了
  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值