点云处理系列之夯实基础(PointNet、PointNet++、SGPN)

最近,开始决定做点云处理方向了,定期做做论文笔记,一方面是督促自己,一方面也用于记录笔记。

这次介绍一些点云处理领域的鼻祖论文:《PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》、 《PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space》和一篇实例分割论文《SGPN: Similarity Group Proposal Network for 3D Point Cloud Instance Segmentation》。

《PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》是3D点云领域第一篇直接使用点云数据的论文,作者提出了一个类似于CNN的基础网络PointNet用来提取点云特征,并用该网络进行了分类、实例分割任务。

作者观察发现点云数据具有三个特征:无序性、点之间存在相互关系、对旋转和平移的不变性。无序性指所设计的网络对于输入的点云数据(一个txt文件,每一行为一个点的x、y、z坐标,也可能还包含其他信息)的每个点的先后顺序应该完全鲁棒。点之间的相关关系要求所设计的网络能够依据点对之间的距离关系区分性地提取出网络中的局部信息和全局信息。对旋转和平移的不变性指构成物体的所有点一起进行平移、旋转操作,不影响网络最终的输出结果。

  • 针对无序性,作者想到使用对输入数据不敏感的集合函数max pool,即对所有点的同一维度取最大值,以此使得网络对输入数据的顺序不敏感,同时也直接得到了global feature。
  • 针对点对之间的关系,即网络需要获得局部特征(如果是分类任务的话,则不需要获得局部特征,故作者只在分割网络中加入了局部特征),作者认为进行max pool前的特征算局部特征,故把下图的nx64和1024给concat起来,再进行后续处理。
  • 针对旋转、平移不变性,作者加入了Alignment网络(下图中的input transform和feature transform),让这个网络学得仿射变换(仿射变换包含了平移和旋转),从而使得网络对平移和旋转鲁棒。
    注意在max pool 前的 mlp 指多层 1x1 的卷积操作,所以得到的是局部特征;在max pool 后的 mlp 指的是全连接网络,所以得到的是全局特征。
    点云处理系列之夯实基础(PointNet、PointNet++、SGPN)_第1张图片
    PointNet 框架图

《PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space》主要做了两步改进:一是在发现PointNet采集局部特征效果有待提升的基础上,采用类似于CNN的重叠多层网络的思想,将PointNet当做一层CNN,通过堆叠PointNet来加深网络。二是针对点云数据分布不均匀的特点,进行密度自适应。本文实现了分类和实例分割任务。(本文没有使用STN网络)

  • 第一点中,先使用farthest point sampling(即每次都采集与当前点最远的那个点,作者说这样采集相较于随机采集会使用到当前数据的分布,但我觉得这样采集不能从密度上反应数据分布)操作选取出一些点,再使用ball query的方式(作者说实验中相较于knn效果更鲁棒)进行grouping操作,以提取出一些中心点(感觉sampling&grouping操作类似于CNN网络中的pooling),再使用pointnet提取这些中心点的特征。之后再重复sampling、grouping、pointnet,实现网络层级堆叠的效果。
  • 第二点中,为了处理数据密度不均匀问题。作者将原始的pointnet层进行改进,比较了多尺度聚类和多分辨率聚类这两种方法(如下面的Figure 3所示):多尺度聚类指使用大、中、小三种半径同时在同一特征图上提取特征,再concat起来;而多分辨率聚类指先使用小的半径提取特征,获得一级feature map,再用大的半径在上一级feature map上再次提取特征,并将这两种特征concat起来,即也蕴含着一种层级提取特征的含义。最后发现多尺度聚类效果更好。

最后,对于分类任务,需要实现point level的predict,故作者使用inverse distance weighted average based on k nearest neighbors进行插值,再与对应sampling&grouping前的点concate起来(下图的虚线),再通过unit pointnet提取特征(类似于CNN中的one by one 卷积)。
点云处理系列之夯实基础(PointNet、PointNet++、SGPN)_第2张图片
PointNet++ 框架图
点云处理系列之夯实基础(PointNet、PointNet++、SGPN)_第3张图片
《SGPN: Similarity Group Proposal Network for 3D Point Cloud Instance Segmentation》是一个实例分割网络,对每个点提取出特征后,第一个分支用一个相似度矩阵(矩阵 S i , j S_{i, j} Si,j 为这两个点的特性向量的差值的2范数)来描述任意两点之间的相关关系,认为任意两点可能存在三种关系:属于同一个实例、属于同一语义类的不同实例、不属于同一语义类。训练获得该矩阵的loss为:
L S I M = ∑ i N p ∑ j N p l ( i , j ) , l ( i , j ) = { ∥ F S I M i − F S I M j ∥ 2 C i j = 1 α max ⁡ ( 0 , K 1 − ∥ F S I M i − F S I M j ∥ 2 ) C i j = 2 max ⁡ ( 0 , K 2 − ∥ F S I M i − F S I M j ∥ 2 ) C i j = 3 L_{S I M}=\sum_{i}^{N_{p}} \sum_{j}^{N_{p}} l(i, j), l(i, j)=\left\{\begin{array}{ll}{\left\|F_{S I M_{i}}-F_{S I M_{j}}\right\|_{2}} & {C_{i j}=1} \\ {\alpha \max \left(0, K_{1}-\left\|F_{S I M_{i}}-F_{S I M_{j}}\right\|_{2}\right)} & {C_{i j}=2} \\ {\max \left(0, K_{2}-\left\|F_{S I M_{i}}-F_{S I M_{j}}\right\|_{2}\right)} & {C_{i j}=3}\end{array}\right. LSIM=iNpjNpl(i,j),l(i,j)=FSIMiFSIMj2αmax(0,K1FSIMiFSIMj2)max(0,K2FSIMiFSIMj2)Cij=1Cij=2Cij=3

即会针对这两点的类别关系,决定该点的loss形式。这里的K1小于K2,α大于1.这会使得训练后,相似度矩阵中的点:若对应两点属于同一实例,则其值趋于0;若属于同一类的不同实例,则其值趋于K1;若属于不同类,则其值趋于K2.
第二个分支获得confidence map,用第一分支的相似度矩阵,提取出其每一行属于同一实例的点,与真实的ground truth求IOU,作为confidence score。训练时的loss为此时的L2损失。
第三分支预测每一个点属于哪个语义类。
最后,将这三个分支的结果融合起来,先通过相似度矩阵,将每一行的点聚合成一个实例,再去掉confidence小于某阈值的候选实例,以及点的数量小于某阈值的候选实例;再通过非极大值抑制去掉重叠的同类的候选实例;再同IOU来将不同类的候选实例进行融合,取最多点所属的类别作为融合后的实例的类别。这样仍然会有2%的点同时属于两个类别,这是因为这些点处于两个实例的边界处,故将其随机分为这两个类中的一个即可。
点云处理系列之夯实基础(PointNet、PointNet++、SGPN)_第4张图片
SGPN 框架

你可能感兴趣的:(点云处理,点云处理,深度学习)