省流:
(1)不管是Linux还是Windows都不影响,只要有pycharm或者vscode即可,啥系统都行。
(2)此外由于自己的需求,所以只做物体部件分割(partseg)任务,没有复现分类(classification)和语义分割(semseg)。
(3)文章包括:建立标注自己的数据集、数据集按格式放到pointnet工程、代码修改、报错修改
(4)博主只是按照自己的数据集复现原本网络的train和test,即跑完一个完整的步骤。至于用自己训练好的模型去检测自己的点云文本,之后再实现可视化和保存检测结果,这个问题博主还有待解决。
背景:自建了一个轮胎表面的点云,需要用pointnet++网络分出轮胎的 槽顶 和 槽底。(自己采的点云,精度不是很高,见笑了)。
所以就是1个物体(即轮胎)2个部件(即槽底 和 槽顶)。记住这个数字,后面数据集标注和改代码会用到。
一、标注数据集
软件:CloudCompare
标注方法:如何利用CloudCompare软件进行点云数据标注
注意:原文中那个:SF name是一样的,即是luntai(一个物体),但是value的值是不一样的,即槽底设置是0,槽顶设置是1(来两个部件)。
标注完后:
得到其中一个txt文本:我们没有用向量信息,所以就是 x y z位置信息和类别。
注意: cloudCompare生成了的txt文件,最后面会有一个空行,我不知道训练时有没有影响,我是删掉了!!!!!!。
二、下载源码
链接: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个轮胎的点云
(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)
4.2 改test_partseg.py:
(1)
(2)
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。
我没试过!!