一、引言
去年举办了图森AI Day后,一直有个念头,想以文字形式概述一下我们在远距离感知方面的工作。最近正好有时间,于是决定写一篇文章,记录一下这几年的研究历程。本文所涉及的内容都可以在图森AI Day的视频[0]和我们公开发表的论文中找到,但并不包含具体的工程细节或技术秘密。
众所周知,图森专注于卡车自动驾驶技术。与轿车相比,卡车的刹车距离和变道时间更长。因此,图森在与其他自动驾驶公司的竞争中拥有独特的优势。作为图森的一员,我负责LiDAR感知技术,现在我将详细介绍使用LiDAR进行远距离感知的相关内容。
在公司刚加入时,主流的LiDAR感知方案通常是BEV(Bird's Eye View)方案。然而,这里的BEV并不是大家所熟知的电动车(Battery Electric Vehicle)的缩写,而是指将LiDAR点云投影到BEV空间下,并结合2D卷积和2D检测头进行目标检测的方案。我个人认为,特斯拉所采用的LiDAR感知技术应该被称为“多视角相机在BEV空间下的融合技术”。 据我所查,最早关于BEV方案的记录是百度在CVPR17会议上发表的论文《MV3D》[1]。随后的许多研究工作,包括我所了解的许多公司实际使用的方案,都采用将LiDAR点云投影到BEV空间进行目标检测的方法,并可归类为BEV方案。这种方案在实际应用中被广泛采用。 总结一下,刚加入公司时,主流的LiDAR感知方案通常是将LiDAR点云投影到BEV空间下,然后结合2D卷积和2D检测头进行目标检测。特斯拉所采用的LiDAR感知技术可以称为“多视角相机在BEV空间下的融合技术”。百度在CVPR17会议上发表的论文《MV3D》是关于BEV方案的早期记录,随后许多公司也采用了类似的方案进行目标检测。
MV3D[1]使用的BEV视角特征
BEV方案的一大好处是可以直接套用成熟的2D检测器,但也有一个很致命的缺点:它限制住了感知范围。从上图可以看到,因为要套2D检测器,它必须形成一个2D的feature map,此时就必须给它设置一个距离阈值,而在上图范围之外其实也还是有LiDAR点的,只是被这个截断操作给丢弃了。那可不可以把这个距离阈值拉大,直到包住所有点呢?硬要这么做也不是不行,只是LiDAR在扫描模式、反射强度(随距离呈4次方衰减)、遮挡等问题作用下,远处的点云是非常少的,这么做很不划算。
学术界对于BEV方案的这个问题并没有引起太多关注,主要原因是数据集的限制。目前主流数据集的标注范围通常只有不到80米(如nuScenes的50米、KITTI的70米和Waymo的80米),在这个距离范围内,BEV特征图的尺寸并不需要很大。然而,在工业界,使用的中距离LiDAR普遍能够达到200米的扫描范围,而近年来也有一些远距离LiDAR问世,它们能够实现500米的扫描范围。需要注意的是,特征图的面积和计算量随着距离的增加呈二次方增长。在BEV方案下,处理200米范围的计算量已经相当巨大,更不用说处理500米范围的情况了。因此,这个问题需要在工业界中得到更多的关注和解决。
公开数据集中激光雷达的扫描范围。KITTI(红点, 70m) vs. Argoverse 2 (蓝点, 200m)
在认识到BEV方案的局限之后,我们经过多年的研究,最终找到了一种可行的替代方案。研究过程并非一帆风顺,我们经历了许多次挫折。一般情况下,论文和报告只会强调成功而不提及失败,但失败的经验同样是非常宝贵的。因此,我们决定通过博客来分享我们的研究历程。接下来,我将按时间线逐步叙述。
二、Point-based方案
在CVPR19上,港中文发表了一项名为PointRCNN[2]的点云检测器。与传统方法不同,PointRCNN直接在点云数据上进行计算,而不需要转换为BEV(鸟瞰图)形式。因此,这种基于点云的方案理论上可以实现远距离感知。
但我们试下来发现了一个问题,KITTI一帧的点云数量可以降采样到1.6万个点来检测而不怎么掉点,但我们的LiDAR组合一帧有10多万个点,如果降采样10倍显然检测精度会大幅度受影响。而如果不降采样的话,在PointRCNN的backbone中甚至有O(n^2)的操作,导致它虽然不拍bev,但计算量仍然无法承受。这些比较耗时的op主要是因为点云本身的无序性,导致不论是降采样还是检索邻域,都必须遍历所有的点。由于涉及到的op较多且都是没有经过优化的标准op,短期内感觉也没有能优化到实时的希望,所以这条路线就放弃了。
不过这段研究也并没有浪费,虽然backbone计算量过大,但它的二阶段因为只在前景上进行,所以计算量还是比较小的。把PointRCNN的二阶段直接套用在BEV方案的一阶段检测器之后,检测框的准确度会有一个比较大的提升。在应用过程中我们也发现了它的一个小问题,解决之后总结发表成了一篇文章[3]发表在了CVPR21上,大家也可以到这篇博客上看看:
王峰:LiDAR R-CNN:一种快速、通用的二阶段3D检测器
三、Range-View方案
在Point-based方案尝试失败之后,我们将目光转向了Range View,当年的LiDAR都是机械旋转式的,比如64线激光雷达就会扫描出64行具有不同俯仰角的点云,比如每行都扫描到2048个点的话,就可以形成一张64*2048的range image。
RV、BEV、PV的对比
在Range View下,点云不再是稀疏的形式而是致密地排列在一起,远距离的目标在range image上只是比较小,但并不会被丢掉,所以理论上也是能检测到的。
可能是因为与图像更相似,对于RV的研究其实比BEV还早,我能找到的最早记录也是来自于百度的论文[4],百度真的是自动驾驶的黄埔军校啊,不论是RV还是BEV的最早应用都来自于百度。
于是当时我就随手试了一把,结果跟BEV方法相比,RV的AP狂掉30-40个点...我发现其实在2d的range image上检测得还可以,但输出出来的3d框效果就非常差了。当时分析RV的特性,感觉它具备图像的所有劣势:物体尺度不统一、前背景特征混杂、远距离目标特征不明显,但又不具备图像语义特征丰富的优势,所以当时对这个方案比较悲观。
因为正式员工毕竟还是要做落地的工作,对于这种探索性问题还是交给实习生比较好。后来招了两名实习生一起来研究这个问题,在公开数据集上一试,果然也是掉了30个点...还好两位实习生比较给力,通过一系列的努力,还有参考其他论文修正了一些细节之后,将点数刷到了跟主流BEV方法差不多的水平,最终论文发表在了ICCV21上[5]。
虽然点数刷上来了,但问题并没有被彻底解决,当时lidar需要多帧融合来提高信噪比的做法已经成为共识,远距离目标因为点数少,更加需要叠帧来增加信息量。在BEV方案里,多帧融合非常简单,直接在输入点云上加上一个时间戳然后多帧叠加起来,整个网路都不用改动就可以涨点,但在RV下变换了很多花样都没有得到类似的效果。
并且在这个时候,LiDAR从硬件的技术方案上也从机械旋转式走向了固态/半固态的方式,大部分固态/半固态的LiDAR不再能够形成range image,强行构造range image会损失信息,所以这条路径最终也是被放弃了。
四、Sparse Voxel方案
之前说过Point-based方案的问题在于点云不规整的排列使得降采样和邻域检索等问题需要遍历所有点云导致计算量过高,而BEV方案下数据规整了但又有太多空白区域导致计算量过高。这两者结合一下,在有点的地方进行voxelization使其变得规整,而没点的地方不进行表达来防止无效计算似乎也是一条可行的路径,这也就是sparse voxel方案。
因为SECOND[6]的作者闫岩加入了图森,所以我们在早期就曾经尝试过sparse conv的backbone,但因为spconv并不是一个标准的op,自己实现出来的spconv仍然过慢,不足以实时进行检测,有时甚至慢于dense conv,所以就暂时搁置了。
后来第一款能扫描500m的LiDAR:Livox Tele15到货,远距离LiDAR感知算法迫在眉睫,尝试了一下BEV的方案实在是代价太高,就又把spconv的方案拿出来试了一下,因为Tele15的fov比较窄,而且在远处的点云也非常稀疏,所以spconv勉强是可以做到实时的。
但不拍bev的话,检测头这块就不能用2D检测中比较成熟的anchor或者center assign了,这主要是因为lidar扫描的是物体的表面,中心位置并不一定有点(如下图所示),没有点自然也无法assign上前景目标。其实我们在内部尝试了很多种assign方式,这里就不细讲公司实际使用的方式了,实习生在之后也尝试了一种assign方案发表在了NIPS2022上[7],可以看看他写的解读:
明月不谙离苦:全稀疏的3D物体检测器
但如果要把这个算法应用在向前500m,向后和左右各150m的LiDAR组合下,还是力有不逮。恰好实习生之前追热度曾经也借鉴Swin Transformer的思想做过一篇Sparse Transformer的文章[8],也是费了好大的功夫从掉20多个点一点点刷起来(感谢实习生带飞,tql),当时觉得Transformer的方法还是很适合不规整的点云数据的,所以在公司数据集上也试了一下。
可惜的是,这个方法在公司数据集上一直刷不过BEV类方法,差了接近5个点的样子,现在回想起来可能还是有一些trick或者训练技巧没有掌握,按理说Transformer的表达能力是不弱于conv的,但后来也并没有再继续尝试。不过这个时候已经对assign方式进行了优化降低了很多计算量,所以就想再尝试一把spconv,结果令人惊喜的是,直接把Transformer替换为spconv就可以做到近距离与BEV类方法的精度相当,同时还能检测远距离目标的效果了。
也是在这个时候,闫岩同学做出了第二版spconv[9],速度有了大幅度提升,所以计算延迟不再是瓶颈,终于远距离的LiDAR感知扫清了所有障碍,能够在车上实时地跑起来了。
后来我们更新了LiDAR排列方式,将扫描范围提升到了向前500m,向后300m,向左向右各150m,这套算法也运行良好,相信随着未来算力的不断提升,计算延迟会越来越不成问题。
下面展示一下最终的远距离检测效果,大家也可以看看图森ai day的视频的01:08:30左右的位置看一下动态的检测效果:
虽然是最终的融合结果,但因为这天起雾图像能见度很低,所以结果基本上都来自于LiDAR感知。
五、后记
从point-based方法,到range image方法,再到基于sparse voxel的Transformer和sparse conv方法,对于远距离感知的探索不能说是一帆风顺,简直就是满路荆棘。最后其实也是随着算力的不断提升加上很多同事的不断努力才做到了今天这一步。在此感谢图森首席科学家王乃岩和图森的各位同事、实习生们,这里面大部分的idea和工程实现都不是我做出来的,很惭愧,更多地是起到了承上启下的作用。
很长时间不写这么长的文章了,写得跟个流水账似的而没有形成一个动听的故事。近年来,坚持做L4的同行越来越少,L2的同行们也逐渐转向纯视觉的研究,LiDAR感知肉眼可见地逐步被边缘化,虽然我仍然坚信多一种直接测距的传感器是更好的选择,但业内人士似乎越来越不这么认为。看着新鲜血液们的简历上越来越多的BEV、Occupancy,不知道LiDAR感知还能再坚持多久,我又能坚持多久,写这么一篇文章也是起到一个纪念作用吧。
深夜涕零,不知所云,见谅。