【三维目标分类 】PointNet详解(一)

        Pointnet是基于点云的三维目标检测网络,也是三维深度学习目标检测的基础网络之一。本节将参考Github上的源码进行介绍,GitHub地址为GitHub - yanx27/Pointnet_Pointnet2_pytorch: PointNet and PointNet++ implemented by pytorch (pure python) and on ModelNet, ShapeNet and S3DIS.

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为点云个数。模型会通过截断或者最远点采样截取1024个点,即N=1024。points还会经过中心归一化和随机增强等操作。标签targets维度为Bx1,即各个类别对应的标签序号。

3 模型简介

        PointNet模型结构如下图所示。

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

        (1)首先通过T-Net获取空间变换矩阵,空间变换矩阵实际是通过深度学习的方法学到一个仿射变换矩阵点云仿射变换—open3d python_Coding的叶子的博客-CSDN博客。其目的是让原始点云变换到一个更容易识别的空间位置或形状。对于3x1024(代码中n=1024)的点云,经过卷积conv1d(3,64)、conv1d(64,128)、conv1d(128,1024),得到1024x1024个特征。前一个1024表示通道数量,后一个1024表示点的数量。然后在后一个1024做最大值池化,由于1024表示点的数量,那么最大值池化只与最大值有关,与顺序无关,从而符合点云的无序性特征。这样特征维度重新变为1024维,经过全连接层FC(1024, 512)、FC(512, 256)、FC(256, 9),那么可以得到9个维度特征,并进一步reshape成3x3的矩阵并加上单位矩阵,从而得到所需要的空间变换矩阵。输入3x1024个点与空间变换矩阵相乘便得到图中input transform的输出,维度仍然为3x1024。

        (2)(1)中输出3x1024经过卷积conv1d(3, 64)得到64x1024的特征。类似(1)中的过程,我们对特征空间也进行空间变换。,经过卷积conv1d(64,64)、conv1d(64,128)、conv1d(128,1024),得到1024x1024个特征。前一个1024表示通道数量,后一个1024表示点的数量。然后在后一个1024做最大值池化,由于1024表示点的数量,那么最大值池化只与最大值有关,与顺序无关,从而符合点云的无序性特征。这样特征维度重新变为1024维,经过全连接层FC(1024, 512)、FC(512, 256)、FC(256, 1096),那么可以得到4096个维度特征,并进一步reshape成64x64的矩阵并加上单位矩阵,从而得到所需要的空间变换矩阵。输入64x1024个特征点与空间变换矩阵相乘便得到图中feature transform的输出,维度仍然为64x1024。

        (3)(2)中输出64x1024经过卷积conv1d(64, 128)、conv1d(128, 1024)得到1024x1024的特征。前一个1024表示通道数量,后一个1024表示点的数量。然后在后一个1024做最大值池化,由于1024表示点的数量,那么最大值池化只与最大值有关,与顺序无关,从而符合点云的无序性特征。这样特征维度重新变为1024维,即上图中的global feature

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

4 损失函数

        损失函数由两部分组成,一部分是交叉熵损失函数,另一部分是(2)中的变换矩阵的损失。矩阵变换相当于是在空间内坐标系的变换。因此,训练出的变换矩阵最好是正交矩阵,这样每个维度的特征尽可能保持相对独立。因此,第二部分的损失是矩阵相对于正交矩阵的差值,然后乘以损失系数0.001。

5 训练评估程序

        将2中的数据集解压到1中工程目录下data文件夹中,data文件夹需要新建,默认是没有的。然后直接运行train_classification.py和test_classdification.py即可完成训练和测试,默认的配置就是基础的PointNet。

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

猜你喜欢

转载自blog.csdn.net/suiyingy/article/details/124565854#comments_22547890