留个笔记自用
3D-MPA: Multi Proposal Aggregation for 3D Semantic Instance Segmentation
做什么
Instance segmentation实例分割
目标检测( Object detection)不仅需要提供图像中物体的类别,还需要提供物体的位置(bounding box)。语义分割( Semantic segmentation)需要预测出输入图像的每一个像素点属于哪一类的标签。实例分割( instance segmentation)在语义分割的基础上,还需要区分出同一类不同的个体。
这里就是从2D图像的分割转移到了点云上的分割,无非就是在位置信息上多了一维
做了什么
给定一个输入点云,这里使用的是一个以对象为中心的方法,其中每个点为其对象中心投票。然后从预测的对象中心抽取对象建议。然后,我们从投票给同一对象中心的分组点特征中学习提议特征。
怎么做
整体结构分为三个部分,Proposal Generation提案生成部分、 Proposal Consolidation提案合并部分、Object Generation对象生成部分
首先是第一个部分,提案生成部分
输入是一个包含N个点I维特征的点云,也就是RN×I,I维特征包含了位置、颜色、法线等相关特征,输出是一个固定数量的对象建议,其中包含了K个点,每个点包含的信息有R3的位置信息和RD的提案特征信息。
然后具体一点,这里使用的sparse volumetric backbone就是一个特征提取网络,文中没有说是什么样子的,但形容上是借鉴了这个结构
当然这里的稀疏卷积仍然是那个常见的
稀疏卷积
总而言之,使用这个网络得到一个N×F的语义特征,然后分入一个二分支
上分支是对象中心投票,下分支是语义分类。首先解释下分支,就是对每个点进行语义分类了,这个很好理解,也就是整个结构所需要做的。然后是上分支,其实也就是回归每个点所属实例的中心点坐标
这个部分采用两个LOSS来进行训练
一个是上分支的中心点LOSS,这里的1(xi)是一个二分函数,用于判断xi点是否属于一个对象,这里的△(x)是预测点位置xi和GT的bounding box中心点的坐标ci的相对偏移
然后将两个LOSS相加,这里的Lsem是语义标签的和GT的cross-entropy
然后就是这部分中的后半步sample步
在得到了每个点对它所属的对象的中心的投票后,就可以得到一个对象中心的分布图类似于↓
在这个分布图中,随机sample K个样本作为案例位置,得到这样的结果↓
值得注意的是这里采用的是随机采样而不是常见的最远采样FPS,因为这里说FPS是会更喜欢原理真实对象中心的值,但其实这样的话似乎就没考虑覆盖率的问题了,而且这里也完全不能保证随机采样能采样到较好的中心位置
然后对每个sample出来的中心点yi,设定一个半径r,r内的其他关联点设定一个集合si作为该对象的所有点。用PointNet学一个关联点si的提议特征gi
最终这里就得到了K个sample中心的local特征
然后是第二部分提案合并部分
这里采用了人见人爱,人见人水的图卷积,先是定义方法,每个点由前面的建议特征gi和位置yi组成,然后是边,如果两个点i和j之间的空间距离小于2,两者连接一条边,然后定义边特征
这里的hθ是一个可学习的非线性函数,y是位置,g是建议特征,[]是常见的concat操作,然后对定义好的点和边使用图卷积,这里堆叠了10层而获得了最好的效果,最后就得到了refine的建议特征hi
然后是最后一个部分对象生成部分
到目前为止,整理一下输入,这里有K个sample点的位置yi,sample点refine后的局部特征hi,还有sample点的关联点也就是邻域集合si目标是从这些提议中获得最终的语义实例,为此,为每个提议预测一个语义类、一个聚集特征向量、一个对象分数和一个与提议相关的点si上的二进制前景背景掩码
具体来说,这里也分了两个分支,首先是下分支,将提议特征hi输入一个MLP得到一个K×Dout的结果,其中Dout=S+E+2,这里的S是语义类别,E是E维的聚集特征,2维的对象分数,也就是上面所提的。这里的对象分数定义的是一个判断正面或负面,接近GT对象中心的为正例,离GT对象都很远或者离两个距离相同的为负例。
这里定义了两个LOSS,一个是前面的分数的LOSS,采用的是cross-entropy来定义的Lobj,根据前面和GT的定义方法用来判断该对象的分数(训练)。还有一个LOSS是Lsem,用的是这里预测的语义类和GT对象的类别的cross-entropy,当然这里约束的loss仅仅是前面对象打分中正例的对象,用来保证它们的语义分类是正确的。
然后是图中的mask部分
每一个分数为正例的sample建议都制作一个mask,这个mask是针对关联点si的,这里的ni就是si集合中点的数量,为的是判断点的前景-背景的类别,也就是跟属不属于对象本体
然后定义一个新的集合
这个集合的意思就是与sample点坐标yi的r范围内vote给yi的点的坐标fi所组成的集合,也就是获取这些邻域点的特征,然后把它们经过一个Pointnet获得各自的mask,具有与最近的GT对象实例标签相同的GT对象实例标签的点被监督为前景,然后其他点都是背景。这里的mask用的是focal loss,也很常见了。
然后是二者的融合模块,前面常见的方法都是采用NMS(非最大抑制)来取最大值,但这里有个常见的问题,就是NMS对于分数特别敏感,当然这很正常,因为抑制掉非最大值的方法就是根据分数。
这里采用的是聚合建议的方法,而不是直接抑制。
这里采用DBScan的方法进行聚类,一个常见的基于密度聚类的方法,这里定义了两种聚类特征的方法,分别是几何特征和嵌入特征
首先是几何特征,它定义的是每个点特征为εi∈R4,包含了三维的中心点预测坐标△yi和1维的对象半径估计r
这里的c是最近的GT对象的中心坐标,r是最近的GT对象的bounding球体的半径,很显然这个LOSS是为了限制聚类特征的几何位置和几何大小
然后是嵌入特征,它定义的是每个点特征为εi∈RE
γ、δ均是超参数,C是GT对象的总数,Nc是聚类提议中属于该对象的总数点,据说这种loss方法已经应用于别的3D实例分割论文中。Lvar将属于同一实例的特征拉向它们的平均值,Ldist将具有不同实例标签的集群分开,,Lreg是一个正则化,将均值拉向原点,聚合完成后就得到了最终的K个对象
总结
1.这篇文章读完后感觉和PointGroup也太像了吧(整体流程步骤上)
PointGroup
2.相比于NMS,这种多建议聚合方法确实是一种创新,但直观感觉上用了好多的Pointnet来获取特征,还有图卷积,这是在用金钱玩游戏呢