PointNet原理详解


在这里插入图片描述

一、3D点云的挑战

  1. 以无序点云作为输入,因此模型需要具备排序不变性
  2. 点云的旋转,平移不应该改变点云的类别,因此模型需要具备几何变换不变性

二、排序不变性

排序不变性,即输入的点云的顺序不应该改变点云所代表的物体类别
在这里插入图片描述
当一个 N × D N \times D N×D 在 N的维度上随意的打乱之后,其表述的应该是同一个物体。为了实现这一点。一个简单的方法是使用对称函数,如SUM和MAX等函数:
在这里插入图片描述
因此我们可以利用max函数设计一个很简单的点云网络,如下:
在这里插入图片描述
因此我们构造的网络也应是一个具有对称函数特特性的网络。但是这样的网络有一个问题,就是每个点损失的特征太多了,输出的全局特征仅仅继承了三个坐标轴上最大的那个特征,此时我们发现,当我们将点云的每个点先映射到一个冗余的高维空间后(例如1024维),再去进行max的对称函数操作,损失的特征就没那么多了。由此,就可以设计出这PointNet的雏形,称之为PointNet(vanilla)

在这里插入图片描述
h:高维映射
g:对称函数
r:MLP

三、几何变换不变性

对于一个点云,进行平移和旋转之后应该表示的仍然是同一物体。
对于普通的PointNet(vanilla),如果先后输入同一个但是经过不同旋转角度的物体,它可能不能很好地将其识别出来。在论文中的方法是新引入了一个T-Net网络去学习点云的旋转,将物体校准,剩下来的PointNet(vanilla)只需要对校准后的物体进行分类或者分割即可。
在这里插入图片描述
对于三维点的旋转只需乘以一个 3 × 3的旋转矩阵,即可将其矫正;同样的将点云映射到K维的冗余空间后,也是学习一个k×k的旋转矩阵,只不过因为旋转矩阵具有正交性,因此这次校对需要引入一个正则化惩罚项,希望其尽可能接近于一个正交矩阵。
在这里插入图片描述

四、网络结构和代码实现

在这里插入图片描述
对于每一个 N × 3 的点云输入,网络先通过一个T-Net将其在空间上对齐(旋转到正面),再通过MLP将其映射到64维的空间上,再进行对齐,最后映射到1024维的空间上。这时对于每一个点,都有一个1024维的向量表征,而这样的向量表征对于一个3维的点云明显是冗余的,因此这个时候引入最大池化操作,将1024维所有通道上都只保留最大的那一个,这样得到的 1 × 1024的向量就是 N个点云的全局特征。

  1. 果做的是分类的问题,直接将这个全局特征再进过MLP去输出每一类的概率即可;
  2. 如果是分割问题,由于需要输出的是逐点的类别,因此其将全局特征拼接在了点云64维的逐点特征上,最后通过MLP,输出逐点的分类概率。

代码实现

### PointNet++ 工作原理与架构详解 #### 1. 背景与动机 传统的PointNet虽然能够有效地处理无序点云数据,但在特征提取过程中仅依赖全局最大池化操作来获取整体形状信息。这种方式忽略了局部几何结构的重要性,从而影响了模型的表现力和准确性[^3]。 #### 2. 层级结构设计 为了克服上述局限性,PointNet++引入了一种层次化的网络框架,该框架能够在不同尺度上捕捉点云中的局部特征。具体来说: - **Set Abstraction (SA)** 模块用于逐步减少输入点的数量并聚合其邻域内的信息; - **Feature Propagation (FP)** 模块负责将高层次抽象出来的语义特征传递回低层更密集的空间位置处; 这种自底向上的构建方式使得每一层都能专注于特定范围内的模式识别任务,最终形成一个多分辨率表示体系[^1]。 #### 3. Set Abstraction模块解析 在每一个SA阶段内执行如下操作: - 对原始点集应用最远点采样(FPS),选取具有代表性的子样本作为中心节点; - 计算这些选定中心周围的球形区域内所有其他成员的位置偏移量及其对应的属性值; - 将得到的结果送入mini-PointNets完成局部区域描述符的学习过程; 以上步骤可以重复多次以适应不同的密度分布情况,并且每次迭代都会更新当前层级下的坐标系以便更好地反映物体内部关系变化趋势[^4]。 #### 4. Feature Propagation机制说明 当完成了由粗至细的信息浓缩之后,则需反方向传播已学到的知识给下一层待细化的部分。此间采用了插值方法填补因降维而丢失掉的具体细节,再结合先前保存下来的中间状态共同构成完整的表达形式。这一双向交互流程有助于保持空间连续性和连贯性的同时增强对复杂场景的理解能力[^2]。 ```python import torch.nn as nn from pointnet2_modules import PointnetSAModule, PointnetFPModule class PointNetPlus(nn.Module): def __init__(self): super(PointNetPlus, self).__init__() # 定义多个set abstraction 和 feature propagation 层... def forward(self, xyz): l0_xyz = xyz # 执行 set abstraction ... # 进行 feature propagation ... return final_features ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值