1 前言
笔者在专栏《自动驾驶Planning模块》中已经详细讲解了传统自动驾驶Planning模块的内容:包括行车的Behavior Planning和Motion Planning,以及低速记忆泊车的Planning(最开始有15篇,目前逐渐更新到17篇)。读者对整个传统的自动驾驶Planning模块的内容也有了一个清晰的认识。
在之前的技术普及类博客《自动驾驶---Tesla之FSD简介》中,笔者也曾简单阐述了特斯拉自动驾驶目前的两个等级:AutoPilot和FSD,并介绍了这两个功能的特点。目前特斯拉基本代表自动驾驶量产技术的最高水平,因此通过了解特斯拉的技术发展,对于国内自动驾驶量产从业者也有较大的帮助。
在本篇博客中,笔者将详细介绍特斯拉是如何从早期传统的自动驾驶系统迁移到完整的端到端自动驾驶系统。
前排提示:篇幅较长,耐心观看;不妥之处,欢迎讨论。
2 FSD迭代进程
本篇博客主要通过以下3个时间节点来阐述特斯拉FSD的进化史,主要参考了特斯拉每年AI Day的内容。
- 特斯拉在2021年:推出HydraNets和BEV
- 特斯拉在2022年:增加Occupancy网络
- 特斯拉在2023年:向端到端过渡
从技术发展的迭代过程中会发现:特斯拉实际上已经为端到端做好了很长时间的准备。以下的每一个点都是一个很大的技术方案,笔者受限于掌握的知识深度,不能涉及到每一个技术的细节,尽量从宏观上让读者更容易明白。技术细节后面会进一步整理之后再慢慢阐述给各位读者朋友们。
2.1 时间点:2021年
首先说说特斯拉感知模块,特斯拉感知的发展历程,也正是国内很多自动驾驶大厂或者主机厂的发展迭代的过程,像无图方案(无高精地图),BEV,Occupancy等,基本都是在引领着量产技术的潮流,因此特斯拉举办的AI Day也算是自动驾驶量产技术的盛宴了。
2.1.1 传感器
特斯拉摄像头(一共8个)布局如下,当然早期还有雷达(后续舍弃)。
特斯拉自动驾驶负责人是这样解释去掉雷达的原因。
"The reason people are squeamish about using Vision is [...] people are not certain if neural networks are able to do range finding of depth estimation of these objects. So obviously humans drive around with vision, so obviously our neural net is able to process the inputs to understand depth and velocity of all the objects around us." Andrej Karpathy
2.1.2 数据标注
为了训练神经网络来预测深度,需要一个包含数百万视频的庞大数据集。如何收集呢?这就体现出特斯拉的优势了,每天都有成千上万的车主开着特斯拉,因此特斯拉的数据集是非常容易获取的。
但是如何给数千小时的视频贴标签呢?特斯拉使用神经网络,并且标签在某种程度上是半监督的。特斯拉开始离线进行自动标注,这样做有几个优点,神经网络可以是超重型的,甚至可以组合雷达或激光雷达输入。
2.1.3 网络训练
一旦数据集标注完毕,就可以使用这些数据集进行神经网络的训练了。
下面详细说明整个原理:
- 所有8幅图像首先由图像提取器进行处理。为此,使用了类似于ResNets(残差网络)的体系结构。
- 然后,有一个多载波融合。这个想法是将所有8个图像组合成一个超级图像。为此,九头蛇使用了类似Transformer的架构。
- 再就是时间融合。其想法是将时间带入等式,并将超级图像与之前的所有超级图像融合。为此,有一个由N个图像组成的视频队列。例如,如果他们想用2秒融合,并且假设相机以每秒36帧的速度工作,N将是72。时间融合是用3D CNN、RNN和Transformer完成的。
- 最后,将输出拆分为HEADS。每个头都负责一个特定的用例,并且可以自己进行微调。如果说头过去只是头,那么它们现在有了主干(trunk)和终端(terminals)。这是一种更深入、更具体地了解用例类型的方法。每个终端都可以处理自己的任务(行人检测、红绿灯等)。
需要注意的是,整个过程被一分为二:有两个时间融合过程,两个蓝色的头和两个绿色的头。这实际上是一种表明神经网络在两个芯片上并行运行的方式,推测是为了安全做的冗余备份。
2.1.4 HydraNets
特斯拉的自动驾驶系统起步时,其感知模块依赖于Mobileye系统。同时也在推出HydraNets,整体架构图如下,这8个图像都是使用共享主干(Backbone)进行同步和融合的。然后,可以定制使用多个“头”(Objects,Traffic Lights,Markings等)。这种结构就是特斯拉所说的HydraNets:几个头,一个身体。
这种结构的优点是,可以针对特定的用例(如障碍物检测)微调神经网络,而不会干扰其他任务(车道线等)。特斯拉不需要激光雷达,因为这些传感器的成本和尺寸,系统是由摄像头和雷达组成的。
2.1.5 Bird-Eye-View
同时在2021年Tesla AI Day,Andrej Karpathy 介绍了Bird-Eye-View概念。
自动驾驶感知中的BEV(Bird's-Eye-View),即鸟瞰视图,是一种在自动驾驶领域中广泛使用的环境感知方法。它模拟了从车辆正上方垂直向下观看地面的视角,能够提供一个全面、清晰且空间一致性的环境感知视图。以下是关于自动驾驶感知BEV的介绍:
(1)工作原理
BEV算法主要将来自不同传感器(特斯拉主要是摄像头)的数据转换为车辆正上方俯瞰视角下的统一表示。这种转换涉及到图像到点云投影、坐标变换以及特征融合与映射等步骤。
- 图像到点云投影:对于视觉传感器,如摄像头,首先通过立体匹配、单目或多目深度估计等技术获取场景的三维信息,然后将这些信息投影到车辆坐标系下的垂直平面上,生成点云数据。
- 坐标变换:车载传感器的数据通常需要从各自传感器坐标系下转换到全局或车辆坐标系下,这涉及到坐标变换和校准过程。
- 特征融合与映射:在BEV空间上进行多传感器数据的融合,提取特征,如使用卷积神经网络或Transformer架构对这些特征进行处理,以生成BEV特征图。
(2)优点
- 全面的环境视图:BEV提供了车辆周围环境的全面视图,使得自动驾驶汽车能够更准确地感知和理解周围环境。
- 无遮挡或缩放问题:与2D感知相比,BEV不存在遮挡或缩放问题,能够更好地处理交叉或遮挡的车辆等复杂场景。
- 空间一致性:BEV提供了空间一致性的视图,有利于后续模块(如规划)的开发和部署。
- 全局视野:BEV能提供车辆周围较大范围的全景视野,不受单一传感器视线局限,对于复杂路口、交叉口以及交通拥堵等场景尤其重要。
2.1.6 Planning
在2021年的AI day上,特斯拉介绍了三种规划方法:
(1)传统的A*算法
在特定场景下,搜索节点到44000个才能完成搜索过程。A*的算法讲解可参考笔者之前写过的博客文章《自动驾驶---OpenSpace之Hybrid A*规划算法》,两者有着比较高的相似度。
(2)通过导航信息增强版的A*算法
这种方法不是传统的调整“启发式”函数,而是更多的输入(具体细节没有透露)。优化完成只需要22000个节点就能完成搜索过程。
(3)神经网络增强版的MCTS算法
通过将神经网络与传统的树搜索相结合,它可以达到少于300个节点的目标。
基于蒙特卡洛树搜索的方法可参考笔者之前的博客《自动驾驶---Behavior Planning之MCTS》。目前还没看到Tesla发表的MCTS与神经网络结合相关的论文。
特斯拉2021年感知和规控的整体架构如下图所示:
2.2 时间点:2022年
在2022年,特斯拉推出了一种新算法,称作 “占用网络”(Occupancy)。因为使用了占用网络,特斯拉自动驾驶系统不仅能够提高感知能力,还能够提升规划能力。特斯拉在2022年所做的就是在Perception模块中添加一个占用网络,因此将Perception模块分为两个子块:第一个是HydraNets,用于查找物体、标志、车道线等,第二个是占用网络,在3D世界中查找占用块。
2.2.1 Occupancy
在讲解Occupancy之前,先理解为什么要使用Occupancy?
如果自动驾驶车辆在行驶过程中看到的物体不是数据集的一部分,这个时候容易出现误判。
而在基于激光雷达的系统中,由于检测到点云,可以确定障碍物的存在,但是在相机系统中,必须首先使用神经网络检测物体,仅凭这一点就造成了许多事故。
注意上图中列出的几个问题:
- 对水平线上的深度非常敏感,只有2个左右的像素决定了一个大区域的深度。
- 不可能透过遮挡物进行检测,也不可能驶过车辆。
- 所提供的结构是二维的,但世界是三维的。
- 对于悬挂的障碍物,通常会进行分类,然后设置成固定的矩形障碍物。
- 可能存在裂缝、坑等非标注的场景,无法检测(它不是数据集的一部分)。
(1)概念
占用网络是一种不同的算法,基于机器人的思想命名为占用网格映射;它包括将世界划分为一个网格单元,然后定义哪个单元被占用,哪个单元是安全的。
首先,Occupancy Network的工作原理是将来自多视图图像的输入数据转换为一个三维特征空间。然后,它使用深度神经网络来学习这个特征空间中的占用概率。最后,Occupancy Network将这些占用概率转换为一个三维占用网格,这个网格可以精确地表示车辆周围环境中的障碍物和其它元素。
参照下图所示,整个Occupancy的过程如下描述:
- 首先,摄像头数据被发送到由Regnets和BiFPN组成的主干网(这些都是2022年最先进的特征提取器)。
- 然后,注意力机制模块进行位置图像编码(这里起始就是Transformer神经网络),并使用关键字、值和固定查询(汽车与非汽车、公共汽车与非公共汽车、交通标志与非交通标志)来生成占用特征量。
- 接着产生了一个占用特征体,然后将其与之前的占用体(t-1、t-2等)融合,以获得4D占用网格。
- 最后,使用去卷积来检索原始大小,并获得两个输出:占用体和占用流。
(2)Occupancy Flow
占用体比较容易理解,占用流似乎不是那么容易理解,这里其实也涉及到预测的概念了,一辆车在摄像头视频数据里的移动,是如何体现到像素的变化里。
为了做到这一点,使用了“光流”的技术。如果熟悉传统的计算机视觉,不少读者应该知道“光流”是什么意思。但其它领域的人(包括笔者)对这个概念不是很清晰,上网搜索了一番。
光流是像素在时间上的运动。它可以通过传统方法或深度学习技术进行计算。得益于光流,可以使用该运动创建flow MAPS,描述每个像素在时间上的运动。流图的一个例子,每种颜色代表一个“方向”。
在分割图之后,对图像的每个像素进行分类,即深度图,它拍摄两个立体图像,并找到每个像素的深度。以两个连续的图像作为输入,可以得到运动矢量。
最终呈现的效果如下(红色:向前,蓝色:向后,灰色:静止,等等)。
(3)NeRFs
由于占用网络会生成3D占用体,然后可以将这些3D体与3D重建体(离线训练出来的)进行比较,从而比较重建的3D场景是否与“地图”(NeRF产生的3D重建)匹配。在这些重建过程中也可能出现图像模糊、下雨、大雾等问题。为了解决这一问题,特斯拉使用车队(众多特斯拉的社会车辆)的数据进行平均(每次车辆看到场景时,都会更新全局3D重建场景)。
下面简单介绍一下NeRFs(神经辐射场)的概念:
NeRFs(神经辐射场)是一种先进的计算机图形学和计算机视觉技术,它利用深度学习模型通过连续的3D函数来表示3D对象或场景。与传统的依赖点云或网格表示的方法不同,NeRFs通过将底层场景建模为神经网络来生成逼真的重建。
NeRFs的核心思想是通过训练神经网络来学习场景的体积密度和颜色,从而能够渲染出从任意角度观察场景时的图像。这种技术使得我们能够以更高的精度和逼真度来捕捉和再现真实世界的三维物体和环境。
(2)应用
在自动驾驶系统中,Occupancy Network主要用于以下任务:
- 障碍物检测:Occupancy Network能够检测车辆周围的障碍物,包括其他车辆、行人、骑自行车者等。这对于自动驾驶汽车来说至关重要,因为它需要准确地知道周围环境中的障碍物,以便进行安全的路径规划和车辆控制。
- 路径规划:Occupancy Network可以生成车辆的路径,并确保该路径避开障碍物。这使得自动驾驶汽车能够在复杂的环境中安全地行驶,同时考虑到其他交通参与者和潜在的障碍物。
Occupancy Network通常与Bird's Eye View(BEV)图像一起使用,BEV图像提供了从车辆上方俯瞰的场景视图,包括车辆前方、后方、两侧和顶部。通过使用BEV图像和Occupancy Network,自动驾驶汽车可以获得一个全面且准确的环境感知能力,这对于实现安全的自动驾驶至关重要。
针对比较特殊的障碍物(类似液压支撑臂),可以看下OCC的效果。
再看一个例子,如果你的数据集里没有对类似的物体进行标注,就可能出现危险。
新的占用网络通过实现3个核心技术来解决上述遇到的这些问题:BEV图、占用检测和Voxels分类(通过三维被占网格的形状可训练得到是哪一种类型障碍物,检测类别可能错误,但是不会漏检)。
2.2.2 HydraNets 2.0
HydraNets与2021年没有太大区别,只是它有一个额外的“Head”,是一个完整的神经网络来执行车道线检测任务。
在2022年特斯拉整个感知模块的整体架构如下所示(Occupancy用于3D建模,HydraNets 2.0用于车道线以及障碍物的检测):
2.2.3 Planning
Planning的流程如下,其实这个和国内很多自动驾驶公司的方案差不多,笔者在《自动驾驶Planning模块》专栏中基本做过介绍,区别主要在于内部的算法使用。
最初的神经网络规划已经不错了,但现在感知的输出中新增了Occupancy占用网格。因此在新的规划模块将占用体和车道集成到由蒙特卡洛树搜索和神经网络组成的架构中。为了理解搜索树的逻辑,以特斯拉在2022年AI Day上给出的例子(路口出现行人)。
蒙特卡洛树搜索(MCTS)的作用前面已经阐述过,这里就不多说了。然后重点说一说规划器里神经网络的作用,从特斯拉AI Day中可以得到的信息,全局规划似乎没有再使用之前的A*算法,而是直接使用MCTS作为全局规划的结果,在MCTS中插入自定义的代价函数,并且特斯拉应该用的是神经网络训练出的代价函数,原因是神经网络能够吸收场景的全局上下文,然后产生一个价值函数,有效地引导它向走向全局最小值,而不是陷入局部最小值,能够比较快的搜索到目标终点(感慨特斯拉学术量产的能力)。
通过对决策轨迹的打分来选择轨迹,如下有两种选择:
(1)在行人未走到左转车道之前,自车加速左转;
(2)在行人穿过左转车道之后,自车减速左转;
最终根据以下四个点去选择轨迹:
- 碰撞检测
- 舒适性
- 干预可能性
- 类人驾驶
2022年特斯拉整个Planning的架构如下图所示:
那么,再把感知和规控的架构放一起,整个特斯拉2022年自动驾驶的架构图如下:
2.3 时间点:2023年
在2023年,特斯拉在FSD v12版本完成了End-To-End 架构的切换。什么是端到端自动驾驶?端到端的自动驾驶方法将感知和决策集成在一个统一的模型中,通过直接学习从图像到驾驶行为的映射,简化了问题复杂性,提高了计算效率。
因此,特斯拉做了两件事:
(1)训练每个模块的深度神经网络;
(2)端到端模型将这些神经网络组装在一起。
2.3.1 Deep Learning
在这篇博客 《自动驾驶---End-to-end用于Planning行为规划》中,笔者大概介绍了Deep Learning的基本过程。在目前的自动驾驶中,Transformer神经网络逐渐被广泛使用。
2.3.2 End-to-end
有了多层的神经网络,如何将其合在一起又或者如何去训练数据呢?
因此,主要的区别不在于模块本身,而在于它们是如何训练和优化的。在端到端系统中,模块被联合优化以实现单个总体目标。在非端到端系统中,每个块都是单独优化的,而不考虑较大系统的目标。
看起来现在更像一个黑盒,但可以看到是如何使用占用网络和多头神经网络的,特斯拉把这些元素组装在一起。虽然这是一个黑盒,但是可以在任何时间点可视化Occupany的输出,可视化Object Detection的输出,直观Planning的输出等等。也可以单独训练这些元素,然后以端到端的方式进行微调。(具体的内容官方没有公布)
特斯拉并不是唯一家做端到端的公司,虽然目前量产的公司不多。而Elon Musk在社交平台上表达过:使用端到端方法,不再需要“告诉”车辆在红灯或停车标志处停车,也不再在变道前验证决策,这辆车通过“模仿”训练使用的1000万视频中的司机,自己去解决车辆行驶过程中遇到的问题。
因此,特斯拉一直在使用1000万视频(数据量会越来越多)的数据集,然后对每一个视频的驾驶员进行评分,并训练机器模仿“好驾驶员”的行为。理论上来说这个潜力是巨大的,可能会比普通人类司机的驾驶更优秀,因为模型在面对未知场景时可以更好地驾驶——它会在训练中找到最接近的行为,而不是停滞不前。
3 总结
通过本篇博客,读者朋友们可以了解到特斯拉在近几年自动驾驶发展的过程,可以看到,其实特斯拉并不是直接进行端到端的研究,通过感知的端到端,再到规控的端到端,都是逐步切入的,有一个发展过程。同时也钦佩特斯拉的勇气,敢于使用前沿的技术,并将其落地量产。