前言
随着自动驾驶与机器人技术的不断发展,基于点云表征的3D目标检测领域在近年来取得了不断的发展。然而,层出不穷的点云数据集(KITTI、NuScene、Lyft、Waymo、PandaSet等)在数据格式与3D坐标系上往往定义各不相同,各式各样的点云感知算法(point-based、 voxel-based、one-stage/two-stage等)也形态各异,使得相关研究者难以在一个统一的框架内进行各种组合实验。
为此,我们开源了一套基于PyTorch实现的点云3D目标检测代码库 - OpenPCDet:
https://github.com/open-mmlab/OpenPCDet
其主要包括了全新改版的 PCDet (已升级到v0.3
) 点云3D目标检测框架 (包括我们首次开源的 PV-RCNN 3D目标检测算法)。它目前支持多种先进的3D对象检测方法,这些方法具有针对一阶段和两阶段3D检测框架的高度重构的代码。
基于OpenPCDet工具箱,我们在所有仅限LiDAR的方法中赢得了3D检测,3D跟踪,域自适应三个轨道上的Waymo开放数据集挑战,并且Waymo相关模型将OpenPCDet很快发布。
我们目前正在积极更新此存储库,不久将支持更多数据集和模型。
接下来,我们主要介绍 PCDet 3D目标检测框架的整体结构设计与优势,以及如何添加新的数据集、如何组合\研发新的model等简要使用说明。
PCDet 3D目标检测框架介绍
数据-模型分离的顶层代码框架设计思想
不同于图像处理,点云3D目标检测中不同数据集的繁多3D坐标定义与转换往往使研究者迷失其中。为此,PCDet定义了统一的规范化3D坐标表示贯穿整个数据处理与模型计算,从而将数据模块与模型处理模块完全分离。
其优势体现在:
- 研究者在研发不同结构模型时,统一使用标准化的3D坐标系进行各种相关处理(比如计算
loss
、RoI Pooling
和模型后处理等),而无需理会不同数据集的坐标表示差异性; - 研究者在添加新数据集时,只需写少量代码将原始数据转化到标准化坐标定义下,PCDet将自动进行数据增强并适配到各种模型中。
PCDet 数据-模型分离的顶层设计,使得研究者可以轻松适配各种模型到不同的点云3D目标检测数据集上,免去研发模型时迷失在3D坐标转换中的顾虑。
图1: PCDet 数据-模型分离的代码框架设计
统一的3D目标检测坐标定义
不同的点云数据集在坐标系以及3D框的定义上往往不一样(KITTI数据集中的camera和LiDAR两个坐标系的混用也常使新手迷茫),因此在 PCDet 中我们采用了固定的统一点云坐标系(如图1右下角所示),以及更规范的3D检测框定义,贯穿整个数据增强、处理、模型计算以及检测后处理过程。3D检测框的7维信息定义如下(如图2所示):
3D bounding box: (cx, cy, cz, dx, dy, dz, heading)
其中,(cx, cy, cz) 为物体3D框的几何中心位置,(dx, dy, dz)分别为物体3D框在heading角度为0时沿着x-y-z三个方向的长度,heading为物体在俯视图下的朝向角 (沿着x轴方向为0度角,逆时针x到y角度增加)。
图2: PCDet采用的标准化3D检测框示意图 (俯视)。
基于 PCDet 所采用的标准化3D框定义,我们再也不用纠结到底是物体3D中心还是物体底部中心;再也不用纠结物体三维尺寸到底是l-w-h排列还是w-l-h排列;再也不用纠结heading 0度角到底是哪,到底顺时针增加还是逆时针增加。
灵活全面的模块化模型拓扑设计
基于图3所示的灵活且全面的模块化设计,我们在PCDet中搭建3D目标检测框架只需要写config文件将所需模块定义清楚,然后PCDet将自动根据模块间的拓扑顺序组合为3D目标检测框架,来进行训练和测试。
图3: PCDet模块化的3D目标检测框架,支持不同类型的3D目标检测算法。
基于图3所示框架,PCDet可以支持目前已有的绝大多数面向LiDAR点云的3D目标检测算法,包括voxel-based
,point-based
,point-voxel hybrid
以及one-stage/two-stage
等等3D目标检测算法(参见图4示例图)。
图4: PCDet模块化设计可以支持多种3D目标检测框架。
清晰简洁的代码结构
PCDet全新重构了基于numpy+PyTorch
的数据增强模块与数据预处理模块,依托data_augmentor
与data_processor
两个基类可灵活添加、删除各种数据增强与预处理操作。
我们在重构PCDet代码时,尽量做到代码结构清晰简洁,用最简单的python+pytorch
完成整个结构(涉及的CUDA代码也都提供了明确接口定义),从而更好的让研究者轻松理解代码逻辑和修改使用。
更强的3D目标检测性能
作为最早开源二阶段3D点云目标检测代码的团队之一,我们不断提出了PointRCNN
、PartA2-Net
、PV-RCNN
等高性能3D目标检测算法。在这次PCDet代码更新中,我们首次开源了PV-RCNN算法,其目前仍是在KITTI+Waymo榜上性能最强的纯点云3D目标检测算法。(过时了)
- 所有型号都经过8个GTX 1080Ti GPU的培训,可以下载。
- 训练时间是使用8个TITAN XP GPU和PyTorch 1.5测量的。
下表显示了受支持的选定方法。 结果是在KITTI数据集的val集上具有中等难度的3D检测性能。
图5: PCDet首次开源PV-RCNN高性能3D目标检测算法,其在KITTI榜上性能显著高于已有算法。
希望我们在PCDet中开源的多个高性能3D目标检测算法可以为各位研究者提供更强的baseline算法,并成为大家的比赛刷榜利器。
如何支持新的数据集?
如之前所说,PCDet的数据-模型分离框架设计与规范化的坐标表示使得其很容易扩展到新的数据集上。具体来说,研究者只需要在自己的dataloader
里面做以下两件事:
(1) 在 self.getitem_()
中加载自己的数据,并将点云与3D标注框均转至前述统一坐标定义下,送入数据基类提供的 self.prepare_data()
;
(2) 在 self.generate_prediction_dicts()
中接收模型预测的在统一坐标系下表示的3D检测框,并转回自己所需格式即可。
如何组合、改进旧模型+支持新的模型?
如图3所示,PCDet中实际上已经支持了绝大部分的模块。对于一个新的(组合的)3D检测模型来说,只要在PCDet框架中实现其所特有的模块(比如新的backbone或新的head)来替换掉原有模块,并修改响应模型配置文件,其他模块以及数据处理部分直接利用PCDet中已有部分即可。
总结
当前支持的功能
支持一阶段和两阶段3D对象检测框架
支持使用多个GPU和多台机器进行分布式训练和测试
支持不同比例的多个头部以检测不同的类别
支持堆叠版本集抽象,以编码不同场景中的多个点
支持自适应训练样本选择(ATSS)进行目标分配
支持RoI-aware点云pooling和RoI-grid点云pooling
支持GPU版本3D IoU计算和旋转NMS
OpenPCDet开源项目旨在为学术界和工业界提供一个更灵活、全面、高效的点云3D目标检测代码框架,也希望吸引更多的研究者参与进来支持更多的算法与数据集,从而推动这个领域的不断发展。
2020/7/1
OpenPCDet库升级到v0.3.0
支持Point-based, Anchor-free Model:
V0.3.0版本中支持了PointRCNN
,PartA2-Free
等point-based
和anchor-free
的网络结构,我们OpenPCDet架构中的每个部分终于都填上了。同时现在大家也可以自由切换PointNet++
和SparseConv
的backbone自由组合了。
另外,相比我们最早发布的PointRCNN代码,OpenPCDet版本的PointRCNN支持了joint训练以及多类预测,只需要3小时即可训好,同时也可以稳定的复现PointRCNN Paper上的KITTI性能了。
支持NuScenes数据集以及两个较强的baseline算法:
本次更新中,我们也支持NuScenes数据集,包含10类预测以及速度预测。同时,我们也在OpenPCDet上提供两个强baseline算法,PointPillar-Multihead
和Second-Multihead
,包括去年NuScenes比赛中的第一算法CBGS,目前NDS可以稳定达到62+。相信有了这些强baseline,大家可以轻松的在NuScenes上调参刷榜。
支持PyTorch 1.1~1.5和spconv 1.0~1.2:
本次更新中,我们的代码也可以同时支持PyTorch 1.1~1.5版本,以及spconv的1.0和1.2版本,同时训练速度也有了明显的提升。
2020/7/31
OpenPCDet支持Waymo数据集啦
我们的OpenPCDet刚刚release了Waymo Open Dataset的相关代码和Waymo上PV-RCNN,Part-A2-Net,SECOND的配置文件和性能。
其中Waymo Dataloader部分的设计和Waymo Eval代码比之前其他codebase的处理方法都要方便很多 (谁用谁知道呀)。
2020/11/10
参考:
等到 Shaoshuai Shi 大佬的更新。。。