前言

单目相机的目标距离估计本身就已经充满了挑战,那么目标的相对速度估计也必然十分困难。

目前,基于单目相机的相对速度估计算法大致可以分成两类:传统方法和深度学习方法。没错,什么任务都可以深度学习。

传统方法中,最经典的是 Mobileye 在 2003 年一篇论文中提出的算法。这套算法同时包含目标距离和速度的估计方法。


传统方法

Mobileye 方法

ME 方法主要依据 2D 目标检测的 BBox 变化。BBox 可以通过 SSD、R-CNN、YOLO 等深度学习模型得到。

除此之外,还需要目标跟踪。在道路多目标场景下,如果想对目标 A 进行速度估计,就需要在连续画面中持续跟踪目标 A。

单目相机的测距 - The Distance Estimation of Monocular Camera - FunnyWii's Zone 这篇文章中,已经介绍过距离的计算方法。

在使用 ME 算法获取目标的 XY 坐标(X 右、Y 前)之后,可以将相对速度表示为两次测量时刻的距离除以时间差。以 Y 轴方向上的速度为例:

v_y = \cfrac{\Delta Y}{\Delta t} \tag{1.1}

这里的 \Delta Y 是两个时间点在 Y 方向上的距离变化量,\Delta t 是时间差。这个时间差通常会在程序中根据相邻帧之间的运行时间自动计算。

由距离估计公式可知,两个时间点 t_1t_2 的距离本身都存在误差,因此 \Delta Y 必然也不够准确。于是论文中进一步引入了目标尺寸变化量来计算相对速度。设 W 为车辆的实际物理宽度,ww' 为两个时间点车辆在图像上的宽度,根据小孔成像原理有:

w = \cfrac{fW}{Y} \tag{1.2}
w' = \cfrac{fW}{Y'} \tag{1.3}

然后根据 Y = \cfrac{fH}{y},可以得到:

v = \cfrac{\Delta Y}{\Delta t} = \cfrac{Y' - Y}{\Delta t} = \cfrac{\cfrac{fH}{Y'} - \cfrac{fH}{Y}}{\Delta t} = \cfrac{fH \cfrac{w-w'}{w'w}}{\Delta t} = \cfrac{Y\cfrac{w-w'}{w'}}{\Delta t} \tag{1.4}

\cfrac{w-w'}{w'} = s

则有:

v = \cfrac{Ys}{\Delta t} \tag{1.5}

在论文 Vision-based ACC with a single camera: bounds on range and range rate accuracy 中,在假设距离 Y 完全准确的前提下,可以得到相对速度的误差:

v_{\text{err}} = \cfrac{Ys_{\text{acc}}}{\Delta t} = \cfrac{Y^2 s_{\text{err}}}{fW\Delta t} \tag{1.6}

其中,s_{\text{err}} 描述的是 BBox 的像素误差。0.1 像素误差的影响,取决于目标 BBox 在图像中的大小。很明显,目标宽度为 100 像素和 1 像素时,0.1 像素误差的影响完全不同。

作者先定义了一个尺度误差 s_{\text{acc}},用像素误差 s_{\text{err}} 除以像素宽度 w,可以理解为误差比例:

s_{\text{acc}} = \cfrac{s_{\text{err}}}{w} = \cfrac{s_{\text{err}}Y}{fW} \tag{1.7}

为了方便理解,本文将论文中的 Z,也就是前向距离,全部替换为东北天坐标系前向的 Y。而在 单目相机的测距 - The Distance Estimation of Monocular Camera - FunnyWii's Zone 一文中没有修改,仍然使用 Z。(懒)

根据公式 1.6 的速度误差,可以发现:

  1. 相对速度误差 v_{\text{err}} 与速度 v 本身无关。
  2. 相对速度误差 v_{\text{err}} 会随着距离 Y 的二次方增长。
  3. 时间间隔 \Delta t 越长,相对速度误差 v_{\text{err}} 越小。
  4. 相机 FOV 越小,也就是焦距 f 越长,相对速度误差 v_{\text{err}} 越小。

参考线方法

参考线方法和 ME 算法一样,建立在道路平坦、目标位于地面的假设之上。它的核心是找到从像素坐标转换到世界坐标的比例因子。

方法一:这种方法不需要对摄像头进行标定,只需要测量道路上两条或多条参考线之间的实际距离(m)。所有车辆目标在穿越参考线时,相对相机的距离都是相同的。

方法二:基于单应计算的方法,即将道路从 3D 空间投影到 2D 空间,也就是常说的 BEV。BEV 中的像素位移(pixel)可以转换为真实 3D 世界中的距离变化(m)。

方法三:对于路端相机,可以根据车牌尺寸变化来计算车辆位置。相比使用车辆宽度作为先验的方法,车牌尺寸更加统一,因此得到的目标位置通常也会更准确。

最后,再根据时间间隔计算目标速度。

px2world.png augmentedline.png

深度学习方法

单目相机可以通过深度图获取目标的相对深度,但相对深度和与目标之间的相对距离并不是一回事,参见 单目相机的深度图,以及绝对深度和相对深度 - FunnyWii's Zone。同样,也可以通过深度学习方法获取与目标的相对速度。

基于 ME 的速度估计虽然原理简单,但存在明显缺陷:

  • 路面不平会导致目标位置计算出现偏移,进一步影响速度估计结果。
  • BBox 的像素抖动会导致速度出现突变。

在国内,无论是论文期刊还是技术博客,使用最多的仍然是传统方法。尤其是技术博客这一侧,有一个算一个,很多最终都落到卖课上去了。

这里以论文 Camera-based vehicle velocity estimation from monocular video 为例。

论文提出了一个二阶段模型。第一阶段主要负责提取相关特征,第二阶段使用多层感知机 MLP 回归车辆目标的位置和速度。

  1. 特征提取阶段

将 RGB 图像转换为三种特征:车辆轨迹、深度和运动。

  • 车辆轨迹:2D 对象 BBox 随时间变化形成的轨迹。
  • 深度:单目相机得到的视差估计。
  • 运动:通过连续帧的光流估计得到的运动信息。

对于车辆轨迹跟踪,论文使用了 Median Flow 和 MIL 两种跟踪器,这两种 tracker 在 OpenCV 中都有现成 API。Median Flow 的优势在于,它能够在轨迹上对 BBox 进行调整,并给出较稳定的 BBox,这一点对于速度估计非常重要。当遮挡导致 tracker 不稳定,进而使 Median Flow 失效时,MIL 就会介入,替换掉失败的跟踪结果。

对于深度估计,使用的是论文 Unsupervised Monocular Depth Estimation with Left-Right Consistency 中的方法。目前,在单目相机场景下直接获取真实绝对深度数据基本不可行。因此,这类方法通常会把训练阶段的深度估计看作一个图像重建问题。具体来说,使用一个已经标定过的双目相机,通过学习从一个相机视角重建另一个视角图像的能力,来理解场景的 3D 结构。

在训练过程中,左目图像 I_l 和右目图像 I_r 并不是直接用来预测深度,而是尝试找到一个稠密关联场 d_r。当这个关联场作用于一侧图像时,就可以重建另一侧图像。不过,这种方法通常只适用于近距离场景。

对于运动信息,论文使用 FlowNet2 提取稠密光流图,以获得运动特征。FlowNet2 将光流估计视为一个视觉学习问题,其 CNN 会在两个堆叠输入帧上完成训练。

Camera-based%20vehicle%20velocity%20estimation%20from%20monocular%20video.png

此外,国内一些主机厂在量产车型上也会采用 BEV 模型,将 6 个相机图像作为输入,并通过加入多任务学习,让模型同时输出 3D 检测结果和车道线检测结果。3D 检测结果中同样包含目标的位置和速度信息。不过,这种方法需要的数据集成本非常高,小公司和个人开发者其实没有太大尝试必要。

Ground Truth 的获取

  • 汽车速度计
  • 雷达
  • GPS
  • 光栅
  • 路面传感器

参考文章

[1] Deep Convolutional Networks for Monocular Velocity Estimation | by Sam Black | Towards Data Science

[2] [2101.06159] Vision-based Vehicle Speed Estimation: A Survey