点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
作者:不知道叫什么好 | 来源:知乎
https://zhuanlan.zhihu.com/p/139396088
本文仅做学术分享,如有侵权,请联系删除。
点云数据里面,一般会有一些噪点,理论上,这些噪点可能会对具体应用的性能产生影响。本文主要介绍CVPR 2020的一篇处理噪点的论文。文章主要对所有采样点的位置、feature进行调整,减弱噪点的影响,论文将这步称为:Adaptive Sampling(AS);并进一步使用Local-NonLocal(L-NL)来对feature进行增强。
论文地址:https://arxiv.org/pdf/2003.00492.pdf
代码地址:https://github.com/yanx27/PointASNL
1. 噪点
在学习点云的feature时,一般使用encoder + decoder的网络结构。在encoder的downsampling过程中,一般使用FPS采样算法来采样。
如上图左图所示,对于一个飞机点云,红圈、蓝圈、绿圈、黄五角星,均表示噪点。当使用FPS进行下采样后,黄色五角星所在的点被采中。直觉上,这个点如果不处理,会对网络性能有所影响。
针对这个问题,论文提出了一个Adaptive Sampling(AS)模块,来实现调整噪点的操作,从而降低噪点对网络性能的影响。
2. Adaptive Sampling(AS)模块
首先定义如下符号方便后续描述:
· :表示从某个层用FPS下采样后得到的点集,其中可能包含噪点。
· :表示下采样得到的点集的feature集合。
· :表示下采样得到的点集里面的某个点的坐标和feature。
AS模块首先从上一层的点集合中使用FPS下采样得到 、
。后续的操作流程如下:
2.1 用KNN找邻居点集
用KNN算法,给每个下采样得到的点找K个邻居点。假设点 的邻居点集合为:
,对应的邻居点的feature集合为:
。
2.2 Self-attention增强邻居点feature
主要思路是:对于点 的第
个邻居点,分别计算出它与
的其它邻居点的相关性,然后用softmax计算出一组权重,最后使用权重对
的所有邻居点的feature进行加权求和,得出点
的第
个邻居点的新的feature。直觉上,经过这步处理后,每个邻居点的feature会包含邻域范围内的所有点的一些信息。
具体操作流程如下:
·邻居点坐标normalization:所有邻居点的坐标,减去第一个邻居点的坐标,转成相对于第一个点的相对坐标。
·重新构建邻居点的feature:每个邻居点的相对坐标,与邻居点的feature,拼到一起,得到每个邻居点的新feature。
·用self-attention模式,分别计算出邻居点集的3个feature矩阵:query、key、value。
·用query和key矩阵相乘,并用softmax,得到邻居点之间的attention矩阵。对attention进行scale。
·用attention和value矩阵相乘,得到所有邻居点feature。
以上过程即为论文中的如下公式:
2.3 调整采样点
主要思路是:用增强后的邻居点的feature,通过网络学出以下两个信息:
·邻居点集的feature的每个channel的attention权重向量,然后分别在每个channel上,用对应channel上的attention权重向量,加权求和,得到采样点 调整后的feature。
·邻居点集的坐标的attention权重向量,然后用该attention权重向量,对所有邻居点的坐标加权求和,得到采样点 调整后的坐标。
具体操作流程如下:
·Self-attention后的feature,经过一个多层MLP网络,得出一个新的weight矩阵,该矩阵的维度是:【batch,point_number,neighbor_number,channel+1】。这里额外增加的一个channel是为了后面计算邻居点集的坐标的权重矩阵。
·在以上的neighbor_number维度上,用softmax,计算出邻居点集的每个channel、坐标的权重矩阵。
·用channel维度上的权重矩阵,对邻居点集的feature在每个channel上进行加权求和,得到点 调整后的feature。
·用坐标的权重矩阵,对邻居点集的坐标进行加权求和,得到点 调整后的坐标。
总结:Adaptive Sampling在邻域内,先用Self-Attention进行feature增强,然后用另一种attention在邻域内进行feature、坐标的加权求和,得出所有采样点的feature、坐标。论文认为,这样即可对采样点中包含的噪点进行处理。
3. Local-NonLocal(L-NL)模块
该模块通过使用局部、全局信息,进一步对采样所得点的feature进行增强。
3.1 Local
对于每个采样点,Local主要是在每个点的局部邻域范围内,对其邻居点的feature进行融合,计算出一个新的feature。这部分使用了PointConv的思想(连续空间下的卷积操作),将每个邻居点的相对坐标映射为一组卷积操作的系数矩阵,然后用每个邻居点的系数矩阵对其feature进行变换,最后用一个Aggregation操作,将邻居点的feature融合为得到中心点 的local feature。对应的公式为:
其中 是一个MLP网络,将邻居点相对坐标映射为卷积操作的系数矩阵。
(个人认为,这部分代码实现,与文章不符。欢迎读者讨论)
3.2 NonLocal
NonLocal本质上是使用Self-Attention,对每个采样所得点,在整个点云范围内进行feature融合,为每个采样点计算出一个包含全局信息的feature。流程图如下:
其中:
·Query Points:用FPS在前一层点云中采样,并用Adaptive Sampling调整后所得的点云feature;
·Key Points:前一层点云的feature。
3.3 feature融合
除了Local、NonLocal两个分支外,代码中其实还有一个skip connection的分支。对于每个采样所得点,该分支直接对采样点的邻居点的feature执行max_pool,最后通过一个1d convolution给每个采样点计算出来一个新的feature。
最后将local、nonlocal、skip-connection三个分支的feature加到一起,再用一个1d convolution对feature的channel进行变换,得到每个采样点的feature。
4. 网络结构
以segmentation为例:
·每个下采样操作,相当于FPS -> Adaptive Sampling -> Local-Nonlocal
·每个上采样操作,相当于Up-Sampling -> Local-Nonlocal
总体结果如下图所示:
5. 总结
读完文章、代码,会发现:
·本文的核心是Adaptive Sampling、Local-NonLocal
·Adaptive Sampling的核心是Self-Attention、Attention
·Local-NonLocal的核心是Self-Attention、PointConv
对Self-Attention、PointConv有疑惑的读者,请参考:
·Non-local Neural Networks (CVPR 2018)
文章地址:https://zhuanlan.zhihu.com/p/129925437
·PointConv: 3D点云卷积 (CVPR 2019)
文章地址:https://zhuanlan.zhihu.com/p/99863795
总体上,这篇文章演示了如何融合local、global范围内的feature,进行feature增强。比较特别的是,作者从“噪点“这个角度作为文章的出发点,如此一来,就有别于其它点云feature融合的文章了。
从代码的角度看,源码“融合“了多篇文章的代码:PointNet++, PointConv, KPConv, ... 如果之前看过相关源码,理解本文应该不会太难。