本意是要做3D Mesh语义分割,但是没有找到较合适的解决方案,于是从pointnet入手来了解三维分割。通过这段时间对论文与源码的配套学习,对源码有了一定的认识,也有一些疑惑的地方,因此借助这个平台分享心得、缕清思路,理解有误的地方望不吝赐教,共勉。
Pointnet点云分类及分割框架如下图1所示。图1 pointnet网络结构图
(1) Pointnet源码目录解读
Pointnet源码包含 3D点云分类、部分分割以及语义分割三部分。源码运行之前建议仔细阅读README.md,根据这个文档指导即可复现源码。
1)根目录下py文件介绍
2)根目录下文件夹内容介绍data 存放用于训练的样例文件h5,test_files与train_files中列举的用于训练及测试的文件项;shape_name.txt中分类类别名称。
dump 存放的是训练结果评价报告以及分类预测结果。
log 存放的是训练结果,默认情况下只存放最近一次训练结果,可根据需要更改源码存放多次训练结果。
models 存放的是训练模型。Pointnet_cls.py和Pointnet_cls_basic.py中的MLP是分类模型结构(这两段未跟踪源码,因此没有做详细区分),对应于论文中如下图2,与论文中所述略有不同;pointnet_seg.py是点云分割模型结构;transform_nets.py为原始点云对称变换以及特征变换,分别对应于源码网络中如图3和图4部分。图2 点云分类MLP图3 点云对称变换图4 特征变换utils data_prep_util为numpy、h5、ply等文件/数据的存储于读取以及其他预处理函数;pc_util这部分没有去跟踪源码,因此暂不解读;tf_util.py为tf的各种卷积函数。
part_seg 部分分割。
sem_seg 语义分割内容。
(2) sem_seg语义分割源码解读
该部分按照训练所涉及到的文件顺序一一介绍。log 存放训练模型结果。
meta all_data_list列举的是数据集中所包含的所有训练数据;anno_path是对应文件的相对存放路径;area6_data_label为验证训练模型时所用到数据集的数据文件列表;class_name是数据集所包含的所有分类类别。
indoor3d_util.py 数据集制作所需的函数。
collect_indoor3d_data.py 数据集制作时npy/txt文件的制作。
gen_indoor3d_h5.py h5文件制作,其输入文件npy/txt的文件内容及格式为ID XYZRGBL,输出为若干个1000*4096的数据文件。
model.py 局部与整体特征拼接及分割网络模型结构,其对应于网络结构中如图5部分。图5 语义分割train.py 语义分割模型训练。
eval_iou_accuracy.py 训练结果的验证。
batch_inference.py 利用训练结果进行点云分类,不提供可视化结果;可选择输出或者不输出obj文件,obj文件可用meshlab 等软件打开预览。
后续做源码的详细解读以及训练集的制作;文中如有理解不当之处,烦请指出;如有意交流,一起进步,可以私信加好友。