FunnyWii
FunnyWii
Published on 2024-11-24 / 33 Visits
0
0

单目相机的相对速度估计

前言

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

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

传统方法中,最经典的是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} = \frac{Y\cfrac{w-w'}{w'}}{\Delta t} \tag{1.4}

\cfrac{w-w'}{w'} = s,可以得到:

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

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

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

其中s_{err}描述的是BBox的像素误差。0.1的像素误差的影响取决于目标BBox在图像中的大小(很明显100像素宽度和1像素宽度,0.1的像素误差影响不同)。作者先定义了一个尺度误差s_{acc},用像素误差s_{err}除以像素宽度w,可以理解为误差比例:

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

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

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

  1. 相对速度误差v_{err}与速度v本身无关

  2. 相对速度误差v_{err}随着距离Y二次方增长

  3. 时间间隔\Delta t越长,相对速度误差v_{err}越小

  4. 相机FOV越小,也就是焦距f越长,相对速度误差v_{err}越小

参考线方法

和ME算法一样,基于道路平坦和目标位于地面的假设。这种方法是找到像素坐标转换为世界坐标的比例因子。

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

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

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

最后可以根据时间间隔计算目标的速度。

px2world.png

augmentedline.png

深度学习方法

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

基于ME的速度估计,算法原理简单,但存在缺陷:

  • 路面不平,会导致目标位置计算出现偏移,导致速度计算也出现偏移。

  • BBox像素抖动,会导致速度突变。

在国内,无论是论文期刊,还是技术博客,使用的最多的就是传统方法,尤其是技术博客上,有一个算一个还都是卖课的...所以目前来看,国内在使用深度学习方法进行目标速度估计的探索上,还是一片蓝海。

以论文 [1802.07094] 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就会介入,替换掉失败的跟踪。

对于深度估计,使用的是 [1609.03677] Unsupervised Monocular Depth Estimation with Left-Right Consistency 论文中提到的方法。目前,使用单目相机场景的数据获取真实的绝对深度数据是不可行的。这种方法将训练过程中的深度估计看作一个图像重建问题。使用一个标定过的双目相机,通过学习一种从一个相机重建另一个图像的功能,就能了解场景的3D形状。具体来说,训练时,左目图像I_l和右目图像I_r不用来直接预测深度,而是尝试找到一个稠密的关联场d_r,关联场应用于一侧图像时,可以重建另一侧图像。这种方法仅限近距离。

对于运动信息,采用FlowNet2提取稠密光流图来获取运动信息。FlowNet2将光流估计视为一个视觉学习问题,它的CNN是在两个堆叠的输入帧上训练的。

Camera-based vehicle velocity estimation from monocular video.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


Comment