面向规模化量产的自动驾驶感知研发与实践
01 地平线自动驾驶环境感知量产实践
图1
附赠自动驾驶最全的学习资料和量产经验:链接
首先,为大家简单介绍下自动驾驶分级,图1左边来自于SAE,是大家提到自动驾驶分级时最广泛看到或最广泛引用的权威来源。从定义上来看,L3级以上才算是自动驾驶。L3级自动驾驶功能里,汽车具备从A点开到B点的能力。L2级的自动驾驶汽车仅仅具备纵向或横向的控制能力,不具备同时控制的能力,因此无法进行变道、超车、上下匝道,所以不能从一个地点开到另外一个地点。L4相比于L3,不再需要人去接管。到了L5级,对自动驾驶场景的限制就不再有了。
目前,国内的量产乘用车还不具备L3级的能力和功能,所以上面刚刚提到研发的Horizon Matrix Mono和Horizon Matrix Pilot产品,实际上也是ADAS或辅助驾驶产品。现有的一些车型实际上已经具备了L3能力,稍后讲到Pilot时也会提到,所谓L3是能够在限定场景区域内从一个点开到另外一个点。
图2
图2是地平线Horizon Matrix智能驾驶解决方案的一个产品矩阵,包括Mono 前视辅助驾驶解决方案、Pilot 领航辅助驾驶解决方案和高级自动驾驶解决方案。它们分别是基于征程2,征程3和征程5开发的。由于今天聚焦于量产实践,所以会讲解在征程2和征程3上已经量产的Mono 和即将量产的Pilot 。从图2中可以看到,Mono的研发时间是从2018年到2021年,三年磨一剑;Pilot 也是用了近两年的研发时间,而SuperDrive,即更高级别基于征程5的解决方案将会在明年量产。
图3
先来看下Mono 的简介,Mono 是基于征程2或征程3的前视单目ADAS解决方案,征程2有4 TOPS的算力,征程3有5 TOPS的算力,它们分别支持C-NCAP跟E-NCAP的法规要求。
Mono 产品虽然看似简单,仅仅是一个单目前视解决方案,却是提升用户驾驶安全性,使得客户车型能够满足NCAP要求的重要产品。NCAP是指New Car Assessment Program,这也是欧洲、日本、北美和中国在法规层面,汽车进入市场之前一个逐步强制的要求。
图4
Pilot 是基于3颗征程3,10路摄像头,支持高速路领航辅助驾驶和停车场记忆泊车的一款L2+产品,也是首个基于国产AI芯片的行泊一体的平台。从图4右下角可以看到Pilot 摄像头的布局,包括1个前视的8M相机,4个侧视的2M相机,后视的1颗相机和4路的环视鱼眼相机。
一些外部的调研也发现,消费者认为自动驾驶目前最需要解决的场景或最有需求的场景,是停车和高速路驾驶,Pilot 3恰好满足了这个要求,所以Pilot 3这款产品的功能正在逐步成为智能汽车的一个标配。我们也看到并预测,未来具备高速路领航辅助驾驶功能车型的量产会越来越多。
以上是已经量产和即将量产的两款主要产品,接下来会为大家讲解其中的感知算法设计,并且是如何结合征程2和征程3芯片实现高性能表现。
02 软硬协同的自动驾驶感知算法设计
图5
最简单的是一个固定的融合网络,这也是最早期的BEV方案。它的好处是所有的都见过,没有特别新的架构在里面,但是足够简单、鲁棒、好用,所以作为一个起点对应上面提到的几个不同层次内容。左边是上面提到的alignment、temporal fusion、 spatial fusion、最终的Task heads,图6以摄像头为例,激光雷达可能会有一些不同的变种,但基本的意思是一样的。首先,在征程2和征程3里,通过采用多任务模型来同时获得更好的感知性能和更低的系统延迟,所以可以认为我们的感知系统是由一个或多个多任务模型组成的。图5有一个简单的示例图,包括以全图输入的一些多任务模型,和若干以ROI作为输入,或是需要做细粒度识别的一些多任务模型。
图6
下面将从Backbone、Task设计以及Multi-task model三个方面为大家讲解算法的设计。首先是Backbone的设计,在Google提出MobileNet之后,MobileNet在对低延迟有非常高要求的场景中获得了巨大成功,并且它仅需要更小的算力。但MobileNet也有一定的缺陷,因为它的depthwise convolution与pointwise convolution的计算量分配不均,使得在硬件上会增加计算和访存读取的切换时间。
为了解决上面的问题,我们提出了VarGNet。它是指可变组的卷积,即variable group的CNN,通过可变组卷积升维,再通过pointwise convolution降维。MobileNet则是通过depthwise convolution升维。相比普通的 group convolution,我们的网络group数可变,但每个卷积里分组channel数是一致的,而一般的group convolution是channel数不一致,但group数保持一致。之所以要做到channel数一致,是因为可以组合跨层之间的部分 channel卷积,减少在SRAM与DDR之间的读取。
VarGNet有两个特性,一个是Block内计算更均衡,像刚刚提到的升维和降维分别使用variable group跟pointwise convolution计算,减少了内存切换和计算之间的平衡;另外一方面在block之间采用了一个更小的 channel或更小的feature map,通过这种方式达到更好的访存和计算平衡。
关于特征和参数的组合,以及硬件在计算过程中的流水线,大家可以参考凌坤在2月23日讲解的《好的自动驾驶AI芯片更是“好用”的芯片》,里面有更详细的介绍。这篇VarGNet的论文,也可以在arXiv上找到。
图7
之后是感知任务设计,大家最熟悉可能是2D感知。计算机视觉里一些经典的任务,比如检测、分割、分类和关键点检测,组成了自动驾驶里最基础的2D感知。图7有一些示例,像车辆检测、车型分类、针对一个行车场景和停车场景的分割,以及通过车轮接力点的关键点检测,在2D任务里判断车辆的朝向,和在停车场景中停车位的检测。但是2D感知都是在图像域的,所以要变为