OpenPCDet: Open-MMLab 面向LiDAR点云表征的3D目标检测代码库
随着自动驾驶与机器人技术的不断发展,基于点云表征的3D目标检测领域在近年来取得了不断的发展。然而,层出不穷的点云数据集(KITTI、NuScene、Lyft、Waymo、PandaSet等)在数据格式与3D坐标系上往往定义各不相同,各式各样的点云感知算法(point-based、 voxel-based、one-stage/two-stage等)也形态各异,使得相关研究者难以在一个统一的框架内进行各种组合实验。
为此,我们开源了一套基于PyTorch实现的点云3D目标检测代码库 - OpenPCDet:
https://github.com/open-mmlab/OpenPCDetgithub.com
其主要包括了全新改版的 PCDet (v0.2) 点云3D目标检测框架 (包括我们首次开源的 PV-RCNN 3D目标检测算法)。
接下来,我们主要介绍 PCDet 3D目标检测框架的整体结构设计与优势,以及如何添加新的数据集、如何组合研发新的model等简要使用说明。
PCDet 3D目标检测框架介绍
数据-模型分离的顶层代码框架设计思想
不同于图像处理,点云3D目标检测中不同数据集的繁多3D坐标定义与转换往往使研究者迷失其中。为此,PCDet定义了统一的规范化3D坐标表示贯穿整个数据处理与模型计算,从而将数据模块与模型处理模块完全分离,其优势体现在: (1) 研究者在研发不同结构模型时,统一使用标准化的3D坐标系进行各种相关处理(比如计算loss、RoI Pooling和模型后处理等),而无需理会不同数据集的坐标表示差异性;(2) 研究者在添加新数据集时,只需写少量代码将原始数据转化到标准化坐标定义下,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目标检测算法。
图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中已有部分即可。
总结
OpenPCDet开源项目旨在为学术界和工业界提供一个更灵活、全面、高效的点云3D目标检测代码框架,也希望吸引更多的研究者参与进来支持更多的算法与数据集,从而推动这个领域的不断发展。