OpenPCDet训练自定义数据

news/2024/9/17 3:52:31

官网也提供了步骤,这里详细介绍下训练自己数据的过程以及中间遇到的一些问题。训练模型这里采用PointRCNN,具体的介绍参考:https://www.cnblogs.com/xiaxuexiaoab/p/18033887

一、准备数据集

数据集这一块我们需要准备好原始点云数据、物体目标标注文件、以及训练和验证对应的索引号,存放至OpenPCD/data/目录,其存放格式如下:

data
|---ImageSets
|   |---train.txt    // 存放索引号
|   |---val.txt 
|---labels
|   |---idx.txt      //第idx的标签
|---points
|   |---idx.npy      // 以npy形式存放点云数据

Points

相比于KITTI数据集,我们自己的数据通常只有点云坐标,也就是X,Y,Z信息,数据的坐标满足如下右手坐标系

labels

标签文件形式为c_x, c_y, c_z, dx, dy, dz, $\theta$,category_name
其中(c_x, c_y, c_z表示框的中心点, dx, dy, dz通常表示长宽高,$$\theta$$表示长轴与x轴夹角,以弧度制表示,逆时针为正, category_name表示物体类别)。
如:

# format: [x y z dx dy dz heading_angle category_name]
1.50 1.46 0.10 5.12 1.85 4.13 1.56 Vehicle
5.54 0.57 0.41 1.08 0.74 1.95 1.57 Pedestrian
  • 偏转角
    除了得到目标框的中心点和大小,还需要得到训练数据(标注工具可采用SUSTechPOINTS,SSE),我们还需要确定目标的偏转角度,角度\(\theta\)表示X轴正方向与物体方向的夹角,以弧度制表示,逆时针为正。如果物体没有明确的方向,可以采用长轴的一侧作为方向。

ImageSets

这个目录下主要存放训练和验证集的索引号,如00000, 00001等。

具体的可以参考博客给出的示例数据Tree
也可以通过百度云链接: https://pan.baidu.com/s/1FufaSbXb7z77k0PZm5h7hQ 提取码: tree

二、修改数据配置

依据数据集类别修改OpenPCD/pcdet/datasets/custom/custom_dataset.py,将里面类别进行修改,可以进行验证

if __name__ == '__main__':import sysif sys.argv.__len__() > 1 and sys.argv[1] == 'create_custom_infos':import yamlfrom pathlib import Pathfrom easydict import EasyDictdataset_cfg = EasyDict(yaml.safe_load(open(sys.argv[2])))ROOT_DIR = (Path(__file__).resolve().parent / '../../../').resolve()create_custom_infos(dataset_cfg=dataset_cfg,class_names=['tree'],data_path=ROOT_DIR / 'data' / 'tree_data',save_path=ROOT_DIR / 'data' / 'tree_data',)

依据数据集修改OpenPCD/tools/cfgs/dataset_configs/custom_dataset.yaml

DATA_PATH: '../data/tree_data'POINT_CLOUD_RANGE: [0, -10.24, -1, 10.24, 10.24, 3]
# 这个地方只会在eval阶段会用到,所以如果自己不需要eval的话可以不加
MAP_CLASS_TO_KITTI: {'Tree': 'tree' 
}
# 需要与自己的点云数据格式对应,一般不需要改
POINT_FEATURE_ENCODING: {encoding_type: absolute_coordinates_encoding,used_feature_list: ['x', 'y', 'z', 'intensity'],src_feature_list: ['x', 'y', 'z', 'intensity'],
}DATA_AUGMENTOR:DISABLE_AUG_LIST: ['placeholder']AUG_CONFIG_LIST:- NAME: gt_samplingUSE_ROAD_PLANE: FalseDB_INFO_PATH:- custom_dbinfos_train.pklPREPARE: {# 需要改成自己的数据集类别filter_by_min_points: ['Tree:5'],# filter_by_difficulty: [-1], # 这个地方如果不注释的话训练可能会报错,可以自己尝试一下}# 需要改成自己的数据集类别SAMPLE_GROUPS: [Tree:15']NUM_POINT_FEATURES: 4DATABASE_WITH_FAKELIDAR: FalseREMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0]LIMIT_WHOLE_SCENE: True

验证:
运行以下代码

python -m pcdet.datasets.custom.custom_dataset create_custom_infos ../../../tools/cfgs/dataset_configs/custom_dataset.yaml

成功后数据目录下会生成custom_infos_val.pkl , custom_infos_train.pkl, custom_dbinfos_train.pkl

三、修改网络配置

在tools/cfgs/目录下选择对应模型的配置文件,如OpenPCD/tools/cfgs/kitti_models/pointrcnn.yamlpv_rcnn.yaml

# 要改成自己的类别
CLASS_NAMES: ['Tree']DATA_CONFIG:_BASE_CONFIG_: cfgs/dataset_configs/custom_dataset.yamlDATA_PROCESSOR:# -   NAME: mask_points_and_boxes_outside_range#    REMOVE_OUTSIDE_BOXES: True-   NAME: sample_pointsNUM_POINTS: {'train': 7000,'test': 7000 }-   NAME: shuffle_pointsSHUFFLE_ENABLED: {'train': True,'test': False}

对于基于体素的网络来说,体素大小与点云范围有比例关系,需要设置成符号条件的数值才行!!!点云范围和VOXEL_SIZE要有一定关系,Z轴/VOXEL_SIZE=40 X、Y轴/VOXEL_SIZE是16的倍数即可。

四、训练及验证

训练

以PointRCNN为例,修改pointrcnn.yaml配置后,执行以下命令

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

测试

  • 测试训练后的模型
python test.py --cfg_file ${CONFIG_FILE} --batch_size ${BATCH_SIZE} --ckpt ${CKPT}
  • 测试所有训练的模型,并在Tensorboard上显示, 则添加--eval_all
python test.py --cfg_file ${CONFIG_FILE} --batch_size ${BATCH_SIZE} --eval_all

五、常见问题

  • ValueError: attempted relative import beyond top-level package
    运行custom_dataset.py的时候出现以下错误,pycharm里面可以正常跳转,但运行会报错
from ...ops.roiaware_pool3d import roiaware_pool3d_utils
ValueError: attempted relative import beyond top-level package

解决方法

...ops.roiaware_pool3d 替换为 pcdet.ops.roiaware_pool3d
相关解释:https://stackoverflow.com/questions/30669474/beyond-top-level-package-error-in-relative-import

  • Error ModuleNotFoundError: No module named 'av2'
OpenPCDet/pcdet/datasets/argo2/argo2_dataset.py", line 7, in <module>
from av2.utils.io import read_feather
ModuleNotFoundError: No module named 'av2'

解决方法
注释掉OpenPCD/pcdet/datasets/__init__.py的15行和27行

# from .argo2.argo2_dataset import Argo2Dataset
from .custom.custom_dataset import CustomDataset__all__ = {'DatasetTemplate': DatasetTemplate,'KittiDataset': KittiDataset,'NuScenesDataset': NuScenesDataset,'WaymoDataset': WaymoDataset,'PandasetDataset': PandasetDataset,'LyftDataset': LyftDataset,'ONCEDataset': ONCEDataset,'CustomDataset': CustomDataset,# 'Argo2Dataset': Argo2Dataset
}

相关解释:https://github.com/open-mmlab/OpenPCDet/issues/1574

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/31991.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PPO-KL散度近端策略优化玩cartpole游戏

其实KL散度在这个游戏里的作用不大,游戏的action比较简单,不像LM里的action是一个很大的向量,可以直接用surr1,最大化surr1,实验测试确实是这样,而且KL的系数不能给太大,否则惩罚力度太大,action model 和ref model产生的action其实分布的差距并不太大import gym impor…

steam发行问题

非常重要,最新steam营销推广 https://store.steampowered.com/news/group/4145017/view/4191238396458987547

软件设计模式概念篇

创建型模式 1、创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。 2、为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不需要清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。…

mysql中explain命令详解

前言 我们可以使用 explain 命令来查看 SQL 语句的执行计划,从而帮助我们优化慢查询。 使用注意:使用的 mysql 版本为 8.0.28数据准备 CREATE TABLE `tb_product2` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 商品ID,`name` varchar(20) DEFAULT NULL COMMENT 商品名称,`…

vasp极化计算

为什么我算一个结构,理论上应该是右极化态的,为什么只有离子极化,没有电子极化?是铁电相构建有问题还是计算的数据有问题?

超线程/同步多线程(HT/SMT)技术

超线程/同步多线程(HT/SMT)技术 虽然现在超线程(Hyper-Threading)被大家广泛接受,并把所有一个物理核心上有多个虚拟核心的技术都叫做超线程,但这其实是Intel的一个营销名称。而实际上这一类技术的(学术/技术)通行名称是同步多线程(SMT,Simultaneous Multithreading)…

Linux基础-文件特殊权限

# day13今日安排默写昨日作业讲解文件权限篇综合知识脑图特殊权限(了解)linux提供的12个特殊权限 默认的9位权限 rwx rwx rwx还有三个隐藏的特殊权限,如下 suid 比如 /usr/bin/passwdsgidsbit 特殊权限对照表类别 suid sgid sticky字符表示 S S T出现位置 用户权限位x 用户…

【django学习-28】列表界面模板下载与上传文件

前言,我们在实际项目开发过程中,经常有列表界面,有上传功能,并且支持先下载模板,后上传 1.实现效果与前端展示<form method="post" enctype="multipart/form-data" action="/depart/multi/">{% csrf_token %}<div class="for…