目录
1. pointnet
1.1 点云数据的特点
1.2 模型功能
1.3 网络结构
1.3.1 分类网络
1.3.2 分割网络
2. pointnet++
2.1 模型
2.2 sampling layer组件
2.3 grouping layer
2.4 pointnet
(1)无序性:不同于图像中的像素数组或体积网格中的体素数组,点云是一组没有特定顺序的点。换句话说(permutations of the input set in data feeding order. ),点云中的点集合排列顺序改变了,点云本身的目标类别和分割结果是不变的(符合交换律,比如加法、乘法、取最值等操作)。
(2)点之间的交互:点不是孤立的,而相邻的点形成了一个有意义的子集。因此,该模型需要能够从附近的点捕获局部结构,以及局部结构之间的组合相互作用。
(3)变换无关性:作为一个几何对象,点集的特征表示应该对某些变换是不变的。例如,旋转和平移点不应该修改全局点云类别或点的分割。
(1)模型输入:网络的输入是坐标点集合(x,y,z);
(2)分类输出:输出有两个分支,分类分支输出是k个scores对应k个类别,哪个值大就是那个类别;
(3)分割输出:分割分支输出的是nxm的矩阵scores,有n个点,每个点有m个分数,m个分数对应m个语义分割类别,哪个值大,当前点就属于哪个类别。
(1)input transform和feature transform是个小网络,其中input transform用来预测放射变换矩阵,用于对齐输入的点云数据,feature transform是用来对齐特征数据,后期的论文证明是没多大用处的,可以忽略;
(2)论文中n是1024(均匀采样),论文中只用到了(x,y,z)坐标,所以输入是nx3点云矩阵,首先经过mlp(64,64),即两个多层感知机全连接网络,维度变化3->64->64,输出nx64特征向量;
(3)再经过3个多层感知机,维度变化64->64->128->1024,升维度,输出nx1024特征向量,方便后面的maxpooling提取全局特征(即降维操作);
(4)提取特征后,使用maxpooling操作,提取全局特征,nx1024,每个点有1024维度特征,求所有点的全局特征,就是在每个维度上取最大值,则nx1024 -> 1x1024;这1024个数据就代表真个点云数据的全局特征;
(5)再接一个mlp(512,256,k),作为分类层,1024->512->256->k全连接节点变换,k个类别分数,哪个值大就是那个类别。
(1)前面的特征提取层是一样的,提取得到局部特征nx64,和全局特征1x1024;
(2)融合局部特征和全局特征,直接concat在一起,变成nx1084,每个点都有1084维度特征;
(3)再接mlp层,维度变换1084->512->256->128,再接mlp层,维度变化128->128->m,这样特征矩阵变化nx1084 -> nxm;
(4)nxm,即n个点,每个点都有m个类别分数,哪个大,则当前点的分割类别就属于对应的类别。
pointnet模型简单一句话,就是mlp提取特征,再经过分类层进行分类,即可完成对输入点云数据的分类,公式概括如下。
其中MAX是最大池化层。
由于只是使用maxpooling来聚合整个点云的特征,pointnet是不能捕获不同尺度下的局部特征。pointnet适用于目标数据的尺度变化不大的场景。
(1)pointnet++特征提取层是一个层级特征提取层,由(sampling,grouping and pointnet三个组件组成), 然后就是分割头(unet形式)和分类头(全连接层)。
(2)网络输入的是Nx(d+C)矩阵,N是点个数,d维坐标,C维点特征,输出矩阵是N'x(d+C'),其中N'是采样后的点个数,C'是点特征向量维度。
(3)每次grouping layer对局部进行KNN聚类,输入到pointnet layer再对每个cluster提取特征,这个过程相当于2D卷积操作,同样是使用层级结构,放大感受野,提取多尺度特征。
sampling layer是迭代最远距离采样IFPS算法,用采样后的点云尽可能的覆盖到原始点云所在范围,代表当前点云数据,论文中是提取1024个点,详细IFPS算法介绍可参考:
iterative farthest point sample (IFPS or FPS)-CSDN博客
如果输入Nx(d+C),则输出N'x(d+C)
(1)输入点集合坐标Nx(d+C)和对应的中心坐标N'xd,对每一个中心坐标利用KNN在点集合中找K个最近的点,在一个cluster中,找出的每个点维度是(d+C)特征;
(2)对于一个cluster的维度则是Kx(d+C),有N'个中心,则输出维度是N'xKx(d+C)
(1)输入是N'xKx(d+C),有N'个聚类中心点,每个聚类中心有K个点;
(2)对每个cluster投入到pointnet层,提取特征,即Kx(d+C) -> (d+C');
(2)有N'个cluster,所以输出的是N'x(d+C')。
真正实现的时候是:(b,npoints,nsamples,features) = (b,N',K,d+C),要channel first,变成
(b,features,npoints,nsamples) = (b,d+C,N',K),比如变成(64,3,1024,16)
待续。。。