点云检测OpenPCDet实战专栏
文章平均质量分 84
详细介绍基于OpenPCDet的PointPillars3d点云检测算法的各个模块,完整记录整个算法的实现过程以及KITTI数据的处理过程。目前在更新nuScenes数据集处理部分......
优惠券已抵扣
余额抵扣
还需支付
¥129.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
Clichong
这个作者很懒,什么都没留下…
展开
-
OpenPCDet框架解析文章导航
最近基于OpenPCDet来对PointPillars算法做一些实验,打算用一个完整的专栏来记录整个OpenPCDet的整体框架以及各个模块之间的结构。耗时一个多月,耗费精力较多,这个专栏主要是详细介绍PointPillars的完整算法流程。由于整体细节比较庞大,。对于每个部分我都分别画了一个完整的模块架构图进行整体上的学习与理解。原创 2023-05-06 20:26:56 · 1015 阅读 · 0 评论 -
OpenPCDet系列 | 8.4 nuScenes数据集数据调用和数据分析
calibrated_sensor_token:可以从calibrated_sensor.json中索引出对应的相机外参和内参,3和4就对应索引出上文所说的ego和camera的外参,sample的外参并不在这个表里,而是在sample_annotation.json中,见下文;(11)prev:上一个sample_data的token,从本数据表中可以索引出对应的数据,是同一个物体的上一个标注,即上一次出现这个物体是在哪里,下同;下面详细列出每隔tabel在运行时可供调用的key。原创 2023-09-01 09:39:58 · 955 阅读 · 0 评论 -
OpenPCDet系列 | 8.3 nuScenes数据集坐标系转换
而全局坐标系是绝对坐标系,是目标在地图中的绝对坐标,不随本车的运动而变化。ego车辆,还有照片中其他车辆(sample_annotation.json)的外参,参考坐标系是世界坐标系,世界坐标系的原点是lidar或radar定义的,没有什么规律,所以要求其他车辆的相机坐标系坐标,就需要在这三个外参(ego、camera、sample)换算一下,具体方法下面会讲。在此之前还需要将激光雷达转到全局坐标系,再通过全局坐标系转车身坐标系再转相机坐标系,然后通过相机坐标系再转到图像的坐标系中。原创 2023-09-01 09:29:36 · 923 阅读 · 0 评论 -
OpenPCDet系列 | 8.2 nuScenes数据集的eval流程
模型的训练和测试过程输出结果是不一样的,对于训练过程是为了构建损失函数来进行训练,而对于测试过程是为了对object进行预测生成预测内容。下面以VoxelNeX检测器的类代码可见,training和testing将会输出两个内容。对于测试过中,这里的recall_dict是各阈值召回率的指标,而pred_dicts是一个字典存储相关的预测信息。后续做内容就是把这些每一帧的预测数据进行转换,每个pred_boxes都从此转换为nuSences的数据结构,也就是下面的一个dict。原创 2023-07-10 16:33:36 · 563 阅读 · 0 评论 -
OpenPCDet系列 | 8.1 nuScenes数据集的处理流程与gt_sample的database构建
对nuScenes数据集处理的了解,大体上的核心还是getitem函数、prepare_data函数,以及collate_batch函数三个部分的处理。其中prepare_data函数和collate_batch函数是在Dataset这个父类实现的,基本的处理流程基本不变,这里记录data_dict的数据处理部分。原创 2023-07-10 16:33:18 · 890 阅读 · 0 评论 -
OpenPCDet系列 | 7.2 KITTI数据集测试流程post_processing处理
其中,这里的nms函数返回的是挑选的anchor索引以及其置信度(sigmoid处理后的预测值)。但是核心的nms处理函数用了c++代码进行编译处理。其中需要将分类预测输出转化为概率,其中利用预测概率的最大值作为其置信度,给后续的nms处理。原创 2023-05-23 10:58:40 · 348 阅读 · 1 评论 -
OpenPCDet系列 | 7.1 KITTI数据集测试流程predicted_boxes预测
首先对于各类预测的特征图进行重新reshape处理,将anchor那一维度进行拼接操作,比如:(16, 248, 216, 42) -> (16, 321408, 7)。最后,对角度进行限制到0-π之间,构建出准确的gt偏航角度。特征维度分别是:(16, 321408, 7)和(16, 321408, 3)这里的预测特征(16, 321408, 2)表示每个anchor对两个方向的预测概率,那么这里需要选择较高的概率的那个索引。所以,这里将预测特征图根据概率转换为01的预测结果。原创 2023-05-23 10:58:16 · 601 阅读 · 0 评论 -
OpenPCDet系列 | 5.4.3 DenseHead中的AxisAlignedTargetAssigner正负样本分配模块
首先,基于上述的操作已经获取到了最大值iou以及满足设定阈值的正样本anchor的索引,根据真个anchor索引可以获得与其iou最大的gt索引,那么根据gt的索引就可以获取对应的gt信息。也就是利用掩码矩阵,分别获取每个当前需要处理的类别,同时单独获取当前需要处理的gt信息,然后传入到assign_targets_single函数中进行处理,这个函数丶作用是针对某一个点云帧中的每一个类别anchors和gt信息,计算前景和背景的anchor类别,box编码以及回归的权重。一个类别中只有百个这样的数量级。原创 2023-05-18 13:53:10 · 598 阅读 · 0 评论 -
OpenPCDet系列 | 5.4.1 DenseHead中的AnchorGenerator锚框生成模块
然后再加上anchor高度的一半也就是1.56 // 2 = 0.78,z轴的位置信息就被更新为1,这个就是anchor的具体在z轴上的位置。下面就是某个grid位置的anchor配置信息,可以看见一个位置的一类anchor会有两个方向的尺寸位置一样的配置。思路上是比较清晰的,具体的细节就是各种anchor信息在各位置的拼接处理。ps:这里的anhcor的z轴位置信息还回加上anchor的高度,以汽车类别为例,由于每个anchor的z轴gird位置设置为。函数来进行具体的anchor生成。原创 2023-05-18 13:26:48 · 558 阅读 · 0 评论 -
OpenPCDet系列 | 5.4 PointPillars算法——AnchorHeadSingle模型预测头模块
同时,不同的head设置了不同的损失函数。模型的具体构建结果如下所示,每个head只有一层的linear来进行最后的预测。到了AnchorHeadSingle模块中,具体的定义其实只涉及到了模型的定义。(其中损失的定义还是在基类中进行构建的)原创 2023-05-16 10:14:45 · 617 阅读 · 0 评论 -
OpenPCDet系列 | 5.3 PointPillars算法——BaseBEVBackbone伪图像特征提取模块
随后,将上采样的ups列表中的3个不同尺度处理的特征图进行concat拼接在一起,得到了(16, 384, 246, 216)的特征矩阵,这个特征矩阵就是backbone_2d提取到的特征矩阵,这与论文中的backbone_2d结构图是完全一样的,然后不同的是第一个block重复次数是3,第二和第三个block的重复次数都是5,在yaml文件中可以自行配置。这部分具体的作用是对提取出来的bev特征矩阵进行进一步的提取,所以主要是模型上的处理,比较少特征上的处理。这部分的模型处理代码比较简单,就不贴上来了。原创 2023-05-16 10:14:06 · 857 阅读 · 0 评论 -
OpenPCDet系列 | 5.2 PointPillars算法——PointPillarScatter伪图像BEV特征构建模块
那么,由于coord存储了voxel的具体网格,可以对其构造出在一维空间中的索引,然后根据索引在空矩阵的相应对位置上填充voxel特征。PointPillarScatter模块的初始化部分比较简单,只是简单的保存了相关的yaml配置,以及保存了点云场景的平面网络的grid size。在进行了PillarVFE编码后,此时的batch_dict更新如下所示,追加了pillar_features字段,表示每个voxel的特征,随后进行Map_to_BEV模块处理。原创 2023-05-15 16:17:51 · 1159 阅读 · 0 评论 -
OpenPCDet系列 | 5.1 PointPillars算法——PillarVFE特征构建与编码模块
PillarVFE模块属于VFE结构的其中一种,所以可以在PCDet中的backbone_3d目录下,可以找到vfe目录结构。在文件中,可以查看所有可供选择的vfe模型结构。原创 2023-05-15 15:58:10 · 953 阅读 · 0 评论 -
OpenPCDet系列 | 4.4 DataProcessor点云数据处理模块解析
在对batch_data的处理中,经过了point_feature_encoder模块处理后,就轮到了进行data_processor处理。在pointpillars中主要进行3种数据处理,分别是:mask_points_and_boxes_outside_range、shuffle_points、transform_points_to_voxels;在data_process模块处理完后,单帧点云场景的数据处理流程就此结束了,随后根据点数量构建一个随机顺序的索引序列,然后根据这个随机的索引序列。原创 2023-05-13 17:47:08 · 817 阅读 · 0 评论 -
OpenPCDet系列 | 4.3 PointFeatureEncoder模块解析
这里使用的点云特征就是xyz+反射强度,具体作用是旋转是否使用xyz位置特征作为点云特征,否则在kitti数据集中就只有反射强度这一维的特征。不过在kitti数据集的处理流程中,这一步其实没有带来变换,唯一的变化是在data_dict中增加了data_dict['use_lead_xyz'] = True这一步。原创 2023-05-13 17:47:34 · 278 阅读 · 0 评论 -
OpenPCDet系列 | 4.2 DataAugmentor点云数据增强模块解析
在pointpillars配置文件中,数据增强部分就包含了gt_sampling、random_world_flip、random_world_rotation、random_world_scaling四种方法。下面对其进行分别记录。在数据增强基类DataAugmentor中提供了一些列的数据增强的方法,在初始化阶段会依次添加配置文件中制定的数据增强方式进入队列中,随后在forward函数中对data_dict数据进行依次处理。由于队列先进先出的特性,所以在配置文件中靠前的部分会按顺序优先处理。原创 2023-05-12 15:40:26 · 1243 阅读 · 0 评论 -
OpenPCDet系列 | 4.1KITTI数据集各文件信息整合与gt database的构建
create_kitti_infos函数主要涉及KittiDataset类的重点三个函数:dataset.set_split、dataset.get_infos、dataset.create_groundtruth_database。在这里插入图片描述通过set_split和get_infos,可以构造出点云每帧的相关信息,包含point_cloud、image、calib、annos,用一个字典包含这4个键值信息来表示当前场景(训练集含标注信息)。原创 2023-05-12 15:39:41 · 1232 阅读 · 1 评论 -
OpenPCDet系列 | 7.PointPillars模型测试KITTI数据集流程解析
对于模型来说,训练过程是为了计算构建损失训练模型的参数,验证过程是为了测试模型当前参数的效果。所以,对于模型结构来说需要分别为测试过程和训练过程进行分别规划。在点云的3d检测中,这里主要体现在dense_head预测层中。对于模型来说,其与训练流程的区别结构图如下。原创 2023-05-10 12:03:47 · 1017 阅读 · 0 评论 -
OpenPCDet系列 | 6.PointPillars模型分类、回归、角度损失的构建
在调用PointPillars算法的get_training_loss函数时,最后是根据dense_head结构中的get_loss函数来实现的。主要是两个函数:self.get_cls_layer_loss() 和 self.get_box_reg_layer_loss()。分别计算分类损失以及回归损失。其中self.get_box_reg_layer_loss()中还包括了角方向的分类损失。原创 2023-05-10 12:02:00 · 666 阅读 · 0 评论 -
OpenPCDet系列 | 5.PointPillars模型前向传播完整流程
具体的模型配置是在pointpillar.yaml的MODEL配置部分,可以卡件其设置VFE、MAP_TO_BEV、BACKBONE_2D、DENSE_HEAD、POST_PROCESSING几个部分。这里以PointPillars模型为例,在PointPillars模型中主要划分了以下4个主要的模块,以下某块首先会在build_network中进行初始化,然后在具体前向传播时通过forward函数进行。在各模块的具体初始化过程中,NAME是当前结构的模块选择,其余的就是类的初始化参数。原创 2023-05-06 19:56:07 · 554 阅读 · 0 评论 -
OpenPCDet系列 | 4.KITTI数据集数据加载流程代码解析
在create_kitti_infos函数处理完后会构造出一些列的pkl文件,其中kitti_infos_train.pkl、kitti_infos_val.pkl是获取每个训练集的各点云帧场景的一系列标注信息,每个场景有4个字典:point_cloud、image、calib、annos。对于一个batch中的不同点云帧场来说,一般情况下点的数量points是不同的,gt的数量也是不同的,而voxel化后的位置信息,voxel数量等等也应该是不同的。以上是需要注意以一下的。这里没有涉及具体的操作。原创 2023-05-06 19:50:04 · 811 阅读 · 0 评论 -
OpenPCDet系列 | 3.OpenPCDet点云检测框架训练准备流程
其中,Detector3DTemplate属于网络构建的基类,调用Detector3DTemplate的build_network函数来实现网络各部分的构建。这部分回合模型的前向传播流程一同介绍,因为具体用的模块是一样的,而需要初始化后才能执行。对于OpenPCDet中模型的训练过程如下所示,在训练前一般需要进行4个部分的准备:数据准备、网络模型准备、以及优化器和学习率调度器。可以选择的优化器有:Adam、SGD、Adam_OneCycle。完整的PointPillars网络配置如上所示。原创 2023-05-06 19:36:23 · 1264 阅读 · 0 评论 -
OpenPCDet系列 | 2.OpenPCDet整体框架与各模块结构
最近基于OpenPCDet来对PointPillars算法做一些实验,打算用一个完整的专栏来记录整个OpenPCDet的整体框架以及各个模块之间的结构。耗时一个多月,耗费精力较多,**这个专栏主要是详细介绍PointPillars的完整算法流程。**由于整体细节比较庞大,所以**这里用本篇文章来当做整个专栏的导航指引,主要的部分主要分为三个大部分:**- **1)训练的准备流程**;- **2)数据加载流程**;- **3)前向传播流程**;后续还会介绍模型的损失计算以及模型的测试流程等部分原创 2023-05-06 10:49:03 · 1328 阅读 · 0 评论 -
OpenPCDet系列 | 1.OpenPCDet的安装训练与测试
不过我是用本地远程连接服务器跑的代码,所以希望可以在本地打开tensorboard,方法如下。3)另外还可以通过slurm进行多GPU训练(不过这里我没有跑通),然后今年过年后回来实验室一试便成功了,真是神奇。训练PointPillar模型。训练Voxel-RCNN模型。1)选择模型推理显示预测结构。原创 2023-03-02 16:50:05 · 2026 阅读 · 2 评论