作者:EatElephant
Tesla AI Day 过去已经 4 个多月,其介绍的很多前卫理念和超级详细的技术方案细节都成为全球自动驾驶从业者津津乐道的话题与专研的方向。这段时间以来我重复看了几遍 AI Day 的视频资料,也看了不少中英文分析解读的文章,一直希望能找机会把我对 AI Day 的理解和解读写成文章分享出来,可是因为拖延症一拖再拖,虽然拖了这么久,可至今 AI Day 上 Tesla 展现的技术创新仍旧走在自动驾驶视觉感知技术的最前沿,所以希望通过这篇文章能够让更多人了解如今自动驾驶车端感知技术的前沿发展动态。

Tesla 感知技术的进化
通过 Tesla 不可谓不频繁的技术分享可以发现,Tesla 的感知技术每隔一段时间都会对自己已有的技术栈进行一次重大革新,根据截至到文章撰写时刻所透漏的 Tesla 感知技术方案,我把这个技术不断迭代更新的过程分成三个重要阶段:以 HydraNet 为代表的第一次革新,以 BEV Layer 为代表的第二次革新,以及以时空序列 Feature 处理模块为代表第三次革新,下面将分别予以详细介绍。
HydraNet:共享特征的多任务网络
截至到目前,大多数学术研究中的网络模型为了便于与其他研究成果进行比较,且受限于有限的资源、时间,基本上都使用一套公开数据集,为了一个具体的目标(目标检测,语义分割,实例分割,深度估计等等)设计一套类似下图的网络架构,具有 Backbone(主干)和 Neck(颈部)两部分进行特征提取,以及 Head(头部)部分根据任务具体类型给出任务需求的输出。

然而要想让车理解交通环境从而能自主地在人类的交通设施下完成自动驾驶,AI 就必须同时掌握数量众多的感知任务(例如:车辆、行人、自行车检测,车道线分割,可通行区域分割,红绿灯、标志牌检测,视觉深度估计,异形障碍物检测等等),使用有限的车端计算资源不可能为每一项任务单独设计一路网络,而且人们发现位于网络低层的 Backbone,Neck 等主要提取一些具有通用性质的视觉特征,在不同任务中共用反而有助于最终感知任务的完成,因此自动驾驶行业从业者普遍采用共享用于特征提取的主干的多头(Multi-head)网络作为自动驾驶感知模块的网络结构,这样一方面能够利用共享主干节省大量重复近似的特征提取计算,同时可以在主干参数保持不变或者较少参与更新的情况下相对独立地优化各个 Head 的性能以满足自动驾驶的需求。
Tesla 在为了研发 FSD 对代码进行彻底的重构之前使用的也是这样的技术方案,而这也是目前绝大多数一线自动驾驶公司所达到的技术水平了。Tesla 与其他众多公司处于这一阶段的公司的差异主要体现在 Head 种类的多少上,根据 2020 年上半年 Andrej Karparthy 的技术分享,当时 Tesla 大概有 1000 多个 Head 来解决各种各样的自动驾驶感知任务类别,这 1000 多个 Head 又可归类于包括但不局限于下面分类的超过 50 个大的感知类别 Task 中:
-
Moving Objects: Pedestrian, Cars, Bicycles, Animals, etc.
-
Static Objects: Road signs, Lane lines, Road Markings, Traffic Lights, Overhead Signs, Cross-Walks, Curbs, etc.
-
Environment Tags: School Zone, Residential Area, Tunnel, Toll booth, etc
正因为有着如此之多 Heads,Tesla 给自己的神经网络模型起名叫做 HydraNet,寓意一个主干,多个头,不可谓不形象。然而最近在 Lex 的采访中,Elon Musk 提到 HydraNet 时候表现出不是很喜欢这个名称,称总有一天会给 FSD 的神经网络取一个新名字,我们拭目以待。我在之前的一篇文章中曾经很详细的介绍过 HydraNet 的特点,以及 Tesla 训练 HydraNet 的一些最佳实践和挑战,感兴趣可以移步解读: Tesla Autopilot 技术架构进一步研究,这里不再赘述。

BEV Layer:FSD 感知的空间理解能力
FSD 发布前的 Autopilot 的以及目前主流的自动驾驶感知神经网络结构都采用了类似 HydraNet 的共享主干多头结构,但是他们的问题在于整个感知都是在图像所在的 Image Space (即图像空间)下进行的。相机图像所在的 Image Space 是一个 2D 像素世界,然而所有自动驾驶的决策和路径规划都是在车辆所在的 3D 世界下进行的,这样的维度不匹配就使得基于感知结果直接进行自动驾驶变得异常困难。
打个比方,开车的新手大多有体会,刚学倒车的时候利用后视镜观察到的场景很难直观的构建车子与周围环境的空间联系,因此新手靠倒车镜很容易发生误操作造成剐蹭,这其实就是缺乏从倒视镜图像平面到自车坐标系空间转换的空间理解能力造成的。
因此一个只能在相机图像平面进行感知的自动驾驶 AI 就好比缺乏空间理解力的驾驶新手,很难完成把车开好的难题,这时候很多公司就选择使用毫米波雷达,激光雷达这类具有深度测量能力的传感器,通过他们与相机结合来帮助相机把图像平面感知结果转换到自车所在的 3D 世界,这个 3D 世界用专业的术语叫做自车坐标系,如果忽略高程信息,那么很多人也管拍扁后的自车坐标系叫做 BEV 坐标系(即鸟瞰俯视图坐标系)。

然而就像 Elon Musk 说的那样,人类不是超人,也不是蝙蝠侠,不能够眼放激光,也不装备有雷达,但是通过眼睛捕捉到的图像,人类依旧可以构建出对周围世界的 3D 空间理解能力从而很好地掌握驾驶这项能力,那么要像人一样单纯利用眼睛(相机)进行自动驾驶就必须具备从 2D 图像平面到 3D 自车空间的转换能力。
传统方案利用相机外参以及地面平面假设便可使用称作 IPM(Inverse Perspective Mapping) 的方法将图像平面的感知结果反投影回自车 BEV 坐标系,Tesla 原本的方案也是这么做的,然而当地面不满足平面假说,且多相机视野关联受到各种复杂环境影响的时候,这类方法就会变得越来越难以维护。

出于 IPM 方法遇到的困难,Andrej Karparthy 和他的团队开始尝试直接在神经网络中完成图像平面到 BEV 的空间变换,这一改变则成为了 2020 年 10 月发布的 FSD Beta 与之前的 Autopilot 产品最为显著的不同之处。
因为视觉感知输入的图片本就在相机 2D 平面内,而 2D 图像平面与自车 BEV 存在尺寸和维度上的不统一,要在神经网络模型内部进行图像平面到 BEV 的空间变换最重要的就是要找到方法进行神经网络内部的 Feature Map 的空间尺度上变换。
主流的能进行空间尺度上变换的神经网络操作主要有 MLP 中 Fully Connected Layer 和 Transformer 中 Cross Attention 两种办法,如下图所示(图片引用自 towardsdatascience.com/),二者都可以改变输入量的空间尺度,从而达到进行尺度变换的目的。

本来目标是尽量少摆公式把道理讲明白,但是 BEV 转换本身是一个尺度层面的数学变换,不摆公式很难讲的清楚,这里利用公式说明下:
Fully Connected Layer :

忽略非线性激活函数和 bias 后

Cross Attention:

这里 K,V 是输入 X 经线性变换后得到的,Q 是输出空间上的索引量 图片 经线性变换得到的,对公式稍作修改可以得到 :

在进行 BEV 变换的过程实际上就是利用两个操作中的任意一个将输入的 2D 图像空间的特征图层转换到 BEV 自车坐标下的特征图层的过程。因此假设通过多层 CNN 特征提取,图像空间特征图层尺度即这里 X 的尺度,为图像的高乘宽,输出 O 所在的 BEV 空间尺度则是以自车位置为原点的前后左右各若干米范围内建立的栅格空间。
对比可见,Fully Connect Layer 和 Cross Attention 的最大不同实际在于作用于输入量 X 的系数 W,全联接层的 W 一旦训练结束后在 Inference 阶段是固定不变的,而采用 Cross Attention 的 Transformer 的 X 的系数 W 是一个输入量 X 和索引量 图片 的函数,在 Inference 阶段会根据输出量 X 和索引量的不同发生改变,从这个角度来讲使用 Cross Attention 来进行空间尺度变换可能使模型获得更强的表达能力。因为以上原因,Tesla 在他们的方案中实际使用了 Cross Attention 的办法来实现 BEV 层。


上面两张图展示了 Tesla 基于 Transformer 的 BEV Layer 的实现方案:首先在各个相机分别通过 CNN 主干网络和 BiFPN 提取多尺度特征图层,多尺度特征图层一方面通过 MLP 层生成 Transformer 的方法中所需的 Key 和 Value,另一方面对多尺度 Feature Map 进行 Global Pooling 操作得到一个全局描述向量(即图中的 Context Summary),同时通过对目标输出 BEV 空间进行栅格化,再对每个 BEV 栅格进行位置编码,将这些位置编码与全局描述向量进行拼接(Concatenate)后再通过一层 MLP 层得到 Transformer 所需的 Query。在 Cross Attention 操作中,Query 的尺度决定最终 BEV 层之后的输出尺度(即 BEV 栅格的尺度),而 Key 和 Value 分别处于 2D 图像坐标空间下,按照 Transformer 的原理,通过 Query 和 Key 建立每个 BEV 栅格收到 2D 图像平面像素的影响权重,从而建立从 BEV 到输入图像之间的关联,再利用这些权重加权由图像平面下的特征得到的 Value,最终得到 BEV 坐标系下的 Feature Map,完成 BEV 坐标转换层的使命,后面就可以基于 BEV 下的 Feature Map 利用已经成熟的各个感知功能头来直接在 BEV 空间下进行感知了。BEV 空间下的感知结果与决策规划所在的坐标系是统一的,因此感知与后续模块就通过 BEV 变换紧密地联系到了一起。

通过这种方法,实际上相机外参以及地面几何形状的变化都在训练过程中被神经网络模型内化在参数里边。这里存在的一个问题就是使用同一套模型参数的不同车子的相机外参存在微小的差异,Karparthy 在 AI Day 上补充了一个 Tesla 应对外参差异的方法:他们利用标定出来的外参将每辆车采集到的图像通过去畸变,旋转,恢复畸变的办法统一转换到同样一套虚拟标准相机的布设位置,从而消除了不同车相机外参的微小差别。

BEV 网络的优势不仅在于可以使用感知输出直接进行决策规划,BEV 的方法还是一个非常有效的多相机融合框架,通过 BEV 的方案,原本很难进行正确关联的跨多个相机的近处的大目标的尺寸估计和追踪都变得更加准确、稳定,同时这种方案也使得算法对于某一个或几个相机短时间的遮挡,丢失有了更强的鲁棒性。

时空序列 Feature:为自动驾驶智能增添短期记忆
BEV 的使用奠定了 Tesla FSD 在视觉感知的领先地位,然而单纯依靠 HydraNet 和 BEV 仍会因为只是用了单一时刻的多张图像作为感知输入而存在连续信息丢失的问题。人对于速度,对于空间的感知很多来自时间维度,好比一个老司机可以在一个熟悉的场景里的很好的完成驾驶任务,但是如果把这个场景中录下的视频拆成乱序的单帧图片,再问这个老司机在其中一张图片里应该怎么打方向盘,怎么踩油门刹车,那恐怕老司机也要被难倒了。老司机无法对单帧图像给出驾驶操作的原因在于熟悉连续数据处理的人脑在单帧图像里无法形成很好的空间概念也无法处理周围物体的速度,轨迹等跟时间相关的信息,因此我们的驾驶技能就没法正常工作。
同样的道理,FSD 也需要具备处理连续的时空序列数据的能力,才能正确处理如城市环境下常见的闪烁的交通灯,分辨参与交通的临时停车和路边的静止车辆,预测周围物体与自车的相对速度,根据历史信息预测参与交通的物体可能的运行轨迹,解决段时间遮挡问题,记忆刚刚开过的速度标识,车道行驶方向等等。换句话说,FSD 需要被赋予短期记忆。

人类的记忆究竟是如何工作的仍旧是脑科学中未解的谜题之一,因此 AI 算法至今仍旧无法重构人类的长期记忆能力。不过 Tesla 希望通过使用具有时序信息的视频片段替代图像对神经网络进行训练,从而使感知模型具有短时间的记忆的能力,实现这个功能的方法是分别引入时间维度和空间维度上的特征队列进入神经网络模型。针对为什么需要空间维度的特征队列 Karparthy 举了一个例子,如果车子行驶到红绿灯路口停止,车子在到达路口前观察到了各车道允许行驶方向的箭头,然而如果单纯依靠时间队列,那么当红灯非常长的时候,前面时刻观察到的车道方向终究会被遗忘,但如果引入空间队列,那么由于红灯下车子没动,无论在红绿灯路口停止多久,空间队列仍能保留对前面观察到的车道行驶方向的记忆。

对于如何融合时序信息,Tesla 尝试了三种主流的方案:3D 卷积,Transformer 以及 RNN。这三种方法都需要把自车运动信息与单帧感知结合起来,Karparthy 表示自车运动信息只使用了包括速度和加速度的四维信息,这些运动信息可以从 IMU 中获取,然后与 BEV 空间下的 Feature Map (20x80x256) 还有 Positional Encoding 相结合 (Concatenate),形成 20x80x300x12 维的特征向量队列,这里第三维由 256 维视觉特征 + 4 维运动学特征(vx, vy, ax, ay) 以及 40 维位置编码(Positional Encoding)构成,因此 300 = 256 + 4 + 40,最后一维是降采样过后的 12 帧时间 / 空间维度。


3D Conv, Transformer,RNN 都能处理序列信息,三者在不同任务上各有长短,但大部分时间采用哪个方案其实区别不大,然而 AI Day 上 Karparthy 另外分享了一个简单有效,而且效果十分有趣可解释的方案叫做 Spatial RNN。与上面三个方法有所不同,Spatial RNN 由于 RNN 原本就是串行处理序列信息,帧间前后顺序得以保留,因此无需将 BEV 视觉特征进行位置编码就可以直接给进 RNN 网络,因此可以看到这里输入信息就只包括 20x80x256 的 BEV 视觉 Feature Map 和 1x1x4 的自车运动信息。

Spatial 特征在 CNN 中常指图像平面上的宽高维度上的特征,这里 Spatial RNN 中的 Spatial 则指的是类似以某时刻的 BEV 坐标为基准的一个局部坐标系里的两个维度。这里为了进行说明使用了 LSTM 的 RNN 层,LSTM 的优势在于其可解释性强,这里作为例子进行理解再合适不过了。LSTM 特点在于 Hidden State 里面可以保留前面长度可变的 N 个时刻的状态的编码(也即短时记忆),然后当前时刻可以通过输入和 Hidden State 决定哪一部分记忆的状态需要被使用,哪一部分需要被遗忘等等。在 Spatial RNN 中,Hidden State 是一个比 BEV 栅格空间更大的矩形栅格区域,尺寸为(WxHxC)(见上图,WxH 大于 20x80 的 BEV 尺寸),自车运动学信息决定前后 BEV 特征分别影响的是 Hidden State 的哪一部分栅格,这样连续的 BEV 数据就会不断对 Hidden State 的大矩形区域进行更新,且每次更新的位置与自车运动相符合。这样经过连续的更新后,就形成了一个类似局部地图一样的 Hidden State Feature Map 如下图所示。


时序队列的使用赋予了神经网络获得帧间连续的感知结果的能力,与 BEV 结合后则使 FSD 获得了应对视野盲区和遮挡,选择性地对局部地图进行读写的能力,正因为有了这样的实时的局部地图构建的能力,FSD 才能不依赖高精地图进行城市中的自动驾驶。

One More Thing:Photon to Control,Tesla 用以替代 ISP 的秘密武器
AI Day 非常详细地介绍了 Tesla FSD 的感知技术栈,然而 AI Day 的时间有限,必定不可能覆盖到 FSD 所使用的所有感知技术。如果有关注 FSD Beta 测试的同学会在 FSD Release Note 中发现每个版本都有这么一条不是很好理解的特征说明,如下图所示:

这里边 photon-to-control 字面意思就是从光子到车辆控制,但是其具体含义即使是像我这样的自动驾驶行业的从业者也是一时摸不到头脑,似乎并没有任何一家自动驾驶公司使用过类似的技术,甚至这个技术的具体含义也无从得知。
好在前一段时间我非常喜欢的 Podcast 主播 Lex Fridman 在他的节目中与 Elon Musk 进行了一次长达两个半小时的访谈,在这个访谈里面 Elon 谈到了 photon-to-control 才使得这一 Tesla 独有的视觉处理技术浮出水面。
原来大多数自动驾驶公司使用 ISP(Image Signal Processing)模块在传感器获取原始图像数据后对图像进行如白平衡,动态范围调整,滤波等操作以获得最佳质量的图像,再将调整后的图像送入感知模块进行处理。这一步对于自动驾驶感知模块十分重要,因为我们的人眼是一个复杂无比的视觉传感器,能够根据周围环境的实际情况对接收的图像进行动态调节,例如调节曝光以适应明暗变化,调节聚焦以专注在不同距离的物体等等,而自动驾驶系统则通过 ISP 模块来尽量的让相机性能接近人眼。然而 ISP 最初的目的是为了在多变的外部环境下获得一张好看的图片,但什么是自动驾驶最需要的图片形式,目前仍没有定论,这就使得 ISP 在处理图像数据的时候有时候无从下手,更多时候只能依据人的判断来调节 ISP 的处理效果。
然而 Musk 认为相机采集的数据最原始的形式是通过 CMOS 传感器对通过镜头到达传感器的可见光光子(photon)进行计数,无论 ISP 采用何种处理方法,本质上会丢掉部分原始图像信息。因此不知道从什么时候开始,Tesla 开始尝试使用原始 photon 计数获得的图像用作神经网络输入,这样不仅节省了 ISP 所需消耗的算力,减少了延迟,还最大程度的保留了传感器获取的信息。根据 Musk 所说,在原始的 photon 计数图像上,即使在光线很弱的黑夜,行人反光也会造成微小的 photon 变化,最终效果是使用 photon 作为输入的感知系统不仅响应更快,延迟更低,还能获得远超人眼的超长夜间视距,如科幻小说一般实力强大。
这一切最初听起来有点科幻,但是在 Tesla FSD 的正式 Release Note 上找到 photon-to-control 的相关更新内容无疑证明了这就是 Tesla 已经应用在其产品功能中的技术。当然可以想像这样的 photon 原始数据可能很难用传统方法进行标注,因此短时间内可能还不能完全取代 ISP,但是 Tesla 在这些前沿方向的尝试对于行业里其他从业者也能起到巨大的启发作用。