目录
.1 intro-点云特性
1.1 点云特性
1.2 motivation
1.3 pointnet的处理
.2 Pointnet
2.1 contribution
2.2 solution
2.3 backbone
2.4 代码部分
2.5 小结
.4 应用
References
.1 intro-点云特性
Q1:什么是点云?
简单来说就是一堆三维点的集合,必须包括各个点的三维坐标信息,其他信息比如各个点的法向量、颜色等均是可选项
num_channels一般为3,表示点云的三维坐标。
1.1 点云特性
点云几个两个很重要的特性。
(1)无序性。点云中的点在打乱它们的索引之后,依然能表达空间结构。
(2)旋转不变形。点云整体经过旋转之后,类别没有改变。
1.2 motivation
related work
-
Volumetric CNNs:对体素应用3DCNN。缺点是点云的坐标空间的稀疏性导致转成体素后的分辨率问题,以及3D卷积带来的开销
-
Multiview CNNs:将点云或者shape渲染成视图,使用传统的图像卷积来做特征学习。这种方法确实取得了不错的效果,但是缺点是应用非常局限,像分割、补全等任务就不太好做
-
Spectral CNNs
-
feature-based DNN
why we want to do this?
直接对点云做特征学习也不是不可以,但有几个问题需要考虑:特征学习需要对点云中各个点的排列保持不变性、特征学习需要对rigid transformation保持不变性等。
1.3 pointnet的处理
对于(1)
所以设计的ML模型必须是一个对称函数,因为对称函数的结果与输入的参数的顺序无关。比如sum、max函数。可以类比二维卷积神经网络中的max pooling操作。实际上论文中的max pooling操作在代码里用的就是max函数。
以上这种直接对坐标进行max的操作会使大量的点丢失(可能会导致特征丢失),所以要先使用多层感知器(MLP)将每个点映射到更高的维度(此时信息会冗余)
对于(2)
论文中使用了T-Net去学习物体的旋转,相当需要学习一个3x3的矩阵
我们希望不论点云在怎样的坐标系下呈现,网络都能正确的识别出。这个问题可以通过STN(spacial transform netw)来解决。二维的变换方法可以参考这里,三维不太一样的是点云是一个不规则的结构(无序,无网格),不需要重采样的过程。pointnet通过学习一个矩阵来达到对目标最有效的变换。
小结:
为什么PointNet是重要的?
真正让PointNet具备很大影响力的,还是它的简洁、高效和强大。
首先要说清楚,PointNet所作的事情就是对点云做特征学习,并将学习到的特征去做不同的应用:分类(shape-wise feature)、分割(point-wise feature)等。
PointNet之所以影响力巨大,就是因为它为点云处理提供了一个简单、高效、强大的特征提取器(encoder),几乎可以应用到点云处理的各个应用中,其地位类似于图像领域的AlexNet。
.2 Pointnet
2.1 contribution
-
设计了一个新颖的深层网络架构来处理三维中的无序点集
-
设计的网络表征可以做三维图形分类、图形的局部分割以及场景的语义分割等任务
-
提供了完备的经验和理论分析来证明PointNet的稳定和高效。
-
充分的消融实验,证明网络各个部分对于表征的有效性。
网络的亮点
-
空间变换网络解决旋转问题:三维的STN(空间变换网络--spatial transform network)可以通过学习点云本身的位姿信息学习到一个最有利于网络进行分类或分割的DxD旋转矩阵(D代表特征维度,pointnet中D采用3和64)。至于其中的原理,我的理解是,通过控制最后的loss来对变换矩阵进行调整,pointnet并不关心最后真正做了什么变换,只要有利于最后的结果都可以。pointnet采用了两次STN,第一次input transform是对空间中点云进行调整,直观上理解是旋转出一个更有利于分类或分割的角度,比如把物体转到正面;第二次feature transform是对提取出的64维特征进行对齐,即在特征层面对点云进行变换。
-
maxpooling解决无序性问题:网络对每个点进行了一定程度的特征提取之后,maxpooling可以对点云的整体提取出global feature。
2.2 solution
challenges
点云的几个特点:
-
无序性 --> 对称函数设计用于表征
-
点不是孤立的,需要考虑局部结构 --> 局部全局特征结合
-
仿射变换无关性 --> alignment network
2.3 backbone
其中,mlp是通过共享权重的卷积实现的,第一层卷积核大小是1x3(因为每个点的维度是xyz),之后的每一层卷积核大小都是1x1。
即特征提取层只是把每个点连接起来而已。经过两个空间变换网络和两个mlp之后,对每一个点提取1024维特征,经过maxpool变成1x1024的全局特征。
再经过一个mlp(代码中运用全连接)得到k个score。
分类网络最后接的loss是softmax。
n*3 输入
输出 n*64
输入 n*64
输出 n*1024
然后max pooling (每个n取出一个最大值)输出1*1024
2.4 代码部分
变换矩阵部分,以第一个STN为例
2.5 小结
本质上pointnet就是一种可以对无序点集提取出特征的网络结构
先输入n*3个点
然后进行仿射变换输出 n*3
经过mlp输出 n*64
再进行仿射变换
再经过mlp 输出 n*1024
然后 max pooling后输出1*1024
并且拼接之前的n*64 输出 n*1088
再经过mlp输出 n*128
然后最后再经过mlp
输出n*m的打分
在PointNet中 网络对每一个点做低维到高维的映射进行特征学习,然后把所有点映射到高维的特征通过最大池化最终表示全局特征。
.4 应用
PointnetGPD
https://github.com/Hymwgk/PointNetGPD
应用于抓取
本质上就是先preprocess得到夹爪内部点云,然后处理进入网络打分,输出打分高的
References:
细嚼慢咽读论文:PointNet论文及代码详细解析 - 知乎