CUHK MMLab 3D点云目标检测框架 OpenPCDet个人学习记录

Posted SoaringPigeon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CUHK MMLab 3D点云目标检测框架 OpenPCDet个人学习记录相关的知识,希望对你有一定的参考价值。

OpenPCDet个人学习记录

项目地址

Github地址: https://github.com/open-mmlab/OpenPCDet
史少帅博士本人对OpenPCDet的描述可以参看这篇文章:OpenPCDet: Open-MMLab 面向LiDAR点云表征的3D目标检测代码库

OpenPCDet框架整体介绍

Motivation
层出不穷的点云数据集(KITTI、NuScene、Lyft、Waymo、PandaSet等)在数据格式与3D坐标系上往往定义各不相同,各式各样的点云感知算法(point-based、 voxel-based、one-stage/two-stage等)也形态各异,使得相关研究者难以在一个统一的框架内进行各种组合实验。

数据-模型分离的顶层代码框架设计思想

不同于图像处理,点云3D目标检测中不同数据集的繁多3D坐标定义与转换往往使研究者迷失其中。为此,PCDet定义了统一的规范化3D坐标表示贯穿整个数据处理与模型计算,从而将数据模块与模型处理模块完全分离。

优势

  • 研究者在研发不同结构模型时,统一使用标准化的3D坐标系进行各种相关处理(比如计算loss、RoI Pooling和模型后处理等),而无需理会不同数据集的坐标表示差异性。
  • 研究者在添加新数据集时,只需写少量代码将原始数据转化到标准化坐标定义下,PCDet将自动进行数据增强并适配到各种模型中

统一的3D目标检测坐标定义

不同的点云数据集在坐标系以及3D框的定义上往往不一样(KITTI数据集中的camera和LiDAR两个坐标系的混用也常使新手迷茫),因此在 PCDet 中我们采用了固定的统一点云坐标系(如上图右下角所示),以及更规范的3D检测框定义,贯穿整个数据增强、处理、模型计算以及检测后处理过程。3D检测框的7维信息定义如下

3D bounding box: ( c x ,   c y ,   c z ,   d x ,   d y ,   d z ,   h e a d i n g   d i r e c t i o n   θ ) (cx,\\ cy,\\ cz,\\ dx,\\ dy,\\ dz,\\ heading\\ direction\\ \\theta) (cx, cy, cz, dx, dy, dz, heading direction θ)

基于 PCDet 所采用的标准化3D框定义,我们再也不用纠结到底是物体3D中心还是物体底部中心;再也不用纠结物体三维尺寸到底是l-w-h排列还是w-l-h排列;再也不用纠结heading 0度角到底是哪,到底顺时针增加还是逆时针增加。

灵活全面的模块化模型拓扑设计

PCDet中搭建的3D目标检测框架只需要写config文件将所需模块定义清楚,然后PCDet将自动根据模块间的拓扑顺序组合为3D目标检测框架,支持不同类型的3D目标检测算法来进行训练和测试。

PCDet可以支持目前已有的绝大多数面向LiDAR点云的3D目标检测算法,包括voxel-based,point-based,point-voxel hybrid以及one-stage/two-stage等等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目标检测算法。我们在PCDet中开源的多个高性能3D目标检测算法可以为各位研究者提供更强的baseline算法,并成为大家的比赛刷榜利器。

如何支持新的数据集?

如之前所说,PCDet的数据-模型分离框架设计与规范化的坐标表示使得其很容易扩展到新的数据集上。具体来说,研究者只需要在自己的dataloader里面做以下两件事:

  • 在 self.getitem() 中加载自己的数据,并将点云与3D标注框均转至前述统一坐标定义下,送入数据基类提供的 self.prepare_data()
  • 在 self.generate_prediction_dicts()中接收模型预测的在统一坐标系下表示的3D检测框,并转回自己所需格式即可

如何组合、改进旧模型+支持新的模型?

对于一个新的(组合的)3D检测模型来说,只要在PCDet框架中实现其所特有的模块(比如新的backbone或新的head)来替换掉原有模块,并修改响应模型配置文件,其他模块以及数据处理部分直接利用PCDet中已有部分即可。

代码学习——数据处理部分

数据处理dataset.py的理解

目的

建立一个不同数据集通用的dataset父类,跟torch.utils.data.dataset同样的作用,只是更具有针对性,针对3D点云数据集

小知识点总结

  • 装饰器 @staticmethod@property
    @staticmethod
class C(object):
   @staticmethod
   def f():
       print('runoob');

C.f();          # 静态方法无需实例化
cobj = C()
cobj.f()        # 也可以实例化后调用

@property

class DataSet(object):
  @property
  def method_with_property(self): ##含有@property
      return 15
  def method_without_property(self): ##不含@property
      return 15

l = DataSet()
print(l.method_with_property) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
print(l.method_without_property())  #没有加@property , 必须使用正常的调用方法的形式,即在后面加()

数据处理kitti_dataset.py的理解

目的

定义KITTI数据集的dataset类

Kitti数据集参数介绍

KITTI数据集–参数
KITTI数据集测试 - 3 calib 相机参数
如何将KITTI激光雷达的点云数据,映射到图像中去

KittiDataset的结构

class KittiDataset(DatasetTemplate)
	def __init__(self, dataset_cfg, class_names, training=True, root_path=None, logger=None) #初始化参数
	def include_kitti_data(self, mode) #在self.logger中存储Kitti信息
	def set_split(self, split) #得到.txt文件下的序列号,组成列表sample_id_list
	def get_lidar(self, idx) #根据序列号,获取lidar信息
	def get_image_shape(self, idx) # 根据序列号,获取图像的信息
	def get_label(self, idx) #根据序列号,获取标签的信息
	def get_calib(self, idx) #该函数是根据序列得到某一标定
	def get_road_plane(self, idx) #根据路面信息文件planes,得到路面向上的单位法向量
	def get_fov_flag(pts_rect, img_shape, calib) #判断该点云是否在图片内,从而判断该点云能否有效 (是否用于训练)
	def get_infos(self, num_workers=4, has_label=True, count_inside_pts=True, sample_id_list=None) #获取sample_id对应的点云场景信息
	def create_groundtruth_database(self, info_path=None, used_classes=None, split='train') #用trainfile产生groundtruth_database,意思就是只保存训练数据中的gt_box及其包围的点的信息,用于数据增强
    def generate_prediction_dicts(batch_dict, pred_dicts, class_names, output_path=None) #产生处理后的预测信息
    def evaluation(self, det_annos, class_names, **kwargs) #准确率测试结果
    def __len__(self)
    def __getitem__(self, index)

create_kitti_infos函数

def create_kitti_infos(dataset_cfg, class_names, data_path, save_path, workers=4)

将训练集、验证集和测试集信息处理并保存到指定位置。
pkl文件是python里面保存文件的一种格式,如果直接打开会显示一堆序列化的东西,它通过pickle.dump写入。

如何数据处理以适应自己的点云数据

OpenPCDet:数据处理适应自己的点云数据

代码学习——模型部分

以上是关于CUHK MMLab 3D点云目标检测框架 OpenPCDet个人学习记录的主要内容,如果未能解决你的问题,请参考以下文章

lidar3D目标检测PointPillars:论文解读代码解读部署实现

lidar3D目标检测PointPillars:论文解读代码解读部署实现

GitHub 开源分享 | PointRCNN - 第一个基于原始点云的两阶段3D目标检测

论文解读 | F-PointNet, 使用RGB图像和Depth点云深度, 数据的3D目标检测

论文解读F-PointNet 使用RGB图像和Depth点云深度 数据的3D目标检测

论文解读F-PointNet 使用RGB图像和Depth点云深度 数据的3D目标检测