论文:https://ieeexplore.ieee.org/abstract/document/10273603
代码:https://github.com/chaytonmin/Occupancy-MAE
占位-MAE 的整体架构。我们首先将大尺度不规则激光雷达点云转换为体积表示,根据其与激光雷达传感器的距离随机屏蔽体素(即范围感知屏蔽策略),然后利用非对称自动编码器网络重建一般三维世界的几何占位结构。我们采用三维空间稀疏卷积 [6],以位置编码作为编码骨干。我们将二元占位分类作为前置任务,以区分体素是否包含点。预训练完成后,轻量级解码器将被丢弃,编码器将用于下游任务的骨干预热。
数据流结构图
GitHub里面的结构图
Q: 这篇论文试图解决什么问题?
A: 这篇论文提出了一种名为Occupancy-MAE(Occupancy-Masked Autoencoders)的自监督预训练方法,旨在解决自动驾驶领域中对大规模标记3D数据的依赖问题。具体来说,它试图解决以下问题:
-
减少对标记数据的依赖:自动驾驶中的感知模型目前严重依赖于大规模标记的3D数据,这些数据的收集和注释既昂贵又耗时。
-
提高学习效率:通过利用未标记的大规模户外激光雷达(LiDAR)点云数据进行预训练,Occupancy-MAE旨在提高特征提取的效率,从而减少对人工注释数据的需求。
-
处理大规模点云数据的挑战:与小规模点云数据不同,大规模户外LiDAR点云数据具有更高的稀疏性和距离依赖性,这使得现有的自监督学习方法在处理这类数据时面临挑战。
-
提高下游任务的性能:通过自监督预训练,Occupancy-MAE能够在多个下游任务(如3D目标检测、语义分割和多目标跟踪)中提高性能,特别是在小目标检测和信息冗余利用方面。
-
提高模型的泛化能力:通过在不同数据集上进行预训练和微调,Occupancy-MAE能够提高模型在不同环境和条件下的泛化能力。
总结来说,这篇论文的主要贡献是提出了一种新颖的自监督学习方法,通过在大规模未标记的户外LiDAR点云上进行预训练,以减少对标记3D训练数据的依赖,并提高自动驾驶感知模型的性能和鲁棒性。
Q: 论文如何解决这个问题?
A: 论文提出了一个名为Occupancy-MAE的自监督预训练框架,通过以下几个关键步骤解决上述问题:
-
自监督学习框架:Occupancy-MAE利用自监督学习来减少对标记数据的依赖。它通过预训练未标记的大规模户外LiDAR点云,提取高级语义信息。
-
范围感知的随机遮蔽策略(Range-aware Random Masking):考虑到LiDAR点云的稀疏性和距离依赖性,论文提出了一种根据点云到激光雷达的距离调整遮蔽比例的策略。这使得远距离点云的遮蔽比例较低,以适应其稀疏性。
该策略根据所占用的体素与激光雷达传感器的距离将占用的体素分为三组:0-30米、30-50米和>50米。
对每组采用掩蔽率r1、r2和r3下降的随机掩蔽策略
r
1
>
r
2
>
r
3
r1 > r2 > r3
r1>r2>r3
因此,未屏蔽占用的体素数量为
u
n
=
n
v
1
(
1
−
r
1
)
+
n
v
2
(
1
−
r
2
)
+
n
v
3
(
1
−
r
3
)
)
u_n = n_{v1}(1 - r1) + n_{v2}(1 - r2) + n_{v3}(1 - r3) )
un=nv1(1−r1)+nv2(1−r2)+nv3(1−r3)),体素集
V
i
n
p
u
t
∈
R
n
u
n
×
4
V_{input}∈R^{nun×4}
Vinput∈Rnun×4作为训练数据。包含点(每个体素的值为1)的占用体素,空体素(每个体素的值为0)被用作地面真值
T
∈
R
n
l
×
1
T∈R^{nl ×1}
T∈Rnl×1
-
稀疏体素化:将大规模不规则的LiDAR点云转换为体积表示(voxel-based representation),以便于处理和分析。
-
3D稀疏卷积编码器(3D Sparse Convolutional Encoder):使用3D稀疏卷积网络来处理被遮蔽的体素,只关注可见的3D体素,从而显著降低计算成本。
-
轻量级3D解码器(Lightweight 3D Decoder):解码器由几个3D反卷积层组成,输出每个体素包含点的概率。
-
占用预测任务(Occupancy Prediction Task):将占用预测作为预训练任务,鼓励编码器学习代表性特征以从少量可见体素中恢复整个3D场景的被遮蔽占用分布。
-
二元占用分类损失(Binary Occupancy Classification Loss):使用二元分类损失函数来训练网络,以区分体素是否包含点。
跨多个下游任务的实验验证:在3D目标检测、语义分割、多目标跟踪和无监督领域自适应等多个下游任务上验证了Occupancy-MAE的有效性。
核心代码
pcdet/models/backbones_3d/voxel_mae_res.py
voxel_features, voxel_coords = batch_dict['voxel_features'], batch_dict['voxel_coords']
select_ratio = 1 - self.masked_ratio # 选择体素的比例
# 计算体素坐标的距离
voxel_coords_distance = (voxel_coords[:,2]**2 + voxel_coords[:,3]**2)**0.5
# 根据距离选择体素
select_30 = voxel_coords_distance[:] <= 30
select_30to50 = (voxel_coords_distance[:] > 30) & (voxel_coords_distance[:] <= 50)
select_50 = voxel_coords_distance[:] > 50
# 生成体素索引列表
id_list = [i for i in range(voxel_coords.shape[0])]
id_list_select_30 = [i for i in id_list if select_30[i] == True]
id_list_select_30to50 = [i for i in id_list if select_30to50[i] == True]
id_list_select_50 = [i for i in id_list if select_50[i] == True]
# 随机打乱体素索引列表
shuffle_id_list_select_30 = id_list_select_30.copy()
random.shuffle(shuffle_id_list_select_30)
shuffle_id_list_select_30to50 = id_list_select_30to50.copy()
random.shuffle(shuffle_id_list_select_30to50)
shuffle_id_list_select_50 = id_list_select_50.copy()
random.shuffle(shuffle_id_list_select_50)
# 按比例选择体素索引
slect_index = shuffle_id_list_select_30[:int(select_ratio * len(shuffle_id_list_select_30))] + \
shuffle_id_list_select_30to50[:int((select_ratio + 0.2) * len(shuffle_id_list_select_30to50))] + \
shuffle_id_list_select_50[:int((select_ratio + 0.2) * len(shuffle_id_list_select_50))]
nums = voxel_features.shape[0]
# 创建全为1的体素特征张量
voxel_fratures_all_one = torch.ones(nums, 1).to(voxel_features.device)
voxel_features_partial, voxel_coords_partial = voxel_features[slect_index, :], voxel_coords[slect_index, :]