正文

在 ADAS 中,测距这项需求一般源于自适应巡航控制(ACC)。ACC 是纵向距离控制,需要能够发现目标,测量相对速度和相对距离,并预测目标的运动轨迹。

对于测距而言,最直接的方法是采用毫米波雷达、激光雷达和双目相机。那为什么还要用单目呢?核心原因还是成本。单目相机便宜、部署简单,但也带来两个明显问题:

  • 深度丢失。单目相机把 3D 世界坐标系中的信息投影到 2D 像素坐标系后,会丢失深度维度。双目相机可以通过视差恢复深度,而单目相机必须依赖几何约束、先验信息或学习方法。
  • 精度问题。目前单目相机测距方案大致分为两类:一类依赖透视法则,也就是小孔成像原理;另一类依赖深度学习,让网络从图像中学习深度线索。前者依赖标定和假设条件,后者依赖数据分布和泛化能力。

单目相机测距的思路

  • 利用目标与道路平面的接地点,局限是相机俯仰角和道路坡度会造成误差。
  • 利用目标的平均高度或宽度,局限是不同目标尺寸差异较大。
  • 利用尺度变化估计 TTC(Time To Collision),局限是它更偏向碰撞时间估计,不是严格意义上的绝对测距。
  • 利用运动立体(Motion Stereo),局限是依赖已知相机运动或静态场景假设,动态目标会增加估计难度,精度也容易受噪声影响。

MobileEye

ME 测距

MobileEye 算法利用图像中车与路面的接触点进行测距,基于以下两个假设:

  • 道路是平的。
  • 相机光轴与路面平行。
ME 测距

图中 \textstyle P 为相机所在位置,\textstyle f 为焦距,\textstyle H 为相机高度,投影到图像上的高度为 \textstyle y

\textstyle A 为安装相机的车辆,\textstyle BC 为路面上的目标车辆。

\textstyle y = \frac{fH}{Z}

检测到前车与路面的接触点后,就可以计算距离。这个接触点一般可以近似认为是深度学习检测器(比如 YOLO)输出的 bbox 底部框线。

\textstyle Z = \frac{fH}{y}

测距误差

假设地面接触点的像素误差为 \textstyle n 个 pixel,那么距离误差为:

\textstyle Z_{\text{err}} = Z_n - Z = \frac{fH}{y+n} - Z

\textstyle y = \frac{fH}{Z} 代入可得:

\textstyle Z_{\text{err}} = \frac{fH}{\frac{fH}{Z}+n} - Z = -\frac{nZ^2}{fH+nZ}

如果只关心误差大小,则有:

\textstyle |Z_{\text{err}}| = \frac{nZ^2}{fH+nZ}

一般来说,\textstyle fH \gg nZ,因此:

\textstyle |Z_{\text{err}}| \approx \frac{nZ^2}{fH}

可见,测距误差会随着距离按二次方增长,而误差比例会随着距离近似线性增长。

相对速度

相对速度可以表示为两次测量时刻的距离差除以时间差:

\textstyle v = \frac{\Delta Z}{\Delta t}

既然两个时刻测量的距离 \textstyle Z 都存在噪声,那么距离差也不会准确。因此,可以使用目标尺寸变化来估计相对速度。设 \textstyle W 为车辆实际宽度,\textstyle w\textstyle w' 为两个时刻图像中的车辆宽度,由小孔成像原理可得:

\textstyle w = \frac{fW}{Z}
\textstyle w' = \frac{fW}{Z'}

因此:

\textstyle v = \frac{\Delta Z}{\Delta t} = \frac{Z' - Z}{\Delta t} = \frac{\frac{fW}{w'} - \frac{fW}{w}}{\Delta t} = \frac{fW\frac{w-w'}{w'w}}{\Delta t} = \frac{Z\frac{w-w'}{w'}}{\Delta t}

定义:

\textstyle s = \frac{w-w'}{w'}

可以得到:

\textstyle v = \frac{Zs}{\Delta t}

需要注意,这里的 \textstyle v = \frac{Z' - Z}{\Delta t} 是带符号的相对速度。如果目标靠近本车,通常 \textstyle Z' < Z,此时 \textstyle v 为负;如果希望表达接近速度,可以取相反符号或使用绝对值。

也就是说,根据两个时刻 \textstyle t_1,t_2 的像素检测宽度,以及 \textstyle t_1 时刻的距离 \textstyle Z,就可以估计相对速度。

CNN 测距

单目相机仅凭单张图像通常无法无先验地恢复绝对尺度,因此需要依靠几何约束、目标尺寸、相机安装高度、道路平面假设或数据驱动的先验信息。

CNN 测距
  • \textstyle \cfrac{h}{H} = \cfrac{f}{Z},即 \textstyle Z = \cfrac{Hf}{h}。需要知道现实世界中的车宽或车高,然后通过物体在图像中的像素高度换算实际距离。直观地讲,物体是近大远小的。
  • \textstyle \cfrac{y}{Y} = \cfrac{f}{Z},即 \textstyle Z = \cfrac{Yf}{y}。需要知道相机距离地面的安装高度,以及图像中车轮与地面接触点的纵坐标。直观地讲,在一条平直道路上,越近的物体纵坐标越靠图像下方,越远的物体越靠图像上方。

Tom van DijkGuido de Croon 在论文 How Do Neural Networks See Depth in Single Images? 中探讨了基于深度学习的单目深度估计算法的局限性。

位置和缩放

下图在一张真实道路图片中加入了一个假的车辆贴图,并改变它的位置和大小。第一行同时改变位置和大小;第二行仅改变位置,物体大小不缩放;第三行仅改变大小,不改变物体位置。

CNN 单目测距位置和缩放

下图显示了 CNN 的输出。可以看出,仅改变 size 时,CNN 的测距能力明显下降;而同时改变位置和大小,或仅改变位置时,网络仍然能够给出较合理的深度变化。因此可以得到一个结论:CNN 更主要依赖物体在图像中的纵坐标,而不是仅依赖物体长宽来进行测距。

原文:These results suggest that the neural networks rely primarily on the vertical position of objects rather than their apparent size, although some change in behavior is observed when the size information is removed.

CNN 单目测距位置和缩放结果

相机位姿

关于相机位姿(camera pose)对测距的影响,一个 robust 的算法应该对相机位姿变化具有一定不变性。作者对 pitch 和 roll 角度扰动进行了分析。首先,通过裁剪(crop)图片来模拟相机 pitch 的变化:

CNN 单目测距相机位姿

作者使用 robust fitting 的方法,通过预测出的深度图得到地平线位置。可以看到,CNN 预测出的深度图能够部分反映地平线位置变化,但效果并不理想。根据前面的分析,CNN 计算深度时依赖物体接地点的纵坐标,所以预测深度会随着 crop 位置变化而变化,即便实际场景本身没有变化。

CNN 单目测距相机位姿结果 1 CNN 单目测距相机位姿结果 2

下图模拟了对 roll 角度的分析。可以看出,CNN 预测的深度图和 roll 角也有较强相关性。

CNN 单目测距 Roll 角 CNN 单目测距 Roll 角结果

颜色和材质

第三部分,作者验证了 CNN 对颜色和材质的不变性。下图可以看出,正确颜色、灰度图、错误颜色都能在深度预测中取得比较接近原图的结果;但是如果使用平均颜色或者 RGB 分割颜色,预测结果会变得非常不准确。

Error values for images that keep the value channel intact (grayscale and false colors) are close to the unmodified values. Images where the value information is removed and the objects are replaced with flat colors (semantic rgb, class-average colors) perform significantly worse.

颜色和材质

形状和边缘

随后作者又研究了形状和边缘对检测的影响。从下图可以看出,去除汽车的中心部分对检测没有明显影响,汽车底部和侧面的边缘似乎对检测影响最大。

形状和边缘

此外,从下图可以看出,阴影对 CNN 测距的影响较大。原本不能检测到的冰箱和狗这些粘贴目标,也可以被检测到了。

形状和边缘 2
形状和边缘 3

总结:基于 CNN 的深度估计,本质上是在训练数据中学习和深度相关的线索。这些线索可能来自物体位置、地平线、阴影、边缘、颜色亮度或场景布局,但它们未必是真正稳定的几何约束。因此,这类方法在分布外场景中的泛化能力容易受限。

更稳妥的思路,是用 geometry 方法完成不同位置下的深度估计,或者通过先验信息预测绝对尺度,再融合几何信息和学习结果,得到更 robust 的深度估计。另一方面,也可以采集更稳定的物理量,例如车型尺寸、车道线、地平线、相机外参等信息,再结合 geometry 信息得到深度。

待验证

  1. 既然 CNN 对 crop 和 rotation 很敏感,那么如果训练时使用 random crop 和 random rotation 这类 data augmentation,CNN 依赖的深度线索是否会发生变化?
  2. 如果显式加入相机外参、地平线或道路平面约束,能否降低 CNN 对图像纵坐标和场景偏置的依赖?

参考文章

[1] 单目测距那些事儿(上)| 从 MobileEye 谈起

[2] 单目测距那些事儿(下)| 突破相机平视假设

[3] Monocular 3D Object Detection in Autonomous Driving: A Review

[4] Vision-based ACC with a Single Camera: Bounds on Range and Range Rate Accuracy

[5] CNN 是靠什么线索学习到深度信息的?一个经验性探索

[6] How Do Neural Networks See Depth in Single Images?

[7] 从对极几何恢复相机运动

[8] A Distance Estimation Method Based on Monocular Vision