最近准备学习有关点云的深度学习模型,想先在自己笔记本电脑(windows11系统)上先简单复现下相关模型和解读代码,由于网上也有很多关于windows系统下的模型复现的博客,所以我就在windows系统下展开了学习。目前只是跑通PointNet和RandLA-Net两个比较基础的模型,但在复现过程中仍遇到很多问题,可能和windows系统本身有关系,所以建议还是提前安装Linux系统,不然可能会在处理问题过程中耗费很多时间。
1、软件安装步骤
可自行上网搜索,主要下载软件有Anaconda、Pycharm、CUDA(需查看电脑的CUDA版本,向下兼容),CUDA安装完成后,在cuDNN网站上寻找与CUDA版本相对应的版本,下载后进行解压,将解压文件夹中的三个文件夹复制到安装CUDA的路径下对应的文件夹即可。
cuDNN安装完成后,打开anaconda prompt,输入nvcc -V来看看cuda信息:
图1 CUDA配置成功
推荐操作链接:深度学习环境配置超详细教程【Anaconda+PyTorch(GPU版)+CUDA+cuDNN】_傲寒。的博客-CSDN博客
注:此处环境是在python3.9版本下配置的,也可配置python版本为3.7及以上的(在配置环境过程中最重要的就是需要在不同组件网站上查看所安装的组件是否兼容以及自己电脑配置是否支持)
2、torch包安装
这是一个python安装包,因为深度学习似乎都需要用到这个包,所以需要安装。我认为Pytorch安装应该也应该属于环境配置中的一环,因为在安装torch包的时候需要考虑CUDA等相关组件的版本,所以在考虑CUDA安装的时候就应该已经查清相关组件(torch、CUDA、cuDNN、虚拟环境的python版本等)的版本关系,避免出现不兼容而做无用功的情况。
以下是一些查看关于上述软件和组件对应关系的网站:
提供文件下载(部分文件后缀存在细小差别,注意仔细查看):download.pytorch.org/whl/torch_stable.html
python与torch的版本对应关系:https://www.cnblogs.com/tingtin/p/13601104.html
如上图1,我在创建环境名为python39的虚拟环境后,在conda prompt中激活该环境,准备安装torch包。安装torch包的方式有三种:通过conda安装;通过pycharm安装;通过下载好的文件直接安装。前两种方式需要连接网络在线下载,在某一方式失败后,可尝试其他方式(可在网上搜索torch包如何安装),本文仅介绍通过conda安装的方式,也是较为简单的方式,但这不意味着每次都能安装成功。
由于是在线安装的方式,安装速度可能会受到影响,因此首先可设置一个加速源,此处使用清华源加速安装,可参考
GPU版本pytorch(Cuda12.1)清华源快速安装一步一步教!小白教学~_小曹同学努力了吗的博客-CSDN博客
具体操作:在激活所创建的虚拟环境后输入镜像源:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
(base) C:\Users\Noxxhh>activate python3.9 # 激活创建的虚拟环境
(python3.9) C:\Users\Noxxhh>pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple #安装设置的加速源
结果:
图2 清华源安装成功
开始指定版本安装,在上述基础上继续输入:
pip install torch==2.0.0+cu117 torchvision==0.15.0+cu117 torchaudio==2.0.0+cu117 -f https://download.pytorch.org/whl/torch_stable.html
对于该指令的解释:首先在https://download.pytorch.org/whl/torch_stable.html或者相关网站中查看各组件的版本以及对应关系以确定是否兼容,然后通过指令指定各组件的版本号,最后利用pip install命令在https://download.pytorch.org/whl/torch_stable.html中自动下载和安装,如果安装不成功,请尝试其他方法或重新选择各组件版本(不同组件间一般存在多种组合)
下载地址:https://github.com/aRI0U/RandLA-Net-pytorch
注:这不是原作者共享的代码地址,原作者是基于TensorFlow编写的代码,而我们需要Pytorch版本的。
下载后进行解压,解压后将文件夹名改为RandLA-Net-pytorch,即删除后缀-master。
(1)打开软件Pycharm和该文件夹,并将解译器设为之前创建的虚拟环境,如图3所示。
图3 添加虚拟环境
(2)打开Pycharm终端安装模型运行所需的python包(该步骤好像也可以在cmd和prompt中进行)
点击①后,输入②,激活配置的虚拟环境,让后续的指令可以在该环境下运行,回车后输入③安装RandLA-Net所需要的python包
图4 操作示意
注:路径一定要对,requirements.txt文件在文件夹RandLA-Net-pytorch中,等待安装,若安装成功则可忽略下述问题。
(3)通过pip list指令可查看当前环境下安装的包,如果Scikit-Learn包为1.3.0版本的话,建议重新安装为较低版本的(比如1.2.2版本:pip install Scikit-Learn==1.2.2),后面会有相关解释。
问题:在安装时可能会弹出torch-points-kernels包安装失败的错误,错误显示为:
The detected CUDA version (10.2) mismatches the version that was used to compile PyTorch (11.7). Please make sure to use the same CUDA versions.
出现该问题的原因是电脑上安装了两个版本的CUDA,在安装 torch-points-kernels包时识别的CUDA版本为10.2,而不是11.7。此时,我在python39环境下输入nvcc -V 查看当前CUDA版本为11.7,但是在安装上述包时仍出现问题,很不解。
另外,之所以还安装了CUDA10.2,是因为之前复现PointNet模型时配置环境所需。此时可卸载CUDA10.2版本进行解决,但考虑到卸载后,PointNet模型肯定不能再运行,所以采用了在网上找到的第二个解决方法:修改环境变量
解决方法:修改环境变量
在打开系统变量时,会发现默认的CUDA_PATH是CUDA10.2所在的路径,这可能说明软件运行时调用的就是CUDA10.2版本的,所以导致python包一直安装不上。
因此,修改CUDA_PATH,将CUDA版本改为与pytorch相匹配的版本,并在环境变量path中将CUDA11.7相关的环境变量置顶
在修改完成后,在pycharm中再次安装torch-points-kernels包就安装成功了(忘记截图)
另外,还可以通过脚本的方式在调用虚拟环境时,自动配置相应的CUDA版本,但是还没研究透彻,暂时先放弃。
S3DIS数据(使用简单,数据量不大,在链接中下载名为Stanford3dDataset_v1.2.zip的压缩包):Large Scale Parsing
Semantic3D数据(数据多且大,可先在S3DIS数据跑通后再下载该数据集):Semantic3D - Data
数据下载好后解压放在RandLA-Net-pytorch/datasets中
(1)根据prepare_s3dis.py中的代码,将S3DIS数据(名为Stanford3dDataset_v1.2)放在路径RandLA-Net-pytorch\datasets\s3dis下,然后运行prepare_s3dis.py,如下图
cd utils #将路径设置在RandLA-Net-pytorch\utils下
python prepare_s3dis.py # 运行prepare_s3dis.py
(2)Semantic3D数据处理相对较复杂。首先,Semantic3D数据很多,需要下载的压缩包很多并需要一一解压,解压后文件为.txt文本格式。根据对prepare_semantic3d.py中代码语句的理解,是需要从文件夹中识别.txt格式的文件再作进一步处理,所以建议可以先不用下载该数据。
下面为官方提供的Semantic3D数据在线下载方式和数据准备
cd RandLA-Net-pytorch/utils
./download_semantic3d.sh
python3 prepare_semantic3d.py # Very slow operation
(3)数据下采样
cd RandLA-Net-pytorch/utils/cpp_wrappers
./compile_wrappers.sh # you might need to chmod +x before
cd ..
python3 subsample_data.py
上述为原作者提供的操作步骤,但是无法在windows系统下成功执行,.sh脚本文件无法通过该命令执行,参考网上的解决方法,通过下载并安装Git解决,但是我最终也没有成功(如果有了解的话,可以提供下解决方法,不胜感激)。然后又胡乱尝试一些方法,最后我通过单独执行compile_wrappers.sh中的命令实现,如下图。执行完成后会生成一些文件,用于支持后续的下采样。
最后,返回到下采样代码所在的路径,执行下采样代码:
cd .. # 退出到subsample_data.py所在的路径下,即RandLA-Net-pytorch\utils下
python3 subsample_data.py # 运行下采样代码
同理,Semantic3D数据的下采样操作也是如此。至此,点云数据的预处理过程全部完成。
python train.py #注意在RandLA-Net-pytorch路径下运行
如果顺利,就会显示下图内容
但是不出所料,没有那么简单,又弹出如下问题:
search_tree = pickle.load(f) AttributeError: Can't get attribute 'EuclideanDistance' on
在一番思索和尝试后,通过降低 scikit-learn版本后成功运行。原来的scikit-learn版本为1.3.0,将其降低到1.2.2即可。
pip install scikit-learn==1.2.2
根据链接中的解释为:Scikit-Learn 1.2.2's sklearn.metrics._dist_metrics module has EuclideanDistance() and EuclideanDistance32(). However, version 1.3.0 has EuclideanDistance32() and EuclideanDistance64(), instead of EuclideanDistance(). I guess they replaced EuclideanDistance() with EuclideanDistance64() in 1.3.0.
因为我是从(1)中GitHub链接获取的代码,但由于代码本身和系统不同导致的原因,在输入python test.py后会报错。
第一个错误:如下图:
解决方法:该问题的产生就是把文件夹名不对,在test.py中找到下图代码位置,并在RandLA-Net-pytorch\runs路径下找到根据时间生成的新文件夹名2023-08-16_18_45,将该名称替换到图中位置。
注:在替换上述文件名前,还需要手动修改train.py中用于文件名自动生成的代码,如下,将“:”改为其他符号,这也是因为windows系统不允许使用“:”等符号命名的原因,当然也可以自定义而不根据时间命名,只需在上述路径也进行相应修改即可。
第二个错误:如下图:
在我调试代码过程中遇到过好几次这种错误,通过多次测试发现,该问题在此处就是因为路径错误导致无法正常读取文件造成的。
我很快找到了这个问题所在,那就是test.py在调用data.py的data_loaders函数后,路径为E:\...\RandLA-Net-pytorch\datasets\s3dis\subsampled\test\train,但实际test文件夹中根本没有train文件夹,而是与test文件夹同在subsampled文件夹下。
我尝试着去修改这个路径,但是修改了很久也没有解决,反而出现了其他的一些错误。最后尝试了大半天后,只有将train文件夹移动到test文件夹下试试,成功运行了。
至此,RandLA-Net模型成功复现,后续将结合模型原理和源码进行理解理解。
写在最后:
这是我第一次写文章,因为关于在windows系统下复现RandLA-Net的教程并不多,我希望在记录的同时也能为初学者提供一些参考。我尽可能写得详细,因为自己深有体会,初学者会因为一些网络教程中没有提到的小细节而踩坑或者耗费很多时间,所以希望提供一些在模型复现过程中的帮助,便于有需要的人花时间在学习原理和解读代码过程中,而不是苦恼代码跑不通。当然,大家可能会遇不到文中的问题或者一些其他问题,以及我说得不对的地方,欢迎留言讨论和指正,谢谢大家。另外,还是建议初学者也在Linux系统下展开学习,网上也有很多安装虚拟机的教程,可以避免后续很多不兼容和奇奇怪怪的问题产生,即使产生问题,也不至于搜不到相关的答案。