Contents — find the section you need

逐帧观看视频时,很难直观地看出图像的哪个部分移动了多少。光流以向量的形式表示每个像素亮度在下一帧中的位置变化。它成为任何涉及运动过程的通用语言:自动驾驶汽车的碰撞预测、无人机的自定位、体育分析和视频插值。

0. 30 秒总结

  • 光流并非“物体本身的速度”,而是其在图像中的视运动。相机运动、物体运动和深度信息都混合在光流中。

  • 亮度恒常性方程每个像素只有一个方程,因此需要通过添加局部窗口平滑假设、特征点或正则化来求解。

  • Lucas-Kanade 算法将小窗口视为单个速度——一种稀疏跟踪方法。Horn-Schunck 算法则利用整个图像的平滑性——一种稠密估计方法。

  • 大位移需要图像金字塔;遮挡、反射和模糊需要置信度度量和异常值处理。卷帘快门还需要校正行时序差异。

  • 诸如 RAFT 之类的基于学习的方法精度很高,但应在检查 GPU 内存、分布式系统行为、实时性能和许可情况后再采用。

1. 从亮度恒定性到光流约束方程

Diagram 1 · Use the button to switch views
从图像金字塔到稠密矢量场的光流估计

图 1 — 金字塔首先处理大位移,然后在更精细的尺度上细化稠密矢量场。置信度和遮挡掩模必须随矢量一起移动。

如果一个小的、静止的图案在帧之间移动,我们可以将其理想化为具有恒定的亮度。

I(x,y,t)=I(x+u\Delta t,y+v\Delta t,t+\Delta t)

一阶泰勒展开式与 \Delta t\to0 一起得到

I_xu+I_yv+I_t=0

由于有两个未知的速度分量 (u,v),但只有一个方程,因此无法单独求解。在边缘上,沿边缘方向的运动是不可见的;在平坦区域,完全没有梯度。这就是孔径问题。

2. Lucas-Kanade 和 Horn-Schunck

Lucas-Kanade 假设局部窗口内的速度相同 W,并最小化以下平方误差。

E(u,v)=\sum_{(x,y)\in W}w(x,y)\{I_xu+I_yv+I_t\}^2

它仅使用梯度矩阵条件数足够好的角点,并将其与特征点跟踪中使用的相同金字塔和迭代更新相结合(参见前一节)。OpenCV 的 calcOpticalFlowPyrLK 是该系列的一个实现。

Horn-Schunck 将整个图像上的流场视为未知量,并同时最小化亮度约束和速度平滑度。

E(u,v)=\iint (I_xu+I_yv+I_t)^2+\alpha^2(|\nabla u|^2+|\nabla v|^2)\,dxdy

较大的 \alpha 会产生更平滑的流场;较小的 \alpha 允许局部不连续性。跨越物体边界的平滑会混合不同物体的速度,因此需要鲁棒损失函数。取而代之的是使用边缘保持正则化。

3. 稀疏流和密集流

类型 估计点 代表性方法 优点 缺点
稀疏 数百到数千个点,例如角点 LK、KLT 轻量级,可直接用于姿态估计 在纹理较少的区域会留下空白
半密集 具有梯度的像素 直接 VO、基于 Hessian 矩阵的方法 平衡几何信息和计算成本 无法填充整个图像
密集 几乎每个像素 Horn-Schunck、TV-L1、RAFT 对运动物体、流体和插值有效 计算成本高,在遮挡边界处存在歧义

对于视觉里程计,将稀疏对应关系传递给几何计算往往更稳定。另一方面,遮挡运动区域行人检测或使用逐像素运动进行视频插值需要高密度流。预先确定所需的密度比简单地增加GPU资源更有效。

4. 处理大位移、遮挡和亮度变化

单像素微分近似在大运动情况下失效。高斯金字塔通过将图像缩小到1/2、1/4和1/8比例构建;在粗略层估计大位移,然后上采样到精细层并迭代细化。金字塔层数过多会导致小物体消失;层数过少则会导致搜索范围不足。

当光照变化时,亮度恒定性失效,因此需要使用局部归一化、梯度方向、鲁棒的Charbonnier损失或相对颜色差异。在运动物体的边界处,前一帧可见的像素可能在下一帧中被遮挡(遮挡)。使用遮挡标志、前后一致性和可见性掩码,而不是强制跟踪。它。

5. 基于学习的方法:如何解读 RAFT

RAFT(循环全像素对场变换)以计算两幅图像间所有像素对的相关性而闻名,然后使用迭代更新算子来优化结果。由于它可以利用比传统方法的“局部窗口”更广泛的对应候选区域,因此在纹理重复或位移较大的区域表现良好。

但是,基准测试中较低的平均端点误差 (EPE) 并不等同于在实际机器人应用中的安全性。如果相机的镜头、曝光、卷帘快门、灰尘或夜间照明与训练数据不同,置信度就会下降。评估应包括推理时间、输入分辨率、量化误差、GPU 驱动程序和模型许可证。

6. 将相机运动与动态物体分离

将结果转换为相机运动需要相机内参矩阵 K 和深度 Z。在归一化后图像点 \mathbf{x} 的坐标,以及由相机平移 \mathbf{t} 和角速度 \boldsymbol{\omega} 引起的流动,在概念上可以表示为:

\mathbf{u}=\frac{1}{Z}A(\mathbf{x})\mathbf{t}+B(\mathbf{x})\boldsymbol{\omega}

平移分量随 1/Z 变化——近处物体比远处物体移动得更多——而旋转分量与深度无关。通过 RANSAC 算法找到的与单一运动模型一致的流动被视为背景;残差较大的区域成为候选动态对象。在包含大量车辆或行人的场景中,目标检测和语义掩码与几何估计结合使用。

7. 评估指标和可复现测量

给定真实流动 (u^*,v^*),平均端点误差为:

EPE=\frac{1}{N}\sum_{i=1}^{N}\sqrt{(u_i-u_i^*)^2+(v_i-v_i^*)^2}

不仅要报告平均值,还要报告第 95 百分位数、遮挡边界处的误差以及低纹理区域的误差。区域,以及按速度细分的误差。由于在真实硬件上很难获得真实轨迹,因此通常会结合运动捕捉、机械臂的已知轨迹、合成图像、前向-后向一致性以及VO重投影误差等信息。

日志应保留相机时间戳、曝光、分辨率、金字塔层级、窗口大小、迭代次数、GPU/CPU、温度和光流置信度。即使算法名称相同,如果这些条件不同,结果也无法比较。

8. 总结

光流算法通过方程约束像素的表观运动,并使用局部窗口、全图像平滑度、图像金字塔和基于学习的相关性来求解。稀疏LK算法适用于自定位;密集光流算法适用于动态物体和视频处理。分别考虑相机运动与物体运动、遮挡、光照和滚动快门,并评估故障情况而不仅仅是平均误差,有助于避免选择错误的实现方式。

检查你的理解
图像运动是否代表物体的物理速度?

相机运动、物体运动和深度都会影响投影运动。将每秒像素数转换为每秒米数需要几何信息。

参考资料

What to read next

Review the background光流 Lab:跟踪两帧之间的运动Continue the series单应性入门——用单个3x3矩阵描述平面对应关系Explore another aspect of this field图像亮度 Lab — 曝光、伽马与裁剪