本博文主要实现对PointNet++源码进行调试,模型训练+模型测试。
一、下载源码和数据集
论文:PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
 GitHub源码:Pointnet2_pytorch
 数据集包括三种:分类、零部件分割和场景分割
 分类数据集:modelnet40_normal_resampled
 零部件分割数据集:shapenetcore_partanno_segmentation_benchmark_v0_normal
 场景分割数据集:s3dis/Stanford3dDataset_v1.2_Aligned_Version
 (科学上网)
PointNet++源码结构如下:
 
 看起来还是比较清晰的,大概可能知道项目中主要包括三个功能:分类classification、零部件分割partseg、场景分割semseg
 
 老规矩,先看README.md
作者安装的是CUDA10.1,PyTorch 1.6和Python 3.7
 可以通过anaconda进行安装conda install pytorch==1.6.0 cudatoolkit=10.1 -c pytorch 
 
 我是在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
其实,认认真真看了PyTorch复现PointNet——模型训练+可视化测试显示这篇博文之后,再看README.md就简单的多了
二、分类任务Classification,数据集为ModelNet10/40
先看README.md
 
 下载所用到的数据集放到data文件夹下,我这边场景分割数据集因为网不好总是失败~~这里就下载好了两个数据集,一个是分类用的,一个是零部件分割用的,场景分割数据集没下载成功…
将用到的分割数据集modelnet40_normal_resampled放到data文件夹下
 
2.1 训练模型——train_classification.py
1,由README.md可知运行分类任务的命令如下:
 
# ModelNet40
## Select different models in ./models ## 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
有四组可以供选择,这里我就选用第一组,不用法向量特征的pointnet2_ssg训练模型作为测试
## 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
2,需要给定的参数有:--model pointnet2_cls_ssg 和 --log_dir pointnet2_cls_ssg
 
修改参数:
parser.add_argument('--epoch', default=1, type=int, help='number of epoch in training')
parser.add_argument('--model', default='pointnet2_cls_ssg', help='model name [default: pointnet_cls]')
parser.add_argument('--log_dir', type=str, default="pointnet2_cls_ssg", help='experiment root')
parser.add_argument('--batch_size', type=int, default=8, help='batch size in training')
使用的模型为:models\pointnet2_cls_ssg,models文件夹里面还有很多模型
 训练好的模型信息存放路径为:log\classification\pointnet2_cls_ssg
 
 
 训练模型所使用的数据集存放位置
 
3,右击运行
开始训练
 
 训练完成
模型存放在:log\classification\pointnet2_cls_ssg\checkpoints
 
2.2 测试模型——test_classification.py
1,由README.md可知运行分类任务的命令如下:
 
## 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
2,需要给定的参数有:--log_dir pointnet2_cls_ssg
 
修改参数:
parser.add_argument('--log_dir', type=str, default="pointnet2_cls_ssg", help='Experiment root')

 测试集位置和使用的测试模型
 
3, 右击运行
测试完成
 
 模型测试信息
 
三、零部件分割任务Part Segmentation,数据集为ShapeNet
先看README.md
 
下载所用到的数据集shapenetcore_partanno_segmentation_benchmark_v0_normal放到data文件夹下
 
3.1 训练模型——train_partseg.py
1,由README.md可知运行零部件分割任务的命令如下:
 
## 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
2,需要给定的参数有:--model pointnet2_part_seg_msg、--normal和--log_dir pointnet2_part_seg_msg
 
修改参数:
parser.add_argument('--model', type=str, default='pointnet2_part_seg_msg', help='model name')
parser.add_argument('--normal', action='store_true', default=False, help='use normals')
parser.add_argument('--log_dir', type=str, default="pointnet2_part_seg_msg", help='log path')

 使用的模型为:models\pointnet2_part_seg_msg,models文件夹里面还有很多模型
 
 训练好的模型信息存放路径为:./log/part_seg/pointnet2_part_seg_msg
 
3,右击运行,报错
AttributeError: module 'numpy' has no attribute 'float'.
`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:

 翻译:
解决:np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float64))
 
 
4,右击继续运行,报错
提示显卡内存不足
 
 解决:将batch_size设置小点,例如设置为4,具体情况根据自己的电脑配置来
parser.add_argument('--batch_size', type=int, default=4, help='batch Size during training')
为了快速训练演示,把epoch设置为1
 
5,右击继续运行
开始模型训练
 
 训练完成
 
训练好的模型保存在log\part_seg\pointnet2_part_seg_msg\checkpoints/best_model.pth
 
 模型训练好了,接下来开始测试
3.2 测试模型——test_partseg.py
1,由README.md可知运行零部件分割任务的命令如下:
 
## 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
2,需要给定的参数有:--normal、--normal和--log_dir pointnet2_part_seg_msg
 
修改参数:
parser.add_argument('--log_dir', type=str, default="pointnet2_part_seg_msg", help='experiment root')
parser.add_argument('--normal', action='store_true', default=False, help='use normals')
parser.add_argument('--batch_size', type=int, default=4, help='batch size in testing')

3,右击运行,报错
又是遇到的这个问题
 
 解决:
 改成np.float64即可
np.array(total_correct_class) / np.array(total_seen_class, dtype=np.float64))
4,右击继续运行
输出测试每个类型的mIoU得分
 
 结果会存放到log\part_seg\pointnet2_part_seg_msg\eval.txt日志文件中
 
四、场景分割任务Semantic Segmentation,数据集为S3DIS
先看README.md
 
 首先把下载好的数据集解压放到data/s3dis/Stanford3dDataset_v1.2_Aligned_Version/
 在data文件夹下创建一个s3dis文件夹,数据集解压到/data/s3dis下即可
哈哈哈哈哈,数据集我没下载成功

 主要是场景分割任务对我而言也用不到
 我就按着README.md大致说下流程
4.1 转换数据集
查看下data_utils/collect_indoor3d_data.py,可以得知数据集的存放路径,看来好像跟README.md给的不太一样,按照代码里面的来哈,可能是作者不小心整错路径了
 
 数据集存放路径:data\stanford_indoor3d
 
4.2 训练模型——train_semseg.py
1,由README.md可知运行场景分割任务的命令如下:
 
## Check model in ./models 
## e.g., pointnet2_ssg
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
2,需要给定的参数有:--model pointnet2_sem_seg 、--test_area 5和--log_dir pointnet2_sem_seg
 
修改参数:
 要我的话我会修改这些参数
parser.add_argument('--model', type=str, default='pointnet_sem_seg', help='model name [default: pointnet_sem_seg]')
parser.add_argument('--test_area', type=int, default=5, help='Which area to use for test, option: 1-6 [default: 5]')
parser.add_argument('--log_dir', type=str, default="data/stanford_indoor3d", help='Log path [default: None]')
parser.add_argument('--epoch', default=4, type=int, help='Epoch to run [default: 32]')
3,能不能正常运行我也不清楚,我没下载成功数据集~~,抱歉各位老爷们
4.3 测试模型——test_semseg.py
1,由README.md可知运行场景分割任务的命令如下:
 
## Check model in ./models 
## e.g., pointnet2_ssg
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
2,需要给定的参数有:--log_dir pointnet2_sem_seg 、--test_area 5和--visual
 
修改参数:
parser.add_argument('--batch_size', type=int, default=4, help='batch size in testing [default: 32]')
parser.add_argument('--log_dir', type=str, default="pointnet2_sem_seg", help='experiment root')
parser.add_argument('--test_area', type=int, default=5, help='area for testing, option: 1-6 [default: 5]')
parser.add_argument('--visual', action='store_true', default=False, help='visualize result [default: False]')
3,能不能正常运行我也不清楚,我没下载成功数据集~~,抱歉各位老爷们
五、总结
其实由先前的PyTorch复现PointNet——模型训练+可视化测试显示,家人们应该都知道如何调试了,大差不差,但是得需要多动手,光说不练假把式,天道酬勤!
 加油!!!