【三维目标检测】Part-A2(一)
本文为博主原创文章,未经博主允许不得转载。
本文为专栏《python三维点云从基础到深度学习》系列文章,地址为“https://blog.csdn.net/suiyingy/article/details/124017716”。
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
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 模型结构与代码详解
模型详细结构及推理过程请参考下一篇博客:【三维目标检测】Part-A2(二)_Coding的叶子的博客-CSDN博客。
6【python三维深度学习】python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_三维点云深度学习
更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。
本文为博主原创文章,未经博主允许不得转载。
本文为专栏《python三维点云从基础到深度学习》系列文章,地址为“https://blog.csdn.net/suiyingy/article/details/124017716”。
相关文章
- nat检测NatTypeTester v3.4 和v5.0版本
- NAT简单粗暴的一键nat类型检测nat1 nat2 nat3 nat4
- 基础知识 | 对目标检测认识及理解
- MindSpore实践:对篮球运动员目标的检测
- 《目标检测蓝皮书》第3篇 卷积神经网络
- 【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度
- 【计算机视觉】运动目标检测算法文献阅读笔记
- 【计算机视觉】基于局部二值相似性模式(LBSP)的运动目标检测算法
- 【计算机视觉】基于自组织背景减除的运动目标检测算法
- 基于典型相关分析的故障检测和过程监控算法研究(Matlab代码实现)
- OpenAI"巧妙"发现无监督情感神经元,可利用文本检测用户情感
- chainer-目标检测-FasterRCNN
- chainer-目标检测-SSD
- 【目标检测竞赛总结】IEEE UV 2022 “Vision Meets Algae” Object Detection Challenge
- JS 检测变量是否是一个数组的几种方法【转】
- MonoJSG:联合语义和几何代价函数的单目3D目标检测(CVPR2022)
- 《中国人工智能学会通讯》——11.13 三维目标检测与模型重建一体化算法
- Python,OpenCV应用轮廓逼近算法,检测对象的形状
- 目标检测2——借Detectron2源码理解Anchors与RPN
- 一文读懂深度学习框架下的目标检测(附数据集)
- 【三维目标检测】FCAF3D(二)
- 【三维目标检测】SSN(二)
- 【三维目标检测】SASSD(一)
- 【三维目标检测】PointRCNN(二)
- 【三维目标检测】Second 模型 (二)
- 【三维目标检测】Complex-Yolov4详解(二):模型结构
- 【三维目标检测可视化】三维点云目标检测与图像融合可视化
- 【三维目标检测】VoxelNet(三):模型详解
- 【三维目标检测】VoxelNet(二):数据处理
- 【并发编程022】程序上下文切换检测和解决办法?
- [shell]通过ping检测整个网段IP的网络状态脚本