光流(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太卷了
### 回答1: bounding box是指在图像中定位物体或区域的矩形框。而光流是指描述图像中像素在不同时间或帧之间的运动向量。 将bounding box作为optical flow输入可以通过以下步骤实现: 首先,根据任务的需求,在图像中选择目标物体或区域,并用bounding box进行标注。 然后,利用计算机视觉算法,例如基于深度学习的目标检测算法,对图像中的目标进行检测和定位。该算法将输入图像和bounding box作为输入,并输出目标检测结果。 接下来,对于每一帧图像中的bounding box,利用光流算法计算目标区域的运动向量。光流算法能够分析相邻帧之间的像素变化,并计算出物体在图像中的运动情况。 最后,根据光流算法计算出的运动向量,可以进一步分析目标物体的运动轨迹、速度和加速度等运动信息。这些信息可以应用于许多计算机视觉任务,例如运动跟踪、行为分析和视频压缩等。 通过将bounding box作为optical flow光流输入,可以更加准确地分析目标物体的运动情况,并为后续的任务提供更丰富的信息。这种方法在许多视觉任务中具有广泛的应用,例如视频监控、自动驾驶和虚拟现实等领域。 ### 回答2: bounding box(边界框)在计算机视觉领域中常用于表示物体在图像中的位置和范围。而optical flow光流)是一种用于估计图像中像素运动的技术。 将bounding box作为optical flow的输入意味着我们希望通过光流来估计给定物体在图像中的运动。通过监测bounding box的运动,我们可以了解物体的位移、速度和方向等运动信息。 在这种方法中,首先需要使用目标检测算法或手工标注的方式得到bounding box的位置。然后,我们可以使用光流算法对bounding box中的像素进行跟踪和分析,以获取物体的运动信息。 使用bounding box作为optical flow输入的好处是,只需对感兴趣的区域进行光流计算,减少了计算量,提高了计算效率。而且,通过对物体运动的分析,我们可以获得更精确的物体运动信息,有助于在视觉跟踪和行为分析等领域中的应用。 然而,bounding box作为optical flow输入也存在一些挑战和限制。首先,bounding box的准确性对光流的计算结果有很大的影响,如果bounding box的位置不准确,可能会导致光流计算出的运动结果不准确。此外,如果物体发生较大的旋转、遮挡或形变等情况,bounding box的边界可能无法完整地包围物体,从而影响光流的计算和分析结果。 综上所述,bounding box作为optical flow光流的输入可以用来估计给定物体在图像中的运动。但在使用时需要注意bounding box的准确性和在特定情况下的局限性。 ### 回答3: bounding box作为optical flow光流的输入,是指在目标跟踪或目标检测任务中,使用bounding box来框定目标区域,并将该区域作为输入,进行光流计算。 光流是一种用于分析图像中像素运动的技术。它能够通过比较相邻帧中的像素位置变化,推测像素的运动方向和速度。为了准确地计算光流,需要选择合适的输入区域。而bounding box提供了一个有效的方式来定义并限制光流计算的区域,以便准确地追踪目标的运动。 具体而言,使用bounding box作为光流的输入可以带来以下优势: 1. 限定区域:bounding box可以将光流计算限定在目标区域内,从而排除其他背景区域的干扰。这样可以提高光流的计算精度和效率。 2. 快速目标跟踪:光流可以用于目标跟踪任务,而bounding box提供了目标的初始位置信息。通过光流计算,可以根据目标的运动轨迹对目标进行跟踪,并及时更新bounding box的位置。 3. 目标检测准确性:光流可以用于目标检测任务,通过计算不同帧之间的光流变化,可以检测出目标的运动。而bounding box则可以用来获取目标在当前帧中的位置,从而进一步提高目标检测的准确性。 总之,使用bounding box作为optical flow光流的输入,可以更好地限定光流计算的区域,提高光流的计算精度和效率,同时也可以用于目标跟踪和目标检测任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值