【论文阅读】PointNet++论文解读以及代码分析(超全)

PointNet系列

第一章 【论文阅读】PointNet论文解读
第二章 【论文阅读】PointNet++论文解读以及代码分析(超全)



前言

上一篇文章主要介绍了点云处理的经典之作PointNet的整体思想和框架,本篇文章将介绍其团队基于PointNet改进的PointNet++。文章核心的一点就是提出了多层次特征提取结构。具体而言就是在输入点集中利用farthest point sampling选择一些点作为中心点,然后围绕每个中心点选择周围的点组成一个区域,将每个区域作为PointNet的一个输入样本,这样就得到了一组该区域的特征。之后中心点不变,扩大区域,把上一步得到的那些特征作为输入再送入PointNet,循环反复,不断提取局部特征,扩大局部范围,最后得到一组全局的特征,然后进行分类或者分割。文章还提出了多尺度方法解决样本中点云密度不均匀的问题,增加模型的鲁棒性。
PointNet++代码


1. PointNet的不足与PointNet++的解决方法

1.1 PointNet存在的问题

PointNet存在的一个缺点就是无法获取局部特征。在PointNet中,要不就是对单个点进行 1 × 1 1×1 1×1卷积操作,要不就是对所有点进行最大池化获得全局特征,虽然每个点都映射到了高维空间中,但还是丢失了很多局部信息,如下图:
在这里插入图片描述
从很多实验结果可以看出,PointNet对于场景的分割效果十分一般,所以提取局部区域特征就成了改进的一个方向。为了解决这一问题,PointNet++提出了首先选取一些比较重要的点作为每个局部区域的中心点,然后再中心点的周围选取k个近邻点,再将k个近邻点作为一个局部点云丢入PointNet中提取特征。

1.2 PointNet++采用的解决方法

为了解决PointNet网络无法提取局部特征的问题,在PointNet++中,作者借鉴了CNN的多层感受野的思想。首先,在整个点云的局部采样并划分为具有重叠的局部区域,在局部区域中通过PointNet提取局部特征,然后扩大范围,在这些局部特征的基础行提取更高层次的特征,直到提取整个点云集的全局特征,整个过程和CNN网络提取特征的过程类似。

2. PointNet++网络结构详解

在这里插入图片描述

2.1 改进特征提取方法

PointNet++在PointNet的基础上加入了多层次结构,使得网络能够在越来越大的区域上提供更高级别的特征,每一次提取就称为set abstraction,主要包括3个部分:Sampling layer, Grouping layer and PointNet layer。

  • Sample layer:使用最远点采样法(FPS)对输入点进行采样,选出若干个中心点。FPS算法是随机选取一个点,然后选择离这个点最远的点加入到结果集中,迭代这个过程,直到结果集中点的数量达到某个给定值。
  • Grouping layer :在上一层提取出的中心点的某个范围内寻找最近的k近邻点组成一个group。
  • PointNet layer:将k个区域通过小型PointNet网络得到的特征作为k个中心点的特征。
    在这里插入图片描述
    上图展示了set abstraction的过程。每一组set abstraction得到的中心点的特征向量集,会作为下一组set abstration的子集,随着层数加深,中心点的个数会越来越少,但是每一个中心点包含的信息会越来越多。在msg中,第一层set abstraction取中心点512个,半径分别为0.1、0.2、0.4,每个圈内的最大点数为16,32,128。
    每一组SA的输入是 N × ( d × C ) N×(d×C) N×(d×C),其中 N N N是输入点数量, d d d是坐标维度, C C C是特征维度;输出是 N ′ × ( d × C ′ ) N^{'}×(d×C^{'}) N×(d×C),其中 N ′ N^{'} N是输出点数量, d d d是坐标维度不变, C ′ C^{'} C
  • 14
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是 PointNet++ 加注意力机制改进的代码示例: ```python import tensorflow as tf def get_attention_weight(x, y, dim): """ 获取注意力权重 :param x: 输入特征向量 :param y: 相关特征向量 :param dim: 特征向量维度 :return: 注意力权重 """ w = tf.Variable(tf.random_normal([dim, 1], stddev=0.1), name='attention_w') b = tf.Variable(tf.zeros([1]), name='attention_b') z = tf.matmul(tf.concat([x, y], axis=1), w) + b a = tf.nn.softmax(z) return a def get_attention_feature(x, y, dim): """ 获取注意力特征向量 :param x: 输入特征向量 :param y: 相关特征向量 :param dim: 特征向量维度 :return: 注意力特征向量 """ a = get_attention_weight(x, y, dim) f = tf.concat([x, y], axis=1) * a return f def pointnet_plus_plus_attention(x, k, mlp, is_training): """ PointNet++ 加注意力机制改进 :param x: 输入点云数据,shape为(batch_size, num_points, num_dims) :param k: k-NN 算法中的 k 值 :param mlp: 全连接网络结构 :param is_training: 是否为训练 :return: 输出结果,shape为(batch_size, num_points, mlp[-1]) """ num_points = x.get_shape()[1].value num_dims = x.get_shape()[-1].value with tf.variable_scope('pointnet_plus_plus_attention', reuse=tf.AUTO_REUSE): # 首先进行 k-NN 建模,找到每个点的 k 个最近邻点 # 根据每个点与其 k 个最近邻点的距离,计算点之间的权重 dists, idxs = knn(k, x) # 将点特征和最近邻点特征进行拼接 grouped_points = group(x, idxs) grouped_points = tf.concat([x, grouped_points], axis=-1) # 对拼接后的特征进行全连接网络处理 for i, num_output_channels in enumerate(mlp): grouped_points = tf_util.conv1d(grouped_points, num_output_channels, 1, 'mlp_%d' % i, is_training=is_training) # 对每个点和其最近邻点进行注意力权重计算 attention_points = [] for i in range(num_points): center_point = tf.expand_dims(tf.expand_dims(x[:, i, :], axis=1), axis=1) neighbor_points = tf.gather_nd(grouped_points, idxs[:, i, :], batch_dims=1) attention_feature = get_attention_feature(center_point, neighbor_points, num_dims * 2) attention_points.append(tf.reduce_sum(attention_feature, axis=1, keep_dims=True)) # 将注意力特征向量拼接起来,作为输出结果 output = tf.concat(attention_points, axis=1) return output ``` 在这个代码中,我们使用了 `get_attention_weight` 函数来获取注意力权重,并使用 `get_attention_feature` 函数来获取注意力特征向量。在 PointNet++ 加注意力机制改进中,我们对每个点和其 k 个最近邻点计算了注意力权重,然后用注意力权重加权求和得到了注意力特征向量,最后将所有注意力特征向量拼接起来作为输出结果。 请注意,这只是一个简单的示例,实际上,PointNet++ 加注意力机制改进的实现要比这个复杂得多。如果您需要更复杂的实现,建议参考相关论文或其他开源实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值