2DPASS: 2D Priors Assisted Semantic Segmentation on LiDAR Point Clouds论文阅读
原文链接 :https://arxiv.org/pdf/2207.04397.pdf
代码链接 :https://github.com/yanx27/2DPASS
要解决的问题 :
1. FOV不同的问题:融合算法训练和推理时需要严格配对的点云和图像数据,但是雷达与摄像头的FOV只有一小部分的重叠;
2. 计算资源:时需要处理图像和点云,给实时应用带来很大负担。

作者考虑到在实际场景中,传感器会不断移动(例如车上的雷达与摄像头),因此同一时间戳中与图像对应的LiDAR点云的非重叠部分(见图1中右侧部分的灰色区域)可以被来自其他时间戳的图像覆盖。同时,图像的密集和结构信息为可见和不可见的点云区域提供了有用的正则化。
本文方法:
****
**** 首先分析上图流程:由于Image尺寸很大(1242x512),因此作者随机采样一个小的patch(480x320,图中红色框选中部分)作为2D输入来加速训练过程。图像patch和点云分别进入2D Encoder(ResNet34 )和3D Encoder(sparse convolution ,也采用了ResNet 架构,但是把损失函数由ReLU换成了Leaky ReLU)进行特征提取(这两个Encoder是相互独立的),之后,MSFSKD模块融合2D和3D特征,通过知识蒸馏将融合后的特征用于增强3D特征,此时2D的纹理、色彩等信息就被增强后的3D特征图吸收了,最后,2D、3D各尺度的特征图都分别用于利用各自的Decoder(2D采用FCN ,3D采用U-Net )输出分割结果。在推理过程中,2D分支就不再使用,来降低额外的计算负担。
**** 总体来说本文是一个2D Priors Assisted Semantic Segmentation (2DPASS)的方法。该方法在训练时充分利用2D图像丰富的信息,而在推理时在没有严格配对数据约束的情况下输出语义分割结果。2DPASS首先通过辅助的模态融合以及multi-scale fusion-to-single knowledge distillation (MSFSKD)获得了多模态数据的丰富的语义信息与结构信息,然后将这些蒸馏给纯3D网络。
具体来说,作者基于之前对于问题的观察,提出一个“model-independent”的训练模式,叫做2D先验辅助语义分割(2DPASS ),只需微小的结构修改即可增强任何3D语义分割网络的性能。在实际操作中,一方面,针对上述未重叠的区域,2DPASS使用纯点云作为输入训练分割网络;另一方面,针对能够完成point-to-pixel匹配的区域,2DPASS采用辅助模态融合,即在不同尺度融合点云与图像,然后对其两种不同区域的预测结果。
作者通过设计多尺度融合到单一知识蒸馏(MSFSKD)策略,将额外的知识转移到3D模型中,并保留其特定于模态的能力。
1、 Point-to-Pixel Correspondence:

这部分是为了得到两个模态配对的特征,为之后的知识蒸馏做准备,这部分读起来有点难理解,首先要明白这样做的目的是在不同特征层(作者是拿第l层举例子)获取图像特征与点云特征,这两种不同的特征需要对齐之后才能进行下一步特征融合与知识蒸馏,而两种不同模态的特征如何对齐呢?我理解的作者的出发点是以感兴趣的点云为基线,对于图像Branch的特征,得到每一个感兴趣点云对应的图像特征向量组成
,对于点云Branch的特征,同样得到每一个感兴趣点云对应的点云特征向量组成
,也就是说最后所得
与
是同样维度的(
,其中
就代表前面说的感兴趣点云的个数,
代表每个感兴趣点云对应2D或3D特征向量的维度),这样就完成了两种不同模态特征之间的对齐。
接下来,再看看是如何得到想要的特征向量的:
1)2D Features:
**** 如图(a),首先将第l层的2D特征
反卷积恢复到原始输入尺寸得到特征图
,目的是根据点与像素的关系(这一关系由相机内外参决定,体现的是输入点云与输入图像之间的匹配关系,这也是为什么需要将2D特征恢复到原始尺寸的原因)从特征图
中提取每一个点对应的特征向量,也就是将
的特征通过某种映射,达到与点云特征对齐的目的,这一映射关系是由以下公式得到(K、T就是相机内外参矩阵):


首先根据投影关系(第一个公式)找到落在H*W中的点云,因为要让每个点都有一个对应的图像提取出来的特征,所以通过
(就是所谓的映射关系,作者将其称为point-to-pixel mapping),采用下取整去原来图像中找最近的一个像素对应的特征向量,最后得到
。此时得到的就是感兴趣的点云对应的逐点的二维特征,这里**“感兴趣的点云”** 的理解如下:原始点云有N个,而此时
的维度是
,这里为什么从N变成了
呢?这是因为,作者为了提速对原始图像做了裁剪,取出Image patch作为2D网络的输入,那么有可能只有部分点云根据第一个公式的投影关系落到裁剪后的Image patch中,而落到Image patch中的点云就是我前面所提到的感兴趣的点云,其个数就是
,且
。
2)3D Features:
**** 如图(b),理解2D feature的获取过程之后就很容易理解3D feature的获取过程了,出发点同样是得到感兴趣点云对应的特征,因为不需要进行点云与图像之间的映射,而是point-to-voxel mapping,因此这个过程简单很多。
具体就是: 首先建立映射关系,这里的
就是第l层的体素化分辨率。

然后,将空间卷积之后得到的点云特征
根据上述映射关系进行最近邻插值得到point-wise的特征图
,最后同样只保留感兴趣点云的特征向量:

2、MSFSKD:

1) Modality Fusion
其实此部分多模态融合的特征只影响了2D分支,3D分支暂且还没有得到2D信息。此处2D learner使用的目的是为了缩小不同模态所得特征图之间的gap,
不仅用于融合2D特征,还用于增强3D特征,最终融合后的特征可以由下述公式表示:

2) Modality-Preserving KD
此处就是文章方法巧妙之处,因为上述
虽然仅仅由3D特征产生,但之前多模态融合的步骤使其会受到2D decoder分割损失的影响,而
是像残差结构一样增强3D特征,所以增强后的3D特征很好的保留了原始3D模态的特征,从而防止蒸馏污染。最后,2个独立的分类器(全连接网络)分别输出3D语义分割分数
和2D语义分割分数
,再使用KL散度实现单向蒸馏:即将
推向更接近
,也就是把2D分支的知识蒸馏到3D分支:

总体来说这样的模态融合与知识蒸馏有以下两点优点: 1) 2D learner和fusion-to-single distillation提供了丰富的纹理信息和结构正则化来增强3D特征学习,且不会丢失3D模态独有的信息。2) 融合分支仅在训练阶段采用。因此,在推理过程中,模型几乎可以在没有额外计算成本的情况下。
实验:
数据集:SemanticKITTI、Nuscenes;
网络设置:2D encoder:ResNet34, 3D encoder:modified SPVCNN(voxel size 0.1, hidden dimensions:64 for SemanticKITTI,128 for NuScenes),进行MSFSKD的层数:4 and 6 for SemanticKITTI and NuScenes,在知识蒸馏的每个尺度上,通过反卷积或 MLP 将 2D 和 3D 特征减少到 64 维。同样,MSFSKD 中 MLP 和 2D learner的隐藏尺寸都是 64;
数据增强:3D:使用从[0.95,1.05]采样的随机比例因子进行全局缩放,并在Z轴周围以随机角度进行全局旋转;2D:水平翻转和颜色抖动;
训练和推理细节:语义分割使用cross-entropy 和 Lovasz losses作为损失函数,以上损失函数与KL散度之间的比例是1 : 0.05。
优化器:SGD;
对于SemanticKITTI validation set:batch size 8 ,learning rate 0.24 ,64 epochs;
对于SemanticKITTI online benchmark:执行实例CutMix,并使用额外的48个epoch微调最后一个checkpoint;
对于NuScenes:batch size 16,80 epochs;
inference:使用voting test-time augmentation,即以Z轴周围的12个角度旋转输入场景,并对预测分数进行平均。
所有实验均在 Nvidia Tesla V100 GPU 上。
方法优点:
1. Generality:它可以很容易地与任何 3D 分割模型集成,只需稍作修改;
2. Flexibility:融合模块仅在训练期间用于增强 3D 网络。训练后,可以在没有图像输入的情况下部署增强的 3D 模型;
3. Effectively:即使只有一小部分重叠的多模态数据,该方法也能显性能。
该方法算是隐式地利用图像信息来增强3D特征,文中提到的模态特征信息保留的知识蒸馏(类似于残差结构避免知识蒸馏污染模态信息)很有参考意义,总体来说,知识蒸馏体现在最后的KL散度使3D分支输出接近于融合了3D特征的2D分支输出,是结果层面的知识蒸馏,而特征融合也是单向的(3D-to-2D)。另外,该算法计算资源还是比较昂贵的。
