数据结构论坛

首页 » 分类 » 定义 » 地平线刘景初上帝视角与想象力自动驾驶
TUhjnbcbe - 2024/5/18 15:59:00
有地方能治好白癜风吗 https://wapyyk.39.net/hospital/89ac7_labs.html

3月28日,地平线在智东西公开课开设的「地平线自动驾驶技术专场」已顺利完结,地平线自动驾驶系统架构师刘景初博士围绕《上帝视角与想象力——自动驾驶感知的新范式》这一主题进行了直播讲解。

刘景初博士从自动驾驶架构演化下提出的算法新需求出发,对软件2.0下新的感知范式、BEV感知的十八般武艺以及端云一体的BEV感知开发进行了深入讲解。

本次专场分为主讲和QA两个环节,以下则是主讲回顾:

各位朋友大家好,我是地平线自动驾驶系统架构工程师刘景初,很高兴和大家分享地平线在感知领域的一些思考和实践。本次课程主要分为以下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里的范围越来越大,这里表述的最好的是特斯拉的AndrejKarpathy,Karpathy把它称作软件2.0。软件2.0,正逐渐在系统中替换软件1.0,那什么是软件2.0?我认为最精确的定义应该是用神经网络实现一些原本用规则、逻辑实现的功能,也有一些宽泛的定义,会把MachineLearning模型、统计学习模型也算做软件2.0,但它的核心特性是算法本身的构建,一方面要依靠人搭一些架构和骨架,更重要的是通过数据来训练它的性能表现。简单来说就是软硬协同的演进趋势,是为了更好地利用软件2.0的方式服务整个自动驾驶系统。

图2

上面谈到了整个自动驾驶系统,而今天的主题是感知。感知是整个自动驾驶系统的最上游,如果回顾下感知系统比较主流的处理方式,可以类比为图2最左部分,自动驾驶系统为了保证足够高的安全性能,会放很多的传感器。每个传感器一般会经过简单的信号处理后,送到一个神经网络中。每个传感器的模态会获得一些神经网络的输出,像图2最左边的下半部分是6路摄像头看到的情景,对应的神经网络会分别处理这几路的video输入,获得每一路的输出。

图2中间部分是语义分割的输出做表示,但实际上每一路的神经网络,一般是多任务模型,除了语义分割外,还有目标检测、深度估计等任务。它们的主要特性是每一路神经网络的输出是在原始的sensor空间,比如图像输入,输出也是在图像空间。而它们给出的信息,比如语义分割、2D目标检测虽然做得很好,但是只能是中间结果,因为一个自动驾驶系统最终在做规划时是在3D空间进行,所以首先需要通过规则把原始传感器中间的信息转到3D空间,同时还需要把很多不同的中间结果,做一定的组合和拼凑,形成下游能够使用的形态。

因为有各种不同的传感器输入,但下游在使用时需要一个完整的度输出,所以会做一些fusion,来组合各路传感器的输出。fusion过程包含了很多的规则,像滤波,选择谁做融合以及最后怎么做融合,选多大的权重融合不同路的信息等。上面这些原因最后在量产实践中的最大问题是基于规则的转换、拼凑、融合的过程,它不是一个可以自主学习的过程,而是一个基于规则的过程。规则意味着出了错需要人来修改,而规则不会自己改变。

当自动驾驶系统应用到一个物理世界中,会遇到各种各样的问题,也就是长尾问题。长尾问题是说当你以为解决了90%的问题,可能还有90%的问题等着你,这样需要很多工程师来写这些规则。比如决策树,如果1个人写决策树,可能过了1个月会忘记之前写的分支,如果个人同时写1个决策树,那软件栈最后会变得很复杂。

举个很简单的例子:停车入位。在驾校学车时,会发现停车入位是一个特别复杂的过程,因为它依赖多路传感器观测,比如需要看左后视镜、右后视镜、正中间的后视镜,还有倒车影像,有的车甚至没有倒车影像。虽然有传感器观测,但是它并不能直接地表现车所在3D空间中的位置,这也是很多同学不太喜欢开车的原因,即不直观。在驾校的教程中,你要注意里面各种各样的规则,比如需要看左边的线在后视镜中的位置,右边的线在后视镜中的位置,这样才能很隐式的映射出,在3D空间中车停在什么位置。

图3

现在很多车都有环视功能,在环视功能中,最终环视影像会给出车辆周围度的场景信息。比如泊车入位,以一个上帝视角直接看到周围空间,这时停车就变得很简单,为什么?因为人脑不需要做观测、拼接,直接拿到了上帝视角,做决策规划。再回到自动驾驶系统,上帝视角对系统的简化和帮助很多,这也是自动驾驶的感知架构演化对我们提出的第一个要求,即要在上帝视角中直接输出下游所需要的信息。这简称是BEV,是鸟瞰的视角,与上帝视角意思相近。

图4

BEV对比传统的感知算法,输入是一样的,是多路的传感器信息,然后每一路传感器信息会经过一个单独的神经网络进行处理。原始传感器的信号模态,与图4中间的一些Featuremap基本上是相应的。不一样的是中间会加一个神经网络,学习如何自动组合和融合单路神经网络的输出,最终在3D空间中直接输出下游规控需要用的输出形态。

比如图4里展示的是一个丁字路口,车道线、斑马线分别在什么地方,这个信息经过简单的结构化,就可以直接给到下游规控进行使用。它最大的特点是来自于一个感知系统,它是一个大的神经网络,这也代表着只要有了数据、真值,就可以训练它,并自动学习如何从原始传感器输入得到最终需要的输出,而不需要有特别多的规则,这也充分体现了感知领域的软件2.0实现。

虽然在业界很多公司都在讨论BEV感知,尤其是基于视觉的BEV感知。这里面的难点许多人认为是神经网络架构设计,但地平线认为如果难度排序,可能神经网络架构设计难度相对较小。还有两方面的难点,第一是当有这样的架构后,要输出什么内容。因为想要用原本感知神经网络的输出,替换以前的一些感知后处理的输出。那究竟输出哪些内容能够被下游比较好的使用,这需要探讨什么是完整的感知算法集合,这是一个系统的架构设计问题。

第二个最难的点是如何获取数据中的真值。当有了数据以后,在有监督学习的训练方式下,需要有真值,神经网络训练才知道往哪走。真值的生成不像在学校里面去做一些论文研究,基于一些比较干净的数据集,在量产的世界中需要有生成真值的能力,而且真值生产的速度要足够快,精度要足够好。

以上这几方面的挑战都需要逐一地击破,才能够在软件2.0大方向的指引下,实现BEV感知范式。

2

软件2.0下新的感知范式

下面分几个环节讨论下地平线在这方面的思考和实践。

图5

首先是架构问题,怎么做架构设计?线上很多做算法的同学都知道BEV已经有很多方法衍生出来,但是今天讨论的是一个比较抽象的结构怎样做BEV感知。图5最左侧是原始传感器的输入,主要是摄像头,也有其他不同类型的输入。做BEV感知第一步是要有单一输入的Frontend网络,它处理一个传感器的输入,不会涉及与其他传感器的交互耦合,是一个单独的神经网络。

而在很多传感器中,比如摄像头,Frontend网络可以是复用的,只进行一些初步的信息提取。比较重要的架构设计来自于怎么对多元的信息进行融合。这里主要分为三步,首先要对同样的模态,比如同样视觉信号的输入,对它进行校准;第二步还需要跨模态进行校准,因为不同类型传感器输出的原始信号形态不一样,所以需要在BEV下把信号对接好,才能进行融合;第三步是设计一个神经网络,在空间和时间维度上对这些对齐好信息进行融合,融合完成后,可以把featuremap送给下游的感知任务,实现各种各样的任务类型。

那地平线目前有什么样初步的尝试呢?

图6

最简单的是一个固定的融合网络,这也是最早期的BEV方案。它的好处是所有的都见过,没有特别新的架构在里面,但是足够简单、鲁棒、好用,所以作为一个起点对应上面提到的几个不同层次内容。左边是上面提到的alignment、temporalfusion、spatialfusion、最终的Taskheads,图6以摄像头为例,激光雷达可能会有一些不同的变种,但基本的意思是一样的。

在各个摄像头的alignment上,最简单的可以把图像的输入,通过perspectivetransform的方式投影在BEV下。这种投影有很多的假设,比如地面平直性假设、车不能有太多的抖动、只能表达地面,不能表达高出地面的内容等。但是做的比较好的方面是地面上的内容,能映射到一个相对合理的空间位置,所以可以选用它来做空间alignment。

空间信息通过alignment对齐到BEV空间之后,有了3D坐标,可以用一个神经网络进行空间的fusion,最简单的方法是通过一个卷积网络。再下一步是进行时间的融合,时间融合最主要的是怎么样做时间上信息的选择,因为摄像头的帧率很快,显然不能处理所有信息,所以需要做一定的选择和采样。最简单的方法是在原始输入中做一个基于时间的队列,等间隔的采样制作一个滑窗,然后把最近的信息放在里面。时间融合的神经网络可以直接针对滑窗做处理,获得空间上的融合效果。最后经过融合以后,feature可以传给最终的感知任务,这是一个偏固定的架构。

图7

地平很快的进入到下一步,首先在做跨摄像头alignment时,上面提到的假设很容易被干扰,那怎么来改进呢?希望在空间alignment上加入一些自适应成分,比如在做空间的映射时,如果能估计出来车辆的外参变化,可以把一个很抖的IPM投影做得相对稳定。同时在时间上面也是如此,如果不能严格要求时间同步,不同摄像头的曝光时间也可以做一些时间上的同步。

经过了这一步以后,是一个对齐得比较好的空间feature,然后把它经过一个融合的神经网络。时间上面有一个受特斯拉方案启发的方式,之前的队列是等时间间隔的队列,但在很多现实场景中发现,重要事件不是等时间间隔发生的,它是稀疏的,可能突然出现,或过很久都不出现。为了处理这种情况,除了time-based队列,还有一个distance-based队列,根据车辆的里程记信息,在固定的空间间隔上把信息入队,通过这种方法实现两种不同尺度的信息队列效果。

最终在做时间融合时,除了使用最简单的卷积神经网络以外,也可以使用循环神经网络RNN。特斯拉提出的方案叫SpatialRNN,它的方式比传统的RNN更复杂一些,因为传统RNN只有一个Recurrentmemory,每一个时间都要不断的更新,但是SpatialRNNmemory是与空间位置对应的,只有当上游空间对齐的信息能够跟时间对应上时,才能循环更新它。

图8

迅速的实践完这种方案以后,地平线没有停下脚步,还在尝试更加新颖,网络上限更加大的方案。原来一直是先做alignment,再做fusion或者先做队列,再做fusion。那alignment和fusion这两步可以进一步的整合吗?因为这两步是人通过规则分开的两种架构性步骤,如果能够通过一个神经网络把它这两个步骤都做到一起,或许网络的上限会更高。

对应下来,在空间融合部分,受到了特斯拉及其他一些工作的启发,可以看到图8下的Transformer方式,可以计算原始图像pixel和最终BEV空间中pixel的交叉关联。交叉关联的学习本身是一种alignment,因为学习的是原始像素到BEV像素中关联,同时还会学习关联的强弱,强弱本身表示一种融合上的权重倾向性。所以通过Transformer结构,可以将alignment和spatialfusion进行融合。

在时间方面也有类似的操作,以往有一个通过规则写下来的固定队列,每一步神经网络处理的是队列里面所有的或最新的样本,如果再进一步,是否能够让神经网络自己去学习如何去入队?如何出队?以及什么时候从队列里面选取什么样的信息融合?这里工作其实叫做MemoryNetworks,它是自己去学习如何存储信息、读取信息以及融合信息的神经网络结构。

大家可以看到在软件2.0的范式下,哪怕是BEV架构也可以有很多的玩法,而且为了能够让各种各样的玩法,尽快的从实验室部署到车端,需要有很强的芯片工具链支撑。因为不希望在GPU上写了一个很好的模型,但移到芯片上部署,没有工具链的支撑。开发者在芯片上做各种定点量化是很痛苦的,所以需要一个工具链让这个过程很平顺地自动化完成。

地平线在这方面也有一些成就,地平线的工具链不仅让内部的工程师使用,还希望能够让我们的客户,包括汽车行业以及汽车行业之外的客户,把神经网络从训练、量化、部署整个的流程能比较顺利的在一个链条里面打通,通过这种方式让BEV方案快速的演进、迭代,扩展到各种各样的任务上。

3

BEV感知的十八般武艺

在谈到的Challenge中,个人认为最简单的是设计神经网络架构,稍微更难一点的是怎么样设计一个不重不漏的感知任务集合,它的输出能够被下游不重不漏地使用,不重表示它是一个很精炼的集合,不会重复输出一些内容让下游去选;不漏表示不要出现下游本来使用,但是感知任务没有办法提取的任务。之前的感知架构栈有这样的问题,经常在实践过程中不断往里面加各种各样奇奇怪怪的任务,来弥补之前任务设计的疏漏,这也会引入很多融合相关的问题,因为上游给的输出越多,也要面临更多选择融合的过程。最好是不做选择,希望上游给的就是最完整、不重不漏的输入。

图9

地平线内部对于这件事情的理解,可以分为以下几个层次,从lowlevel表达物理世界的约束;到中层语义层次,

1
查看完整版本: 地平线刘景初上帝视角与想象力自动驾驶