Windows11和Ubuntu用PointNet++训练自己的数据集(部件分割模型partseg)

省流:
(1)不管是Linux还是Windows都不影响,只要有pycharm或者vscode即可,啥系统都行。
(2)此外由于自己的需求,所以只做物体部件分割(partseg)任务,没有复现分类(classification)。《语义分割(semseg)在尝试,看博主下下篇》
(3)文章包括:建立标注自己的数据集、数据集按格式放到pointnet工程、代码修改、报错修改
(4)博主只是按照自己的数据集复现原本网络的train和test,即跑完一个完整的步骤。至于用自己训练好的模型去检测自己的点云文本,之后再实现可视化和检测结果保存txt文本,这个问题看博主下一篇文章。

背景:自建了一个luntai表面的点云,需要用pointnet++网络分出luntai的 槽顶 和 槽底。(自己采的点云,精度不是很高,见笑了)。所以就是1个物体(即luntai)2个部件(即槽底 和 槽顶)。记住这个数字,后面数据集标注和改代码会用到。关于PointNet++的原理和代码讲解可以看这个B站视频
在这里插入图片描述

一、标注数据集

软件:CloudCompare
标注方法:如何利用CloudCompare软件进行点云数据标注
注意:(1)原文中那个:SF name是一样的,即是luntai(一个物体),但是value的值是不一样的,即槽底设置是0,槽顶设置是1(来两个部件)。
在这里插入图片描述
(2)原文中选no!!!
在这里插入图片描述

标注完后:
在这里插入图片描述

得到其中一个txt文本:我们没有用向量信息,所以就是 x y z位置信息和类别。
注意: cloudCompare生成了的txt文件,最后一行会有一个空行,我不知道训练时有没有影响,我是删掉了!!!!!!。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b30f149dd266492bb28dda3ccca261a3.pn

二、下载源码

链接:https://github.com/yanx27/Pointnet_Pointnet2_pytorch
在这里插入图片描述

三、添加自己的数据集

3.1知识准备——要看!!建议下载shapenet数据集体会一下

自己用得到的功能是部件分割即partseg,所以得参考原作者用的ShapeNet数据集的格式。

格式介绍:点云数据集ShapeNet
ShapeNet数据集百度网盘下载: 百度网盘【提取码:evqi】
百度网盘来源:【三维视觉】【深度学习】ubuntu18.04下PointNet官方代码Pytorch实现

3.2添加自己的数据集

在自己的源码工程下新建 data 文件夹,在其下新建shapenetcore_partanno_segmentation_benchmark_v0_normal文件夹,之后在建立以下三个文件,因为自己是一个物体即luntai,所以就只有一个自己起的编号(01234567)。
在这里插入图片描述

在这里插入图片描述
(1)01234567:0-35,一共36个luntai的点云
在这里插入图片描述

(2)synsetoffset2category.txt:对应好即可,注意两者之间是tab键还是空格。我是从ShapeNet数据集直接改的,所以不太清楚。
在这里插入图片描述
(3)train_test_split文件夹:指定自己的36个点云文件,哪些点云是用于训练(train)、那些用于测试(test)、那些用于验证(val)。
三个json文件里面的名字、路径对应上就好,不用加.txt且前面的shape_data要加上并且01234567在多个物体时要记得修改。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4)最后在pycharm的工程上看到:
在这里插入图片描述

四、修改代码

由于原本的partseg代码用的是16种物体共50个部件,咱们是1个物体2个部件,所以有些张量的维度得改。
参考:Pointnet++内Partseg分割网络训练自己的数据集

4.1 改train_partseg.py:

(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)根据自己的数据集多少、点的个数改一下参数,重点改标出来的
在这里插入图片描述

4.2 改test_partseg.py:

(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)根据自己的数据集多少、点的个数改一下参数,重点改标出来的
在这里插入图片描述

4.3pointnet2_part_seg_msg.py(你若用这个模型,就改动,用别的模型就改别的)

(1)
在这里插入图片描述
(2)
在这里插入图片描述

(3)
在这里插入图片描述

五、运行train_partseg.py

若习惯终端命令,可以从pycharm运行终端,并进入该工程的文件夹
在这里插入图片描述

5.1运行train_partseg.py

第一种方法:命令行传参
在这里插入图片描述

python train_partseg.py --model pointnet2_part_seg_msg --log_dir pointnet2_part_seg_msg

(1)–model pointnet2_part_seg_msg 是指定模型为pointnet2_part_seg_msg,模型名字可以看工程文件的models文件夹有哪些模型
(2)由于咱们自己的txt文件没有向量信息,所以命令行没加 --normal
(3)–log_dir pointnet2_part_seg_msg是指定训练后的数据保存在log/part_srg下那个文件夹。若是指定就是保存到 后面名字指定的文件夹,没指定就是按时间来命名。如下图
在这里插入图片描述
在这里插入图片描述
第二种方法:直接运行.py文件,但是要设置好默认值(default)
在这里插入图片描述

5.2运行出现的问题

(1)问题1:torch.OutOfMemoryError: CUDA out of memory.
(2)解决:减小上图中的批量大小(batch size) 或者 不要再自己笔记本上跑,在具有好的深度学习条件的电脑上跑。我是换成了更好的台式电脑。
(3)参考:torch.OutOfMemoryError: CUDA out of memory

六、运行test_partseg.py

6.1运行test_partseg.py

在这里插入图片描述
可以看到相比于train_partseg.py参数设置还有有点不同
法一:终端命令行来进行。
此外,同样咱们的txt是没有向量信息,所以也不带–normal

python test_partseg.py --log_dir pointnet2_part_seg_msg

或者日期的文件夹

python test_partseg.py --log_dir 2024-12-05_20-22

在这里插入图片描述
法2:pycharm点击运行

把required改成 default。后面带文件夹
在这里插入图片描述

6.2运行出现问题

(1)问题1:RuntimeError: Error(s) in loading state_dict for model
原因:代码参数值与模型训练时的参数值不一致导致异常信息
解决:看看那些默认值,train和test有些参数是否一样 或者 训练train时存放的log里的文件夹和这里测试test时读取的是否是一个,我的就是单击pycharm运行按钮导致train存放在日期文件夹下,test在终端输入,目录读取pointnet2_part_seg_msg文件夹,不一致,所以命令换成读取相应日期文件就好。
在这里插入图片描述
(2)问题2:numpy‘ has no attribute ‘float‘
原因:numpy‘ has no attribute ‘float
解决方法1:降低numpy版本
快捷安装方法:
点击pycharm右下方解释器,再点击解释器设置:
在这里插入图片描述
+是下载,还可以选择版本,选1.25.3
-是卸载
在这里插入图片描述
在这里插入图片描述
解决方法2:参考PyTorch复现PointNet++——模型训练+模型测试,里面有一种方法说把代码中的报错部分改为np.float64。
np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float64))。这里用了老哥的图贴一下。
在这里插入图片描述

(3)问题3:RuntimeError: GET was unable to find an engine to execute this computation
解决方法1:先按此链接试试,如果都没问题,都能正常打印再参考此篇知乎评论区
在test_partseg.py前面 加上torch.backends.cudnn.enabled = False(亲测有效)
在这里插入图片描述
解决方法2:我看过有帖子说换成cpu就行,我没试过!!!!若用cpu跑。就把那个使用GPU的参数设置为使用cpu。
在这里插入图片描述

我没试过!!

七、用自己训练的模型检测一个自己的数据集,并分类保存在相应的txt,看下一篇文章!

八、语义分割训练自己的模型,看下下篇文章!

若对你有用的话,请帮忙点个赞,加个收藏

### PointNet 自定义数据集语义分割教程 #### 数据准备 要使用PointNet进行自定义数据集的语义分割,首先需要准备好合适的数据格式。通常情况下,PointNet依赖于点云数据作为输入,并且这些数据应按照特定结构组织以便模型能够正确读取解析。 根据已知的信息[^1],可以借鉴ShapeNetCore数据集的格式来构建自定义数据集。具体来说,每个样本应该包含以下部分: - **点坐标**: 每个点由其三维空间中的 (x, y, z) 坐标表示。 - **法向量(可选)**: 如果可用,则提供每一点的方向信息。 - **类别标签**: 对于每一个点,都需要有一个对应的语义分类标签。 这种格式允许网络学习到不同类别的几何特征并做出预测。 #### 训练流程设置 一旦完成了数据预处理工作之后,下一步就是配置好训练环境以及调整超参数以适应新的任务需求。这里提到的方法适用于任何基于PyTorch或其他框架实现版本的PointNet架构。 以下是几个重要的方面需要注意: - **模型初始化**: 加载官方或者社区维护好的开源代码库中已经实现了的标准PointNet模型文件。 - **损失函数的选择**: 针对语义分割问题,交叉熵损失是一个常用选项因为它能很好地衡量实际分布与目标之间的差异程度[^2]. 下面给出一段简单的Python脚本来展示如何加载数据并启动一次基本的训练过程: ```python import torch from pointnet import PointNetSeg # Assume this is your implementation of the segmentation model. device = 'cuda' if torch.cuda.is_available() else 'cpu' model = PointNetSeg(num_classes=NUM_CLASSES).to(device) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE) for epoch in range(NUM_EPOCHS): for data in dataloader: points, target = data['points'].to(device), data['labels'].to(device) optimizer.zero_grad() pred = model(points.transpose(2, 1)) # Adjust dimensions as needed by network. loss = criterion(pred.view(-1, NUM_CLASSES), target.view(-1)) loss.backward() optimizer.step() print(f"Finished Training with final loss {loss.item():.4f}") ``` 上述代码片段展示了标准的前馈神经网络训练循环的一部分,其中包含了正向传播、计算误差梯度反向传递更新权重的过程。 #### 后处理与评估指标 完成训练阶段后,还需要考虑如何有效地评价我们的成果。常用的性能测量手段包括但不限于精确率(Precision),召回率(Recall),F1分数(F-Score)等统计学概念;另外还有IoU(intersection over union)这样的区域重叠比例也是特别针对图像识别领域的有效工具之一[^3]。 --- ###
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值