BEV数据集标注成本高?BEVPose:减少对标注数据依赖!

引言

本文提出了一个名为BEVPose的框架,通过利用自监督和传感器位姿信息,实现相机和激光雷达数据的多模态BEV表示对齐,显著减少了对标注数据的依赖。BEVPose在BEV地图分割任务中表现出色,能够超越全监督的方法,同时提升数据效率。未来,该方法有望拓展至野外和室内场景以及其他自动驾驶和机器人导航任务。

1 背景介绍

在移动机器人和自动驾驶领域,建图和环境表示是至关重要的基础工作。多年来,机器人学和计算机视觉领域围绕这一目标进行了大量研究,结合多种传感器,开发出丰富的建图方法和环境表示形式。

这些方法既包含在线的顺序处理(如同时定位与建图),也包含批处理方式(如从运动中恢复结构),并广泛应用了相机和激光雷达等多种传感器模式。环境的表示方式从稀疏的地标(基于手工设计或深度学习的特征)到密集的三维形式,例如网格、体素,也进一步扩展到经典距离函数或神经网络表示的隐式格式。

通过几何地标和语义实体的选择,使得建图方法更加多样化。然而,目前并不存在一种“通用最优”的解决方案能够满足所有需求,实现通用建图。因此,选择合适的表示方式和传感器输入,并在几何信息与语义信息之间找到最佳平衡,对于设计有效的建图方法至关重要。

近年来,鸟瞰图(BEV)表示在自动驾驶领域得到了快速发展,因为它能够精确获取平面环境中物体的位置和语义信息,对目标检测和地图语义分割等任务尤为重要。BEV地图将来自不同传感器的数据整合为一致的格式,与场景的平面几何结构相吻合,从而增强了二维投影的学习效果。

然而,这种方法面临的主要挑战是需要大量标注数据。对于BEV相关任务,数据需要从不同于传感器视角的角度进行标注,这显著增加了标注成本和复杂性。尤其是在非城市或室内环境中,由于缺乏大规模高质量的数据集,知识迁移面临更大困难。

最近,自监督学习逐渐崭露头角,为BEV表示提供了潜在的解决方案。特别是在多模态融合的BEV表示中,自监督学习显示出优势,但在自监督的多模态融合方面,尤其是相机与激光雷达的融合,仍有许多尚未被充分探索的领域。

2 方法提出

为了填补了当前研究中的空白,作者提出的BEVPose 方法。该方法利用相对低成本且易于获取的真值(即传感器位姿)来学习并融合相机与激光雷达的BEV表示。通过已知的相对传感器位姿,BEVPose 提供了丰富的监督信号,通过BEV地图对齐来学习潜在的BEV嵌入并进行多模态融合。在这一自位姿监督”的BEV表示中,各种地图特征和地标得以隐式呈现,为后续微调任务(如地图语义分割)奠定了坚实的基础。实验结果表明,BEVPose 能在使用少量标注数据的情况下超越当前先进的BEV地图分割方法。

图1 BEVPose框架图

3 方法详解

3.1 BEV表示

在该方法中,BEV地图被用作重建周围三维场景的一种紧凑而全面的方式。BEV地图提供了一个统一框架,用于集成多模态传感器数据并嵌入语义层,以提升模型对整体场景的理解。在模型中,作者使用了两种不同且互为补充的传感器输入:一个是包含N_c个校准周视相机的多视图相机系统,另一个一个全向 360° 激光雷达点云。假设相机和激光雷达均已完成校准,即已知相机的内参矩阵(K_{ci} \in \mathbb{R}^{3 \times 3}) 和相机与激光雷达之间的外参变换( T_{ c_j}^{c_i}T_{c_i}^l \in SE(3) )。场景的几何和语义信息被封装在以激光雷达原点为中心的xz平面二维网格BEV地图B中。B的每个单元格对应一个D维特征向量的柱,例如B_{x_i z_j} \in \mathbb{R}^D,用于编码与该网格单元相关的几何和语义信息。

3.1.1 图像编码器

每个 RGB 图像(\mathbb{R}^{H \times W \times 3})通过共享的主干和颈部架构编码到C_c维的图像特征空间中。为了将这些编码特征转换到BEV空间,需要获得其深度分布。受 LSS 的启发,通过学习每个图像特征沿其投影射线的离散深度分布,将相机特征提升到BEV空间。在学习到该分布后,相应的特征向量根据分布中的权重重新分布到射线上。沿射线的深度分布被表示为L个均匀量化深度值上的有限概率质量函数。

在BEV池化过程中,每个相机的特征体积(\mathbb{R}^{H \times W \times L \times C_c})被转换为BEV网格。具体而言,通过在y轴(垂直方向)上聚合和展平每个网格单元中的特征,生成相机BEV地图B_{\text{cam}}^i。随后,将所有单个相机的BEV地图整合形成多视图相机BEV地图B_{\text{cam}}。为加速池化过程,作者利用了预先计算的相机校准信息,从而能够提前确定相机BEV体积的每个柱与最终BEV网格图之间的关联关系。

3.1.2 点云编码器

激光雷达点云首先按照预定分辨率进行体素化处理,然后输入到三维编码器中。该过程生成一个四维特征体积(\mathbb{R}^{L_x \times L_z \times L_y \times C_l})。接着,这个特征体积沿y轴(垂直方向)进行池化,从而生成激光雷达的BEV地图,记作B_{\text{lidar}}

3.1.3 多模态融合

作者通过级联四个Transformer块来获得最终融合的BEV地图。在交叉注意力模块中,提升后的图像特征作为键和值,查询则来自激光雷达BEV特征。随后,融合后的嵌入通过一个瓶颈式 ResNet 编码器处理,如图 1 所示。

3.2 BEV对齐

如第一节所述,受到自监督学习成功研究的启发,作者将BEV特征的预训练框架为一个自监督BEV对齐问题,并通过多视角相机与激光雷达的校准相对位姿先验提供位姿监督。为了对齐这些BEV地图,以学习足够丰富的潜在嵌入,能够捕捉场景的语义和几何细节,这对于特征的有效对齐至关重要。

按照自监督方法的既定实践,作者将对齐问题表述为一个对比学习任务,通过引入对比损失将对齐目标融入框架中。为构建对齐问题的一种方式是将激光雷达 BEV(B_{\text{lidar}})视为参考BEV地图,而将每个单独的相机视锥BEV地图(B_{\text{cam}}^i)作为对应的查询。这些相机查询和激光雷达参考地图均在其各自的局部坐标网格中定义。目标是在真实的相对位姿(正样本)下最大化查询与参考BEV地图之间的一致性,并在其他不正确的相对位姿(负样本)下最小化这种一致性。这个目标最终转化为最小化对比损失,具体表述如下:

L_{\text{align}} = -\log \frac{\exp(s(B_{\text{cam}}, B_{\text{lidar}}; T_{c}^{l+}) / \tau)}{\sum_{j=1}^{N_s} \exp(s(B_{\text{cam}}, B_{\text{lidar}}; T_{cj}^l) / \tau)}

其中,N_s代表样本总数,s(B_{\text{cam}}, B_{\text{lidar}}; T_{c}^l)计算两个BEV地图之间的相似度得分或一致性。此相似度通过对齐并变换到同一BEV网格图后对应特征向量的内积和来实现。此外,\tau在该框架中作为一个可学习的温控参数。

为了更好地理解,假设是特定相机BEV网格单元中的一个代表点。该点使用T_{lc}转换到激光雷达框架。然后,通过插值相关网格单元角的激光雷达BEV特征,推断出相应的激光雷达BEV特征。相似度度量随后被计算为对应对齐的BEV特征的内积之和,具体公式如下:

s(B_{\text{cam}}, B_{\text{lidar}}; T_{c}^l) = \sum_{x, z} B_{\text{cam}}^{\top}[x, z, :] B_{\text{lidar}}[i(p_l), :]

其中,B[.,.,:]表示网格中的BEV特征,p_lp_c的转换,即p_l = T_{c}^l p_c,而i(.)为网格单元的插值函数。 为了精准定位那些极有可能出现的被误判的负样本,作者还采用从非重叠相机位姿位姿为中心的分布图中抽取负样本,通过对比学习的方式,引导概率分布接近真值。

4 实验结果

表1 nuScenes数据集中 BEV 图像分割的评价
表2 自监督预训练结果评价
图2 BEVPose在不同训练数据比例下的性能
图3 分割结果可视化
图4 传感器模态丢失的鲁棒性评估可视化
表3 消融实验结果
图5 BEV 嵌入可视化

5 结论

BEVPose通过自监督学习技术整合相机和激光雷达数据,有效降低了对大规模标注数据集的依赖,并在多种环境条件下展现出优异的性能。在BEV地图分割领域,该方法的成绩与其他先进的算法相当,但所需标注数据量更少。 开发团队计划通过引入时间约束和轨迹信息进一步优化BEVPose,以增强其BEV表示的时序连贯性,并考虑将其应用于更广泛的环境,包括非公路和室内环境,以及扩展到其他自动驾驶任务,例如2D和3D目标检测。此外,该团队还考虑将深度传感器和雷达等其他传感器模态整合进框架,作为未来研究的潜在方向。

 Ref:

BEVPose: Unveiling Scene Semantics through Pose-Guided Multi-Modal BEVAlignment

编译|Deep蓝同学

审核|fafa

第二届线下自主机器人研讨会(ARTS)即将召开👇
第二届ARTS报名入口即详情须知
第二届ARTS奖学金通知
ARTS 2024 学术辩论通知抢“鲜”发布

<think>嗯,用户现在想了解如何在BEVFormer中使用自定义数据集以及标注方法。之前他们问了关于BEVFormer的Pred、GT、Cam的问题,现在进一步深入到了数据集的使用和标注。我需要结合之前的回答和用户提供的引用信息来组织答案。 首先,用户提供的引用1提到数据集的构建是常规操作,使用dataset和dataloader,特别是nuscene数据集的处理方式。引用2讨论了统一数据协议,简化数据准备流程,降低自定义数据集的门槛。引用3则指出了当前版本的局限性,包括标注数据不足的问题。这些引用可能帮助用户理解数据准备的关键点和挑战。 接下来,用户的问题是如何在BEVFormer中使用自定义数据集,包括方法、标注工具和数据格式。我需要分步骤回答,可能包括数据准备、标注工具推荐、数据格式转换、配置修改和训练验证等步骤。 根据之前的回答,BEVFormer依赖3D标注数据,如NuScenes格式,所以可能需要将自定义数据转换为类似的结构。需要提到数据目录结构,比如图像、标定文件、标注文件的存放位置。标注工具方面,用户可能需要使用如LabelImg、LabelMe或更专业的3D标注工具如SUSTechPoints或OpenPCDet中的工具。数据格式转换部分,需要说明如何将标注结果转换为BEVFormer所需的格式,比如.json或.pkl文件。 然后,可能需要修改配置文件,比如在MMDetection3D框架中调整数据集路径和类别定义。还要提到数据增强的方法,如翻转、旋转等,以及如何配置dataloader的参数,如batch_size和num_workers。 此外,用户提供的引用中提到统一数据协议和简化流程,可以强调遵循MMDetection3D的数据准备规范,利用现有工具减少工作量。同时,引用3提到的伪标签质量依赖问题,可能需要提醒用户在标注时注意准确性,或者考虑闭环验证来提升数据质量。 用户可能需要具体的步骤示例,比如修改config文件中的data_root路径,或者展示如何编写自定义的数据集类。需要确保回答结构清晰,分点说明,并提供实际代码示例或配置示例,帮助用户实际操作。 最后,相关问题部分可以引导用户进一步了解数据处理细节、标注工具使用或性能优化的方法。要确保引用之前的回答中的参考文献,如[^1][^2][^3],来保持一致性。</think>### BEVFormer自定义数据集使用指南 在BEVFormer中使用自定义数据集需遵循以下步骤,结合MMDetection3D框架的数据处理规范和实际工程实践: --- #### 一、数据准备核心流程 1. **数据目录结构** ```bash custom_dataset/ ├── samples/ # 环视摄像头图像(6路) │ ├── CAM_FRONT/ │ ├── CAM_BACK/ │ └── ... ├── calib/ # 相机内外参(JSON格式) ├── annotations/ # 3D标注文件(JSON或.pkl) └── bevformer_meta/ # BEV特征元数据(可选) ``` 2. **标注工具选择** - **3D标注工具**:推荐使用[SUSTechPoints](https://github.com/naurril/SUSTechPOINTS)或[OpenPCDet标注工具](https://github.com/open-mmlab/OpenPCDet),支持点云与图像融合标注[^2]。 - **2D标注工具**:LabelImg(矩形框)、LabelMe(多边形)等工具生成2D标注后,通过相机标定数据反投影至3D空间。 3. **数据格式转换** 需将标注结果转换为BEVFormer兼容格式(参考NuScenes格式): ```python # 自定义标注示例(JSON格式) { "frames": [ { "frame_id": "0001", "cameras": { "CAM_FRONT": "samples/CAM_FRONT/0001.jpg", # 其他摄像头路径... }, "calib": "calib/0001.json", "annos": { "boxes_3d": [[x,y,z,l,w,h,yaw], ...], # 3D框参数 "labels": ["car", "pedestrian", ...] # 类别标签 } } ], "categories": ["car", "pedestrian", "cyclist"] # 自定义类别 } ``` --- #### 二、BEVFormer适配配置 1. **修改配置文件** 在`configs/bevformer/bevformer_base.py`中调整数据集路径和类别定义: ```python data = dict( train=dict( type='CustomDataset', data_root='data/custom_dataset/', ann_file='annotations/train.json', pipeline=train_pipeline ), val=dict(...), test=dict(...) ) class_names = ['car', 'pedestrian'] # 与自定义数据集类别一致 ``` 2. **数据增强策略** 在`pipelines`中添加针对自定义数据的增强: ```python train_pipeline = [ dict(type='LoadMultiViewImageFromFiles', to_float32=True), dict(type='PhotoMetricDistortionMultiViewImage'), # 光度变换 dict(type='RandomFlip3D', flip_ratio=0.5), # 空间翻转 dict(type='ObjectRangeFilter', point_cloud_range=point_cloud_range), dict(type='Pack3DDetInputs', keys=['img', 'gt_bboxes_3d', 'gt_labels_3d']) ] ``` --- #### 三、关键实现细节 1. **标定文件要求** 每个样本需提供相机内外参(JSON格式): ```json { "intrinsic": [[fx, 0, cx], [0, fy, cy], [0, 0, 1]], # 内参矩阵 "extrinsic": [[R11,R12,R13,tx], [R21,R22,R23,ty], [R31,R32,R33,tz]] # 外参矩阵 } ``` 2. **数据加载优化** 使用MMDet3D的`Custom3DDataset`类高效加载数据: ```python from mmdet3d.datasets import Custom3DDataset dataset = Custom3DDataset( data_root='data/custom_dataset', ann_file='annotations/train.json', pipeline=train_pipeline, metainfo=dict(classes=class_names) ) ``` 3. **伪标签生成(可选)** 若标注数据不足,可用预训练模型生成伪标签: ```python model = init_model(config, checkpoint, device='cuda:0') pseudo_labels = inference_detector(model, unlabeled_data) ``` --- #### 四、验证与调试 1. **可视化检查** 使用MMDet3D内置工具验证数据加载正确性: ```python from mmdet3d.utils import register_all_modules register_all_modules() vis = Visualizer() vis.draw_bev_boxes(custom_data['gt_bboxes_3d'], view='bev') ``` 2. **性能基线测试** 在自定义数据集上运行预训练模型: ```bash python tools/test.py configs/bevformer/bevformer_base.py \ --checkpoint bevformer_base.pth \ --eval bbox ``` --- ### 相关工具与资源 - **标注工具**:SUSTechPoints(点云+图像融合标注) - **格式转换脚本**:参考MMDet3D的[tools/dataset_converters](https://github.com/open-mmlab/mmdetection3d/tree/main/tools/dataset_converters) - **数据增强库**:Albumentations(针对图像)、PcdetAug(针对点云) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值