目录
本博客主要讲了如何使用公共数据集在pointnet++网络下实现分类网络,部件分割网络以及语义分割网络,这三个实验在win10下已经全部验证跑通,只要跟着博文同样可以无痛跑通,另文末附已下载好的数据集。
1.pointnet++源码下载与环境配置
1.1源码下载
直接贴出链接,下载后使用vsCode打开,开始配置环境。yanx27/Pointnet_Pointnet2_pytorch: PointNet and PointNet++ implemented by pytorch (pure python) and on ModelNet, ShapeNet and S3DIS. (github.com)https://github.com/yanx27/Pointnet_Pointnet2_pytorch
1.2环境配置
参考该项目的环境进行配置:Python3.7,PyTorch1.6,torchvision0.7.0(一般都是比torch版本高0.1或者0.1.1,当然可以自己去查去验证一下)。
但是由于我电脑的显卡是4060,所以安装高一点版本的CUDA,我选择Python3.8,PyTorch1.12,torchvision0.13.0
第一,下载torch和torchvison文件:我习惯是下载torch.whl和torchvision.whl文件来安装的,可以在下面的链接下载(这里演示的是下载Python3.7,PyTorch1.6):download.pytorch.org/whl/torch_stable.htmlhttps://download.pytorch.org/whl/torch_stable.html 下载对应的torch和torvison版本,如下所示:
第二,创建Anaconda虚拟环境并激活环境
#创建名为pointnet2的虚拟环境
conda create -n pointnet2 python=3.8 -y
#激活环境
conda activate pointnet2
第三,安装torch和torchvison:下载的文件可以直接拖到命令框中,变成路径名,pip install安装即可。
#安装torch
pip install E:\edgeDownLoad\torch-1.12.0+cu116-cp38-cp38-win_amd64.whl
#安装torchvison
pip install E:\edgeDownLoad\torchvision-0.13.0+cu116-cp38-cp38-win_amd64.whl
第四,安装其他依赖:需要安装tqdm,用来显示进度条的。
2.点云分类模型
2.1Modelnet40数据集下载
数据集下载地址:全部下载下来就行了,总共有1.6个G。
https://shapenet.cs.stanford.edu/media/modelnet40_normal_resampled.zip
数据集位置:然后数据全部放在data/modelnet40_normal_resampled/路径下面,如下所示:里面的数据全部是以txt格式进行存储的,共有40个类别,还包含着划分的训练集和验证集文件配置。
数据可视化:可以任意打开一个txt文件查看,每个点包含六列信息,分别代表X,Y,Z坐标以及其对应法向量,至于其类别标签其实就是文件名,或者可以理解为文件夹上。
2.2模型训练
参考作者的ReadMe文件已经说明的很清楚了,训练时候主要分为是否利用法向量信息,如果使用法向量信息则使用--use_normals。
## e.g., pointnet2_ssg without normal features
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg
python test_classification.py --log_dir pointnet2_cls_ssg
## e.g., pointnet2_ssg with normal features
python train_classification.py --model pointnet2_cls_ssg --use_normals --log_dir pointnet2_cls_ssg_normal
python test_classification.py --use_normals --log_dir pointnet2_cls_ssg_normal
## e.g., pointnet2_ssg with uniform sampling
python train_classification.py --model pointnet2_cls_ssg --use_uniform_sample --log_dir pointnet2_cls_ssg_fps
python test_classification.py --use_uniform_sample --log_dir pointnet2_cls_ssg_fps
# ModelNet10
## Similar setting like ModelNet40, just using --num_category 10
## e.g., pointnet2_ssg without normal features
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg --num_category 10
python test_classification.py --log_dir pointnet2_cls_ssg --num_category 10
我这里以不使用法向量信息训练为例,执行指令,下图是跑了一轮的结果,评价指标是训练和验证的准确率。
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg --batch_size 8
3.ShapeNet数据集下载并训练点云部件分割模型
3.1shapeNet数据集下载
数据集下载地址:
https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip
数据集位置:然后数据全部放在data/shapenetcore_partanno_segmentation_benchmark_v0_normal/
路径下。
模型训练:使用以下指令训练模型,如下所示
## Check model in ./models
## e.g., pointnet2_msg
python train_partseg.py --model pointnet2_part_seg_msg --normal --log_dir pointnet2_part_seg_msg
python test_partseg.py --normal --log_dir pointnet2_part_seg_msg
(出现BUG):AttributeError: module 'numpy' has no attribute 'float'.这种情况一般是由于numpy版本问题,查阅相关资料,将numpy版本降低为1.23.5就行了。
下面是训练一轮的结果,评价指标有训练的准确率(train accuracy),每个类别的mIoU(共16个类50个部件),测试的准确率(test Accuracy),class mIoU,instance mIoU。这里介绍一下class mIoU,instance mIoU,其实主要就是分母不相同:
class mIoU:分母为类别数,反映的是类别的精度。instance mIoU:分母是预测的实体数,反应的是实体的精度。
下面举例说明,比如现在有两个类共5个类别,分别为类别cls1有a,b两个部件,cls2有c,d,e三个部件:
cls1:
a,b
cls2:
c,d,e
比如一个批次里面有3个点云(3个实例),一个是cls1,两个是cls2,每个类的部件mIoU为:
cls1:
a:0.5
b:0.6
===>cls1 mIoU:(0.5+0.6)/2=0.55
第一个cls2:
c:0.6
d:0.7
e:0.8
===>第一个cls2 mIoU:(0.6+0.7+0.8)/3=0.7
第二个cls2:
c:0.5
d:0.5
e:0.5
===>第二个cls2 mIoU:(0.5+0.5+0.5)/3=0.5
class mIoU=[0.55/1+(0.7+0.5)/2]/2=0.575
instance mIoU=(0.55+0.7+0.5)/3=0.5833
4.S3DIS数据集下载并训练点云语义分割模型
数据集下载地址:Index of /s3dis (ethz.ch)
数据集位置:然后数据全部放在data/s3dis/Stanford3dDataset_v1.2_Aligned_Version/
.要看清楚是在data下新建s3dis文件。
数据预处理:进入data_utils文件夹,执行collect_indoor3d_data.py,将在data/s3dis/Stanford3dDataset_v1.2_Aligned_Version/
生成npy文件,应该把这些npy文件全部放到/data/stanford_indoor3d路径下。
模型训练:执行以下指令就行了
python train_semseg.py --model pointnet2_sem_seg --test_area 5 --log_dir pointnet2_sem_seg
python test_semseg.py --log_dir pointnet2_sem_seg --test_area 5 --visual
报错了EOFError: Ran out of input,可以通过调小num_worker来解决,如下所示,不然我都内存都快爆了😂😂
这差不多也算是跑起来了,至此三个网络都过了一遍,这个项目很顺畅没有什么坑。
4.总结
本博客主要关注pointnet++三个任务的训练过程,分别为分类网络,部件分割网络以及语义分割网络,而且该项目代码中也缺少预测代码(只有test.py代码,用来验证得到评价指标的),也就是缺少可视化代码,后面在新的博文中也会分享一下pointnet++网络结构及代码,以及分类网络和部件分割网络的可视化代码部分。
如果博客中哪里出现有错误,还请各位大佬指正。
数据集自取链接:https://pan.baidu.com/s/1Mr4axiajSkMEZ9lPclMcSA 提取码:hiio