一、OpenPCDet 简介
1.1 简介
OpenPCDet: Open-MMLab 面向LiDAR点云表征的3D目标检测代码库
OpenPCDet的github链接
-
OpenPCDet 是一套基于PyTorch实现的点云3D目标检测代码库。
-
设计思想:点云数据集(KITTI、NuScene、Lyft、Waymo、PandaSet等)在数据格式与3D坐标系上往往定义各不相同,各式各样的点云感知算法(point-based、 voxel-based、one-stage/two-stage等)也形态各异
因此基于数据-模型分离的顶层代码框架设计思想,设计一个统一的架构,使得相关研究者可以在一个统一的框架内进行各种组合实验。
1.2 数据-模型分离的顶层代码框架
PCDet定义了统一的规范化3D坐标表示贯穿整个数据处理与模型计算,从而将数据模块与模型处理模块完全分离。
具体框架如下图所示:
数据模型分离的优点:
- 研究者在研发不同结构模型时,统一使用标准化的3D坐标系进行各种相关处理(比如计算loss、RoI Pooling和模型后处理等),而无需理会不同数据集的坐标表示差异性
- 研究者在添加新数据集时,只需写少量代码将原始数据转化到标准化坐标定义下,PCDet将自动进行数据增强并适配到各种模型中。
1.3 统一的3D目标检测坐标定义
PCDet 中我们采用了固定的统一点云坐标系,以及更规范的3D检测框定义,贯穿整个数据增强、处理、模型计算以及检测后处理过程。3D检测框的7维信息定义如下:
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角度增加)。
1.4 模块化模型拓扑设计
我们在PCDet中搭建3D目标检测框架只需要写config文件将所需模块定义清楚,然后PCDet将自动根据模块间的拓扑顺序组合为3D目标检测框架,来进行训练和测试。
模块化设计如下图所示:
PCDet可以支持目前已有的绝大多数面向LiDAR点云的3D目标检测算法,包括voxel-based,point-based,point-voxel hybrid以及one-stage/two-stage等等3D目标检测算法。 如下图所示:
二、 代码解析
2.1 框架介绍
文件结构如下图所示:
各个目录的作用如下:
2.2 数据处理流程
-
步骤1:
__getitem__
作用:从磁盘上加载数据并统一坐标系。
如果只更换数据集,则需要重写__getitem__
-
步骤2:
data_augmentor
作用: 数据增强的方法,例如随机裁剪、随机旋转等… -
步骤3:
point_feature_encoder
作用:选择一些特征的编码,输入的特征是points:(N,3+C_in)
经过选择和编码后,输出的特征是points:(N,3+C_out)
-
步骤4:
data_processor
作用:处理输入的数据,比如mask_point_boxes_outside_range、sample_points等 -
步骤5:
collate_batch
作用:将数据整理成batch
2.3 模型拓扑的依赖关系
建立model的过程在【pcdet/models/detectors/detector3d_template.py】中。
其中build_networks
是根据拓扑信息(module_topology
)建立网络, 并保存在module list
中。
其中module_topology
的定义如下:
2.4 模型的前向传播和最优
以point_rcnn
为例,定义了一个PointRCNN的类,继承的是Detector3DTemplate的类。
-
前向传播
- 首先遍历module_list, 通过
topology
顺序的调用各个模型。如果是训练过程(training
), 则调用get_traing_loss
计算损失。如果是推理过程,则调用post_processing
进行后处理
- 首先遍历module_list, 通过
-
最优化
计算的损失包括两个部分- DETECTOR.get_training_loss()
- HEAD.get_loss()
2.5 模型
2.5.1 detector
detector的存放位置:
对于所有detector的顶级模板如下
- 建立网络结构(Build_networks)
- 前向传播(Forword)
- 计算损失(Loss calculation)
- 后处理 (Post_processing:NMS+score threshold)
2.5.2 3D backbone network
backones_3d的存放位置:
3d主干网络的作用:提取基于体素的或者基于点云的特征。
3d主干网络主要有如下几种:
- 3d encoder with sparse convolution(with VFE)
- 功能:通过稀疏卷积进行编码
- 实例:VoxelBackBone8x、VolxelResBackBone8x
- 3d UNet with sparse convolution(with VFE)
- 功能:通过稀疏网络进行编码和解码两个部分
- 实例:UNetV2
- point-wise networks(PointNet++)
- 功能: 用PointNet++ 直接提取点的特征
- 实例:PointNet2MSG
2.5.3 2D Backbone network
backones_2d的存放位置:
2d主干网络的作用: 提取2d特征图。
3d主干网络主要有如下几种:
- Map_to_bev_module(把3d特征映射到2d上)
- HeightCompression
- PointPillarScatter
- 2d convolution encoder with FPN-like unsampling
- BaseBEVBackbone
2.5.4 Denseheads
Denseheads的存放位置:
- 任务:生成dense 3d boxes, 真正进行检测的过程。
AnchorHead包含如下两部分:- target assigning:对于每个anchor判断是否是正样本以及要朝着那个groud truth 回归。
- head loss calculation:计算loss,包括分类和回归的损失。
分类:
- 基于BEV 特征的 Dense head (继承于AnchorHeadTemplate)
- AnchorHeadSingle: 只输入一个特征图,基于anchor进行检测
- AnchorHeadMulti:输入多个特征图,基于anchor检测
- CentorHead:anchor- free检测,对于每个pixel输出一个检测框。
- 基于点特征的Dense head (继承于PointHeadTemplate)
- PointHeadSimple: 只做分割,判断每个点是前景点还是背景点。
- PointHeadBox: 不仅做分割,还做预测。对于每个点预测一个3d 的bonding box。
- PointIntraPartOffsetHead: 除了分割和预测外,还可以预测Intra part offset
2.5.5 RoIHeads
RoIHeads的存放位置:
- 任务:Refine 3D proposals with RoI-aligned features
- Extract RoI-aligned features
- proposal_layer
- ProposalTargetLayer
- Head loss calcution
- 二阶段的ROI检测(继承于ROITemplate)
- PointRCNNHead
- PartA2Head
- PVRCNNHead
2.6 配置文件
配置文件的存放路径:
通过.yaml
文件进行多层次的配置。
例如如下图所示的pv_rcnn.yaml
是个整体的配置。其中嵌套了三个下一级的配置,包括DATA_CONFIG
、MODEL
、OPTIMIZATION
三、拓展开发
3.1 使用自定义的数据集
步骤如下:文章来源地址https://www.toymoban.com/news/detail-439516.html文章来源:https://www.toymoban.com/news/detail-439516.html
- 继承
DatesetTemplate
写自己的DatasetModule
- 重载
self.__getitem__()
函数来加载点云或者gt_boxes, 并把它们转换成统一的坐标系。 - 调用
self.prepare_data()
去处理数据 - 重载
self.generate_prediction_dicts()
函数把预测结果转换成我们需要的格式。 - 重载
self.evaluation()
函数来评估模型的性能
3.2 使用自定义的模型
步骤如下:
- 继承
DetectorTemplate
来写自定义的detector - 写自定义的配置文件
- 在对应的目录下写对应的模型
- 重载
forward()
函数 - 重载
get_training_loss()
函数
到了这里,关于OpenPCDet解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!