zl程序教程

您现在的位置是:首页 >  Java

当前栏目

MMDet3D 1.1:统一易用的 3D 感知平台

2023-02-18 16:49:15 时间

自从两年前 MMDetection3D 发布以来,我们收到了很多用户的反馈,其中有不少有价值的建议,同时也有很多吐槽(当然我们非常欢迎大家来吐槽),也有很多社区用户参与到我们代码库的完善中来。

我们也非常高兴地看到越来越多的自动驾驶团队将 MMDetection3D 用在实际业务中,越来越多的研究人员用 MMDetection3D 做研究发 paper。

而这次发布的 MMDetection3D 1.1 则是我们尝试探索下一代 3D 通用感知的第一步

https://github.com/open-mmlab/mmdetection3d/tree/dev-1.x

(文末点击阅读原文可直达,欢迎体验)

全新引擎,全新体验

在全新的 1.1 版本中,我们移除了 MMSegmentation 的依赖,降低了 MMDetection3D 的依赖复杂性,同时我们为点云分割增加了更多新的 feature 和任务支持。

全新的 MMDetection3D 1.1 依赖于 OpenMMLab 最新推出的 MMEngine 和全新重构的 MMDetection 3.x,除了更新了整体的训练流程外,我们着重解决了 3D 检测这个方向一直以来的痛点问题:多数据、多任务、多模态之间的不统一

OpenMMLab 中检测相关的算法库

统一的数据集

基于 MMEngine 提供的 BaseDataset, 我们在 1.1 版本中根据任务类别分别重写了 Det3DDataset 和 Seg3DDataset。而针对同一个数据集,比如 KITTI,我们不再根据任务设置(点云检测、纯视觉检测)进行细分,统一在一个数据集类 KittiDatset 内实现完成各模态、各任务的支持。

统一的数据预处理

在之前的版本中,图像数据的预处理过程(Normalize、padding 等等)通常都是放在 Pipeline 中做的,而点云数据的预处理 (比如体素化 Voxelize)则是单独在模型的内部实现,比如某些 Voxel-based 的方法中会单独实现 voxelize 方法在模型内部调用,通过点云生成体素。

在全新的 1.1 版本中,我们基于 MMEngine 内的 BaseDataPreprocessor 模块,将所有的数据(图片、点云)的预处理过程统一放在 Det3DDataPreprocessor 内,做到不同模态数据处理的统一。除此以外,将点云体素化预处理过程迁移到模型外,也更加便于模型的部署。

统一的评估接口(eval metric)

在之前的版本中,各个数据集的评估接口都是直接和自身数据集类进行了深度的绑定,通过调用 Dataset.evaluate 方法进行模型性能的评估。

由于各个数据集在进行性能评估时要求的标注信息都不太一样,所以一个数据集的评估指标很难适用于另一个数据集;而 MMDetection3D 希望最终能提供一套通用的 3D 检测评估方法指标,只需要最基本的 3D 框标注信息就能实现性能评估。

在1.1 版本中,我们开始初步尝试着解决这个问题:基于 MMEngine,我们将各个数据集的评估接口模块转化为 Metric 类,比如 KittiMetric 、NuscenesMetric、WaymoMetric等等。理论来说,用户只需要在 config 文件中修改需要的 Metric 类型就可以获得需要的评测指标。但目前受限于各数据集 Metric 是将检测结果转到 SDK 的格式,再调用 SDK 的工具进行评估,所以 Metric 的互相调用仍然是一个难题。

针对这一问题,我们在 1.1 版本中初步对 KittiMetric 进行了相应的改进,使得其变得更加通用,能够满足自定义数据集以及各类数据集的评估要求。

统一的可视化

我们在之前的文章带你玩转 3D 检测和分割 (三):有趣的可视化中为大家介绍了不同场景不同任务下的可视化,虽然做了一定的介绍和梳理,但是整个可视化过程依然比较混乱。

而在 1.1 版本中,我们基于 MMEngine 的 Visualizer 模块,为各个模态、任务的可视化提供了一个统一的入口。此外,我们可以直接借(bai)鉴(piao) MMDetection 3.x 强大的 2D 图像检测可视化模块 DetLocalVisualizer 中和图像绘制相关的各种强大功能,用在多模态和纯视觉的 3D 检测可视化中;同时,我们还极大地增强了可视化功能的可拓展性,用户自定义需要的可视化功能时会更加容易!

开放统一的坐标系接口

其实我们在半年前发布的 v1.0.0rc0 版本就已经对坐标系进行了整体的重构,所有坐标系统一改为右手系,并且已经在之前的文章带你玩转 3D 检测和分割 (二):核心组件分析之坐标系和 Box中为大家具体介绍和梳理了坐标系重构前后的差异。

MMDetection3D 重构后的坐标系

当然这里需要进一步强调的是,由于数据集的不同,我们这里只是对所有数据集中各类数据传感器(摄像头、激光雷达等)的坐标系进行了统一。

但是由于各个数据集数据采集的传感器的数目和摆放位置等并不一致,比如 KITTI 数据集由一个激光雷达和四个前视相机(左右各两个,一个黑白,一个彩色)采集得到,而 nuScenes 数据集则是由一个激光雷达、六个环视相机以及五个雷达,所以不同数据在不同传感器的坐标系之间的转换在各个数据集中是不一致的。

而涉及到多个传感器之间转换的时候,不同的数据集会有不同的处理方法:KITTI 数据集在标定的时候,选取了 CAM0 作为参考坐标系,提供的标定转换矩阵都是围绕着这个 CAM0 存储的,而由于传感器数目更多, nuScenes 数据集选择了自车 (ego)作为数据在坐标系之间转换的桥梁,整个转换过程如下图所示:

nuScenes 数据集数据在坐标系之间的转换示意图

虽然在 v1.0.0rc 版本中,我们统一了各个数据集之间的坐标系,但是由于不同数据集标定文件的存储形式不同以及数据在各个坐标系之间的转换方式不同,3D 检测领域各个数据集的进一步统一受到限制。接下来就将介绍这个问题在我们全新的 1.1 版本中如何得到了进一步的解决。

数据集任务模态 all in one

在数据集方面,由于 3D 任务的复杂性,除了上述协同重构的方面外,我们还统一了不同数据集的数据协议:包括在不同模态、不同场景等设置下,数据存储方式(info)、数据读取和数据增强转换等内容。这样使得多模态的统一、跨数据集以及自定义数据集的训练和评测更加方便。

数据接口统一示意图

多任务统一

在 1.1 版本之前,MMDetection3D 有两种数据信息存储格式:pkl 和 json。pkl 文件主要按照每帧为单位进行存储,每帧的所有信息(点云、图像、注释)存储在一个字典(dict)里,主要用于点云和多模态感知任务;而 json 文件则是以图像为单位,按照 2D 检测中最主流的 coco 格式存储,主要用于纯视觉(如单目)3D 检测,方便直接复用 MMDetection 中 2D 检测相关的数据集类。

当我们希望在多任务中统一数据存储为一份文件时,最大的难点在于:通常数据集提供的 3D 标注是基于整个点云场景的,且一般保存在激光雷达坐标系下;但是在做纯视觉(如单目)3D 检测的时候,我们通常需要将这些 3D 框进行划分,找到每个 3D 框所属的相机然后将其转换到该相机的坐标系下进行存储,从而便于后续训练过程中的使用。

在 1.1 版本中,我们将同数据集所有任务的数据存储格式统一为一份 pkl 文件,按照每帧为单位进行存储,每帧的信息除了包含点云训练所需要的 instances 的整个场景的标注,也包含了纯视觉(单目)训练所需要的 cam_instances。cam_instances 内部以图像为单位,分别保存该帧中属于各个图像的标注, 从而使得一份数据集的 pkl 文件将可以被点云检测、纯视觉检测和多模态检测任务所共用,真正做到一份数据文件涵盖所有任务。

跨数据集统一

在 1.1 版本之前,不同数据集在数据存储时往往采用了不同的格式,比如针对某个场景,KITTI 将数据信息分为 image、point_cloud、calib、annos四个部分进行存储,而 nuScenes 的数据文件则把图片的数据存储在 cams内,而且标注信息(calibration) 也不像 KITTI 一样进行整合存储。除此以外,nuScenes 还包含 KITTI 数据集所没有的时序数据信息(sweeps)。

不同数据集间数据存储方式的不统一大大增加了用户在不同数据集上迁移模型的难度。在 1.1 版本中,我们为数据的存储提供了统一的协议和格式,在之后我们也会提供相应的文档进行具体介绍。

自定义数据集更便捷

通过统一数据协议,我们针对不同的任务提供了一整套从自定义数据准备->预处理转换->训练->推理验证的全流程规范。考虑到 3D 数据集部分标注和标定文件 (calibration) 难以获取的特点,我们秉持着最简化的原则,针对不同的任务,能让用户用最少的数据准备成本(标注 / 标定成本)实现训练和推理测试,大大降低用户自定义数据集的门槛

模型更多更强

一个强大的 3D 感知代码库一定离不开对主流和前沿模型的支持,MMDetection3D 致力于打造最全面的 3D 感知模型算法库。

更全面的纯视觉 3D 检测模型

最近 BEV-based perception 潮流下,纯视觉的 3D 检测方法又一次焕发新生。在这波浪潮下,从 DETR3D 、ImVoxelNet 到 BEVDet , PETR, M2BEV 和 BEVFormer,都是基于 MMDetection3D 实现的。

此外,我们从 v1.0.0rc0 版本开始陆续支持了 PGD/SMOKE/MonoFlex,在之后我们也将支持 Waymo 纯视觉 3D 检测高精度 baseline MV-FCOS3D++,BEVDet 的正式支持目前也在和原作者持续推进中。除此以外,我们将会在纯视觉领域保持持续跟进和输出。

更丰富的室内模型和任务支持

在室内 3D 检测方面,我们支持了最新的 SOTA 算法 FCAF3D,新增了 S3DIS 上的 3D 检测,同时支持了室内场景流行的卷积操作 MinkConv;在室内点云分割方面,我们对原有的点云语义分割进行了拓展,在 ScanNet 上支持了实例分割。在这里我们特别感谢来自社区的 contribution,MMDetection3D 的发展离不开社区用户们的支持 ~

室外点云 3D 检测持续更新

对于 PointPillars 这种经典模型,我们进行了进一步优化,获得了更好的检测性能;针对 Point R-CNN 进行了更新,实现了更加稳定的训练;同时我们支持了部分 PV R-CNN 的模块,完整版本的 PV R-CNN 的支持也在持续推进中。

更广泛的用户生态圈

除了我们自身支持的模型外,MMDetection3D 在产学研界也获得越来越广泛的应用,我们的用户生态圈也越来越庞大。

MMDetection3D 在产学研界的广泛应用

更快的训练速度

基于 MMEngine, 我们进一步提升了模型的训练速度, 基本让各个算法都实现了不同程度的训练加速。

MMDetection3D 1.1 更快的训练速度

用户体验全面优化

让 MMDetection3D 成为新手入门 3D 检测的最佳代码库是我们一直追求的目标,MMDetection3D 在关注代码质量和易用性的同时,更重视用户的使用体验,从用户的角度出发,容易上手的代码库一定是容易安装的,同时也应该有着全面清晰的用户文档告诉用户怎么使用。

在 MMDetection3D 1.1 中,我们提供了更全面的文档和教程,并对文档结构进行了调整,提供了基础教程和进阶教程,由浅入深,让用户能够快速上手速度更快、接口更统一、扩展更灵活、更大更强更全面的 MMDetection3D 1.1。

简化安装与环境配置

在之前的版本中,由于 3D 检测模型非常依赖于各种 CUDA 算子, MMDetection3D 的安装对新手来说可能没有那么友好。

考虑到这个问题,MMDetection3D 从 1.0.0rc2 版本开始,将所有的 CUDA 算子全部迁移到 mmcv,用户可以直接根据自己的环境选择预编译好的 mmcv-full 进行安装,就可以免去自己本地编译的烦恼,实现更加流畅的安装。

此外,我们新增了对 spconv 2.0 版本的支持,用户可以在可供安装的环境中选择使用 spconv 2.0,在获得一致性能的前提下大幅减少 了 GPU 的显存占用。

最后,我们也对 Windows 的适配做了优化,进行了更加全面的验证,让用户在 Windows 上也能获得不错的使用体验。

更细致的用户文档

从 v1.0.0rc0 版本之后,我们在原本有的针对不同数据集教程的基础上,新增了针对不同任务和设置的教程;伴随着 v1.1 版本的发布,基于我们新的数据存储协议,我们进一步完善了自定义数据集的文档,细化了每个处理步骤,努力降低用户使用自定义数据集的难度。

除此以外,我们新增了全新的数据流文档,介绍数据如何在整个训练和推理验证过程中进行变换和传递。之后我们还会进一步更新和完善整体文档,包括但不限于对各个数据集进行更加细致的介绍,比如数据集的传感器 setup 、相应的数据标注文件内容的含义等等。

社区力量是 OpenMMLab 生态中至关重要的部分,MMDetection3D 1.1 还处于初期阶段,中英文文档和教程还有待完善,所以我们邀请社区同学们一同建立更加完善的 MMDetection3D 文档和教程 ,我们也非常欢迎社区同学对我们文档的反馈和吐槽~

总结

3D 检测这个方向相比 2D 检测本身就更为复杂,坐标系之间的转换、数据采集和标定方式的多样性、多模态的融合方式等等问题使得 3D 检测相比 2D 检测有着更高的门槛,而如何降低 3D 检测的入门门槛和做好 3D 检测各个任务、数据、模态之间的统一是我们一直在做的事情。如何实现通用的 3D 检测一直是这个领域亟待解决的问题,而 MMDetection3D 正是在朝着这个方向不断努力。

想了解更多 MMDetection3D 1.1 相关内容,欢迎查看直播回放视频~

未来,我们也将不断地迭代更新,为社区带来更好用的 3D 感知模型库。我们计划在未来支持更多的检测/分割算法,更丰富的模型库,更强大的预训练模型。同时我们也将不断提高 MMDetection3D 的易用性。欢迎社区用户参与到 MMDetection3D 的建设中,不断迭代完善 MMDetection3D。

我们将在 2023 年 1 月 1 日正式发布 MMDetection3D 1.1.0 版本到主分支,对新版本感兴趣的同学可以使用 dev-1.x 分支来体验我们的全新版本。我们将在未来保持双分支的同时维护,主要维护时间线如下所示:

最后,欢迎社区用户来试用 MMDetection3D 1.1,通过提 PR、 issue 和 discussion 参与到 MMDetection3D 1.1 的建设中,我们一起来做更好的 3D 感知平台~