目录

PyTorch复现PointNet模型训练可视化测试显示

PyTorch复现PointNet——模型训练+可视化测试显示

因为项目涉及到3D点云项目,故学习下PointNet这个用来处理点云的神经网络

论文的话,大致都看了下,网络结构有了一定的了解,本博文主要为了下载调试PointNet网络源码,训练和测试调通而已。

我是在Anaconda下创建一个新的虚拟环境空间部署项目测试

大概用到的就这些了,后面调试项目时候缺少安装啥就行了

torch                     2.0.0+cu117
torchvision               0.15.0+cu117
python                    3.8.19
numpy                     1.24.3
matplotlib                3.7.5
opencv-python             4.10.0.84

一、下载源码和数据集

论文:

GitHub源码:

数据集下载:

若上面的数据集没法下载,可以走网盘:

大致的源码结构如下:

https://i-blog.csdnimg.cn/direct/a15725b7768a482abd83574bedfea643.png

二、PyCharm打开项目

拿到项目,第一件事是要看下 README.md

https://i-blog.csdnimg.cn/direct/ce3838eac1ad44a19836f55d66a4d941.png

没啥高级词汇,大概能看出来啥意思就行

三、下载数据集

.sh 文件是Linux下的脚本文件夹,我这是Windows操作系统,先打开看看这里面都写了啥

可视化工具在 build.sh 文件中,数据集在 download.sh 中,我这边就只用到必须的数据集

看下 download.sh

https://i-blog.csdnimg.cn/direct/2e1624570d4946128f296d776fac49ea.png

知道了数据集下载的链接

数据集下载:https://shapenet.cs.stanford.edu/ericyi/shapenetcore_partanno_segmentation_benchmark_v0.zip

也就是第一部分中提到的数据集下载链接

四、分类任务

训练的话,通过 README.md 可以看出有两种,一种是分类任务,一种是分割任务

cd utils
python train_classification.py --dataset <dataset path> --nepoch=<number epochs> --dataset_type <modelnet40 | shapenet>

4.1 分类模型训练:train_classification.py

1,文件在 utils 文件夹下

https://i-blog.csdnimg.cn/direct/2b2eb80d674e45708a239ebf39abbea3.png

2, README.md 也说明了要配置的参数

python train_classification.py --dataset <dataset path> --nepoch=<number epochs> --dataset_type <modelnet40 | shapenet>

我把要配置的参数给整理到一块了,方便进行修改测试,其他的参数根据情况去修改即可

https://i-blog.csdnimg.cn/direct/26b9c47090ce49b7a0333a34dba7532e.png

3,右击运行(Ctrl + Shift + F10),报错

https://i-blog.csdnimg.cn/direct/7ece2036874a4877a60ba0123003e3a6.png

修改进程数为0, parser.add_argument('--workers', type=int, help='number of data loading workers', default=0)

https://i-blog.csdnimg.cn/direct/00b9d56abc5e4010a45e7a6948f19952.png

4,再次右击运行(Ctrl + Shift + F10)报错

OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/.

https://i-blog.csdnimg.cn/direct/b59ccb5ab2f44e759818c0ca08b8415f.png

按要求加入, os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" ,允许程序在存在多个 libiomp5md.dll 副本的情况下继续执行,但这可能会导致不稳定的行为,包括程序崩溃或产生不正确的结果,所以它只是一个临时的解决方案

import os                                  
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"  

https://i-blog.csdnimg.cn/direct/a45874d4238944a987eb5abd972d6cf5.png

5,再次右击运行(Ctrl + Shift + F10),开始训练

https://i-blog.csdnimg.cn/direct/2debc5d89a424f1c8c102731c51b6613.png

让它跑着吧先~~也就5个epoch

6,因为这里训练的epoch为5,每个epoch都会存下来一个模型

可以看到在utils下的cls文件下有五个模型

https://i-blog.csdnimg.cn/direct/e0c5706e776b402596e44502a44a3179.png

4.2 分类模型测试:show_cls.py

1,utils文件夹下的 show_cls.py 文件用于分类模型测试

https://i-blog.csdnimg.cn/direct/935ea72c512d46548e726ac16c177769.png

2,指定两个参数即可

模型路径: parser.add_argument('--model', type=str, default = './cls/cls_model_4.pth', help='model path')

数据集的路径: root='../dataset/shapenetcore_partanno_segmentation_benchmark_v0'

https://i-blog.csdnimg.cn/direct/4f58ec8e32584248917ee42078374b7c.png

3,右击运行(Ctrl + Shift + F10),测试成功

可以看到测试的损失和准确率,目前作者没有提供可视化结果展示

https://i-blog.csdnimg.cn/direct/acbb0d3623bf47ed881d01fa41ae5ad0.png

五、分割任务

能把分类任务跑通,分割任务都是类似的

5.1 分割模型训练:train_segmentation.py

python train_segmentation.py --dataset <dataset path> --nepoch=<number epochs>

1,文件在utils文件夹下

https://i-blog.csdnimg.cn/direct/b0627514db114ebd9d0b695f01400951.png

2,看README.md指定配置参数

python train_segmentation.py --dataset <dataset path> --nepoch=<number epochs>

https://i-blog.csdnimg.cn/direct/1970395af5e34ffc9c27247381a76b8e.png

3,右击运行(Ctrl + Shift + F10),开始训练

开始训练

https://i-blog.csdnimg.cn/direct/94fa75c1c43b4192bc594292e54af9b5.png

epoch为25

4,epoch为25,会保存25个模型

可以看到在utils下的seg文件下有二十五个模型

https://i-blog.csdnimg.cn/direct/a9e6ed17d4bd47d09883b1b49240292c.png

5.2 分割任务测试:show_seg.py

1,utils文件夹下的 show_seg.py 文件用于分割模型测试

https://i-blog.csdnimg.cn/direct/44b12d6858494a46ad72ced3a87741cc.png

2,右击运行(Ctrl + Shift + F10),报错

https://i-blog.csdnimg.cn/direct/4482151c2f974ebc930249285e59250e.png

找了一下原因, show_seg.py 用到了 show3d_balls.py 里面的 showpoints函数

show3d_balls.py 又用到了一个dll文件, dll = np.ctypeslib.load_library('render_balls_so', '.') 而这个是 .so 不是 .dll (原文是在Linux下跑的)

https://i-blog.csdnimg.cn/direct/e27e880d909c4733946f9332cee9722d.png

故需要转换一下,通过Visual Studio创建一个动态链接库(DLL)项目,生成 render_balls_so.dll 放到utils文件下即可

https://i-blog.csdnimg.cn/direct/0703b9ea29dc4e79bcd4a1655ceef5fe.png

我这边就不搞了,抓紧时间学习下PointNet++

参考博客:https://blog.csdn.net/qq_45369294/article/details/121041403

3,直接拿来用

下载是一个压缩包,里面是一个完整的Visual Studio项目,但是用不到,咱们就用到了里面的一个dll文件

https://i-blog.csdnimg.cn/direct/9b4daa896155412e96a7c80183143146.png

4,再次右击运行(Ctrl + Shift + F10),报错

https://i-blog.csdnimg.cn/direct/b4c2785e2ae7448897686a39049c884b.png

还是之前遇到的问题,导入

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

和分类任务一样,进行简单配置即可

https://i-blog.csdnimg.cn/direct/3671ff9225a04d5489285ccc3b7329e9.png

5,再次右击运行(Ctrl + Shift + F10),测试成功

对Airplane进行分割,效果展示

https://i-blog.csdnimg.cn/direct/78e847abf64b487881fd2b6d24ce5e29.png

六、完结

目前只是实现了代码的跑通,后续还得认真学习原理以及去修改模型架构适配自己的工作任务。