3DTrans: 首个支持自动驾驶室外点云迁移学习的代码库

作者 | ZB  编辑 | 3DTrans

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【3D目标检测】技术交流群

本文将为大家介绍上海人工智能实验室交通平台组ADLab的3DTrans代码库--首个自动驾驶室外3D点云迁移学习的代码库。此外3DTrans代码库还是Uni3D(CVPR-2023)和Bi3D(CVPR-2023)的官方实现代码库。

Code Link: https://github.com/PJLab-ADG/3DTrans

PART.1

3DTrans--首个支持多种迁移学习任务的3D室外点云代码库

1.1

3DTrans可以做什么?

快速目标域自适应3DTrans可以仅使用无标注数据来提高3D感知模型对unseen domains的适应性。例如,3DTrans代码库支持ST3D[1]等多个无监督领域适配(UDA)方法。此外,3DTrans开发了许多新的UDA技术来解决不同类型的域偏移(如激光雷达引起的域差异以及物体大小引起的域差异),其中包括Post-SN、Pre-SN和Range-map Down-sampling/retraining操作。

低成本目标域适应3DTrans可以从unseen domains中选择出信息量最大的子集样本,并以最小的成本为其进行标注。例如,3DTrans开发了Bi3D,它选择部分但重要的目标数据并以最小的成本对其进行人工标注,在高性能和低标注成本之间实现了良好的平衡。此外,3DTrans已经将几种典型的迁移学习技术集成到3D目标检测框架中。例如,3DTrans集成了TQS[2]、CLUE[3]、SN[4]、ST3D[1]、伪标注[1]、SESS[5]和Mean Teacher[6]等方法,以支持自动驾驶相关的模型跨传感器、跨场景的迁移。

多数据集的联合训练3DTrans可以执行多数据集的3D目标检测任务。例如,3DTrans首次研发了多数据集3D目标检测框架--Uni3D,使当前的3D基线模型能够有效地从多个公开3D数据集中进行学习,提高了不同自动驾驶厂商、传感器、不同地点数据之间的复用性。

多数据集支持3DTrans为Waymo、nuScenes、ONCE、Lyft和KITTI等多个公开数据集提供了统一的数据加载接口和数据增强方式,有利于研究跨数据集的3D感知任务。此外,为了消除3D室外点云数据的域差异,并获得可泛化的表示,3DTrans集成了一些经典的无标注预训练技术,来为目前3D基线检测模型提供更好的参数初始化。例如,我们集成了PointContrast[7]和SESS[5]来支持基于室外点云的预训练任务。

多模型的可扩展性3DTrans可以快速完成新基线检测模型的UDA、ADA、SSDA、MDF等任务的支持。在不对代码和新基线检测模型结构进行重大更改的情况下,通过使用3DTrans,单数据集3D基线检测模型可以成功地迁移到带有域差异的新领域。

b0efc13959da44267adc8ff16afd2de9.png

3DTrans代码库不同模块输入输出关系图

1.2

3DTrans的每个模块介绍

3DTrans是一个轻量级、简单、自包含的开源代码库,用于探索面向自动驾驶的迁移学习技术,目前主要由四个功能组成:

1) Unsupervised Domain Adaptation (UDA) for 3D Point Clouds

2) Active Domain Adaptation (ADA) for 3D Point Clouds

3) Semi-Supervised Domain Adaptation (SSDA) for 3D Point Clouds

4) Multi-dateset Domain Fusion (MDF) for 3D Point Clouds

1.2.1  3DTrans@UDA

入口链接:

https://github.com/PJLab-ADG/3DTrans/blob/master/docs/GETTING_STARTED_UDA.md

3DTrans代码库UDA基线算法的构建:

3DTrans是面向自动驾驶场景迁移学习的代码库,最常见的迁移学习任务是UDA任务。其假设:模型可以接触到全量带标注的源域数据和全量无标注的目标域数据。3DTrans支持了ST3D[1]等最新的UDA 3D方法。同样,我们针对在3D自动驾驶场景下常见的两种领域差异,即LiDAR-beam variation和Object-size change,给出了LiDAR down-sampling retraining和Post/Pre-SN实现,来针对特定域差异来迁移3D感知模型。详情见:
https://github.com/PJLab-ADG/3DTrans/blob/master/docs/GETTING_STARTED_UDA.md

3DTrans@UDA实验结果

Waymo->KITTI:

7505616e9673d4dd2973cf2cfd08ec84.png

1.2.2  3DTrans@ADA

入口链接:

https://github.com/PJLab-ADG/3DTrans/blob/master/docs/GETTING_STARTED_ADA.md

3DTrans代码库ADA基线算法的构建:

3DTrans代码库首次支持了多种经典的ADA算法,包括TQS[2],CLUE[3]以及我们的Bi3D,同时,利用TQS中的代码,可以轻易地实现query-by-committee、query-by-uncertainty等方法。

TQS[2]由transferable committee、transferable uncertainty和基于图像级特征的transferable domainness组成。在我们的复现中,我们使用CNN从BEV特征中提取场景级特征描述,并使用三个分类器头来构建committees。不同于以往使用熵来评估不确定度的工作,我们计算了客观分数和0.5的标记,这种打分方式不同于原来的TQS[2],这是因为我们只关注单一类别,不能使用最高分和第二高分的差。此外,我们通过域鉴别器计算域得分,并设置为  =0.75,  =0.4,这与TQS相同。为了与TQS保持一致,我们使用源域数据和选择的目标数据来微调在源域上训练的检测器。

CLUE[3]使用不确定性加权聚类来选择目标数据。按照这个思路,我们首先通过计算NMS后的预测熵来获得每帧的不确定性,然后用熵的平均值来表示帧级的不确定性。此外,利用CLUE[3]提出的加权K-Means和K个中心进行聚类,其中K表示当前采样时刻的标注预算。

3DTrans@ADA实验结果

Waymo->KITTI:

4e4aceb47cdcc48e74ee5ed9989928de.png

1.2.3  3DTrans@SSDA

入口链接:

https://github.com/PJLab-ADG/3DTrans/blob/master/docs/GETTING_STARTED_SSDA.md

3DTrans代码库SSDA基线算法的构建:

3DTrans代码库同样支持了多种半监督算法,包括经典的SESS[5]和Pseudo-Label[5]算法。并且我们给出了在Domain Shifts的情况下,该如何使用上述半监督方法来部署模型到目标域。SSDA的技术路线是:源域预训练模型->在1%/5%的带标注目标域数据下微调->在半监督目标域数据下进行重训练。3DTrans支持的半监督算法如下:

SESS[5]是一种在Mean Teacher范式下,引导教师模型和学生模型对于输入数据的随机扰动来保持预测一致性的算法。它设计了一个特定的基于点的数据扰动方案和三种一致性损失,能够使网络生成更准确的进行检测。我们已经在代码库中复现了SESS并将其应用在了跨域检测中。

Pseudo-Label[5]是针对无标签数据非常经典的一种方法,即由初始模型推理无标注数据,从而产生大量伪标签,通过设计的阈值过滤,最终的伪标注数据与带标注数据共同监督网络的训练。我们在代码库中复现Pseudo-Label方法并将其与Mean Teacher框架结合,应用在跨域检测中。

3DTrans@SSDA实验结果

Waymo->nuScenes:

8cceb90248c1b3a2c13a51a5d596ffbb.png

1.2.4  3DTrans@MDF

入口链接:

https://github.com/PJLab-ADG/3DTrans/blob/master/docs/GETTING_STARTED_MDF.md

3DTrans代码库MDF基线算法的构建:

3DTrans代码首次支持的3D场景下的MDF任务设定。MDF多域融合是指3D目标检测器在多个数据集上进行联合训练,并且需要尽可能同时在多个数据集实现较高的检测精度。需要注意,相比于Domain Adaptation(DA)领域中的Multi-source Domain Adaptation, 这里所提出的MDF任务不要求不同域之间是close-set闭集关系,即来自于不同域(或数据集)的类别分布式是可以不一致的。相比于Multi-source Domain Adaptation,MDF任务设定弱化了对于不同域之间的数据分布和类别分布的条件限制。

在3DTrans代码库中,我们构建了几种典型的MDF基线模型:

1)Single-dataset training:单数据集训练策略,难以部署到另外的数据集下。

2)Direct Merging:将不同数据集的数据直接合并,并且采用PV-RCNN or Voxel-RCNN等基线模型进行训练,

见脚本:slurm_train_multi_db_merge_loss.sh

3)Uni3D训练:将不同数据集的数据直接合并,并采用Dataset-shared Backbones + Dataset-specific Heads的方式进行训练,

见脚本:slurm_train_multi_db.sh

3DTrans@MDF实验结果(更多结果请参见代码库)

Waymo+nuScenes:

bfe8c662818038c2b6c067a4de8fa02e.png

1.2.5  3DTrans@可视化介绍

入口链接:

https://github.com/PJLab-ADG/3DTrans/blob/master/docs/QUICK_SEQUENCE_DEMO.md

3DTrans代码库UDA基线算法的构建:

目前现有的一些3D点云代码库的可视化模块都是单帧可视化,缺乏针对时序数据的处理。为此,我们在3DTrans代码库中增加了Sequence-level时序级别的可视化UI工具,可视化效果非常直观。目前主要支持对Waymo,ONCE和nuScenes数据集的时序检测结果的可视化。用户可以给定的一个序列ID,来产生对应的可视化内容

92026faebd4c5439e38988129864e31c.gif

987d668282cc78beef853c0b5ce46a80.gif

PART.2

Uni3D和Bi3D简要介绍

2.1

 Uni3D: CVPR-2023收录

Uni3D是我们针对MDF任务设定,提出的一个通用的解决方案。其可以容易地部署到PV-RCNN、Voxel-RCNN等模型中。另外,我们近期发现其对PV-RCNN++、Centerpoint等基线模型同样有明显提升。详情参考:Uni3D: 首个多数据集3D目标检测框架(已开源)

2.2

Bi3D:CVPR-2023收录

Bi3D是针对ADA任务设定,首次提出的在自动驾驶场景下主动学习解决方案。同样其可以以较低的标注代价来让自动驾驶感知模型适配的没有见过的目标域下。详情参考:Bi3D: 首个主动领域适配3D目标检测算法(已开源)

PART.3

3DTrans正在做什么?

最近火热的ChatGPT/GPT-4等大模型引发了我们对自动驾驶大模型的思考。众所周知,全面、多样的语料库是构建强大、通用的NLP或者跨模态大模型的基石。一些研究表明,如果可以获取到代表力强、差异性强的预训练数据,基础模型的参数量的增加是可以带来预训练性能的提升。

然而,在3D LiDAR自动驾驶场景下,由于不同厂商所提供的原始数据之间的差异很大,导致难以在自动驾驶领域获得一个unified dataset。因此,到目前阶段,我们认为在自动驾驶领域实现通用感知的一个必要路线是进行unified dataset的构建,或者是设计一个unified baseline model使得其可以在带有差异化的数据集中学习到一个unified representations。当然,Uni3D选择了后者。与此同时,我们也并没有放弃对前者的努力,Bi3D就是在探索如何从海量无标注的自动驾驶数据集中挑选出最优价值的数据,这个研究工作的最终目的实际上是为了从目前已知的多个学术数据集中挑选有价值样本,以最小的存储代价构建一个unified dataset。

近期,我们正在探索利用算法从海量自动驾驶数据中挑选出有价值的样本(多样性强、冗余度低),进一步设计有效的解决方案来让模型可以在多源数据中学习到通用表征。

“路漫漫其修远矣,吾将上下而求索”,探索自动驾驶感知模型跨传感器、跨数据集、跨任务的通用表征的路途漫长。我们欢迎有相同兴趣爱好的朋友交流、合作、加入我们!(加入我们!

PART.4

致谢与开发团队

感谢闫翔超(Shanghai AI Laboratory),袁家康(复旦大学),费奔(复旦大学),黄思渊(上海交通大学)和周鸿斌(Shanghai AI Laboratory)对开发3DTrans所做出的贡献。

3DTrans团队开发成员信息:

https://bobrown.github.io/Team_3DTrans.github.io/

此外,我们的3DTrans代码库是基于OpenPCDetv0.5.2(https://github.com/open-mmlab/OpenPCDet/tree/v0.5.2)进行开发,感谢OpenPCDet开发团队的出色代码库。

同时,我们也想利用这个机会感谢ONCE开发团队(https://once-for-auto-driving.github.io/),其公开的大规模数据集支持了3DTrans团队对AD场景下预训练任务的研究。

参考文献:

[1] Jihan Yang, Shaoshuai Shi, Zhe Wang, Hongsheng Li, Xiaojuan Qi. ST3D: Self-training for Unsupervised Domain Adaptation on 3D Object Detection.

[2] Bo Fu, Zhangjie Cao, Jianmin Wang, and Mingsheng Long. Transferable Query Selection for Active Domain Adaptation.

[3] Viraj Prabhu, Arjun Chandrasekaran, Kate Saenko, Judy Hoffman. Active Domain Adaptation via Clustering Uncertainty-weighted Embeddings.

[4] Yan Wang, Xiangyu Chen, Yurong You, Li Erran, Bharath Hariharan, Mark Campbell, Kilian Q. Weinberger, Wei-Lun Chao. Train in Germany, Test in The USA: Making 3D Object Detectors Generalize.

[5] Na Zhao, Tat-Seng Chua, Gim Hee Lee. SESS: Self-Ensembling Semi-Supervised 3D Object Detection.

[6] Antti Tarvainen, Harri Valpola. Mean teachers are better role models: Weight-averaged consistency targets improve semi-supervised deep learning results.

[7] Saining Xie, Jiatao Gu, Demi Guo, Charles R. Qi, Leonidas J. Guibas, Or Litany. PointContrast: Unsupervised Pre-training for 3D Point Cloud Understanding

视频课程来了!

自动驾驶之心为大家汇集了毫米波雷达视觉融合、高精地图、BEV感知、传感器标定、传感器部署、自动驾驶协同感知、语义分割、自动驾驶仿真、L4感知、决策规划、轨迹预测等多个方向学习视频,欢迎大家自取(扫码进入学习)

914d8156568ec4f16bea8b9aa7156ae8.png

(扫码学习最新视频)

国内首个自动驾驶学习社区

近1000人的交流社区,和20+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、Occpuancy、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

90a027c8909f804b2bac2908acd80eeb.jpeg

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向;

0b3edf26167cf8a8c007760086b2d9dc.jpeg

添加汽车人助理微信邀请入群

备注:学校/公司+方向+昵称

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将下面代码写成matlab形式 int runBm3d( const Mat image_noisy, Mat& image_basic, Mat& image_denoised ) { int Height = image_noisy.rows; int Width = image_noisy.cols; int Channels = image_noisy.channels(); vector<Mat> block_noisy;//store the patch vector<int>row_idx;//patch idx along the row direction vector<int>col_idx; GetAllBlock(image_noisy, Width, Height, Channels, kHard, pHard, block_noisy, row_idx, col_idx); int bn_r = row_idx.size(); int bn_c = col_idx.size(); tran2d(block_noisy, kHard); vector<int> sim_num;//index number for the selected similar patch in the block vector vector<int> sim_idx_row;//index number for the selected similar patch in the original Mat vector<int> sim_idx_col; vector<Mat>data;//store the data during transforming and shrinking Mat kaiser = gen_kaiser(beta, kHard);//2-D kaiser window float weight_hd = 1.0;//weights used for current relevent patch Mat denominator_hd(image_noisy.size(), CV_32FC1, Scalar::all(0)); Mat numerator_hd(image_noisy.size(), CV_32FC1, Scalar::all(0)); for (int i = 0; i < bn_r; i++) { for (int j = 0; j < bn_c; j++) { //for each pack in the block sim_num.clear(); sim_idx_row.clear(); sim_idx_col.clear(); data.clear(); getSimilarPatch(block_noisy, data, sim_num, i, j, bn_r, bn_c, int((nHard - kHard) / pHard) + 1, NHard, tao_hard);//block matching for (int k = 0; k < sim_num.size(); k++)//calculate idx in the left-top corner { sim_idx_row.push_back(row_idx[sim_num[k] / bn_c]); sim_idx_col.push_back(col_idx[sim_num[k] % bn_c]); } tran1d(data, kHard);//3-D transforming DetectZero(data, lambda3d * sigma);//shrink the cofficient weight_hd = calculate_weight_hd(data, sigma); Inver3Dtrans(data,kHard);//3-D inverse transforming aggregation(numerator_hd, denominator_hd, sim_idx_row, sim_idx_col, data, weight_hd, kHard, kaiser);//aggregation using weigths } } image_basic = numerator_hd / denominator_hd;
最新发布
05-24

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值