今天复现了PointNet++网络,中途也遇到过好多报错问题,但都一一解决了,最终实现cls、partseg、semseg训练(train)和测试(test)程序的成功跑通。
首先,我参考的论文和所用的源码参考自这篇文章:
附代码:
论文链接:
https://proceedings.neurips.cc/paper/2017/file/d8bf84be3800d12f74d8b05e9b89836f-Paper.pdf
按理说复现是适用于在Ubuntu下跑,但是我想在Windows实现一下
Windows系统
python 3.8 cuda 11.6 pytorch 1.12.0 torchvision 0.13.0
在这之前要先在anaconda下创建一个pointnet的虚拟环境,python版本选择3.8
然后对应自己CUDA版本下载对应的gpu版的pytorch
这一块虚拟环境的GPU配置就不细说了,如果没有配置过可以参考我这篇文章,基本步骤都差不多:
其实这里的东西如果真的想全部能跑是缺了一些东西的,下面具体再说。
2.启动PyCharm打开该项目文件Pointnet2,同时将自己前面创建好的虚拟环境导入进来(具体导入的方法,参考我上面的文章链接,也有步骤)
其中环境Python3.8是自己给虚拟环境起的名称,可以在这里面编辑,因为我前面配置过Python3.7的虚拟环境,而这次采用pythonn3.8版本的,一开始导入进来,前面的环境名称还是默认Python3.7,我以为3.8版本的python编译器没有成功导入进来,担心后面因版本问题引起不必要的报错,后来发现编译器python.exe已经是3.8的了,只是虚拟环境名称需要改一下
如果不确定可以跑下面的程序来确认一下python版本(确认一下导入的虚拟环境是对的)
3.接下来我们就可以依次运行train_cls.py、train_partseg.py、train_semseg.py、test_cls.py、test_partseg.py、test_semseg.py是否可以正常跑通,train代表进行模型训练用的,test代表模型测试用的。
首先我把我自己调通的可以跑的程序先放出来
(1)train_cls.py
(2)train_partseg.py
(3)train_semseg.py
(4)test_cls.py
(5)test_partseg.py
(6)test_semseg.py
上面这些都是调整好的代码应该是可以直接跑通的,如果哪个程序有问题可以粘贴我的程序过去试一试,注意一些文件路径要修改成自己的。
三、复现过程中遇到的问题总结
(1)首先把下面这些文件夹依次打开,你会发现导入的包被标红,因为路径不对
将下面
修改为
models.是包含pointnet.py的文件夹,也就是说要精确到文件所在文件夹,系统才能正确找到,不报错,其他的脚本遇到这种情况类似处理
(2)报错:AttributeError: module ‘numpy‘ has no attribute ‘float‘
出现这个问题的原因是:从numpy1.24起删除了numpy.bool、numpy.int、numpy.float、numpy.complex、numpy.object、numpy.str、numpy.long、numpy.unicode类型的支持。解决上诉问题主要有两种方法:
方法一:修改numpy版本
安装numpy1.24之前的版本
方法二:修改代码
可以用python内置类型或者np.ndarray类型替换:np.float替换为float或者np.float64/np.float32
参考链接:
(3)报错:
choice = np.random.choice(len(point_set.shape[0]), npoints, replace=True) TypeError: object of type 'int' has no len()
将
替换为
(4)报错:
return F.conv1d(input, weight, bias, self.stride, RuntimeError: Given groups=1, weight of size [64, 6, 1], expected input[16, 9, 4096] to have 6 channels, but got 9 channels instead
上面是复现时运行train_semseg.py报错RuntimeError:
-
该个错误主要是因为S3DIS数据集的数据具有9个通道,涉及xyz、rgb和归一化XYZ。但是代码仅支持 3 或 6 个通道。要解决此问题,应进行一些小的修改。
1 pointnet_sem_seg.py;通过添加 if来考虑通道 =9 的情况。with_normalized_xyz params
2 pointnet.py;更改 PointNetEncoder 的前向方法,稍微修改拆分方法
3 这样就可以解决S3DIS数据集在pointnet++训练时的场景分割报错了。
参考自:
(5)报错
return open(self.baseFilename, self.mode, encoding=self.encoding)
PermissionError: [Errno 13] Permission denied: 'D:\cs\Pointnet2\log\part_seg\pointnet2_part_seg_ssg\eval.txt'
或
model_name = os.listdir(experiment_dir+'/logs')[0].split('.')[0]
IndexError: list index out of range
这是因为该路径下没有这个名称的文件夹或者文件夹名称不对,我一开始就是文件夹名字写错了,应该是ssg我写成了msg所以一直报错
要有这个文件夹
文件夹里要有这些文件
如果没有的话可以从以往的2024-01-06_22-21记录中复制过来,实在不行建立内容为空的文件,但是一定要让系统在搜索路径的时候能找到
(6)FileNotFoundError: [WinError 3] 系统找不到指定的路径的解决方法
判断文件的父子目录设置是否正确
可参考:
(7)self = reduction.pickle.load(from_parent) EOFError: Ran out of input的解决方法
这是在运行train_semseg.py程序时遇到的错误
将num_workers改为0即可
修改前
修改后
参考:
(8)报错
这是因为我们的data文件夹里还没有stanford_indoor3d这个文件夹,这是个数据集,需要我们先运行个脚本生成
或者在Pycharm中运行
报错原因是我们没有建立s3dis文件夹,并将Stanford3dDataset_v1.2_Aligned_Version放入其中所以脚本运行时找不到路径,文件夹像下面这样处理
然后再运行collect_indoor3d_data.py就成功了,如下图所示
此时我们在回到 data/s3dis/Stanford3dDataset_v1.2_Aligned_Version/文件夹会发现多了好多npy文件
而我们的stanford_indoor3d文件夹里是空的,但是后续模型数据集的加载又是来自这个文件夹,因此将所有的npy文件复制到stanford_indoor3d文件夹中
现在此时data文件夹里的目录结构是下面这样的
再回来运行train_semseg.py程序就可以了,可能会遇到上面提到的(4)和(7)的报错,对应上面方法就可以解决,成功截图如下:
先训练,训练完才能用test_semseg.py进行测试,测试结果是可以进行可视化的,只需要把test_semseg.py中,visual的default的参数值改为True就可以生成obj文件,然后可以用CloudCompare软件进行可视化
注意,我们网盘下载下来的文件里没有visual,我们要自己建立,否则会因找不到文件路径而报错,目录结构如下,如果缺少eval.txt或其他文件夹,仿着classification建好
运行其他的也是,如果找不到路径就缺啥见啥或检查路径和文件名对不对
参考自:
(9)visualizer文件中有个show3d_balls.py文件,适用于可视化的,里的README有提到,但是用到的一些so文件,是ubuntu里的命令文件,如果想在windows下能运行,需要重新改写。
1、win10系统下build.sh文件运行问题
安装git–>安装g++
安装git:https://so.csdn.net/so/search?q=%E5%AE%89%E8%A3%85git&t=&u=
安装g++: MinGW下载和安装教程
2、win10系统下download_data.sh文件运行问题
该文件位于链接的part_seg的文件夹下
若显示unzip不是内部或外部命令,也不是可运行的程序或批处理文件。则可通过在系统环境变量中添加windows下的zip.exe和unzip.exe的路径
3、 raise OSError(“no file with expected extension”)问题
在运行PointNet的可视化程序时,作者只提供了linux平台下的动态链接库程序源码,自己的windows平台下无法调用。发现是动态链接库的文件格式不对,遂学习如何将.so文件转换成.dll文件
3.1 安装viusal studio
3.2 新建C++动态链接库项目
3.3 修改头文件pch.h
3.4 重写dllmain.cpp文件
转载链接:
注: 若pycharm调试时出现OSError: [WinError 193] %1 不是有效的 Win32 应用程序 的问题
原因为visual调试时的 配置: Debug Win32,需修改为Win64,解决方案见下图,修改为x64即可
(10)报错
FileNotFoundError: [Errno 2] No such file or directory: 'E:\临时
\Pointnet2\log\part_seg\pointnet2_part_seg_ssg\eval.txt'
这个就是运行test_partseg.py报的错,原因是原文件家里有一个pointnet2_part_seg_msg的文件夹而我们这里找的是pointnet2_part_seg_ssg文件夹,因此我们要自己建立,结构如下
然后再运行就可以了
(11)报错
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'log\sem_seg\pointnet2_sem_seg\visual'
这是运行test_semseg,py找不到文件,做法类似于上面建立文件夹,后续如何用test_semseg,py前面已经介绍
(12)最先开始遇到的错误是,运行train_cls.py遇到的报错
(1)
return forward_call(*input, kwargs)
TypeError: forward() missing 1 required positional argument: 'cls_label'
一开始查这个问题,一直没有解决掉,后面按照(4)进行修改后,报错变成下面这样了
问题在pointnet_util.py这里
将
改为
即把print朝里面缩进一下,然后就可以正常跑了
至此,所有程序就都可以正常跑了,复现完成!
到此这篇Pointnet代码复现(pointnet代码运行)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/34913.html