这篇教程Pointnet++ _语义分割实践写得很实用,希望能帮到您。
数据集:Scannet
数据集包含xyz和label信息,并不包含颜色信息。
一共1513个采集场景数据(每个场景中点数不一样),其中,1201个场景用于训练,312个场景用于测试。
这里的每一个场景8192点是一个样本,跟pointnet中单位平方4096点为一样本不同。
(注:github上回答s3dis数据集直接用于pointnet++的效果可能并不好的问题,说可能是s3dis采用的9通道信息,后六个通道占主要特征导致的,建议采用前三个通道! what???待测)
理论部分

这就是pointe++的核心结构图了。
pointe++提出的目的:改善pointnet没有很好地捕获局部特征的问题。
我们可以把网络分为前端+后端,前端为特征提取层,后端按功能分为分类模块和分割模块。(这里主要讲语义分割模块)
特征提取层
特征提取层的每个小块的组成:sampling(采样层:质心)--> grouping(分组层)--> pointnet(局部特征提取)
- 采样层:主要是为了质心点的选取,采用的是 FPS算法,即最远点采样。这里的质心点的个数是固定的,可能有重复点。
- 分组层:为了克服常常在同一密度上训练而实际点集密度分布不均匀的情况,提出通过多尺度的方法实现自适应的特征提取,这里包括SSG(单尺度)、MSG(多尺度同一级,说计算成本很高)、MRG(多尺度不同级)三种方式。
- pointnet:pointnet++在采样和分组后采用类似于pointnet几个特征层嵌入到网络中,分级式网络结构就是在这里体现的。

- figure 3:
- MSG(左边):不同半径的区域的特征连接在一起,附近的点数是固定的,由随机采样得到的;但计算成本很高,所以提出MRG;
- MRG(右边):不同网络级中综合不同半径的信号;根据当前局部密,上级特征和这级特征分以不同的权重:当前局部密度比较小,上一级(右侧)的权重比较大;当前局部密度比较大时,这一级(左侧)的权重比较大。
注:以上的多尺度方式的分组层并没有开源代码,仅开源了SSG单尺度的代码。
SSG:每一层球查询的质心点数逐渐减少,半径逐渐增大,附近点一直是32个。TiTAN XP上训练约7个小时。
- figure 5:
- 不同方式在均匀和不均匀的场景数据集上的准确率的比较;MSG、MRG鲁棒性更强。
- DP:means random input dropout during training,均匀点随机丢失;(其它??)
Pointnet++_源代码 理解和跑通pointnet对于三维数据的分类和分割原理 |