3月28日,地平线在智东西公开课开设的「地平线自动驾驶技术专彻已顺利完结,地平线自动驾驶系统架构师刘景初博士围绕《上帝视角与想象力自动驾驶感知的新范式 》这一主题进行了直播讲解。
刘景初博士从自动驾驶架构演化下提出的算法新需求出发,对软件2.0下新的感知范式、BEV感知的十八般武艺以及端云一体的BEV感知开发进行了深入讲解。
本次专场分为主讲和Q&A两个环节,以下则是主讲回顾:
各位朋友大家好,我是地平线自动驾驶系统架构工程师刘景初,很高兴和大家分享地平线在感知领域的一些思考和实践。本次课程主要分为以下4个部分:
1、自动驾驶结构演化提出算法新需求
2、软件2.0下新的感知范式
3、BEV感知的十八般武艺
4、端云一体的BEV感知开发
图1
先来看一张简单的图,分享下地平线对于自动驾驶的理解。自动驾驶的目标比较简单,通常有三个:安全、舒适、效率。一般安全是第一位的,因为谁也不是希望自动驾驶出事,它是为了不出事而设计的系统。除了安全之外,是舒适和效率,对于不同的车型,这两个目标会有不一样的折衷。如果是日常生活中的乘用车,舒适应该会更重要一些,因为很多人不希望在日常通行过程中频繁体验推背感,所以舒适对于乘用车来说比较重要。最后是效率,大家都不希望为了舒适,车辆只以5迈的速度在街上行驶。更多是希望在满足安全、舒适的前提下,尽快把我们送到想去的目的地。
在一些其他场景之下,舒适和效率可能会有顺序的交换。比如一些运货的车,车上没有易碎物品,舒适性上可以稍微打折扣,在不损坏货物的前提下,急刹车或者加速是允许的,这时可以把效率的优先级提高一些。
从我个人的理解来看,自动驾驶最终要服务的系统级目标是安全、舒适、效率。为了实现这个目标,自动驾驶已经研发了数十年,典型的系统pipeline没有太多变化。在典型的pipeline中,最上游是传感器,类比于人的感官,像眼睛、耳朵、触觉等传感器;再往下游是大脑中对原始传感器信息的处理,并从中提取一些有意义的、抽象的、精简的信息,这部分一般叫做环境感知。
再往后是定位地图。如果不是熟路,车主在开车的过程中是很容易迷路的,在很多主流的自动驾驶方案中,地图或高精地图是比较重要的一环,它的基本作用是作为离线感知器,把人眼看不到、耳朵听不到的超视距信息,预先通过一些预处理方法形成一个数据结构。当人在线开车时,通过定位把信息recall回来,放到当前的局部坐标系下,这样就能看得更远、更全,获得更好的感知效果。环境感知和定位地图都是为了完成感知,只是一个是在线的,一个是离线的,这两个模块的边界在不同公司也会有不同的划分。
再往下游是决策规划。决策规划笼统划分可以分为决策模块和规划模块,若是更细分,可分为决策、预测、规划和控制这四个模块。最核心的问题是如何处理场景中与其他交通参与者的动态博弈。之所以在图1中规划决策模块上放了“下棋”的图标,因为决策和规划这两个最主要技术模块的内部过程,与下棋有很多异曲同工之处,很多用来解决下棋问题的方法,某种程度上也可以应用在决策规划模块中。
最后是控制执行。这部分是怎么样把计算出的车辆油门、刹车、转向等信息传递到车身中,然后让车去执行。
中间三个环节比较偏算法,所以用颜色比较深的形式表达;而两端偏硬件外设,是由车的硬件架构决定,所以用颜色比较浅的形式表示。虽然pipeline在这几十年来已逐渐成型,但是通过什么样的软件和硬件划分方式来实现这些模块,在最近几年有很大的演进趋势变化。
看下图1中最下面的方框,上面箭头表达的是以往主流的划分方式,竖杠与上面的 pipeline对应,比如传感器,一般意义上来看,传感器是纯硬件外设,甚至一部分感知工作或一些很前端的信号处理,都是硬件外设来完成的。硬件外设的特点是运算速度很快,功耗比很出色,但它的灵活性相对比较差。
1
自动驾驶结构演化提出算法新需求
在刚做环境感知时,大家谈AI,大多谈的是环境感知中的AI应用。为了让AI算法能更快、更好地运行,一般都不会把它运行在硬件外设上,也不会选择运行在CPU上,它们两个的缺点要么是可编程性不够,要么是能耗比不够,所以会设计专用的硬件加速器,这也是地平线的主要发力点。
再往后的很大区间是CPU上的软件,这里面包含了底层的一些软件、中间件,更大量的是上层的逻辑算法,还有一些偏传统的数学优化方法。因为它的灵活性很高,所以AI加速器的支持力度相对会低一些,传统方法一般把这些软件运行在CPU上,有些实践也会把它放在GPU上,因为GPU对很多的数学运算来说,基本上是一个通用的计算设备。
最后,控制执行一般都在硬件外设,这也是目前主流的方法。大家可以看到,虽然谈到自动驾驶和AI有很多关联,但实际应用上,主流的方法只在环境感知中很窄的一段区间里,是AI算法真正发挥作用的地方。
最近几年有一个很大的趋势性变化,如图1中最下面的横向箭头,展示了一个更加复杂,但更有意思的途径,两端还是硬件外设,但在传感器侧,硬件外设的边界向前端退缩了。以往很多需要使用ISP设备计算的信号,现在可以直接将原始传感器的信息直接送到AI算法里,跳过一些专用的硬件做计算。同时,在感知的下游,也可以去掉大量用于辅助感知的规则,即感知后处理。所以在环境感知中,AI算法基本上能够cover环境感知以及环境感知的下一步。
定位地图是另外一个相对不一样的环节。定位地图里面有很多优化的内容,所以很多核心的问题可以通过软件和CPU解决,而且地图在云端有相对成熟的自动化工具,有时不一定依赖AI算法,也可以获得不错的效果。所以在车端上能体现出的定位地图,大部分还是CPU的通用软件算力,但也有一些内部实践发现,在定位方面以及地图和感知融合方面,使用AI算法会有不错的效果。
再到决策规划模块,以往很多决策规划的内容都是写的规则,if-else或一棵巨大无比的决策树,然后在里面做决策。规划可能是一些优化的问题,很多时候靠规则设置一些边界条件和代价函数决定最终的行为。最近也有一个趋势是将决策规划中偏上层的部分,甚至决策和规划的边界消融掉,然后把决策、规划中很核心的初始解选择问题,通过AI算法来实现,包含了模仿学习、强化学习等内容,再把剩下的一部分交给软件来做,通过这样的方式达到更好的协同。
最后控制执行变化不多,主要是硬件外设。通过上面可以看到一个很大的趋势是 AI算法在整个pipeline里的范围越来越大,这里表述的最好的是特斯拉的Andrej Karpathy,Karpathy把它称作软件2.0。软件2.0,正逐渐在系统中替换软件1.0,那什么是软件2.0?我认为最精确的定义应该是用神经网络实现一些原本用规则、逻辑实现的功能,也有一些宽泛的定义,会把Machine Learning模型、统计学习模型也算做软件2.0,但它的核心特性是算法本身的构建,一方面要依靠人搭一些架构和骨架,更重要的是通过数据来训练它的性能表现。简单来说就是软硬协同的演进趋势,是为了更好地利用软件2.0的方式服务整个自动驾驶系统。
图2
上面谈到了整个自动驾驶系统,而今天的主题是感知。感知是整个自动驾驶系统的最上游,如果回顾下感知系统比较主流的处理方式,可以类比为图2最左部分,自动驾驶系统为了保证足够高的安全性能,会放很多的传感器。每个传感器一般会经过简单的信号处理后,送到一个神经网络中。每个传感器的模态会获得一些神经网络的输出,像图2最左边的下半部分是6路摄像头看到的情景,对应的神经网络会分别处理这几路的 video输入,获得每一路的输出。
图2中间部分是语义分割的输出做表示,但实际上每一路的神经网络,一般是多任务模型,除了语义分割外,还有目标检测、深度估计等任务。它们的主要特性是每一路神经网络的输出是在原始的 sensor空间,比如图像输入,输出也是在图像空间。而它们给出的信息,比如语义分割、2D目标检测虽然做得很好,但是只能是中间结果,因为一个自动驾驶系统最终在做规划时是在3D空间进行,所以首先需要通过规则把原始传感器中间的信息转到3D空间,同时还需要把很多不同的中间结果,做一定的组合和拼凑,形成下游能够使用的形态。
因为有各种不同的传感器输入,但下游在使用时需要一个完整的360度输出,所以会做一些fusion,来组合各路传感器的输出。fusion过程包含了很多的规则,像滤波,选择谁做融合以及最后怎么做融合,选多大的权重融合不同路的信息等。上面这些原因最后在量产实践中的最大问题是基于规则的转换、拼凑、融合的过程,它不是一个可以自主学习的过程,而是一个基于规则的过程。规则意味着出了错需要人来修改,而规则不会自己改变。
当自动驾驶系统应用到一个物理世界中,会遇到各种各样的问题,也就是长尾问题。长尾问题是说当你以为解决了90%的问题,可能还有90%的问题等着你,这样需要很多工程师来写这些规则。比如决策树,如果1个人写决策树,可能过了1个月会忘记之前写的分支,如果100个人同时写1个决策树,那软件栈最后会变得很复杂。
举个很简单的例子:停车入位。在驾校学车时,会发现停车入位是一个特别复杂的过程,因为它依赖多路传感器观测,比如需要看左后视镜、右后视镜、正中间的后视镜,还有倒车影像,有的车甚至没有倒车影像。虽然有传感器观测,但是它并不能直接地表现车所在3D空间中的位置,这也是很多同学不太喜欢开车的原因,即不直观。在驾校的教程中,你要注意里面各种各样的规则,比如需要看左边的线在后视镜中的位置,右边的线在后视镜中的位置,这样才能很隐式的映射出,在3D空间中车停在什么位置。
图3
现在很多车都有环视功能,在环视功能中,最终环视影像会给出车辆周围360度的场景信息。比如泊车入位,以一个上帝视角直接看到周围空间,这时停车就变得很简单,为什么?因为人脑不需要做观测、拼接,直接拿到了上帝视角,做决策规划。再回到自动驾驶系统,上帝视角对系统的简化和帮助很多,这也是自动驾驶的感知架构演化对我们提出的第一个要求,即要在上帝视角中直接输出下游所需要的信息。这简称是BEV,是鸟瞰的视角,与上帝视角意思相近。
图4
BEV对比传统的感知算法,输入是一样的,是多路的传感器信息,然后每一路传感器信息会经过一个单独的神经网络进行处理。原始传感器的信号模态,与图4中间的一些Feature map基本上是相应的。不一样的是中间会加一个神经网络,学习如何自动组合和融合单路神经网络的输出,最终在3D空间中直接输出下游规控需要用的输出形态。
比如图4里展示的是一个丁字路口,车道线、斑马线分别在什么地方,这个信息经过简单的结构化,就可以直接给到下游规控进行使用。它最大的特点是来自于一个感知系统,它是一个大的神经网络,这也代表着只要有了数据、真值,就可以训练它,并自动学习如何从原始传感器输入得到最终需要的输出,而不需要有特别多的规则,这也充分体现了感知领域的软件2.0实现。
虽然在业界很多公司都在讨论BEV感知,尤其是基于视觉的BEV感知。这里面的难点许多人认为是神经网络架构设计,但地平线认为如果难度排序,可能神经网络架构设计难度相对较校还有两方面的难点,第一是当有这样的架构后,要输出什么内容。因为想要用原本感知神经网络的输出,替换以前的一些感知后处理的输出。那究竟输出哪些内容能够被下游比较好的使用,这需要探讨什么是完整的感知算法集合,这是一个系统的架构设计问题。
第二个最难的点是如何获取数据中的真值。当有了数据以后,在有监督学习的训练方式下,需要有真值,神经网络训练才知道往哪走。真值的生成不像在学校里面去做一些论文研究,基于一些比较干净的数据集,在量产的世界中需要有生成真值的能力,而且真值生产的速度要足够快,精度要足够好。
以上这几方面的挑战都需要逐一地击破,才能够在软件2.0大方向的指引下,实现BEV感知范式。
2
软件2.0下新的感知范式
下面分几个环节讨论下地平线在这方面的思考和实践。
图5
首先是架构问题,怎么做架构设计?线上很多做算法的同学都知道BEV已经有很多方法衍生出来,但是今天讨论的是一个比较抽象的结构怎样做BEV感知。图5最左侧是原始传感器的输入,主要是摄像头,也有其他不同类型的输入。做BEV感知第一步是要有单一输入的Frontend网络,它处理一个传感器的输入,不会涉及与其他传感器的交互耦合,是一个单独的神经网络。
而在很多传感器中,比如摄像头,Frontend网络可以是复用的,只进行一些初步的信息提龋比较重要的架构设计来自于怎么对多元的信息进行融合。这里主要分为三步,首先要对同样的模态,比如同样视觉信号的输入,对它进行校准;第二步还需要跨模态进行校准,因为不同类型传感器输出的原始信号形态不一样,所以需要在BEV下把信号对接好,才能进行融合;第三步是设计一个神经网络,在空间和时间维度上对这些对齐好信息进行融合,融合完成后,可以把feature map送给下游的感知任务,实现各种各样的任务类型。
那地平线目前有什么样初步的尝试呢?
图6
最简单的是一个固定的融合网络,这也是最早期的BEV方案。它的好处是所有的都见过,没有特别新的架构在里面,但是足够简单、鲁棒、好用,所以作为一个起点对应上面提到的几个不同层次内容。左边是上面提到的alignment、temporal fusion、 spatial fusion、最终的Task heads,图6以摄像头为例,激光雷达可能会有一些不同的变种,但基本的意思是一样的。
在各个摄像头的 alignment上,最简单的可以把图像的输入,通过perspective transform的方式投影在BEV下。这种投影有很多的假设,比如地面平直性假设、车不能有太多的抖动、只能表达地面,不能表达高出地面的内容等。但是做的比较好的方面是地面上的内容,能映射到一个相对合理的空间位置,所以可以选用它来做空间alignment。
空间信息通过alignment对齐到BEV空间之后,有了3D坐标,可以用一个神经网络进行空间的fusion,最简单的方法是通过一个卷积网络。再下一步是进行时间的融合,时间融合最主要的是怎么样做时间上信息的选择,因为摄像头的帧率很快,显然不能处理所有信息,所以需要做一定的选择和采样。最简单的方法是在原始输入中做一个基于时间的队列,等间隔的采样制作一个滑窗,然后把最近的信息放在里面。时间融合的神经网络可以直接针对滑窗做处理,获得空间上的融合效果。最后经过融合以后,feature可以传给最终的感知任务,这是一个偏固定的架构。
图7
地平很快的进入到下一步,首先在做跨摄像头alignment时,上面提到的假设很容易被干扰,那怎么来改进呢?希望在空间alignment上加入一些自适应成分,比如在做空间的映射时,如果能估计出来车辆的外参变化,可以把一个很抖的IPM投影做得相对稳定。同时在时间上面也是如此,如果不能严格要求时间同步,不同摄像头的曝光时间也可以做一些时间上的同步。
经过了这一步以后,是一个对齐得比较好的空间feature,然后把它经过一个融合的神经网络。时间上面有一个受特斯拉方案启发的方式,之前的队列是等时间间隔的队列,但在很多现实场景中发现,重要事件不是等时间间隔发生的,它是稀疏的,可能突然出现,或过很久都不出现。为了处理这种情况,除了time-based队列,还有一个distance-based队列,根据车辆的里程记信息,在固定的空间间隔上把信息入队,通过这种方法实现两种不同尺度的信息队列效果。
最终在做时间融合时,除了使用最简单的卷积神经网络以外,也可以使用循环神经网络RNN。特斯拉提出的方案叫Spatial RNN,它的方式比传统的RNN更复杂一些,因为传统RNN只有一个Recurrent memory,每一个时间都要不断的更新,但是Spatial RNN memory是与空间位置对应的,只有当上游空间对齐的信息能够跟时间对应上时,才能循环更新它。
图8
迅速的实践完这种方案以后,地平线没有停下脚步,还在尝试更加新颖,网络上限更加大的方案。原来一直是先做alignment,再做fusion或者先做队列,再做fusion。那alignment和fusion这两步可以进一步的整合吗?因为这两步是人通过规则分开的两种架构性步骤,如果能够通过一个神经网络把它这两个步骤都做到一起,或许网络的上限会更高。
对应下来,在空间融合部分,受到了特斯拉及其他一些工作的启发,可以看到图8下的Transformer方式,可以计算原始图像pixel和最终BEV空间中pixel的交叉关联。交叉关联的学习本身是一种alignment,因为学习的是原始像素到BEV像素中关联,同时还会学习关联的强弱,强弱本身表示一种融合上的权重倾向性。所以通过Transformer结构,可以将alignment和spatial fusion进行融合。
在时间方面也有类似的操作,以往有一个通过规则写下来的固定队列,每一步神经网络处理的是队列里面所有的或最新的样本,如果再进一步,是否能够让神经网络自己去学习如何去入队?如何出队?以及什么时候从队列里面选取什么样的信息融合?这里工作其实叫做Memory Networks,它是自己去学习如何存储信息、读取信息以及融合信息的神经网络结构。
大家可以看到在软件2.0的范式下,哪怕是BEV架构也可以有很多的玩法,而且为了能够让各种各样的玩法,尽快的从实验室部署到车端,需要有很强的芯片工具链支撑。因为不希望在GPU上写了一个很好的模型,但移到芯片上部署,没有工具链的支撑。开发者在芯片上做各种定点量化是很痛苦的,所以需要一个工具链让这个过程很平顺地自动化完成。
地平线在这方面也有一些成就,地平线的工具链不仅让内部的工程师使用,还希望能够让我们的客户,包括汽车行业以及汽车行业之外的客户,把神经网络从训练、量化、部署整个的流程能比较顺利的在一个链条里面打通,通过这种方式让BEV方案快速的演进、迭代,扩展到各种各样的任务上。
3
BEV感知的十八般武艺
在谈到的 Challenge中,个人认为最简单的是设计神经网络架构,稍微更难一点的是怎么样设计一个不重不漏的感知任务集合,它的输出能够被下游不重不漏地使用,不重表示它是一个很精炼的集合,不会重复输出一些内容让下游去选;不漏表示不要出现下游本来使用,但是感知任务没有办法提取的任务。之前的感知架构栈有这样的问题,经常在实践过程中不断往里面加各种各样奇奇怪怪的任务,来弥补之前任务设计的疏漏,这也会引入很多融合相关的问题,因为上游给的输出越多,也要面临更多选择融合的过程。最好是不做选择,希望上游给的就是最完整、不重不漏的输入。
图9
地平线内部对于这件事情的理解,可以分为以下几个层次,从low level表达物理世界的约束;到中层语义层次,关注的是从这个世界中提取一些逻辑上的Entity;到最终从Entity中得到结构层次的理解,包含一些概念、关联、行为,通过这样不同层次的内容来支撑下游的任务。
同时这个架构还能够把上游直接输给有能力的下游,比如有能力的下游也是一个神经网络,神经网络和神经网络之间的沟通,没有必要通过设计的这些任务做二传手,它们可以直接通过神经网络feature map这样的隐式语言来沟通。
图10
接下来会看一些实例,首先看下语义感知。如果分为静态和动态,静态主要是环境中静止的信息、地面的信息,比如车道线、路沿、地面标志、停止线,这些是最基本的行车静态约束。在图10左上角可以看到基于BEV架构,通过六路传感摄像头的输入,得到右面的BEV效果输出。除了可以展示车道信号、路沿的分割结果以外,还可以获得更多的任务,包括检测人行道、路口的逻辑结构,还检测路上标志。
除了静态以外,动态也很重要。因为世界中大部分的道路使用者是动态的,所以也需要有动态感知能力。图10右半部分展示的是基于六路传感器的输入,直接获得BEV下车辆测量输出的效果,图像中的绿框是 BEV的结果在图像空间中的效果。这个场景中路边停着一排车,可以看到BEV下的空间也有同样的、很炫酷的效果。以上是语义感知,从世界中提取一些需要知道的语义信息。
语义层的输出,一般是下游最想要使用的。因为比较简单、结构化,像高精地图很多用到的是语义层信息。那为什么喜欢用雷达?因为雷达对动态感知的语义层抽取很直接,如果车上有一个反射点,它就是一个框的直接对应关系。但在现实世界中,语义层的信息可能不够,以停车入位为例,如果开房车出去旅游,到房车营地后会发现房车营地不给划线,实际的停车位是由别人怎么停来决定的。由于房车有不同的大小,停车的位置也不同,这时很难通过地上的语义线来决定,而是要通过一些很底层的约束,即别人停在哪里,那个地方是要避免的,来决定房车停在哪里。所以在一个混乱分散的世界里,需要对底层的物理逻辑有一定理解,哪怕对这个世界一无所知,对语义一无所知,但至少知道什么东西是不能撞上去的,这是BEV下的底层视觉要完成工作。
图11
图11左边展示的是底层视觉静态感知的效果,它是路面上一帧的结果,图片中蓝色地面表示地面,它的高度比较低,红色部分越红代表高度越高,还有一些零散的内容,像地面上的肉色表示地面上稍微凸起的物体,对于这些物体,可能是一个披萨盒或水泥墩子,车主在开车会想究竟要不要压过去,会做一些相应的选择。不需要理解它究竟是什么东西,只要知道那里有个东西,不要压过去,车就安全了。
图11右面是动态的效果,这是对于光流概念的拓展。相信很多同学都听说过光流,光流是两帧图像之间像素的位移,在BEV空间中,有一个很直观的体现,即可以直接通过底层的物理感知获得这个世界中的物体,在以什么样的速度移动,比如右边的图展示了通过BEV网络获得世界中移动物体的运动速度和运动朝向,不同的颜色代表了不同的运动物体,黄色是向下的,紫色的是向上的,不同的颜色也代表不同的运动速度,运动速度越快颜色越深。通过这样的方式,不仅仅可以把静态的信息通过底层感知完全cover,还可以获得速度信息。得到速度信息以后,就可以更好地在周边场景中移动。
那是做了底层感知就够吗?这涉及本次分享了另外一个主题,想象力对于感知的重要性,个人的观点认为想象力是下一代感知最重要的一个环节。为什么它如此重要呢?
图12
以停车入位为例,自从有了环视影像以后,我曾经尝试只看环视影像在地库里开车,发现速度特别慢,甚至没有看原始摄像头的方法简单,为什么会出现这种情况呢?因为在 BEV空间中,传统感知只看到看得见的内容,看不见的内容做不到感知。
但如果感知能够给出更多的信息,比如感知可以告诉车主,看到有根柱子,并且根据一些先验知识,还看到了一截道路从柱子后面延伸出来,大概可以猜出来柱子后面是有别的可行区域,相当于可行区域能够延伸到柱子后面。除此之外,它还能告诉车主在这个场景下未来的行驶轨迹,及未来的行为是选择向右走,甚至可以不用思考右面是否可行,感知网络直接告诉车主可以往右走,这代表着很大的范式转变。
以往的感知是感知看得见的内容,但如果感知能够感知看不见的内容或可能看见的内容,那可能会对下游的感知系统有很大的使用范式上的转变。
图13
接下来分别以静态和动态举例,比如静态,为什么喜欢用地图,因为它是超视距的,10公里之外的内容打开手机就可以看到,但是感知往往是看不到的,感知只能看到有像素显示出来的信息。如果将想象力引入到 BEV感知中,会怎么样?会发现车端仅依靠传感器信息似乎也可以猜到,如果前面有一个路口,看到人行横道两边大概率会有延伸出去的道路,就像车辆在行驶的过程中,一边在做感知,一边在做建图,叫它online maps。图13左边显示是online maps逐渐扩展自己对于周边车道线、道路以及连接关系的理解。
那动态上的想象力是什么?最典型的一个例子是在规控领域经常遇到的预测模块,它代表的是未来某一个动态物体,在未来一段时间会做什么事情或者会去哪里。图13右半部分显示的是未来每辆车会去哪里,线代表了未来几秒钟车辆会在什么地方。如果这个模块形成感知的一部分,会有什么现象发生呢?会发现以前的感知和预测中间隔了一层感知结果,需要对感知结果进行很多的抽炼、提取,不希望感知结果传出太多的信息。实际上很多成熟的预测网络已经是神经网络,它可以直接拿到原始感知的feature map。如果感知网络本身加了一个感知头,它是来做预测的,那感知网络能够利用很多无法结构化的线索做预测,来完成一些以前先感知再预测做不到的事。
4
端云一体的BEV感知开发
通过对自动驾驶感知的理解,构建出了一个语义感知、底层视觉到想象力等不同层级的感知任务,形成一个完整的感知集合,但最难的一点是数据,数据从哪里来?真值从哪里来?对于软件2.0下的自动驾驶量产来说,个人认为难度比神经网络要大几个量级,这也是为什么地平线会有一个混合了系统、软件、算法和硬件的团队,在云端的平台AIDI里面做攻坚。希望把这项能力能够开发出来,让更多的客户在AIDI中体验到这种能力。
它基本上分为几个步骤,从车端的数据采集,到把采集的数据在云端进行重建,通过数据的采集以及数据的理解,获得一个更加完整的世界的信息。然后再基于这个信息,进行一个云端的perception,即不仅仅只能做车端的感知,要先把云端的感知做好,才能让云端的感知作为一个老师来教导车上的感知。
既然这是一个真值的生产链路,还需要质检才能完成工作。
图14
整体的流程比较简单,在车端考虑的是怎样挖掘有效的信息,因为车无时无刻不在路上行驶,会见到很多的信息。那么什么样的信息是对神经网络性能的提升有效,什么样的数据是被需要的?这本身也是一个很艰难的感知任务,背后有各种各样的策略来完成这件事情。
像Trigger端上触发,基本思路是根据车端能拿到的感知结果,然后写一些规则、脚本,选择在某些条件下,在数据对我很有用的时间点触发。
第二种是主动学习,即在车上神经网络有自主学习的能力,它很好奇,并不是一个傻傻的接受传感器输入,只会干活的神经网络。比如这个例子很有意思,想拿回去研究,它会自主选择这件事情。
还有一些方法是如果有Multi-sensor,每种不同的sensor信息来源可能会有轻微的差别,但在逻辑上知道它们是有一致性的,这时空间和时间上的不一致,可以作为一种挖掘信息的来源。通过这样的方法把数据挖到云端以后,经过一些隐私处理,把信息送到云端。
云端首先要从车端传送的信息重建出整个世界,而且这个世界不仅仅是3D世界,还要知道时间维度上的信息,这个过程叫做4D重建。第二部分是怎么做云端的perception,也就是在云端做老师模型,因为云端和车端做感知,它们的约束条件和优化目标不一样,车端很多时候是在一定的功耗、算力条件下,或帧率精度足够的情况下,帧率跑的越高越好。但云端算力更充足,所以可以选择更大的模型,甚至把未来的信息也用上,而车端无法知道未来的信息。第三步是QA,像生产线一样可以人来做抽检,也可以自动地做相关的质检。
经过一串的真值的生产以后,就获得了很高质量的真值以及配套的原始数据,可以把它喂给神经网络,然后神经网可以训练起来了。像地平线在AIDI上获得了真值以后,无缝的在AIDI上把训练任务和真值连接起来,触发新一轮的训练,训练好之后会进行自动的系统集成,生成新一版的软件,通过OTA下发到车端,来完成一轮迭代循环。
新的软件在车端会持续进行数据挖掘工作,再来完成图14类似的一个循环过程。通过上面提到的迭代方式,整个系统迭代效率是很高的,地平线内部的一些系统可以达到两三周量级的一轮快速迭代。这样的快速迭代,很大程度上归功于上面的循环。
在整个过程中,尤其是云端的自动标注过程,目前有很多的云端算法和软件团队,很努力的把云端的标注过程变成一个labor free的工作,即不需要像以往的标注过程一样,每个像素都要让人来标,而是让大部分的工作都由一个大的神经网络模型加上重建来解决,只有很少一部分的校验工作和补充工作由人完成,大大提高了整体的标注效率。整个迭代的速度也是比较快的,现在的吞吐量也比较高,这主要得益于整个环节的自动化。
图15
下面看一些具体的例子,比如在AIDI上怎么获得真值呢?首先会在最初始的数据来源,采集同一个地点的数据,如果BEV感知的效果不够好,触发车队需要在一个地点通过不同的方向采集数据。图15显示是同一个路口附近,不同的采集结果、单次重建的结果,可以看到虽然单次重建本身都还不错,但看得不全,因为只有车经过的路线能看得比较多,车没经过是看不到的。通过多个单次重建结果的聚合,算法就可以获得一个完整的场景重建。
除了静态环境的重建以外,还可以进行动态场景重建,或面向动态的感知结果,最终拼成一个完整的、全息的4D世界信息,来给下游的云端感知模型使用。有了这样一个4D点云,怎么样进行标注任务呢?
以做 BEV的静态感知标注为例,如15图右上角所示,这里面展示的是一辆车,在一个路口右转了一次,方框是感知范围,另外一辆车在路口直行了一次,又一辆车反方向直行一次,经过这样信息聚合,就可以得到一个完整的场景。它很像地图,但与地图也有一些不太一样的地方,一般地图强调的是世界最新的样子,而且是在全局和世界的关系下的位置样子。
但是在标注任务中,首先要跟原始传感器信息匹配,如果拿一年前的图像信息和一年后的重建信息匹配,这不叫真值,因为某一个路口场景有可能有所改变,这个真值标注是没有用的;另外一点是标注一般只关心局部,因为想训练的是神经网络在这个图像输入下,它的输出是什么。本身是一个相对局部的内容,只需要相比“目力所及”稍微拓展一些,不需要拓开很多,就足够感知模型训练。还有很多其他的任务,包括BEV下的低级视觉信息、高度、光流、三维检测等,都可以通过同样一个全息的信息来提龋
以上是怎么在AIDI上,通过AIDI的云端的环境,用一种很自动化的方式获得BEV中最难的一块内容。地平线自动标注部分也有一个很强的算法团队来负责。
最后总结一下,本次讲解是想提供一种系统级的建模,希望能够通过一种相对清晰的视角把自己看到的和地平线团队看到的自动驾驶行业感知范式的演变,用一个比较形式化的、简化的表现方式,呈现出它最重要的方面。但是我们也知道统计学大师们说过,所有的模型都是错误的,只有某些模型,因为它体现了某种重要的方面,所以它对我们有所帮助的。关于BEV的建模也有这个特点。
依个人来看,量产自动驾驶技术不是单一技术就能够完成的,在地平线的量产技术中,BEV只是很重要的一个算法的视角,实际上为了完成自动驾驶系统量产,还需要很多不同的技术与BEV一起取长补短,才能满足最终产品级的某些需要。
量产自动驾驶也不是单一的视角,不是仅在云端做出优秀的模型,就可以做到量产,需要既看技术,还要看当下市场需要,什么样的技术能够在当前的算力和技术水平下,能够被大规模部署在车上。同时,地平线认为量产自动驾驶不是一家公司能够搞定的,世界需要百花齐放。
还有一点地平线让我比较佩服是有一个好的生态视角,而且对产业生态持很大的开放度。前几天地平线创始人还宣布,未来不仅是算法会有一定的开放性,甚至未来最核心的BPU,即神经网络加速器的计算IP,也是能够通过白盒的方式提供给部分整车厂合作伙伴,去协助他们设计硬件。通过这样的方式,地平线希望世界上不仅仅有一家特斯拉,还能够有很多家企业通过与地平线的深度合作,达到特斯拉水平甚至超越特斯拉,创造更丰富的产品集合。
如果大家对自动驾驶感兴趣,欢迎加入这个行业。如果大家对地平线感兴趣,欢迎来加入我们一起创造未来真实的现实。