前言
单目相机的目标距离估计本身就已经充满了挑战,那么目标的相对速度估计也必然十分困难。
目前,基于单目相机的相对速度估计算法大致可以分成两类:传统方法和深度学习方法。没错,什么任务都可以深度学习。
传统方法中,最经典的是 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 轴方向上的速度为例:
这里的 \Delta Y 是两个时间点在 Y 方向上的距离变化量,\Delta t 是时间差。这个时间差通常会在程序中根据相邻帧之间的运行时间自动计算。
由距离估计公式可知,两个时间点 t_1 和 t_2 的距离本身都存在误差,因此 \Delta Y 必然也不够准确。于是论文中进一步引入了目标尺寸变化量来计算相对速度。设 W 为车辆的实际物理宽度,w 和 w' 为两个时间点车辆在图像上的宽度,根据小孔成像原理有:
然后根据 Y = \cfrac{fH}{y},可以得到:
令
则有:
在论文 Vision-based ACC with a single camera: bounds on range and range rate accuracy 中,在假设距离 Y 完全准确的前提下,可以得到相对速度的误差:
其中,s_{\text{err}} 描述的是 BBox 的像素误差。0.1 像素误差的影响,取决于目标 BBox 在图像中的大小。很明显,目标宽度为 100 像素和 1 像素时,0.1 像素误差的影响完全不同。
作者先定义了一个尺度误差 s_{\text{acc}},用像素误差 s_{\text{err}} 除以像素宽度 w,可以理解为误差比例:
为了方便理解,本文将论文中的 Z,也就是前向距离,全部替换为东北天坐标系前向的 Y。而在 单目相机的测距 - The Distance Estimation of Monocular Camera - FunnyWii's Zone 一文中没有修改,仍然使用 Z。(懒)
根据公式 1.6 的速度误差,可以发现:
- 相对速度误差 v_{\text{err}} 与速度 v 本身无关。
- 相对速度误差 v_{\text{err}} 会随着距离 Y 的二次方增长。
- 时间间隔 \Delta t 越长,相对速度误差 v_{\text{err}} 越小。
- 相机 FOV 越小,也就是焦距 f 越长,相对速度误差 v_{\text{err}} 越小。
参考线方法
参考线方法和 ME 算法一样,建立在道路平坦、目标位于地面的假设之上。它的核心是找到从像素坐标转换到世界坐标的比例因子。
方法一:这种方法不需要对摄像头进行标定,只需要测量道路上两条或多条参考线之间的实际距离(m)。所有车辆目标在穿越参考线时,相对相机的距离都是相同的。
方法二:基于单应计算的方法,即将道路从 3D 空间投影到 2D 空间,也就是常说的 BEV。BEV 中的像素位移(pixel)可以转换为真实 3D 世界中的距离变化(m)。
方法三:对于路端相机,可以根据车牌尺寸变化来计算车辆位置。相比使用车辆宽度作为先验的方法,车牌尺寸更加统一,因此得到的目标位置通常也会更准确。
最后,再根据时间间隔计算目标速度。
深度学习方法
单目相机可以通过深度图获取目标的相对深度,但相对深度和与目标之间的相对距离并不是一回事,参见 单目相机的深度图,以及绝对深度和相对深度 - FunnyWii's Zone。同样,也可以通过深度学习方法获取与目标的相对速度。
基于 ME 的速度估计虽然原理简单,但存在明显缺陷:
- 路面不平会导致目标位置计算出现偏移,进一步影响速度估计结果。
- BBox 的像素抖动会导致速度出现突变。
在国内,无论是论文期刊还是技术博客,使用最多的仍然是传统方法。尤其是技术博客这一侧,有一个算一个,很多最终都落到卖课上去了。
这里以论文 Camera-based vehicle velocity estimation from monocular video 为例。
论文提出了一个二阶段模型。第一阶段主要负责提取相关特征,第二阶段使用多层感知机 MLP 回归车辆目标的位置和速度。
- 特征提取阶段
将 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 会在两个堆叠输入帧上完成训练。
此外,国内一些主机厂在量产车型上也会采用 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
评论