逐步记录!OpenPcdet下使用自己采集和标注的激光雷达数据训练自定义场景下的模型

您所在的位置:网站首页 采集的定义 逐步记录!OpenPcdet下使用自己采集和标注的激光雷达数据训练自定义场景下的模型

逐步记录!OpenPcdet下使用自己采集和标注的激光雷达数据训练自定义场景下的模型

2024-07-02 00:16| 来源: 网络整理| 查看: 265

1.环境安装可参考安装pcdet所需的依赖:

ubuntu 18.04 从零开始复现 OpenPCDet 训练kitti数据集并评估 可视化 损失函数_openpcdet复现_用券买土豆的博客-CSDN博客

2.采集的激光点云数据标注可参考我之前的文章:

labelCloud 开源三维点云工具标注自制点云数据集(以.bin格式点云为例)-CSDN博客

3.最后可视化点云可参考我之前的文章:

基于OpenPCDet的三维目标检测点云学习--取出标注框内的点云_point3d提取3d框点云-CSDN博客

 引言

之前介绍了如何使用labelCloud标注自己采集的激光点云数据,现记录一下如何在OpenPcdet下使用标注好的数据训练自己的目标检测模型,大致的思路就是参考kitti数据集的格式改写相关数据解析接口,这里不对具体原理做详细阐述,只记录相关改写的步骤。如下先放一段用自己的数据集训练的Pointpillars模型,通过onnx转换部署到英伟达的AGX Xavier上,ROS可视化下实时推理可视化的视频:

Pointpillars实时检测效果示意图

过程记录

1.首先仿照OpenPcdet/pcdet/dataset/kitti下建立相关数据解析文件:

 PS:都是直接根据kitti复制过来的只是名字换成了自定义的,其中mylidar_utils.py的内容可以先清空,里面需要包含的函数接口后续步骤讲解;mylidar_object_eval_python为对应的只有激光雷达坐标系下数据的评估,只评估bev/3d,这里我已经修改过,由于不影响训练,所以本次不展开讲解。

2.进入OpenPcdet/pcdet/datasets/__init__.py,在开头注册自定义的数据集名称,这里有两个地方需要修改,都是仿照kitti格式来的,如下:

 PS:MylidarDataset表示后续在mylidar_dataset.py中自制数据集类名称,这里还未修改相关内容所以报错,修改完相应就会消失。

3.mylidar_utils.py文件内容:

import numpy as np def get_objects_from_label(label_file): with open(label_file, 'r') as f: lines = f.readlines() objects = [Object3d(line) for line in lines] return objects def cls_type_to_id(cls_type): type_to_id = {'Car': 1, 'Pedestrian': 2, 'Cyclist': 3} if cls_type not in type_to_id.keys(): return -1 return type_to_id[cls_type] class Object3d(object): def __init__(self, line): label = line.strip().split(' ') self.src = line self.cls_type = label[0] self.cls_id = cls_type_to_id(self.cls_type) self.truncation = float(label[1]) self.occlusion = float(label[2]) self.alpha = float(label[3]) self.box2d = np.array((float(label[4]), float(label[5]), float(label[6]), float(label[7])), dtype=np.float32) self.h = float(label[8]) self.w = float(label[9]) self.l = float(label[10]) self.loc = np.array((float(label[13]), -float(label[11]), -float(label[12])), dtype=np.float32) self.ry = -(float(label[14])+np.pi/2) self.score = float(label[15]) if label.__len__() == 16 else -1.0 self.level_str = 'Easy' self.level = 0 self.box3d = np.array((float(label[13]), -float(label[11]), -float(label[12]), float(label[10]), float(label[9]), float(label[8]), float(label[14])), dtype=np.float32)

PS:该文件主要包含内容为读取标注数据标签的信息根据转换关系转化到激光雷达坐标系下(使用labelCloud标注kitti格式的是在相机坐标下),每一位都有对应的参数,详细可从参考开头标注的文章,其中self.level_str = 'Easy'和 self.level = 0,由于只有雷达坐标系下的数据,故默认检测难度只有一个,self.box3d为后续可视化添加的内容,可以不加,不影响训练。

4.mylidar_dataset.py文件(直接复制的kitti_dataset.py,只是换了名称)内容修改:

 

首先如上图修改为自己建立或注册的名字, 带#为修改前的语句,可以删除,这里展示是为了示意改动的痕迹,与步骤1,2对应的名字,第15行修改后第二步的报错消失。(其它未提到的代码可以保留跳过,这里只贴出需要修改的地方)

 由于只有激光雷达数据,解析图像数据的函数接口可以删除。

图中红框表示 mylidar_utils.py文件中定义的标签文件解析类,而该类在kitti中定义在OpenPcdet/pcdet/utils/object3d_kitti.py文件中,为了方便管理放在mylidar_dataset.py同级目录下;另外1存放标签和雷达数据的文件夹名字需要放在如上图修改后的,mylidar和mylabel文件夹下。

  如上图86行,101行,125行涉及图像数据可删除;第106行如果你有对应的地面数据可以保留,没有的话可以删除也不影响什么,个人尝试过添加地面参数数据,对检测结果没有什么影响所以删除。

 如上图,带#的语句都是可以删除的图像与图像坐标系相关的。

 修改107行与后续gt_boxes_lidar对齐,否则后续模型学习出来的结果对行人/骑行者类别高宽比比差别较大的类别的检测效果,

 如上图122行,由于标签数据的读入就是雷达坐标系下的因此并不存在朝向角的转化。

 如上图为提取标签边界框包含的点云类别,对相关文件重命名。

如上图为网络模型生成的预测参数模板。

 如上图为评估自己数据集的代码,改成如1.所述的自定义名字。

 

 

 

如上图,将带#关于图像的代码删除。 

 如上图为创建.pkl数据预读取文件的代码,其中trainval/test基本用不到可以删除。

 

 如上图,到这自制数据集处理的文件基本就修改完毕,接着就是按照上述子自定义的名字创建数据集。 

5.数据准备。在OpenPcdet/data/路径下(与kitti同级目录)创建名为mylidar的文件夹,并在该文件夹创建数据集划分文件ImageSets和训练数据文件夹training:

 然后在training文件夹下建立存放自己采集的点云数据的mylidar文件夹和对应标注好的标签文件夹mylabel,点云文件和标签文件不用按照kitti那样的索引也可以,只需要一帧点云文件对应一帧的标签文件即可。

最终准备好的数据如下图所示,这里数据划分我已经划分好了,并且都是以采集时候原始时间戳命名的格式:

 

6.生成数据预处理与预读取配置文件。在OpenPcdet/tools/cfgs/dataset_configs/目录下复制kitti_dataset.yaml文件并重命名mylidar_dataset.yaml,在原有kiiti的配置下修改自定义的配置文件:

  

PS:其他的配置,如点云范围,数据增强什么的可以按照自己的需求修改。

7.生成数据预处理与预读取文件.pkl:

在OpenPcdet/路径下运行如下代码生成:

python -m pcdet.datasets.mylidar.mylidar_dataset create_mylidar_infos tools/cfgs/dataset_configs/mylidar_dataset.yaml

生成的相关文件如下:

对上图任取出一帧点云边界框内点云可视化如下:

 一般提取出来的形状完整就表示mylidar_dataset.py修改没问题。

 ok,接下来就是改训练配置文件训练了!!!

8.生成并修改训练配置文件(网络使用pointpillars):进入/tools/cfgs/kitti_models复制pointpillar.yaml文件到当前目录下,并改名pointpillar_mylidar.yaml,做如下修改:

PS:其他的配置,如点云范围,数据增强什么的可以按照自己的需求修改。 

9.开始训练:

在OpenPcdet/tools/路径下运行如下代码开始训练:

python train.py --cfg_file cfgs/kitti_models/pointpillar_mylidar.yaml

 如上图为根据kitti评估代码改写的评估脚本,最终评估自己数据集的bev和3d的平均精度指标(参考,由于没有对应标注图像数据,故将所有检测目标统一难度为简单)。

10.训练模型结果可视化(可视化代码为pcdet下demo.py改写的):

总结

以上就是使用自己采集标注后的激光点云数据在pcdet上训练的过程总结,由于数据集难以制作,用于网络训练的点云数据较少,效果还有待提高,这里仅作效果展示,步骤记录,后续改进的地方还有很多,码字不易,如有相关的问题随时留言或私信多多交流~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3