[3D检测系列-PV-RCNN] PV-RCNN论文详解、PV-RCNN代码复现、包含官网PV-RCNN预训练权重及报错问题
[3D检测系列-PV-RCNN] PV-RCNN论文详解、PV-RCNN代码复现
一、论文详解
1、3D voxel CNN
2、体素到关键点场景编码
2.1、关键点抽样
2.2、体素抽象
3、VSA模块(体素集抽象模块)
3.1、 预测关键点权重
4、提案细化的关键点到网格 RoI 特征抽象
4.1、通过集合抽象进行 RoI 网格池化
4.2、3D 提案细化和置信度预测
5、训练损失
二、代码复现
1、Copy代码
2、安装一些功能包
3、数据集的准备
4、网络运行检测:
一、论文详解
1、3D voxel CNN
特征:首先将输入点P划分为空间分辨率为L×W×H的小体素,其中非空体素的特征直接计算为所有内部点的逐点特征的平均值。 常用的特征是 3D 坐标和反射强度。 该网络利用一系列 3×3×3的3D 稀疏卷积将点云逐渐转换为具有 1×、2×、4×、8× 下采样大小的特征量。 每个级别的这种稀疏特征量可以被视为一组体素特征向量。通过将编码的 8 倍下采样 3D 特征量转换为 2D 鸟瞰特征图,按照基于anchor的方法生成高质量的 3D 提议。 具体来说沿 Z 轴堆叠 3D 特征量以获得 L/8 × W/8 鸟瞰特征图。 每个类有 2× L/8 × W/8 个 3D 锚框,采用该类的平均 3D 对象大小,并为鸟瞰特征图的每个像素评估两个 0°、90° 方向的锚。 采用基于锚的方案的 3D 体素 CNN 主干网络比基于 PointNet 的方法实现了更高的召回性能
2、体素到关键点场景编码
2.1、关键点抽样
采用FurthestPoint-Sampling (FPS)算法从点云P中采样少量n个关键点K = {p1,····,pn},KITTI数据集n=2048 ,Waymo 数据集n=4,096 。这种方法使关键点分布在非空体素周围,可代表整个场景。
2.2、体素抽象
表示为 3D voxel CNN 的第 k 层中的体素特征向量集
作为特征向量集每个体素的 3D 坐标,Nk为第k层非空体素数量
然后对于每个关键点 pi,首先在第 k 层的半径 rk 中识别其相邻的非空体素,以检索体素特征向量集。
表示相对位置
代表语义体素特征
代表Pi相邻体素集(就是由上面二者相关联得到)
通过 PointNetblock将中的体素特征转换以生成关键点 pi 的特征:
M(·) 表示从相邻集合 中随机采样至多个 体素以节省计算量。G(·) 表示多层感知器网络以对体素特征和相对位置进行编码。沿通道最大池化操作 max(·) 将不同数量的相邻体素特征向量映射到关键点 pi 的特征向量。 通常,还在第 k 层设置多个半径,以聚合具有不同感受野的局部体素特征,以捕获更丰富的多尺度上下文信息。
上述体素集抽象是在3D体素CNN的不同层次上进行的,不同层次的聚合特征可以串联起来生成关键点pi的多尺度语义特征
其中生成的特征结合了从体素特征 中基于 3D 体素 CNN 的特征学习和从体素集抽象中基于 PointNet 的特征学习。
3、VSA模块(体素集抽象模块)
VSA作用:对从3D CNN特征量到关键点的多尺度语义特征进行编码
原始点云特征,将关键点 pi 投影到 2D 鸟瞰坐标系,并利用双线性插值从鸟瞰特征图中获得特征 。pi 的关键点特征通过连接其所有相关特征得到进一步丰富,这些特征具有很强的保留整个场景的 3D 结构信息的能力,并且还可以大大提高最终检测性能。
3.1、 预测关键点权重
提出了一个预测关键点加权 Predicted Keypoint Weighting(PKW) 模块 ,以通过来自点云分割的额外监督来重新加权关键点特征。分割标签可以直接由3D检测框注释生成,即通过检查每个关键点是在ground-truth 3D框的内部还是外部。
每个关键点的特征的预测特征权重可以表示为:
其中 A(·) 是具有 sigmoid 函数的三层 MLP 网络,用于预测 [0, 1] 之间的前景置信度。 PKW 模块由具有默认超参数的焦点损失(链接:链接:Focal loss for dense object detection)进行训练,用于处理训练集中前景/背景点的不平衡数量。
4、提案细化的关键点到网格 RoI 特征抽象
在上一步中,将整个场景归纳为少量具有多尺度语义特征的关键点。给定由 3D 体素 CNN 生成的每个3D提议(RoI),每个 RoI 的特征需要从关键点特征中聚合准确和强大的提案细化。 提出了基于集合抽象操作的关键点到网格 RoI 特征抽象,用于多尺度 RoI 特征编码。
4.1、通过集合抽象进行 RoI 网格池化
提出 RoI-grid pooling 模块将关键点特征聚合到具有多个感受野的 RoI-grid 点。 我们在每个 3D 提议中统一采样 6 × 6 × 6 网格点,表示为。 采用集合抽象操作从关键点特征中聚合网格点的特征。 具体来说,首先将网格点 在半径 内的相邻关键点识别为:
其中使 被附加与从关键点 得到的局部相对位置相关联。 然后采用PointNet-block聚合相邻关键点特征集以生成网格点的特征为:
4.2、3D 提案细化和置信度预测
给定每个框提案的 RoI 特征,提案细化网络学习预测相对于输入 3D 提案的大小和位置(即中心、大小和方向)残差。 细化网络采用 2 层 MLP,并有两个分支分别用于置信度预测和框细化。对于置信度预测分支,采用 3D RoI 与其对应的 ground-truth 框之间的 3D Intersection-over-Union (IoU) 作为训练目标。 对于第 k 个 3D RoI,其置信度训练目标 被归一化为 [0, 1] 之间
其中是第 k 个 RoI w.r.t 的ground-truth的IoU。然后训练置信分支以最小化预测置信目标时的交叉熵损失,是网络的预测分数
框细化分支的框回归目标采用传统的基于残差的方法进行编码,并通过平滑 L1 损失函数进行优化。
5、训练损失
与second网络损失相同
二、代码复现
先附上环境配置:
Ubuntu18.04
python3.6
pytorch 1.8.0 torchvision 0.9.0 cuda 11.1
1、Copy代码
git clone https://github.com/open-mmlab/OpenPCDet
2、安装一些功能包
按照requirements来安装需要的依赖,我自己是按照txt中需要的一个一个的安装的,官方则是直接安装。但是环境就是玄学,为了避免出现问题我已经安装过的我怕系统重新给我下载会出现问题。因此我是对照txt将我还没下载的库自己手动下的,下面这个是官网的代码,可以一键直接下载。记得使用镜像源不然很慢。
cd OpenPCDet
pip install -r requirements.txt
安装Spconv:
pip install spconv-cu11.1
注意:此处的-cu11.1是你cuda的版本,我这里是11.1根据自己的cuda版本来下载。
安装pecet:
python setup.py develop
如果你不确定自己有没有安装成功可以打开终端:
python
import spconv
import pcdet
如果没有报错则验证成功。
安装mayavi:
conda install mayavi
3、数据集的准备
这个地方不需要重新介绍(我有点懒),大家可以参考我另外一篇文章,直接看数据集准备的那部分。直接设置软连接,里面也包括了如何下载Kitti数据集的方法。
[3D检测系列-PointRCNN]复现PointRCNN代码,并实现PointRCNN3D目标检测可视化,包含预训练权重下载链接(从0开始以及各种报错的解决方法)_Callme_TeacherPi℡的博客-CSDN博客
然后这个地方还需要对数据集做处理,不然后面出现以下错误:
File "../pcdet/datasets/kitti/kitti_dataset.py", line 378, in __getitem__ sample_idx = info['point_cloud']['lidar_idx'] KeyError: 'point_cloud'
解决方法:
进入tools/文件下:
python -m pcdet.datasets.kitti.kitti_dataset create_kitti_infos cfgs/dataset_configs/kitti_dataset.yaml
4、网络运行检测:
首先需要下载一个预训练权重:
这个权重需要fanqiang:https://drive.google.com/file/d/1lIOq4Hxr0W3qsX83ilQv0nk1Cls6KAr-/view?usp=sharing
然后这个是已经下载好的:
PV-RCNN预训练权重
将下载好的权重放在tools/文件下就可以了。
然后进入tools文件夹下:
python test.py --cfg_file cfgs/kitti_models/pv_rcnn.yaml --batch_size 8 --ckpt pv_rcnn_8369.pth --save_to_file
!!!!开始训练啦!!!!
注意:如果你的内存不大的话可以把batch_size改为4,4都还不行的话就改成1。
然后下面就是检测完成的结果!!!
结果保存在:
自己写的所以有点复杂,但是至少能完成嘿嘿。如果各位有优化欢迎评论区讨论!!
大功告成!编写不易,大家成功后点个关注or赞谢谢~~
[3D检测系列-PV-RCNN] PV-RCNN论文详解、PV-RCNN代码复现、包含官网PV-RCNN预训练权重及报错问题相关推荐
- Object Detection--RCNN,SPPNet,Fast RCNN,FasterRCNN论文详解
物体检测 图片分类和物体检测的区别 输出不同 检测的目标不同 物体检测算法常用到的概念 Bounding Boxbbox Intersection over UnionIoU 非极大值抑制 Non-M ...
- RepVGG论文详解(结合代码)
目录 1.简介 2.RepVGG详情 2.1 RepVGG Block 2.2 结构重参数化 2.2.1融合Conv2d和BN,将三个分支上的卷积算子和BN算子都转化为卷积算子(包括卷积核和偏置) 2 ...
- 智能车视觉处理系列文章——迷宫巡线法详解(含代码)
巡线方法 1.迷宫巡线法 按照上海交通大学的方法,通过使用迷宫巡线(种子生长法)在巡线的过程中进行图象的自适应阈值,这样可极大的减少计算量.具体思想参考上交文章,以下内容为对代码(以左手迷宫巡线为 ...
- Coordinate Attention for Efficient Mobile Network Design论文详解(结合代码)
1.简介 Mobile Network设计的最新研究成果表明,通道注意力(例如,SE注意力)对于提升模型性能具有显著效果,但它们通常会忽略位置信息,而位置信息对于生成空间选择性attention ma ...
- scala 系列 ---- take,takeRight,takeWhile的使用详解用法及代码示例
take : takeRight(n: Int): List[A] 提取列表的前n个元素 takeRight: takeRight(n: Int): List[A] 提取列表的最后n个元素 takeW ...
- 【GAN】二、原始GAN论文详解
写在前面 在前面一篇文章:[GAN]一.利用keras实现DCGAN生成手写数字图像中我们利用keras实现了简单的DCGAN,并生成了手写数字图像.程序结果让我们领略了GAN的强大,接下来我们开始一 ...
- Fast R-CNN论文详解
Fast R-CNN论文详解 作者:ture_dream &创新点 规避R-CNN中冗余的特征提取操作,只对整张图像全区域进行一次特征提取: 用RoI pooling层取代最后一层max po ...
- 【论文精读3】MVSNet系列论文详解-P-MVSNet
P-MVSNet全名为"P-MVSNet: Learning Patch-wise Matching Confidence Aggregation for Multi-View Stereo ...
- Faster RCNN训练自己数据集报错记录及解决
Faster R-CNN源码网址:https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5点击打开链接 环境:python3.6 tenso ...
最新文章
- Tkinter的Menu组件
- 《机器学习实战》总结
- 微软4年后重登市值第一,纳德拉如何做到的?
- mysql replace first_Java replaceFirst()方法
- 10 字符串相关操作
- 5.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Kong 的配置详解
- ThinkPad T410 拆机(高清)
- 矩阵卷积、矩阵相乘以及频域相乘之间的关系
- 大数据面试题——用shell打印200以内的质数
- 局域网oracle 速度慢,[转帖]局域网中其他用户感觉上网速度慢、网速卡
- 明天(10分)C语言
- 制作Android系统App
- 电容ESR表(一) 电容ESR表的特点、测量原理、电路分析
- 计算机基础为什么要学word,计算机基础中word教学探讨
- 地质勘查土质分类图片_收藏必备!自然资源部:岩石、砾质、土质、泥质统一这样划分!...
- 汇丰,用数字技术创新奇妙体验
- 威海综合竞争力跃居全国第27位
- jquery的淡入,淡出事件 fadeIn fadeOut
- Blender PS Zbrush 人物眼球制作2 - Albedo 贴图和UV不匹配修正
- java——java介绍