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

2023-05-16

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


文章目录

  • 光流(optical flow)基础概念以及典型算法
    • 什么是光流?
    • 一、传统经典光流算法: Lucas-Kanade
    • 二、基于神经网络的光流算法:FlowNet&FlowNet2.0
      • 1.FlowNet
      • 2.FlowNet2.0
    • 总结


什么是光流?

  • 光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。参考博客
  • 光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。 由光流的定义可以引申出光流场,它是指图像中所有像素点构成的一种二维(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)需要时可逆的。

  • Lucas-Kanade算法还借助了图像金字塔(Pyramid)的方式,在高层低分辨率图像上,大的偏移将变为小的偏移。最终,Lucas-Kanade方法给出了一种求解稀疏(明显特征的角点)光流的方法。图像金字塔是图像多尺度调整表达的一种重要的方式,图像金字塔方法的原理是:将参加融合的的每幅图像分解为多尺度的金字塔图像序列,将低分辨率的图像在上层,高分辨率的图像在下层,上层图像的大小为前一层图像大小的1/4。层数为0,1,2……N。将所有图像的金字塔在相应层上以一定的规则融合,就可得到合成金字塔,再将该合成金字塔按照金字塔生成的逆过程进行重构,得到融合金字塔。
  • 当然,Horn-Schunck光流法也是一种很好的算法。该算法主要基于全局平滑性假设(即假设计算得到的光流场是连续变化的),通过最优化能量方程进行光流求解。该算法可以得到图像的稠密光流信息,但是计算量大、抗干扰性能弱,适用于干扰较小且实时性不高的应用场景。

二、基于神经网络的光流算法: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太卷了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

光流(optical flow)基础概念以及典型算法 的相关文章

  • ensp 查看命令(display)

    ensp 查看命令 xff08 display xff09 span class token number 1 span display this span class token comment 查看当前配置过的命令 span span
  • 关于HTTP 和 HTTPS

    什么是http 超文本传输协议 Http xff0c HyperText Transfer Protocol 是互联网上应用最为广泛的一种网络协议 xff0c 设计Htto最初的目的是提供一种发布和接收HTML页面的方法 xff0c 他可以
  • 关于事件流的简单理解

    JS事件 1 首先 xff0c 什么是事件 xff1f JavaScript和Html发生交互是通过事件来实现的 xff0c 事件 xff0c 就是文档或浏览器窗口发生一些特定的交互的瞬间 2 什么是事件流 xff1f 事件流就是 xff0
  • Vue中引入自定义公共组件方法以及步骤

    什么是公共组件 xff0c 公共组件的使用场景 项目中如果多个页面都显示有相同的区域内容 xff0c 则该公共区域内容可以封装成公共组件进行使用 步骤 xff1a 1 创建自定义公共组件 xff0c 在src下的components目录中自
  • vue中的data为什么是一个函数

    首先 xff1a 组件是一个可复用的Vue实例 xff0c 一个组件被创建好之后 xff0c 就可能被用在各个地方 xff0c 而组件不管被复用多少次 xff0c 组件中data数据都应该是相互隔离 xff0c 互不影响的 xff0c 基于
  • Vue中key值的作用

    Vue中key值的作用 首先v for 在列表渲染时 xff0c 我们可以用v for基于一个数组来渲染一个列表 v for指令需要使用item in arr形式的特殊语法来进行渲染列表 xff0c arr是源数据 xff0c span c
  • 电商后台管理项目d01

    电商后台管理项目d01 1 项目技术栈 2 项目初始化 3 Element UI 的按需引入 4 路由配置 5 Axios 的封装 6 实现登录功能 7 完成首页部分 8 用户管理 用户列表 9 权限管理 1 角色
  • react之jsx语法规则

    希望在之后的日子里 xff0c 能够时常更新 xff01 定义虚拟DOM时 xff0c 不要写引号 标签中混入JSX表达式时 xff0c 要用 样式的类名不要用class属性 xff0c 要是用clsaaName属性 lt h1 class
  • 电子凭证文件上传

    最近 xff0c 一直在做一些关于文件上传 xff0c 以及凭证导出打印的工作 xff0c 做一些记录 xff0c 方便日后的查阅 对了 xff0c 我在这里用的是antDesign这个第三方组件 文件上传 vue模板中 lt p gt l
  • 可视化图表API格式要求有哪些?Sugar BI详细代码示例(2)

    Sugar BI中的每个图表可以对应一个数据 API xff0c 用户浏览报表时 xff0c 选定一定的过滤条件 xff0c 点击 查询 按钮将会通过 API 拉取相应的数据 xff1b 前面说过 xff0c 为了确保用户数据的安全性 xf
  • "Warning: GetWindowMenuPopup failed! "

    对mdi程序中一个弹出菜单警告原因的分析 作者 laomai 网址 http blog csdn net laomai xff08 转载时请注明出处 xff09 一 引子 最近在编译一个别人的mdi程序代码 xff0c 在调试程序时 vc6
  • div仿input的使用

    需求描述 xff0c 输入框支持文本输入 xff0c 以及支持标签在对应节点的插入 1 首先封装组件 xff0c 通过父子组件传参的方式进行数据的处理 用富文本插件体积略大通过div标签的contenteditable属性来处理成仿inpu
  • 关于优雅去重的一些感想

    也就不赘述有的没的 xff0c 看代码 1 通过reduce 方法进行去重 this pageDataList 61 this pageDataList reduce tempArr item 61 gt if tempArr findIn
  • java形参的改变会影响实参吗?

    java形参的改变会影响实参吗 xff1f 昨天做题的时候遇到了这个问题 xff08 如图所示 xff09 xff0c 传入的参数是int 数组 xff0c 实参跟着形参一起改变了 但是之前传入int型参数时形参的改变是不会影响实参的 所以
  • 快速教你数据清洗的步骤及方法,不可错过

    说起数据清洗 xff0c 可能会有些小伙伴会觉得这一步可以忽略掉 xff0c 但是 xff01 作为混迹在数据分析这一块多年的老油条 xff0c 小编在此严肃地声明 xff01 资料清理是资料处理中最不能被忽略的部分 xff0c 它是资料分
  • 阿里八年大佬,分享三款值得推荐的开源接口测试工具

    三款值得推荐的开源接口测试工具 接口测试可以测试APIs Application Programming Interface 是否符合功能 xff0c 可靠性 xff0c 性能和安全要求 接口测试对于成功的CI DevOps来说至关重要 J
  • Gazebo的安装&与ROS的连接

    一 安装 1 添加源 span class token function sudo span span class token function sh span c span class token string 39 echo 34 de
  • 3d仿真文献综述

    文献综述 Vincent文论创新点Digital Twin based synchronised control and simulation of the industrial robotic cell using Virtual Rea
  • MATLAB多个子图 用一个 colorbar

    多个子图使用同一个colorbar left bottom width height ps42 61 zeros 8 4 ps42 3 61 0 44 ps42 4 61 0 20 ps42 7 8 2 61 0 08 ps42 5 6 2
  • ARS_408毫米波雷达数据解析学习记录-利用RVIZ实现解析结果的可视化

    前面已经基本完成了ARS 408毫米波雷达数据的获取与解析工作 虽然已经将从CAN口获取的数据解析处理成指定的消息类型并进行了发布 xff0c 但是需要注意的是 xff0c 它们只是处于文本数据形态 xff0c 我们仍然无法得到直观的显示结

随机推荐