Warning!远距离LiDAR感知

本文经自动驾驶之心公众号授权转载,转载请联系出处。

一、引言

去年开了图森ai day之后,一直想以文字形式总结一下这几年在远距离感知方面所做的工作,正好最近有时间了,就想写一篇文章记录一下这几年的研究历程。本文所提到的内容都在图森ai day视频[0]和公开发表的论文中,不涉及具体的工程细节等技术秘密。

众所周知,图森是做卡车自动驾驶的,而卡车不论是刹车距离还是变道时间都远比轿车要长,所以如果说图森有什么与其他自动驾驶公司不同的独门技术,远距离感知必然是其中之一。我在图森负责LiDAR感知这一块,就专门聊一聊使用LiDAR进行远距离感知的相关内容。

刚加入公司时,主流的LiDAR感知一般是BEV方案。不过此BEV不是大家熟悉的那个BEV,特斯拉的那个BEV感知我个人认为应该叫作“多视角相机在BEV空间下的融合技术”,而这里的LiDAR BEV是指将LiDAR点云投影到BEV空间下,然后接2D卷积+2D检测头进行目标检测的方案。我能查到最早关于BEV方案的记录是在百度发表在CVPR17的论文MV3D[1],后续的大部分工作,包括我所了解的大部分公司实际使用的方案,最后都要投影到BEV空间进行检测,大致也都可以归在BEV方案之中。

Warning!远距离LiDAR感知插图1MV3D[1]使用的BEV视角特征

BEV方案的一大好处是可以直接套用成熟的2D检测器,但也有一个很致命的缺点:它限制住了感知范围。从上图可以看到,因为要套2D检测器,它必须形成一个2D的feature map,此时就必须给它设置一个距离阈值,而在上图范围之外其实也还是有LiDAR点的,只是被这个截断操作给丢弃了。那可不可以把这个距离阈值拉大,直到包住所有点呢?硬要这么做也不是不行,只是LiDAR在扫描模式、反射强度(随距离呈4次方衰减)、遮挡等问题作用下,远处的点云是非常少的,这么做很不划算。

BEV方案的这个问题在学术界并没有引起关注,这主要是数据集的问题,主流数据集的标注范围通常只有不到80m(nuScenes 50m、KITTI 70m,Waymo 80m),在这个距离下BEV feature map并不需要很大。但工业界使用的中距离LiDAR普遍已经可以做到200m的扫描范围,而近几年也有几款远距离LiDAR问世,它们可以做到500m的扫描范围。注意到feature map的面积和计算量是随距离呈二次方增长的,在BEV方案下,200m的计算量几乎都无法承受,更不用说500m了。

Warning!远距离LiDAR感知插图3

公开数据集中激光雷达的扫描范围。KITTI(红点, 70m) vs. Argoverse 2 (蓝点, 200m)

在认识到BEV方案的局限之后,我们进行了多年的研究,最终才找到了可行的替代方案。研究过程并非一帆风顺,经历了很多次挫折,论文和报告中一般都只会讲成功而不会说失败,但失败的经验也是弥足珍贵的,所以博客反而成了更好的媒介,下面就按时间线依次讲述一下。

二、Point-based方案

CVPR19上,港中文发表了一篇Point-based检测器PointRCNN[2],它是直接在点云上进行计算的,点云扫到哪它算到哪,没有拍BEV的过程,所以这类point-based方案理论上是可以做到远距离感知的。

Warning!远距离LiDAR感知插图5

但我们试下来发现了一个问题,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。

Warning!远距离LiDAR感知插图7RV、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物体检测器

Warning!远距离LiDAR感知插图9

但如果要把这个算法应用在向前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左右的位置看一下动态的检测效果:

Warning!远距离LiDAR感知插图11

虽然是最终的融合结果,但因为这天起雾图像能见度很低,所以结果基本上都来自于LiDAR感知。

五、后记

从point-based方法,到range image方法,再到基于sparse voxel的Transformer和sparse conv方法,对于远距离感知的探索不能说是一帆风顺,简直就是满路荆棘。最后其实也是随着算力的不断提升加上很多同事的不断努力才做到了今天这一步。在此感谢图森首席科学家王乃岩和图森的各位同事、实习生们,这里面大部分的idea和工程实现都不是我做出来的,很惭愧,更多地是起到了承上启下的作用。

很长时间不写这么长的文章了,写得跟个流水账似的而没有形成一个动听的故事。近年来,坚持做L4的同行越来越少,L2的同行们也逐渐转向纯视觉的研究,LiDAR感知肉眼可见地逐步被边缘化,虽然我仍然坚信多一种直接测距的传感器是更好的选择,但业内人士似乎越来越不这么认为。看着新鲜血液们的简历上越来越多的BEV、Occupancy,不知道LiDAR感知还能再坚持多久,我又能坚持多久,写这么一篇文章也是起到一个纪念作用吧。

深夜涕零,不知所云,见谅。

文章来源:51cto

联系邮箱:idea2003@foxmail.com

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注