今天写点代码方面的内容,昨天已经简单讲解过paper了,只看文章的话,理解的效果一般,所以今天结合代码再来充分认识PointNet。代码分为分类、分割两部分,本文以分类为例。 网络结构 这部分代码位于pointnet_cls.py中。 PointNet中使用了maxpooling和T-net,作者文章中起到关键作用的是maxpooling,而T-net对性能的提升作用也还是有的。 接下来就重点分析PointNet中的T-net代码,这部分代码位于transform_nets.py脚本中。 下一篇会讲讲PointNet++,由于是改进版,所以可能会结合代码一起介绍。
PointNet (PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation) (作为第一个直接处理点云的深度学习框架 PointNet++ (PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space) 文章要解决的两个问题 使用PointNet作为局部特征学习器作为一个基础的结构部件,PointNet要在局部点集中抽取特征,或者把特征组合成更高层表示,所以PointNet++递归地使用PointNet在一个嵌套划分的输入点云集合上 (PointNet layer) 但是存在采样不均匀密度的问题。 PointNet网络进行特征提取(MSG、MRG),不断迭代。
个人实验的一些总结 对于点云的在深度学习上的运用可以参考其在深度学习在二维图像上的一些点来进行相关优化, 目前做的实验都只是按照传统的深度学习优化方法优化现有的模型, 对于正则化似乎对于整体的pointnet 的提升不是很大 一方面 pointnet 模型采用的是 L2 正则化,相比于 L1 正则化要更好,另一方面,采取的 alpha*L1+(1-alpha)*L2 可能效果更好, 因为调参的问题 总的来说,其他常规深度学习优化对于 pointnet 应该是能带来一些提升的,大家可以试一下。
++模型 Set Abstraction Layer(集合抽象层) 集合抽象层是PointNet++的核心模块,它通过迭代地采样点云中的点,并在每个采样点上应用PointNet来提取局部特征。 局部特征提取(Local Feature Extraction):对每个分组应用PointNet或类似的结构,提取局部特征。 多层感知机(MLP) 在PointNet++中,多层感知机(MLP)用于对点云中的点进行特征提取。MLP是一个简单的前馈神经网络,它可以在每个点上进行多次非线性变换,以提取更复杂的特征。 Symmetric Function(对称函数) PointNet++使用最大池化作为对称函数,以确保特征的排列不变性。这意味着无论点的顺序如何变化,提取的特征都是相同的。 这些层将特征向量映射到最终的分类标签或每个点的分割标签 PointNet++核心代码 特征提取核心代码 class PointNetSetAbstraction(nn.Module): def
Abstract Motivation:PointNet不能捕捉局部结构信息,因此限制了其在细粒度任务和复杂场景的泛化能力。 作者提出了一个层级的网络来学习上下文尺度逐渐增大的局部特征。 Introduction PointNet++的想法很简单,首先使用距离度量将点云分成若个个有重叠的子区域。使用网络在这些子区域上提取特征。 最后使用pointNet对这些“patch"抽取特征。 2. 如何通过特征提取器提取特征。 作者选用PointNet作者特征提取器。 PointNet layer: 使用PointNet来对一个个patch提取特征。 值得注意的是,输入pointnet的坐标需要进行一个处理。就是将每个点的坐标减去中心点坐标。 其实这个也很好理解,我们使用pointnet来提取的是这个patch的特征,坐标剪完就是个相对坐标(相对于一个patch中心点的 坐标)。
换个角度来讲,PointNet能够总结出表示某类物体形状的关键点,基于这些关键点PointNet能够判别物体的类别。这样的能力决定了PointNet对噪声和数据缺失的鲁棒性。 如图所示,作者通过实验列出了PointNet学习到的以下几个物体的关键点。 ? 3PointNet系列模型结构 3.1 PointNet ? 3.3 Frustum-PointNet 上述的PointNet和PointNet++主要用于点云数据的分类和分割问题,Frustum-PointNet(F-PointNet)将PointNet的应用拓展到了 将点云平移到计算得到的目标质心后,通过PointNet(或PointNet++)对3D bbox的中心、尺寸和朝向进行回归得到最终的输出。 4目标检测效果 因为目前我们主要考虑点云的目标检测问题,在此忽略PointNet和PointNet++论文中提出的分类和语义分割的效果,只考虑F-PointNet的检测效果。
[0lrup2k9hf.gif] PointNet++是PointNet的升级版本,增加了对局部信息的感知能力。体现到代码上的话,变化还是比较多的,我们以分类为例,对结构和代码进行分析。 网络结构 首先是网络结构方面,复习前任PointNet网络结构的,请点这里 改进版去掉了T-net,在网络层次上变多了,但是更加组织有序。 pointnet_sa_module模块的代码如下: def pointnet_sa_module(xyz, points, npoint, radius, nsample, mlp, mlp2, group_all 分类任务部分与PointNet差别不大,不再赘述。 小结 上述代码是pointnet2_cls_ssg.py,它的多尺度版本为pointnet2_cls_msg.py,单尺度版本搞清楚了,多尺度版本的理解也不成问题。
今天要聊的论文是斯坦福大学Charles等人在CVPR2017上发表的论文,提出了一种直接处理点云的深度学习网络——PointNet。 因为在PointNet之前,点云没办法直接处理。 由于点云是三维的、无序的,别说深度神经网络了,就是普通算法很多都不能奏效。 比如MVCNN的有些指标就不输PointNet。 这时候我们就会觉得,冥冥中一定存在一种网络,可以摆脱上面这些操作。 于是,PointNet出现了,从此点云处理领域分成“前PointNet时代”和“后PointNet时代”。接着,各种直接处理点云的网络也纷纷出现,如PointCNN、SO-Net,效果也是越来越好。 后续还会陆续讲到其他网络,并与PointNet做对比。
从PointNet到PointNet++,这个参数量笔者始终没搞明白,这里把计算过程放上来,希望有同学一起看看。 1、PointNet++中分类任务ssg版本的计算。 这里需要注意一点,计算conv_num的公式里,用红字标出来的‘+3’,这是代码里提到的,pointnet_sa_module首先进行sample_and_group运算,来看代码做了什么: sample_and_group 2.这里还想提一点,上一张图中,我们注意到作者说pointnet的Model size是40MB,但是pointnet论文里是这么写的: ? 3.5MB。 不知道两个数字为什么不一致。
可以发现,PointNet的结构并不复杂,比起CNN还要简单一些。理解PointNet关键在于理解一维卷积在网络中的作用,本文对该部分进行了详细的说明。 另外,可以看到,PointNet最大的缺陷就是没有考虑周围的局部信息,所有的卷积操作都是针对单个点的进行的。这一点在PointNet++中得到了关注,后面的文章会对其进行解读。 关于一维卷积conv1d 在PointNet中,用到的卷积操作都是conv1d,和卷积神经网络用到的conv2d有些不同,这里先介绍一下conv1d操作原理,这样能更好的理解数据在PointNet中是怎么变化的 05 延伸 在NLP的文本分类中,用的也是一维卷积,但和PointNet中卷积核大小总是1不同,文本分类网络中卷积核大小很多时候是大于1的。 但类似的做法并不能在PointNet中实现。
://github.com/fxia22/pointnet.pytorch(Pytorch实现) https://github.com/yanx27/Pointnet_Pointnet2_pytorch 虽然PointNet能够用于对各个点云局部提取特征,但是由于点云在各个局部均匀性不一致,很可能导致学习到的PointNet不能提取到很好的局部特征。 应用场景 从PointNet的结构可以看出,由于没有local context信息,因此对复杂的点云没办法处理,也是PointNet结尾总结的future work,即在PointNet++中进行了升级 refine或语义分割,如局部点云语义分割或3D BBox等目标的回归 至于为什么使用PointNet而不是使用PointNet++,从结构上可以看出PointNet++会有一个邻域中心和邻域点云索引的过程 不管点云网络的任务是什么,对于复杂场景点云一般采用PointNet++进行处理,而简单场景点云则采用PointNet。
pointnet训练文件pointnet/sem_seg/train.py注释 原文如下: import argparse import math import h5py import numpy as ', type=int, default=0, help='GPU to use [default: GPU 0]') parser.add_argument('--model', default='pointnet_cls ', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') parser.add_argument
使用对称函数,Pointnet使用的就是这种方法。 Pointnet网络主要使用对称函数解决点的无序性问题,对称函数就是指对输入顺序不敏感的函数。如加法、点乘、max pooling等操作。 ', help='Model name: pointnet_cls or pointnet_cls_basic [default: pointnet_cls]') parser.add_argument 针对Pointnet论文作者提供的版本(Tensorflow)的源码如下:https://github.com/charlesq34/pointnet 对于pointnet源码其余部分的介绍不详细展开, 针对pointnet存在的点与点之间相关性的缺失,在pointnet++中使用局部采样+分组+pointnet的结构进行解决,并考虑到了点云的稀疏性解决方案,之后很多深度学习的研究在此基础上展开,习惯上称为 https://github.com/yanx27/Pointnet_Pointnet2_pytorch
众所周知,frustum-pointnet是斯坦福大学PointNet作者Chales大神的成果,将pointnet用到了目标检测中,测试数据集是KITTI。
Q3:为什么PointNet是重要的? 这个后面会说,直接对点云使用深度学习、解决了点云带来的一系列挑战,PointNet应该是开创性的。 但我觉得,真正让PointNet具备很大影响力的,还是它的简洁、高效和强大。 首先要说清楚,PointNet所作的事情就是对点云做特征学习,并将学习到的特征去做不同的应用:分类(shape-wise feature)、分割(point-wise feature)等。 PointNet之所以影响力巨大,就是因为它为点云处理提供了一个简单、高效、强大的特征提取器(encoder),几乎可以应用到点云处理的各个应用中,其地位类似于图像领域的AlexNet。 另外PointNet在众多细节设计也都进行了理论分析和消融实验验证,保证了严谨性,这也为PointNet后面能够大规模被应用提供了支持。 本文仅做学术分享,如有侵权,请联系删文。
PointNet 但是,如果尝试使用点云代替呢? 主要有三个约束: 点云是无序的。算法必须对输入集的排列保持不变。 如果我们旋转椅子,它仍然是椅子,对吗?网络对于不变的转换必须是不变的。 PointNet的作者介绍了一种将所有这些属性都考虑在内的神经网络。它设法解决分类,部分和语义分割任务。 https://arxiv.org/pdf/1612.00593.pdf ? master/nbs/PointNetClass.ipynb 2.1.数据集 在原始论文中,作者在ModelNet40形状分类基准上评估了PointNet。 3.最后的话 实现了PointNet,这是一种深度学习架构,可用于各种3D识别任务。即使在这里实现了分类模型,分段,正态估计或其他任务也只需要在模型和数据集类中进行较小的更改。 齐,苏昊,莫凯春,莱昂尼达斯· 吉巴斯,PointNet:针对3D分类和分割的点集深度学习(2017),CVPR 2017 http://stanford.edu/~rqi/pointnet/ [2]
本文是关于PointNet点云深度学习的翻译与理解,PointNet是一种直接处理点云的新型神经网络,它很好地体现了输入点云的序列不变性。 摘要 点云是一种重要的几何数据结构类型。 命名为 PointNet,从对象分类,部分分割到场景语义分析等方面提供了一个完整的体系结构。虽然简单,但 PointNet是高效且有效。从经验上讲,它表现出很强的 PAR 水平,甚在至比现有技术更好。 PointNet 的应用,我们提出了一种新颖的深层网络体系结构,它利用原始点云(点集)而不需要体素化或渲染。 理论分析提供了一个理解为什么我们的 PointNet 对输入点的小扰动以及通过点插入(异常值)或删除(缺失数据) 具有很强的鲁棒性。 在一个统一的体系结构下,我们的 PointNet 不仅速度更快,而且表现的性能很好,甚至比现有技术更好。
摘要 这篇文章[1]是 PointNet 的改进版。PointNet 是直接将神经网络用于点云数据处理的先锋,虽然 PointNet 在 3D 任务上取得不错的效果,但其还是存在不足。 PointNet++ 则针对这个问题,在 PointNet 基础上引入了层级式的嵌套结构来捕获局部特征。 受感于 CNN,作者将这种层级结构引入到 PointNet 中,设计出了 PointNet++。 作者指出,PointNet++ 的一大贡献点在于:PointNet++ 在多尺度下利用了相邻点信息,使得学习更鲁棒且细粒度。 对于 PointNet 层,作者这里并不是直接使用原版的 PointNet[2],而是在其基础上加入了多尺度信息。
论文地址:https://arxiv.org/abs/1706.02413 代码:https://github.com/charlesq34/pointnet2.git 来源:斯坦福大学 论文名称:PointNet PointNet是一个先锋在这个领域。然而他不能捕获空间点引起的局部结构特征,这限制了其对细微场景的和复杂场景的表示能力。 本文中提出了递归的网络结构,嵌入到PointNet中,嵌入的处理输入的点云序列。通过使用空间距离,我们的网络能够通过不断增加的上下文范围来学习本地特性。 本文的网络结构被命名为PointNet++。实验结果表明,本文网络结构可以有效和鲁棒的学习点云的特征结构。特别是在具有挑战性的数据集上获得的结果显著优于当前最先进的算法水平。
本文是关于PointNet点云深度学习的翻译与理解,PointNet是一种直接处理点云的新型神经网络,它很好地体现了输入点云的序列不变性。 图2 PointNet 架构。分类网络以 n 个点作为输入,应用输入和特征转换,然后通过 max pooling 合并点特征。输出是 k 类的分类分数。分割网络是对分类网络的扩展。 PointNet 架构 我们的完整网络体系结构在图 2 中可见,其中分类网络和分割网络共享大部分结构。请阅读图 2 的标题。