7月4日,地平线「你好,开发者」自动驾驶技术专场在智东西公开课顺利完结直播。专场由地平线4D标注技术负责人隋伟主讲,主题为《面向BEV感知的4D标注方案》。
本文是此次专场主讲环节的实录整理。如果对直播回放以及Q&A有需求,可以点击阅读原文前去观看。
各位朋友,大家好,非常荣幸有这样一个机会,在智东西公开课和大家做一次技术分享。
今天我要分享的是《面向BEV感知的4D标注方案》。首先会简单的介绍一些4D标注的技术,以及依赖的硬件基础;之后主要介绍两种标注方案:一种是面向采集场景的,主要是在研发阶段,使用的车辆传感器会按照自己的需求进行改装。一个简单的例子就是可以用一些非量产的传感器;另一种是面向量产场景的,例如针对量产数据badcase迭代阶段,这种场景下只能够利用量产车上的传感器,会有一些限制;最后,我会介绍一下地平线4D-Label的云端运营平台,以及4D-Label技术的未来发展趋势。
01 4D-Label技术简介
首先介绍一下4D-Label技术。4D主要就是3D空间和时序。以BEV为代表的感知技术,典型的特征就是输出的空间从2D的透视图像转换到了3D空间。原先都是在图像空间里,输入的是图像,输出的也是2D图像像素空间的信息,也就是所见即所得。但BEV感知技术输入的是2D的图像或者是2D的video,输出的是3D空间的感知结果,通常是以车体坐标系之下的一些3D静态或者动态的结果。对于BEV感知,真值数据的生成是非常关键的环节,因为标注的空间需要从2D透视图像空间转换到3D空间。其中,考虑到时序动态物体,需要用到一项很重要的技术就是4D重建技术。
这次技术分享涉及到的一些感知任务,大致可以分为三类:第一类是静态感知。静态感知的输出形式,实际上越来越像局部的高精地图,包含物理层,逻辑层以及半动态层。其中物理层主要是路面连续要素如车道线、路面离散要素如路面标识符,空中静态要素如灯牌,半动态层主要是像锥桶这类容易被移动的物体。逻辑关系主要是车道链接关系,以及道路元素和交通灯的关联关系。动态感知主要是运动车辆和行人,包含检测、跟踪、预测,此外还有一些速度、加速度的属性,现有的一些端到端的感知框架,可以直接在同一个网络完成以上所有感知输出。还有一类任务就是通用障碍物感知,主要是针对场景中的非白名单的物体,目前业界主流的的感知任务就是Occupancy和Ocupancy Flow ,这类任务的基本原理是将空间划分成规则的voxel, 预测每个voxel的被占据情况以及每个voxel的速度,本质上是通过几何的方法,而非语义的方法实现对通用物体的识别。今天我们主要就是针对这三类任务,来介绍一些标注方案。
4D-Label整体的技术路线,无论是面向采集场景的多模方案还是面向量产数据的纯视觉方案,都是一致的。整体的思想就是:首先是采集数据,之后进行点云或者Object级别的4D重建。在得到4D重建空间的基础之上,采用人工的方式通过3D 标注工具进行标注和质检,之后完成真值数据的发版。随着人工标注数据越来越多,可以在云端训练一些大模型,用于辅助标注,提升标注效率,降低标注成本。当云上的数据规模累积到一定的程度,云上模型的性能会大幅度提升。此时,大部分的标注任务都可以实现自动化标注。
此外,为了进一步提升标注的质量和自动化,我们会设计一些自动质检的策略。比如说,采用多传感器的交叉验证,在2D图像上利用大模型的预刷,得到一些标注结果,同时和3D空间的标注结果进行对比,去除差异较大的数据,只保留一致性好的标注数据作为真值,从而保证真值数据的质量。通过大模型预刷,目前我们可以通过这种策略可以节省80%以上的标注人力,甚至有一些像动态物体的标注,可以实现完全自动化。
4D标注涉及到的硬件基础,首先就是传感器的布局。在L2++以上的自动驾驶方案里面,通常采用周视+环视的布局方式,构成了两层360度成像范围。如果是面向采集场景的采集车,一般会在车顶安装Pandar128 Lidar用于标注。
在得到改装的车辆之后,还要进行传感器之间的外参标定和时间同步,用来实现不同传感器之间数据的时空一致性。涉及到的外参标定主要有Lidar和camera之间的标定,以及GPS、IMU和Vcs坐标系之间的标定。标定的方式可以分为两种,一种是工厂标定,一种是在线标定。工厂标定,是在出厂时进行的一次比较全面和系统的标定,通过特定的标注工具,得到高精度的标定结果,但是无法频繁地进行标定。在线标定,是利用一些端上的感知结果,进行外参标定,在线标定可以高频次进行,能够有效地保证传感器精度的下限,例如当传感器因为抖动而发生位置变化的时候,在线标定可以获取最新的标定结果。在实际过程中,这两种方式我们都会使用,工厂标定得到传感器的外参之后,通过在线标定做实时或者定时更新。
在得到外参标定之后,还需要进行多传感器之间的时间同步,用于保证不同传感器之间准确的数据的关联关系。在我们方案里,采用的是11V图像同步曝光,时间偏差小于5ms。
另外,介绍一下我们的方案里面涉及到的一些数据格式的定义,这里涉及到两个基本的数据概念。
第一个数据概念是Clip。Clip是一段数据视频,可以是固定的长度或者固定的空间距离。比如说,在量产的时候,可以设定Clip的长度是15s。在采集模式下,可以采用空间距离,限制它为300m的局部片段。每个clip都包含多个传感器的数据。例如在采集模式下,clip包含Lidar点云数据,11V的图像数据,以及GPS、IMU、轮速计等所有传感器的数据。
第二个数据概念是Site。Site是一个空间的物理坐标点,可以理解成是一个空间的GPS点。这个空间位置中具有唯一的特性,一个Site可以包含多个经过它的Clip。举个简单的例子,把路口中心点定义成一个Site,就可以通过GPS范围来筛选出所有经过该路口的Clip数据。
02 面向采集场景的多模标注方案
上面是一些4D-Label的简单的技术简介。接下来,我会介绍两种方案:一种是面向采集场景的多模标注方案,另一种是面向量产的纯视觉方案。多模标注方案在量产感知传感器基础之上增加了Pandar128雷达。面向量产的标注方案主要是采用量产传感器采集的数据进行标注,我们的方案是纯视觉感知,因此只用图像信息(结合惯导、轮速计等)进行标注。对于一些有Lidar的量产方案,可以将Lidar利用起来,以减少动态标注的难度。
首先是多模的方案。我们按照这几种任务,分别来介绍一下标注的过程:
我们按照静态、动态和通用障碍物三种任务分别介绍一下多模标注方案。
首先是路面静态要素的标注。路面静态要素的标注,本质上是对路面进行建模,也就是局部的建图。在我们的方案里面,采用了单趟重建和多趟聚合的方式。这种方式,一方面可以提升建图效率,平摊标注成本;另一方面也能保证建图的完整性,提升召回以及远距离的真值。
介绍一下具体方案:首先利用Pandar128采集的数据,结合IMU和GNSS数据,做单趟重建,得到单趟的点云地图;每一个clip都对应一个点云地图,之后把位于同一个Site的所有clip的点云地图收集起来,并建立clip之间的关联关系,确定联合优化的范式,将多个clip的点云地图进行聚合,得到完整的局部地图。
在我们的方案里面,需要同时满足城区、高速、还有泊车三个场景的建图。这些环境都存在非常大的挑战,针对单趟局部建图,我们做了一些的优化。例如高速场景的初始化,很容易因为速度过快、环境单一、特征约束不足而失败。我们方案引入了语义信息,来提供更加准确的Lidar关键点的对应关系同时也采用轮速计和GNSS这样的多传感器的数据,来辅助初始化。经过这些优化之后,可以将初始化的成功率提升到98%以上,单趟的重建精度可以达到厘米级(和高精度的Novatel进行评测)。
在得到单趟重建之后,为了提升局部地图的完整性,提升路面元素的召回,需要对多趟clip重建的结果进行聚合。多趟聚合的核心点在于位置重识别,也就是SLAM里面的回环检测。回环检测的关键在于提供feature层面的对应关系。但是,因为这个场景里面比较单一,像高速场景或者是路口场景,能够有效识别的特征并不是很多,容易导致回环检测失败,或者造成比较大的偏差。
针对这些问题,我们对聚合做了一些优化:首先和单趟重建一样,引入了一些语义信息,能够得到一些路面和标识牌这些显著的特征,利用语义信息引导进行匹配;另外,也采用了一些learning的方法,得到的一些关键点,能够在一些极端环境下,提供更鲁棒的匹配结果。通过这两种策略,可以使多趟重建的成功率达到90%以上。下面这个demo就是一个全局聚合之后的局部地图的效果,可以看到,由于建图的精度足够高,lidar intensity图上路面的元素结构特别清晰。
Lidar的反射率会对材质敏感,当遇到特殊材质、路面破旧或者有积水的情况,会导致intensity图上路面要素不清晰,难以识别,另一方面Pandar128的intensity本身就需要标定,同一台Lidar传感器,在跨天或者跨地点的时候,会出现Intensity不稳定的情况。为了提升标注的召回,我们的方案里引入了语义图以及纹理图,用于提供更多的信息(见上图)。
纹理图,主要是通过Lidar和视觉的外参标定,实现了Pixel -level的融合,最终得到路面纹理的重建结果,纹理图像能提供的信息非常丰富,理论上只要具备行驶条件的场景下的数据,纹理图像都能进行标注。和纹理图一样,语义图是用采用2D图像的感知结果,通过Lidar-camera的融合得到的,引入感知结果可以处理一些弱纹理的情况。
在标注的时候,我们将三种不同模态的数据投影到一个平面上得到一幅BEV空间的大图,通过人工标注的方式得到真值数据。由于投影的过程保留了高度信息,因此标注的结果可以利用这些高程信息得到3D空间的数据。
当积累一定的量的数据之后,我们利用这些数据训练一个云端大模型用于辅助标注。模型采用了我们自己的一篇工作MapTR,输入是三种模态的大图的信息,输出的直接是实例级别数据。每一条车道线都会表示成有序的点列,这样就节省了很多的后处理。这些标注的结果通过简单的处理就可以得到训练样本。后续我们也会尝试采用MapTR直接标注逻辑层。
这是我们通过多模的方案,做的一个标注案例。这个案例里面有三段clips,左上角不同颜色的轨迹代表不同的clips。通过三个clips的聚合,保证了路口的完整性。因为在有些路口比较大的情况下,单趟的采集和重建,不能保证这个路口能被完整的重建出来。通过多个Clip聚合的方式,可以保证路口的完整性,同时也能满足远距离感知的真值需求。
此外,通过聚合的方式,也可以平摊clip的标注成本。因为聚合之后,一张BEV大图,只需要标注一次,就可以生成所有clip的真值。我们采用将标注的真值投影到图像空间,计算重投影误差的方式对多模的真值进行评测。我们的方案可以做到重投影误差小于3个像素。
我们的方案相较于HDmap定位生成真值的方式在多个方面具有优势。首先是可扩展性强。图商的高精地图,在建图的时候,会采用价格高昂传感器,成本很高,可扩展性比较差,体现在现在高能地图的覆盖率并不是很高,尤其是在城市地区。我们的方案虽然是基于采集车,但是也需要考虑采集车队的可扩展性,所以我们采用的是一般精度的传感器。另外,图商的地图在建图主要目的是用来做定位导航,因此需要做完整的建图,而4D-Label的首要目的是用来做标注,感知数据首先要考虑的是质量、数量和多样性,因此所以不需要做完整的地图重建,甚至不需要做地图的维护,只需要在一些区域里面做采样性地重建,就能够满足真值多样性的需求。
这是第一个不同点,第二点不同的是图商的地图,受鲜度的影响,地图更新比较慢。这样会导致在生成真值的时候,需要投入大量的人力资源,去识别地图和实际场景不一致的问题。而4D-Label大部分情况都是即建即用,不需要考虑鲜度的问题。
此外,定位精度也会存在差别。现在基于视觉感知的的高精地图定位方法,横向误差大概是在10-20cm左右,纵向误差可能会到30-40cm以上。这样的精度,偏差已经大于一根车道线,没有办法满足真值精度的需求。而4D-Label这种方法,不需要考虑全局的定位精度,只需要保证局部的里程计精度,所以它的精度会比较高。横纵向误差都能够到10cm以下。这就是图商HD Map和4D-Label的一些对比。总而言之,4D标注的首要目标是满足感知的真值需求,所有的方案设计都应该从围绕满足真值数据的数量、质量和多样性。
刚才讲的是行车。在泊车场景下的标注,底层的建图方案基本一致。唯一的区别在于地库泊车场景下,没有GNSS信息,无法采用多趟重建+全局聚合的方式。因此在泊车场景下,我们采用全场景建图的方式,将采集的数据进行完整的地图重建。针对建图精度提升的优化策略与行车也基本相同,主要是通过Lidar-seg语义的信息,做了一些约束。泊车场景的重建的精度,能够达到4-5cm。我们主要是通过人工构造回环的方式进行评测。在标注的时候,我们也开发了相应的预刷大模型。像地库位点、限位器、库位角点还有墙壁的检测,现在都是通过大模型预刷的方式来进行。
以上介绍的是路面的静态要素的标注,接下来介绍动态物体的标注。动态物体的标注,采用的Lidar+视觉后融合的方案。主要的过程是,首先有一个Lidar检测的大模型,对输入的Pandar128的点云数据进行感知,得到每帧点云上的3D物体的检测框。之后采用传统的卡尔曼滤波的方式,对不同帧之间感知结果的跟踪,得到每个物体的跟踪结果,从而可以获取每个物体在时序上的一条完整轨迹。
通过利用Lidar SLAM获取的自车轨迹,可以将每个运动物体投射到全局坐标系之下,从而得到全局的轨迹。之后,对这些运动物体的轨迹做进一步的优化,比如说轨迹的平滑性,还有动力学约束,能够得到一些更加平滑和准确的轨迹。得到运动物体的轨迹之后,就可以得到其所有信息,包括track ID,预测的信息,速度和加速度等属性。拿到这些信息之后,就可以生成动态感知任务的真值,像检测、预测,还有端到端直接估计速度、加速度的属性。
4D标注过程在云上进行的最大的优势就是可以利用未来的信息来做标注。也就是说,一个运动物体可以用其未来的信息来辅助当前的标注,也因此能够得到比较高的一个精度或者召回。我们前面讲到,视觉和Lidar之间会有时间的同步,而视觉11V的图像是同时曝光的,它和Lidar之间的扫描会存在一个时间偏差。利用时间同步的信息和轨迹信息,可以把物体的运动信息插值到任何一个时刻,从而得到每个时刻的真值。例如当某些Lidar帧上出现漏检的情况,可以通过时序轨迹差值的方式补充在该帧上的结果。
为了进一步提升真值的质量,我们采用2D预刷大模型的方式,和3D插值的结果进行对比,实现自动质检。只有3D投影的结果和2D有比较高的overlap,才会被当作高质量的真值保留下来,否则会被丢弃掉。这样做并不会影响真值的的效果,因为检测任务中每个训练样本是物体的object,而不是一幅图像。所以,即便在同一个样本里,一幅图像或者一帧点,有部分的object没有被完全准确标注出来, 也并不影响最终的训练任务。一个时刻的图像,如果能保证里面有60% -70%的真值是准确标注的,就能够满足模型训练的需求。这种投影的方式还有一个用处就是将2D感知的属性赋予3D标注结果,例如车辆的车门开合、车灯颜色等,很难通过Lidar识别的信息,可以通过2D图像获取。
接下来介绍其它静态要素的标注,驾驶场景里面的红绿灯、交通牌和锥桶。这些物体的标注方案和动态物体基本是一致的,主要区别在于两点:3D空间bounding box的获取方式以及跟踪方式。在这里我们以锥桶的方案为案例进行介绍。
我们的主要的路线:首先是有一个Lidar分割的大模型,利用Lidar的语义信息,提取锥桶的潜在3D proposal,但这里面可能会存在大量的噪声;之后利用时序的信息对2D锥桶检测结果进行跟踪和关联;最后利用2D锥桶和3D-proposal做关联,去除一些噪声。可以看得出来,最终的标注方案,实际上是比较依赖于2D锥桶检测大模型,它的准召率也依赖于2D锥桶大模型。最后,通过2D和3D交叉验证的方式,得到锥桶的标注结果。我们的方案可以实现锥桶标注的准召率高于95%,测距误差50m范围之内小于5%。
这个demo展示了两个场景下的一些真值标注的效果,一个是泊车场景下,一个是行车场景下。对于一些2D检测出来,但是3D缺少的情况,可以采用标志为 ignore的方式,不参与训练。
最后,介绍一下通用障碍物的自动标注,其实就是驾驶里面的Occupancy和Occupancy flow的感知任务。Occupancy反映了场景中动静态物体的占据情况,它将空间划分成均匀的体素(voxel),有物体占据的地方标志为1,没有物体占据的地方标志为0。此外,每个voxel还有一个速度的矢量信息,表示voxel的运动情况,即Occupancy flows。Occupancy和Occupancy flow实际上是对场景进行4D重建, 它主要的优势就是可以识别场景中的一些通用的、非白名单的障碍物,像一些散落的石块、散落的不规则物体、还有像宠物、逆行车等。
现有的Occupancy也有一些真值生成方案,还有一些公开数据集,今年CVPR举办了Occupancy的竞赛,也发布了数据集。但是现有的这些方案主要的问题在于过多地依赖了语义信息,例如在将场景分成动态和静态的时候,会通过3D检测的方式来进行的,这就引入很强的语义信息。实际上,在真值生成过程中,过于依赖白名单物体,就会导致实际上生成的真值,并没有办法真正发挥通用物体检测的本初目的。
针对这种情况,我们对Occupancy的方案进行了一些改进。主要思路是在整个过程中尽量减少对语义的依赖。在动静态分离的时候,并不是依赖于白名单信息,而是利用几何信息进行运动分割。分割完之后,将静态场景和动态场景分而治之,静态采用前面介绍的静态语义建图的方式来得到静态的点云;动态的话,主要采用Scene Flow或者ICP的方式,来进行动态点云的配准,最终得到整个场景的4D点云。同时,在生成每帧图像的时候,我们也会做图像和3D结果的cross check,最后来生成真值。
下面是一些案例,这个场景里面有很多的障碍物,像摆放的不规则、临时的红绿灯,里面还有只宠物狗、行人推的婴儿车。像这只宠物狗,能够比较好的识别出来。还有一些不规则的,像放在十字路口的临时红绿灯,也能够比较好的识别出来。我们针对Occupancy真值的性能做了一些定量的评测。针对50cm×50cm这样的小物体,准召率是高于92%。
03 面向量产场景的纯视觉标注方案
接下来,我介绍一下面向量产场景的纯视觉标注方案。
纯视觉的标注方案,主要是利用视觉加上一些GPS、IMU和轮速计传感器的数据进行动静态标注。当然面向量产场景的话,不一定非要是纯视觉,有一些量产的车辆里面,会有像固态雷达(AT128)这样的传感器。如果从量产的角度做数据闭环,把这些传感器都用上,可以有效地解决动态物体的标注问题。但是我们的方案里面,是没有固态雷达的。所以,我们就介绍这种最通用的量产标注方案。
纯视觉的标注方案的核心在于高精度的pose重建。我们采用Structure from motion (SFM) 的pose重建方案,来保证重建精度。但是传统的SFM,尤其是增量式的SFM,效率非常慢,计算复杂度是O(n^4),n是图像的数量。这种重建的效率,对于大规模的数据标注,是没有办法接受的,我们对SFM的方案进行了一些改进。
改进后的clip重建主要分为三个模块:1)利用多传感器的数据,GNSS、IMU和轮速计,构建pose_graph优化,得到初始的pose,这个算法我们称为Wheel-Imu-GNSS-Odometry (WIGO);2)图像进行特征提取和匹配,并直接利用初始化的pose进行三角化,得到初始的3D点;3)最后进行一次全局的BA(Bundle Adjustment)。我们的方案一方面避免了增量式SFM,另一方面不同的clip之间可以实现并行运算,从而大幅度的提升了pose重建的效率,比起现有的增量式的重建,可以实现10到20倍的效率提升。
上图展示了这就是刚才介绍的两个重要模块WIGO和Parallel SFM。第一个是多传感器融合算法,提供初始化的pose,第二个是并行的SFM重建算法。WIGO的Relative Translation Error (RTE) 指标能到2.5%,Relative Rotation Error (RRE) 能到0.8deg/100m。引入视觉观测之后,Parallel SFM的 RTE指标可以降低到0.5%,RRE指标可以降低到0.2deg/100m。(所有的指标都是和Lidar Odometry的结果进行比较)。
在单次重建的过程中,我们的方案也做了一些优化。例如我们采用了Learning based features(Superpoint和Superglue),一个是特征点,一个是匹配方式,来替代传统的SIFT关键点。用学习NN-Features的优势就在于,一方面可以根据数据驱动的方式去设计规则,满足一些定制化的需求,提升在一些弱纹理以及暗光照的情况下的鲁棒性;另一方面可以提升关键点检测和匹配的效率。我们做了一些对比的实验,在夜晚场景下NN-features的成功率会比SFIT提升大概4倍,从20%提升至80%。
得到单个Clip的重建结果之后,我们会进行多个clips的聚合。与现有的HDmap建图采用矢量结构匹配的方案不同,为了保证聚合的精度,我们采用特征点级别的聚合,也就是通过特征点的匹配进行clip之间的聚合约束。这个操作类似于SLAM中的回环检测,首先采用GPS来确定一些候选的匹配帧;之后,利用特征点以及描述进行图像之间的匹配;最后,结合这些回环约束,构造全局的BA(Bundle Adjustment)并进行优化。目前我们这套方案的精度,RTE指标远超于现在的一些视觉SLAM或者建图方案。
这张slide展示的是一个site的重建案例。左边是Paralle SFM重建的结果,右图是稠密点云的重建结果。稠密点云的重建,用的是传统的MVS的方案,但是结合了语义信息。从右侧的重建结果可以看到,重建出来的语义点云,因为没有Lidar和camera跨传感器之间的时间同步及传感器抖动的问题,就会非常准确,甚至直接可以在点云上,直接标注车道线分割。
需要说明一下的是,我们重建稠密点云,主要目的是来验证一下SFM重建的精度。在实际的标注过程中,并不会做全场景的稠密点云重建。MVS逐像素的重建,重建非常耗资源,成本非常高昂。但是重建出的点云,大部分是非兴趣区域。为了节省成本,提升标注效率,针对不同的感知任务,我们会设计不同的标注方案。
首先,介绍一下路面要素向车道线、路沿、路面标志等感知方案的真值标注方案。路面静态要素标注的核心,在于3D路面的重建。我们重建方案主要是在SFM的基础之上,用Nerf进行路面重建。我们将路面采用Nerf 进行表达,在进行Nerf查询的时候,输入BEV空间的坐标点,经过编码之后输入到对应的MLP,最后输出该点的高度、RGB以及语义结果。在Nerf初始化的过程中,我们采用Parallel SFM重建提供两类信息:一类是每幅图像对应的相机的pose信息,另一类是一些重建的稀疏的3D点。相机的pose点通过外推,可以得到路面的初始3D形状, 用于作为路面高度的初始化。
Nerf训练的监督信息主要是两类,一个是RGB,另一个是2D语义图。其中语义信息可以减少弱纹理的影响。训练的过程,也是是一个查询的过程。对空间中的每一个点,送到Nerf里面,会得到一些返回的高度值,返回的RGB值以及语义值。获取到这些信息之后,可以根据SFM提供的pose,投影到不同的2D透视图像和语义图像空间中,形成监督loss,对Nerf进行优化。Nerf收敛之后,同样执行一遍查询过程,便可以得到重建的3D路面结果。
这是重建的一个局部Site的效果。左边这张图是由多个clips构成,每一条不同颜色的轨迹线对应一条clip。通过多个clips聚合,可以得到完整的十字路口的重建效果。为了验证重建的精度,我们把重建的结果投影到原图上,可以看到,投影的一致性非常高。从视觉重建出的结果,没有异源传感器之间抖动的影响,投影到原图和2D的语义分割结果,基本都能对得很齐。我们对路面重建的结果做了一些简单的评测,计算了车道线的重投影误差,精度可以达到误差小于3个像素。