利用迭代FPS选择一个子点集:
具体的,FPS逻辑如下:
一开始,找个seed点(一般是质心)放在已经选中的点集中,确定要选的点数K,然后每一轮,都执行如下三步选择出一个点,直到已经选中的点集中数量=K
1)对于任意一个剩余点,计算该点到已经选中的点集中所有点的距离
2)取最小值,作为该点到已经选中点集的距离
3)计算出每个剩余点到当前已经选中的点集的距离后,取距离最大的那个点。
(2) grouping layer
输入到该层的是一个 N ∗ ( d + C ) N*(d+C) N∗(d+C)的点集和一个 N ′ ∗ d N'*d N′∗d的质心集,该层输出一个 N ′ ∗ K ∗ ( d + C ) N'*K*(d+C) N′∗K∗(d+C)的点集,其中K是质心点的邻居个数,K是随着group自适应变化的,但是作者也说了,不用担心,在下一层pointNet中这些变化的K都会被转换为一个固定长度的local region feature vector.
grouping layer有两种查询方式:一种是半径球查询(r固定),上限点数是K,作者建议采用这种方法,因为这更能趋向于局部特征,更具有通用性。另一种是KNN查询。
实际上,为了保证半径球查询能够自适应点云采样密度,在下一小节中,会展开作者提供的两种策略:MSG和MRG
(3)PointNet layer
输入到该层的是 N ′ ∗ K ∗ ( d + C ) N'*K*(d+C) N′∗K∗(d+C)的矩阵,代表 N ′ N' N′个local点区域。输出数据是 N ′ ∗ ( d + C ′ ) N'*(d+C') N′∗(d+C′)矩阵,其中 C ′ C' C′代表PointNet提取出来的 C ′ C' C′维点特征。
Note: 在作用PointNet layer之前对每个local区域中的点都做了相对坐标变换:每个group中的点都相对质心做变换,转换为相对质心的相对坐标,这样可以获得局部点之间的关系,更有利于学习。
其中i表示K个local region中的第i个,j表示d维坐标中的第j维,x(j)_hat表示质心点。
当输入采样密度变化时,网络会学习从不同尺度的local region中自适应地结合特征。每一个abstraction level 提取多个scale的local patterns并且根据局部点密度智能地结合他们。
有两种类型地自适应不同尺度的特征结合方法:MSG和MRG
1. Multi-scale grouping (MSG)
思路很朴素,就是取不同稀疏度生成不同scale的region,计算他们的特征然后把他们的特征concat起来。
具体地,作者采用对输入点云进行不同dropout ratio的随机dropout来实现,dropout ratio在[0,p]之间,为了不对dropout太过分产生没有意义的空点集,p被设置为0.95. 作者解释dropout ratio可以实现点云具有变化的稀疏性,随机dropout实现了点云稀疏性变化的均匀性。
Note:这里我一开始根据Figure 3(a)理解成了,取不同球半径生成不同scale的region,根据作者的dropout描述,这样理解是不对的。
2. Multi-resolution grouping (MRG)
上面的MSG方法的计算量很大。作者提出MRG作为替代方法,在后面的实验结果中,发现MSG比MRG效果要好一些,但是时间成本很高。
在Figure 3(b)中,在第i个层级 L i L_{i} Li中的region feature是由两个vectors concatenate而来的, 左边的vector是通过一个set abstraction level从低一级的 L i − 1 L_{i-1} Li−1的子区域中提取出来的,右边的vector是利用single PointNet直接处理在local region中的所有原始点而得来的。
如果local region density很低,那么left权重应该被设置低一些,right权重应该被设置的高一些。
如果local region density很高,那么left权重应该被设置高一些,right权重应该被设置的低一些。
这些都是由网络来学习的,满足自适应性。
在语义分割中,要求输入点的数量与输出点的数量相等。而set abstraction level会实现点的数量降采样,为了解决这个问题,作者采用了基于距离的插值和skip link concation来解决这个问题。
如Figure 2右上角所示,前一层的 ( N 2 , d + C 2 ) (N_{2},d+C_{2}) (N2,d+C2)通过
1.插值,变成了 ( N 1 , d + C 2 ) (N_{1},d+C_{2}) (N1,d+C2)
2.skip link concatenation,变成了 ( N 1 , d + C 2 + C 1 ) (N_{1},d+C_{2}+C{1}) (N1,d+C2+C1)
3.unit pointnet(FC+ReLU), 进行简单的特征融合,变成了 ( N 1 , d + C 3 ) (N_{1},d+C_{3}) (N1,d+C3)
直到生成最后的 ( N , k ) (N,k) (N,k),其中k表示语义分割的标签。
实验和结果部分略
1. PointNet++ 通过层级结构具有了强大的对点云细节捕获的能力,根据作者描述,这是受CNN层级结构的启发。 一个好的idea从一个领域迁移到另一个领域,然后work的很好,就是普通意义的创新,而这需要博闻强识+灵活的思维。
2. 为了解决点云中稀疏性不同的问题,作者提出MSG和MRG来解决它。MSG的思想很朴素,用dropout对input的点云生成不同稀疏度的点云,分别提取特征进行特征向量串联。MRG的多分辨率,在我看来是比较粗糙的,作者只提取了 L i − 1 L_{i-1} Li−1层和raw点云的特征进行串联,可能是更多的考虑了速度的问题吧。
4. 不同的度量方法用在不同的数据上效果有差异,在刚性物体上,利用欧式距离度量效果就会很好,在非刚性物体(比如动物,一匹马)上,相应的利用测地距离度量效果会更好。如在3维人体姿态识别或者其他跟非刚性物体识别的任务中,应该考虑测地距离度量。