三维目标分类 — PointNet++多尺度分组MSG详解(三)

三维目标分类 — PointNet++多尺度分组MSG详解(三),第1张

        上 一节详细介绍了PointNet++点云分类。PointNet++通过SA模块对原始点云进行采样分组,如果只是采用单一半径尺度和固定采样点数,那么分组内的点云会受点云密度的影响。如果点云过于稀疏,那么小半径尺寸无法将稀疏的点云进行分组,从而无法提取到稀疏点云的特征。在单一尺度分组的PointNet++结构中,第一层的SA分组半径最小,后续SA层都是基于前一层进行的,那么如果第一层没有提取到特征,那么后续也无法提取到相应稀疏点云的特征。为了解决这个问题,PointNet++作者提出了多尺度分组策略(Multi-Scale Group, MSG),本文将介绍MSG的实现方式。GitHub地址为GitHub - yanx27/Pointnet_Pointnet2_pytorch: PointNet and PointNet++ implemented by pytorch (pure python) and on ModelNet, ShapeNet and S3DIS.。

        文中涉及到PointNet的地方请参考上一篇文章的详细介绍三维目标分类 — PointNet详解(一)_Coding的叶子的博客-CSDN博客。

1 代码环境部署
conda create -n torch16cu101 python=3.7
conda activate torch16cu101
pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
pip install tqdm
git clone https://github.com/yehx1/Pointnet_Pointnet2_pytorch.git
cd Pointnet_Pointnet2_pytorch
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg
2 数据介绍

         以Pointnet的modelnet40为例,其点云文件中含有x、y、z、normal_x、normal_y、normal_z,前三个为坐标,后三个为法向量。关于txt存储的点云文件格式请参考点云格式介绍(三)_Coding的叶子的博客-CSDN博客。样例文件下载地址:modelnet40点云样例数据-深度学习文档类资源-CSDN下载。

        解压后文件主要包含:

        (1)各个类别的点云,每个点云文件共有10000个点。分别存储在以类别名称命名的为文件夹中,共40个类别的文件夹。

        (2)filelist.txt中列举了全部点云文件的文件名,共12311个点云文件。

        (3)modelnet40_train.txt中列举了用于训练的点云文件名,共9843个点云文件,占比80%。

        (4)modelnet40_test.txt中列举了用于测试的点云文件名,共2468个点云文件,占比20%。

        PointNet模型的输入为点云points和标签targets。其中,points的维度为Bx3xN,B为batch_size,3为点云坐标,N为点云个数。如果使用法向量(use normls),则points的维度维Bx6xN。模型会通过截断或者最远点采样截取1024个点,即N=1024。points还会经过中心归一化和随机增强等 *** 作。标签targets维度为Nx1,即各个类别对应的标签序号。

3 SA(Set Abstraction)模块

        单一尺度SA模块(Single-Scale Group, SSG)详细介绍请参考三维目标分类 — PointNet++详解(二)_Coding的叶子的博客-CSDN博客,主要包含随机采样、分组和PointNet特征提取三个步骤。SSG会进行一次随机最远点采样,设置一个分组半径,然后对分组内的点云进行PointNet特征提取。

        MSG多尺度分组仍然会进行一次随机最远点采样,但是分别设置多个分组半径;然后针对各个分组内的点云分别进行PointNet特征提取;最后将不同分组半径下提取到的点云特征进行拼接,得到SA模块输出的最终特征。      

4 模型简介

        PointNet++模型结构如下图所示。

         PointNet++网络提取特征的各个步骤如下:

        (1)SA1:输入为xyz坐标值和法向量,以法向量作为原始特征,也可以设置不输入法向量。这里假设不输入法向量,那么输入维度为3x1024(N=1024)。随机最远点采样的点数为512,分组半径分别为0.1、0.2、0.4,分组内点数分别为16、32、128个,那么采样分组后的特征维度分别为512x16x(3+0)、512x32x(3+0)、512x128x(3+0),其中分组内每个点的坐标都已减去中心点坐标,0表示原有特征维度,对应上图中的C,若用法向量作为输入特征,则会将坐标与法向量拼接作为新的特征。特征分别经过PointNet卷积[Conv1d(3, 32)、Conv1d(32, 32)、Conv1d(32, 64)]、[Conv1d(3, 64)、Conv1d(64, 64)、Conv1d(64, 128)]、[Conv1d(3, 64)、Conv1d(64, 96)、Conv1d(96, 128)],和最大池化后。每个分组点云的特征维度分别为64、128、128,并对这些特征进行拼接,拼接后维度为320(64+128+128)。这相当于512个采样点的特征维度为320,即320x512,320对应上图中的C1。

        (2)SA2:输入为(1)中采样得到的512个点坐标和320x512维度特征。随机最远点采样的点数为128,分组半径为0.2、0.4、0.8,分组内点数为32、64、128个,那么采样分组后的特征维度为128x64x323,其中分组内每个点的坐标都已减去中心点坐标,并将坐标与原特征拼接作为新的特征(3+320=323)。经过PointNet卷积[Conv1d(323, 64)、Conv1d(64, 64)、Conv1d(64, 128)]、[Conv1d(323, 128)、Conv1d(128, 128)、Conv1d(128, 256)]、[Conv1d(323, 128)、Conv1d(128, 128)、Conv1d(128, 256)],和最大池化后。每个分组点云的特征维度分别为128、256、256,并对这些特征进行拼接,拼接后维度为640(128+256+256)。这相当于128个采样点的特征维度为640,即640x128,256对应上图中的C2。

        (3)SA3:输入为(2)中采样得到的128个点坐标和640x128维度特征。将全部128个点分为1组,采样中心设置为为坐标原点。那么采样分组后的特征维度为1x128x643,将坐标与原特征拼接作为新的特征(3+640=643)。经过PointNet卷积Conv1d(643, 256)、Conv1d(256, 512)、Conv1d(512, 1024)和最大池化后。每个分组点云的特征维度为1024,共1个分组。这相当于1个采样点的特征维度为1024,即1024x1,1024对应上图中的C4。

        (4)(3)中输出1024维度特征经过FC(1024, 512)、FC(512, 256)、FC(256, 40)、log_softmaxt得到40维度的输出,即40个类别log softmax,即图中的class scores。

5 损失函数

        与PointNet不一样的地方在于,PointNet++不含特征变换矩阵。因此。损失函数仅由交叉熵损失函数组成,不再包括64维特征的变换矩阵的损失。这里考虑到类别的均衡性,交叉熵损失函数会为每个类别分配一个权重。在全部原始点云中,同一类别的空间点数量最多的权重最小,取值为1。其他,类别的权重是最大点数量与该类别数量的比值的三分之一次方,显然其他类别的权重大于1。

6训练评估程序

        将2中的数据集解压到1中工程目录下data文件夹中,data文件夹需要新建,默认是没有的。将model参数设置为pointnet2_cls_msg(msg,Multi-Scale Group,单一尺度分类,下节会介绍多尺度分类),然后直接运行train_classification.py和test_classdification.py即可完成训练和测试,通过将use_normals设置为True将在输入中引入法向量。

python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。https://blog.csdn.net/suiyingy/article/details/124017716

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/875671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存