当前位置: 观测器 >> 观测器优势 >> 浅析激光雷达的点云语义分割算法
本文来源:焉知自动驾驶、知乎
/导读/
物体检测的输出是场景中感兴趣物体的信息,包括位置,大小,类别,速度等。相对于点云数据来说,这些输出结果是非常稀疏的,只描述了场景内的一部分信息。对于全自动驾驶的应用场景,这些稀疏的信息是远远不够的。首先,物体只是场景中的一部分内容,还有很多重要的信息是以非物体的形式存在的,比如说道路,建筑物,树木等等。如果没有这些信息,车辆就无法识别可以行驶的区域,也无法规避所有的障碍物,自动驾驶的功能也就会受到很多限制,比如说只能完成一般的AEB(自动紧急刹车)功能。其次,即使是在物体级别,D物体框也是一个粗略的表示。在需要更为精细的空间信息时(比如自动泊车应用),物体框的精度就不太够了,尤其是对于形状可变的物体,比如说铰接式公交车。因此,除了物体检测以外,自动驾驶的环境感知还包括另外一个重要的组成部分,那就是语义分割。准确的说,这部分有三个不同的任务:语义分割(semanticsegmentation),实例分割(instancesegmentation)和全景分割(panoramicsegmentation)。语义分割的任务是给场景中的每个位置(图像中的每个像素,或者点云中的每个点)指定一个类别标签,比如车辆,行人,道路,建筑物等。实例分割的任务类似于物体检测,但输出的不是物体框,而是每个点的类别标签和实例标签。全景分割任务则是语义分割和实例分割的结合。算法需要区分物体上的点(前景点)和非物体上的点(背景点),对于前景点还需要区分不同的实例。基于LiDAR点云的不同的分割任务(图片来源于参考文献[15])语义分割
语义分割和物体检测这两个任务有着很多的相似之处,其关键之处都在于如何有效的从原始点云数据中提取场景中的有用信息,以此对不同位置的语义信息进行解析。在深度学习流行之前,语义分割一般是通过传统的监督学习算法(supervisedlearning)来解决的。其流程主要分为两步:首先,通过聚类算法找到每个点的邻域,在该邻域范围内进行特征提取,以此特征为基础对每个点进行分类。机器学习领域中经典的分类器,比如SVM,AdaBoost,RandomForest等等都可以采用。这一步骤与传统的点云物体检测方法非常类似。其次,以上的特征提取和分类并没有考虑大范围的上下文信息,而这部分信息对语义分割来说是不可或缺的。因此,在局部分类的基础上,还需要一个上下文模型来提高分割结果的正确性和平滑性。这里最常用的模型是ConditionalRandomFields(CRF)。一般来说,CFR可以作为一个正则项与局部分类器的优化目标相结合,从而将两个步骤整合为一个优化问题来求解。进入深度学习时代以后,特征提取和分类的任务基本上交给神经网络来完成。我们需要设计的主要是原始数据的组织形式以及神经网格的细节。与点云物体检测算法类似,按照输入数据的不同组织形式,语义分割的方法也可以分为基于点的方法,基于网格的方法,以及基于投影的方法。当然,两个任务也有很多不同。最显著的一点是,语义分割任务需要比物体检测任务更大范围的上下文信息。举例来说,一个车辆的检测只需要观测其局部邻域(最多几十米)的范围即可,与更远范围的场景因素关联性较弱。但是,如果要进行道路的分割,那就得观测整个场景,场景中任何一个位置的因素都有可能对道路分割的结果产生影响。这个特点也决定了语义分割的特征提取网络必须要具备更大的感受野。基于点的方法对于直接处理点的方法来说,PointNet[]和PointNet++[]是最具有代表性的。PointNet首先通过共享的MLP来提取每个点特征,然后利用池化操作再将所有点的特征合并为一个全局特征向量。对于分类任务来说,可以直接以此向量作为特征,用MLP进行分类。对于分割任务来说,需要把点特征与全局特征进行拼接,然后用MLP对每个点进行分类(也就是分配一个语义标签)。PointNet网络结构从上面的描述中不难看出,虽然点分类的时候采用了全局+点特征,但是PointNet中的点特征提取是对每个点独立进行的,这个过程并没有用到邻域的信息。因此,局部上下文信息在整个特征提取过程中是被忽略的,这对语义分割来说影响比较大。作为PointNet的升级版本,PointNet++用聚类的方式来产生多个点云子集,在每个子集内采用PointNet来提取点的特征。这个过程以一种层级化的方式重复多次,每一次聚类算法输出的多个点集都被当做抽象后的点云再进行下一次处理(SetAbstraction,SA)。这样得到的点特征具有较大的感受野,包含了局部邻域内丰富的上下文信息。对于分割任务来说,下一步我们需要将聚类后的点云和学习到的高层次特征再映射回原始的点云上(PointFeaturePropagation)。与SA的过程类似,propagation也是一个迭代的过程。在把第L层的点云映射回L-1层时,对于L-1层的每一个点,需要从L层点云中选取其K近邻(文章中取K=),通过插值的办法得到propagation后的特征,插值的权重根据点与点之间的距离来计算。然后,将propagation的特征与L-1层原始的特征进行拼接(skiplink),并利用一个共享的全连接网络来做进一步的特征提取。这个过程重复多次,直至回到原始的点云层。最后,再用一个全连接网络来输出每个点的类别。PointNet++网络结构PointNet++的网络结构非常简洁,也具有很好的上下文特征提取能力。但是,这个系列的方法一般只能用来处理小规模的点云。在自动驾驶应用中,考虑到复杂的道路交通场景,百万级别的点云数量,以及对实时性的严苛要求,这类方法就不太适用了。这里主要的问题有两个:一个是点采样的方法(比如farthest-pointsampling)对点云规模的可扩展性较差,另外一个是局部特征的学习无法适应自动驾驶中的复杂场景(学习能力不够或者感受野不够)。RandLA-Net[4]采用了随机采样的策略,极大的降低了点采样过程的计算复杂度。同时,通过局部空间编码和基于注意力机制的池化,对局部特征提取进行优化。在SemanticKITTI(点云数量约10万/帧)的测试上,RandLA-Net的速度是PointNet++的50倍,达到FPS。语义分割的准确性方面也比PointNet++提升了一倍多(mIoU指标:5.9%vs.0.1%)。除了PointNet++系列以外,对点云的直接处理还可以通过Point卷积的方式进行。这类方法的主要思路是将卷积操作从网格数据移植到点云上。在传统的卷积操作中,卷积核中的权重是输入数据在空间位置上一一对应的,因此可以进行一对一的操作,比如加权求和,从而得到相应位置的输出。对于点云数据来说,点的位置是不固定的,卷积操作也无法在空间位置上找到对应关系。KPConv[5]提出在一个领域范围内定义相对位置固定的一些kernelpoints(类比传统的卷积核)。由于在空间位置上无法与点云对齐,因此邻域中每个点的卷积权重需要对所有kernelpoints权重进行加权求和来得到。这里的权重通过点和kernelpoints的空间距离来确定。KPConv的输入和输出都是点云,点的数量也不变,但是点特征被增强了。对于语义分割任务,我们可以采用与PointNet++中类似的策略,也就是sampling,pooling,upsampling这样的结构进一步扩大感受野,并最终得到每一个点的类别输出。传统Conv与KPConv的对比此外,还有一些方法采用循环神经网络(RNN)或者图神经网络(GNN)来更好的提取上下文信息,但是这些方法一般计算复杂度比较高,通常只适用于室内小规模场景的处理,这里就不做介绍了。基于网格的方法在D物体检测领域的经典方法VoxelNet中,点云被量化为均匀的D网格(voxel)。配合上D卷积,图像语义分割中的全卷积网络结构就可以用来处理D的voxel数据。FCPN[6]在三维空间进行均匀采样,每个采样的位置收集邻域内固定数量的点用来提取点特征。这里与VoxelNet中的方式略有不同:VoxelNet中的网格也是均匀位置采样,邻域的大小是固定的,但点的数量则是不固定的。所以,VoxelNet中的网格数据是稀疏的,而FCPN中的网格数据则是稠密的。但是,无论哪种方式,最后得到的数据形式都是4D的张量,也就是D网格+特征。这种数据形式可以采用D卷积来处理,并通过一个U-ShapeNet的结构来提取不同尺度的信息,最终得到原始量化尺度下的分割结果。每个网格会被分配一个类别标签,网格中所有的点共享此标签。FCPN网络结构Voxel的表示方式优点在于数据规整,可以采用标准的卷积操作来处理,多尺度的信息也可以很容易的通过pyramid结构来获取。其缺点在于非常依赖网格大小的选取:网格较小导致数据维度较大,影响计算速度;网格较大会丢失信息,影响分割精度。当采用较小的网格时,数据会变得非常稀疏。所以可以通过稀疏卷积的方式来提高运算效率,比如LatticeNet[7]。基于投影的方法点云是存在于D空间的,具有完整的空间信息,因此可以将其投影到不同的二维视图上。比如,我们可以假设D空间中存在多个虚拟的摄像头,每个摄像头所看到的点云形成一幅D图像,图像的特征可以包括深度和颜色(如果通过RGB-D设备采集)等信息。对这些D图像进行语义分割,然后再将分割结果投影回D空间,我们就得到了点云的分割结果。这个基于多视图的方法缺点在于非常依赖于虚拟视角的选择,无法充分的利用空间和结构信息,而且物体间会相互遮挡。Multi-view(左)和Range-View(右)此外,我们还可以将D点云投影到RangeView。对于采用水平和垂直扫描的LiDAR来说,点云中的每个扫描点自然的就有水平和垂直两个角度,而且这些角度都是离散的,其个数取决于相应的分辨率。比如18线的LiDAR,其垂直角度个数就是18。假设其水平角度分辨率为0.5度,那么其扫描一周就产生了70个角度。将点云映射到以水平和垂直角度为XY坐标的二维网格上,就得到了一个70x18像素的Range图像,其像素值可以是点的距离,反射强度等。RangeNet++[8]是基于RangeView的一个典型方法。在将点云转换为range图像之后,经典的hourglass全卷积网络被用来对图像进行语义分割。之后将分割结果投影回D空间后,再进行一些后处理,以提高分割结果的局部一致性。RangeNet++的组成模块RangeNet++网络结构图SqueezeSeg[9](及其改进版本SqueezeSegV[10])也是基于RangeView的方法。在转换后的range图像上采用SqueezeNet网络来得到语义分割的结果,然后采用CRF对分割结果进行优化(用RNN来实现CRF)。实例级别的输出则是通过传统的聚类算法得到的。V版本在网络结构,损失函数,批标准化(BN)以及额外的输入特征方面进行了改进,并利用了合成数据以及域适应学习(DomainAdaptation)。SqueezeSeg网络结构以及基于RNN的CRF实现RangeView是一种非常紧致的数据表示,有利于减低算法的计算量,这对于自动驾驶的应用来说非常重要。因此,近年来RangeView在D物体检测领域也受到了很多的