Part-A2是商汤在CVPR 2020上发布的三维点云目标检测模型,来源于PointRCNN同一作者,论文名称《From Points to Parts 3D Object Detection from Point Cloud with Part-aware and Part-aggregation Network》。从名称可以看出,Part代表的是目标的局部信息,A2代表 aware and aggregation,即目标内局部点云识别与聚合。该论文最突出的创新点在于在三维目标框检测时利用到了目标内的局部点云信息。在此之前的模型,主要是将三维目标看作一个整体,可以理解为一个黑盒子,最目标内部的点云分布情况缺乏关注。
1 源码与输入数据
源码采用的是mmdetection3d框架中的PartA2模型。mmdetection3d安装和调试验证可参考本博客之前的专栏,里面有详细介绍。
数据采用的是kitti,为了快速进行算法调试、训练、评估和验证,以及快速下载,我制作了一个mini kitti数据集,数据集的文件目录结构与完整KITTI数据集保持一致。其中,小型的KITTI数据集,即 mini kitti保存了20个训练样本和5个测试样本。下载地址为:minikitti数据集-深度学习文档类资源-CSDN下载。
下载的数据包含4个部分,即激光雷达数据velodyne、图像数据image_2、校准数据calib和标注数据label_2。如果需要对应的ImageSets,请下载:train_val_testforminikitti-深度学习文档类资源-CSDN下载,将下载的文件夹重名为ImageSets即可。
关于KITTI各个部分的介绍请分别参考以下内容:
KITTI数据集简介(一) — 激光雷达数据_Coding的叶子的博客-CSDN博客_雷达数据集
KITTI数据集简介(二) — 标注数据label_2_Coding的叶子的博客-CSDN博客_kitti数据集标注
KITTI数据集简介(三) — 图像数据image_2_Coding的叶子的博客-CSDN博客
KITTI数据集简介(四) — 图像数据calib_Coding的叶子的博客-CSDN博客
数据预处理部分可以参考Voxelnet的数据处理方式加以理解:【三维目标检测】VoxelNet(二):数据处理_Coding的叶子的博客-CSDN博客。
下载后直接将数据保存在mmdetection 3工程所在目录的data文件夹下,目录结构如下图所示,然后执行下文第2节中的kitti数据预处理命令。
2 mmdetection3d kitti数据处理与模型训练
mmdetection3d kitti (持续更新)_Coding的叶子的博客-CSDN博客
python tools/create_data.py kitti --root-path ./data/kitti --out-dir ./data/kitti --extra-tag kitti
mmdetection3d kitti数据预处理完成之后,运行下述命令即可开始PointRCNN的训练。
python tools/train.py configs/point_rcnn/point_rcnn_2x8_kitti-3d-3classes.py
3 源码运行调试
mmdetection3d的PartA2源码运行命令如下:
python tools/train.py configs/parta2/hv_PartA2_secfpn_2x8_cyclic_80e_kitti-3d-3class.py
PartA2运行与mmdetection3d的版本有关,早期版本运行会有几个bug,不过后续都已经修复了。为了避免bug,大家可以安装最新版本,也可以按照下面步骤进行修改。
3.1 稀疏卷积版本
PartA2采用了稀疏卷积,需要安装spconv 2.0库。安装方式如下,其中102表示cuda版本为10.2,且最低支持CUDA 10.2。
-
pip install cumm-cu102
-
pip install spconv-cu102
如果没有安装spconv 2.0则有可能报如下错误:
(1)RuntimeError: /tmp/mmcv/mmcv/ops/csrc/pytorch/cuda/sparse_indice.cu 123。
(2)RuntimeError: indices must be contiguous。
3.2 稀疏卷积特征赋值
spconv 2.0不再支持对稀疏变量的特征直接赋值,需要采用replace_feature来完成。例如,a.feature=xxx需要改成a=replace_feature(a, xxx)。使用relace_feature之前先要导入该函数,即
“from mmdet3d.ops.sparse_block import replace_feature”。
如果spconv的版本不正确,那么运行程序时会报错提示“ValueError: you can't set feature directly, use 'x = x.replace_feature(your_new_feature)' to generate new SparseConvTensor instead.”。解决方法为将报错处的程序都逐一替换成replace_feature操作即可。
3.3 parta2_bbox_head.py
如果运行程序时报错提示“ File "/root/project/mmdetect2d/mmdetection3d-master/mmdet3d/models/roi_heads/bbox_heads/parta2_bbox_head.py", line 262, in forward x_part = self.part_conv(part_features)”,并且触发AssertionError错误,那么可以考虑在最新版本的mmdection3d项目中下载parta2_bbox_head.py文件并且替换掉当前文件。
3.4 no attribute 'train_cfg'或'test_cfg'
如果运行程序时报错提示“AttributeError: 'PartA2' object has no attribute 'train_cfg'”或“AttributeError: 'PartA2' object has no attribute 'test_cfg'”,那么需要对mmdetection3d-master\mmdet3d\models\detectors\two_stage.py中的TwoStage3DDetector类进行修改。这个是早期版本的bug,没有加载train_cfg或test_cfg。那么在该类中增加“self.train_cfg = train_cfg”和“self.test_cfg = test_cfg”即可,如下所示。
-
if pretrained:
-
warnings.warn(
'DeprecationWarning: pretrained is deprecated, '
-
'please use "init_cfg" instead')
-
backbone.pretrained = pretrained
-
self.backbone = build_backbone(backbone)
-
self.train_cfg = train_cfg
-
self.test_cfg = test_cfg
-
if neck
is
not
None:
-
self.neck = build_neck(neck)
-
-
if rpn_head
is
not
None:
4 Part-A2简介
Part-A2的整体结构如下图所示,主要包括Part-Aware stage 和Part-aggregation stage两个阶段。Part-Aware stage主要是提取点云中各个点的特征,包括语义分割特征和目标内部点的特征,提取特征的方法是一个采用三维稀疏卷积的UNET结构。UNET是二维图像语义分割中比较常见的一个主干网络结构,Part-A2沿用了这个结构,并且将二维卷积相应地替换成三维稀疏卷积。Part-Aggregation stage阶段主要是根据上一阶段的特征和候选框proposal生成最终的目标分类、置信度和位置预测特征,这个功能与SECOND等三维目标检测网络基本一致,但进行了语义特征和Part 特征的融合。
5 模型结构与代码详解
模型详细结构及推理过程请参考下一篇博客:预计本周内更新。
6【python三维深度学习】python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_三维点云深度学习
更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。
转载:https://blog.csdn.net/suiyingy/article/details/126649034