赞
踩
PointNet:https://web.stanford.edu/~rqi/pointnet/
PointNet++:https://web.stanford.edu/~rqi/pointnet2/
视频链接:[5分钟点云学习] #02 PointNet 开山之作
方案1: 将输入排序为规范顺序
要求该图在维度减小时保持空间邻近性,一般难以实现,且效果不好
方案2: 将输入视为序列来训练 RNN,但通过各种排列来扩充训练数据
将元素数量扩展到数千个输入元素(常规点云数量)难以确保鲁棒性
方案3: 使用对称函数
对于在
x
i
∈
R
d
x_i\in\mathbb{R}^d
xi∈Rd的无序点云数据
{
x
1
,
x
2
,
.
.
.
,
x
n
}
\{x_1,x_2,...,x_n\}
{x1,x2,...,xn},可以定义一组函数
f
:
X
→
R
f:\mathcal{X}\to\mathbb{R}
f:X→R,将点云映射到向量上:
f
(
x
1
,
x
2
,
…
,
x
n
)
=
γ
(
MAX
i
=
1
,
…
,
n
{
h
(
x
i
)
}
)
,
f\left(x_1, x_2, \ldots, x_n\right)=\gamma\left(\operatorname{MAX}_{i=1, \ldots, n}\left\{h\left(x_i\right)\right\}\right),
f(x1,x2,…,xn)=γ(MAXi=1,…,n{h(xi)}),其中
γ
\gamma
γ和
h
h
h通常是MLP网络。
这些函数称为对称函数,除了可以取最大值,取最小值、平均值的操作也可以看作对称函数。
视频链接: [5分钟点云学习] #03 PointNet++ 竟然是图结构?!
构建点的分层分组,并沿着层次结构逐步抽象出越来越大的局部区域网络结构。
采样层(sampling):从输入点中选择一组局部区域质心点
分组层(grouping):通过查找质心周围的“相邻”点来构造 局部区域集(质心+“相邻”点)
PointNet层:使用mini-PointNet将局部区域模式编码为特征向量
N × (d + C) -> 集合抽象层 -> N’ × (d +C’)
给定N = 4096个点 { x 1 , x 2 , . . . , x n } \{x_{1},x_{2},...,x_{n}\} {x1,x2,...,xn},使用迭代最远点采样(farthest point sampling, FPS)选出N’ = 1024个采样点(质心) { x i 1 , x i 2 , . . . , x i m } \{x_{i_1},x_{i_2},...,x_{i_m}\} {xi1,xi2,...,xim},使得 x i j x_{i_j} xij是和其他点 { x i 1 , x i 2 , . . . , x i j − 1 } \{x_{i_1},x_{i_2},...,x_{i_{j-1}}\} {xi1,xi2,...,xij−1}距离最远的点。
输入:
输出:
有两种分组策略:
论文中主要使用了基于半径的球查询。在这里,作者还实验了基于kNN的邻域搜索,并使用不同的搜索半径和k。在这个实验中,所有的训练和测试都是在具有均匀采样密度的ModelNet40分类任务数据集上进行的。使用1024个点。
如表5所示,基于半径的球查询略好于基于kNN的方法。然而,我们推测,在非常不均匀的点集中,基于kNN的查询将导致较差的泛化能力。我们还观察到,稍大的半径对性能有帮助,可能是因为它捕捉到了更丰富的局部模式。
输入:
输出:
grouped_xyz_norm = grouped_xyz - new_xyz.view(B, S, 1, C)
for i, conv in enumerate(self.mlp_convs):
bn = self.mlp_bns[i]
new_points = F.relu(bn(conv(new_points)))
new_points = torch.max(new_points, 2)[0]
采样出的点小于原始点的数量,如何恢复所有点的特征?
一种简单的方法是采样所有点,但会造成很高的计算成本。
文中提出使用点特征传播(Point Feature Propagation)的方式,基于距离的插值和跨级跳跃链接的分层传播策略,如要将点特征从 N l × ( d + C ) N_{l}\times(d+C) Nl×(d+C)点传播到 N l − 1 N_{l-1} Nl−1 点,其中 N l − 1 N_{l-1} Nl−1 和 N l N_l Nl(其中 N l ≤ N l − 1 , N_{l}\leq N_{l-1}, Nl≤Nl−1,)通过在 N l − 1 N_{l-1} Nl−1点的坐标处插值 N l N_l Nl 点的特征值 f f f 来实现特征传播:
其中, f f f 为特征值, p = 2 p = 2 p=2, k = 3 k = 3 k=3。
如此基于距离的倒数对特征进行加权拟合,恢复出未被采样到点的特征。层层恢复回去,最终得到每个点的特征以及语义信息。
连接的特征通过单位点网(unit pointnet),类似于 CNN 中的1x1卷积。应用一些共享的全连接层和 ReLU 层来更新每个点的特征向量。重复该过程,直到将特征传播到原始点集。
点集在不同区域的密度不均匀是很常见的。这种不均匀性给点集特征学习带来了重大挑战。在密集数据中学习的特征可能无法推广到稀疏采样区域。因此,针对稀疏点云训练的模型可能无法识别细粒度的局部结构。
为解决这一问题,文章提出了密度自适应 PointNet 层。
由于采样密度从均匀点云转移到虚拟扫描场景,SSG性能大大下降。但是,MRG网络对采样密度偏移更具鲁棒性,因为当采样稀疏时,它能够自动切换到描绘更粗粒度的特征。MSG网络仅受到轻微影响,并且在比较中实现了最佳精度。这些证明了的密度自适应层设计的有效性。
在测试期间随机丢弃点(见图左4),以验证PointNer++对非均匀和稀疏数据的鲁棒性。
三种点集形状将给出相同的全局形状特征 f ( S ) f(S) f(S):
作者可视化了分层网络的第一级内核所学到的东西:在空间中创建了一个体素网格,并聚合局部点集,这些点集在网格单元中激活某些神经元最多。在可视化中可以看到平面、双平面、直线、角等结构。
PointNet正确地捕捉了房间的整体布局,但未能发现家具。相比之下,PointNet++在分割房间布局之外的对象方面要好得多。因为PointNet++进行分层特征学习,并捕获了不同尺度的几何特征,这对于理解多个级别的场景和标记各种大小的对象非常重要。
为了从ScanNet场景(ScanNet为体素数据集)中生成训练数据,作者从初始场景中采样1.5米乘1.5米乘3米的立方体,然后保留其中≥2%的体素被占用,且≥70%的表面体素具有有效注释的立方体。
作者在飞行中对这样的训练立方体进行采样,并沿右上轴随机旋转它,将扩充的点添加到点集以形成固定的基数(在本文的情况下为8192)。
在测试期间,作者类似地将测试场景拆分为更小的立方体,并首先获得立方体中每个点的标签预测,然后合并来自同一场景的所有立方体中的标签预测。如果一个点从不同的立方体中得到不同的标签,则进行多数投票,得到最终的点标签预测。
更改分割PointNet的最后一层,预测每个点的法向量。我们使用余弦距离的绝对值作为Loss。
将PointNet法线预测结果(左列)与从网格计算的ground-truth法线(右列)进行了比较。可以观察到一个合理的正常重建。PointNet的预测比ground-truth更平滑、更连续,ground-truth包括某些区域的翻转法线方向。
使用第一个GitHub项目(PyTorch版本+S3DIS)的代码为基础,环境配置较为容易,只需要安装PyTorch和tqdm即可。如果需要使用ScanNet数据集进行测试,可以参考第二个和第三个GitHub项目的数据导入部分进行更改。
注意,本节非PointNet、PointNet++论文中内容
PointNet++原论文使用仅XYZ的ScanNet,特征数量为3,上述9维的特征数量为PointNet使用S3DIS数据集所用的配置 ↩︎
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。