每周总结(四)

本文介绍了PointNet++的学习心得,重点解析了PointNet++的结构,包括基本原理、SA层、密度自适应策略,以及在程序调试中遇到的问题和解决方案,特别是点云局部区域的特征提取和最远点采样方法。
摘要由CSDN通过智能技术生成

2020年第42周学习小结:

本文为10月12日~10月18日的学习小结。
本周学习了PointNet++的论文及相应的代码(分类部分)。PointNet++网络结构的搭建借鉴了CNN的思想。通过层次结构应用PointNet(SA层)来提取点云特征,同时在特征提取模块中引入了特殊结构(MSG与MRG)来解决点云密度分布不均匀的问题,取得了很好的结果。

论文阅读 PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

基本原理

PointNet++网络的改进指出在于它借鉴了CNN的思想来保留点云中局部区域的特征。网络中中定义了一个SA层用于提取点云特征,能够更好的保留点云的局部信息。
举个例子,下图为LeNet的网络结构,对输入图像中的局部区域(如3*3共9个像素点大小)做卷积操作得到一个特征,反复卷积直到提取原始图像中没个局部区域的特征。再对这些特征组成的图做相同的操作,最终输入的图像经过多层卷积层不断抽象得到了最终用于分类的特征。
LeNet网络结构
而下图为PointNet++中对应的结构:
PointNet++网络结构
图中的虚线圆圈就类似CNN中的卷积核,将圆圈内所有点提取为一个特征即为局部特征提取,所有输入点经过SA层后将会变成一个个特征点。最终点云经过一层层SA层抽象为了点云的特征。

可以看到SA层与CNN中的卷积层非常相似,都是选取中心点,由其领域中的所有点得到特征。但由于点云的性质导致无法直接应用3D CNN。

PointNet首先对点云进行标准化(T-Net)再应用MLP,最大池化层等结构来提取整个点云的信息,最终会导致局部特征的丢失。
我认为PointNet++就是逐层使用小型的PointNet网络来提取点云特征(类似CNN中的卷积操作)。

为了实现以上结构,有以下两点问题需要解决:

  • 局部区域的选择

在二维图像中,局部区域即每个卷积核,卷积中心就是一个个的像素点,它们排列有序,使用固定大小的卷积核就能有效的覆盖整幅图像。

但在点云中,各点之间的距离是不相等的,因此局部区域的中心的选择较为重要,它决定了最终能否有效覆盖整个点云。而局部区域的大小,即邻域的选择也要考虑到点云分布不均的特点。

  • 如何将局部区域中的点信息提取为一个特征点?

在CNN中,特征提取就是简单的卷积操作,对卷积中心及其邻域应用卷积核相乘就能得到一个结果,即局部区域的特征。

PointNet++中使用PointNet来实现特征提取,即对每个局部区域应用小型的PointNet来得到局部区域的信息。

SA层

PointNet++中定义了一个SA层(set abstraction)用于解决以上问题。单个SA层由采样层,分组层以及PointNet层三个模块组成。
采样层用于从输入集合中选出每个局部区域的中心点,分组层用于构建局部区域点集,通过这两层完成局部区域的划分。PointNet层使用小型PointNet网络用于提取局部区域的特征,这一层用于聚合局部区域的特征。

  • 采样层

采样层使用了最远点采样(FPS,farthest point sampling)来进行局部区域中心的选择,这种方式相比随机采样能够更好的覆盖整个输入点集。

假设点云中有N个点,用向量d表示每个点的坐标,向量C表示点的特征。由PointNet++的网络结构图可以看出,输入为N*(d+C)的点云,经过采样层,由最远点采样选出了K个局部中心,用于分组层进行区域划分。

  • 分组层

在划分局部区域时使用了球型邻域,将局部区域中心点周围球型邻域的点分为一组,用于后续的特征提取。

分组层根据采样层选出的中心点将点云分为了K个不同大小的局部区域,最终输出N1*K*(d+C),N1为每个局部邻域中点的数量。

  • PointNet层

这层对每个局部区域应用PointNet进行特征的提取,最终输出一个个新的特征点,对应输入邻域的局部特征。

输入为K组邻域点,使用PointNet对每个局部区域进行特征提取,得到一个长度为C1的特征向量。最终输出为N1*(d+C1)的形式,即N1个特征点组成的点集,此时点的数量相比输入下降了,但每个点的特征却包含了更多的信息。

密度自适应

邻域大小的选择对特征学习较为重要,在CNN中,使用较小的卷积核一般能获得更好的性能,但并不同样适用于点云。点云的分布不均匀,有些地方稀疏,若使用较小的邻域,那么该局部区域中的点过少会导致PointNet层无法有效的学习到局部信息。为了解决这一问题,PointNet++设计了两种分组策略:多尺度分组与多分辨率分组,如下图:

MSG与MRG

  • 多尺度分组

多尺度分组(MSG,Multi-scale grouping)即采用不同尺寸的邻域,同时提取特征,并将这些不同尺度的特征组合起来作为局部区域的整体特征。

由于在网络浅层时输入点数量较多,因此采样得到的中心点较多,使用MSG方法就意味着要在如此多的邻域中应用PointNet层提取特征,计算量太大。

  • 多分辨率分组

多分辨率分组(MRG,Multi-resolution grouping)提取到的特征向量由两部分组成,左边的部分(s1)是由上层的3个中心点提取得到的,而每个中心点都是由上上层相应的领域中的点得到的,同时将这些点视为一个大的局部空间,并提取特征(s2)。

当点云的局部区域较为稀疏时,经过一个SA层得到的中心点就更少了,此时s1就不如s2更能表征点云中该区域的特征。当局部区域较为密集时,经过两层抽象得到的特征s1包含的信息更多。

简单概括一下:
MSG是对同一层的点,采用一组不同大小的邻域同时提取特征并组合为整体特征。
MRG是分别对不同层次的点进行特征提取,并组合为整体特征。可以看出该方法相比MSG计算效率要更高。

程序调试

准备工作

程序我使用的是pytorch版本

PointNet++下载地址(pytorch版本)
https://github.com/yanx27/Pointnet_Pointnet2_pytorch

论文作者编写的程序为TF版本,但是需要修改的地方较多,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一周 在我的第一周实习,我被分配到了软件开发团队。我接受了我的同事们的介绍和指导,并开始了我的工作。我学习了公司的开发流程和规范,并熟悉了项目使用的技术和工具。这周我主要学习了Python编程语言和Django框架,并且完成了一些小任务,如编写简单的Python脚本和创建一个Django应用程序。我还学习了如何使用版本控制系统Git,并学会了如何提交代码和合并分支。 第二周 在第二周,我接手了一个小项目,这个项目是一个基于Django的Web应用程序。我学习了项目的功能和架构,并对其进行了一些改进。我加入了一些新的功能,比如用户验证和数据存储,同时也修复了一些已知的问题。在这个过程,我学习了如何调试和测试应用程序,并且深入了解了如何使用Django ORM访问数据库。 第三周 在第三周,我与同事们一起开展了一个小型团队项目。这个项目旨在为公司的客户提供一个在线购物平台。我在这个项目负责开发前端界面,并使用React框架创建了几个组件。在这个过程,我学习了React的基本概念和语法,并掌握了如何将组件和API集成到前端。 第周 在第周,我继续负责前端开发,并且开始使用Redux管理应用程序的状态。这个项目也涉及到了一些后端开发,所以我还学习了如何使用Node.js和Express框架编写API,并了解了如何使用MongoDB存储数据。我还学习了如何使用Webpack打包应用程序,并将其部署到Heroku云服务器上。 第五周 在第五周,我们决定使用GraphQL作为我们的API技术栈。我花了一些时间学习GraphQL的基础知识,并使用Apollo Client在前端集成了它。我还使用Prisma ORM替换了MongoDB,并学习了如何使用它访问PostgreSQL数据库。 第六周 在第六周,我加入了另一个小型团队项目。这个项目是一个基于机器学习的图像分类器。我负责开发前端和API,并使用React和Node.js编写了应用程序。我还学习了如何使用TensorFlow和Keras编写机器学习模型,并在这个项目应用了这些知识。 第七周 在第七周,我继续开发机器学习应用程序,并与同事一起解决了一些挑战。我还花了一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值