当前位置: 首页 > article >正文

人工智能3d点云之Pointnet++项目实战源码解读(点云分类与分割)

一.项目文件概述

二.数据读取模块配置

实际代码运行时是先定义与加载好模型,然后再去读取数据进来传入到模型网络中去训练。但现在反过来先读取数据开始。

进入ModelNetDataLoader类的_getitem方法,

做标准化的目的是处理异常大的数值

上面返回的cls是类别,相当于标签(Y)。point_set就是由六列(特征)组成一个点,共1024个点的矩阵。这时dataload构建完成了。

三.网络模型架构

dataload完成可以读取数据后,现在就传入网络结构进行前向传播了,这里在配置文件中可知用的是pointnet2_cls_msg模型来的,所以进入这个类的构造方法与forward方法中。

sa1到sa3层是整个Pointnet++的核心部分

补充上图中的[8,3,1024]中的8是指batch_size。

现在进入sa1定义的类中,如下图:

四.最远点采样

还是在s1对应的forward方法中,

上图中只是做采样操作,还没做特征提取或权重参数计算,所以输入只要原始数据的坐标信息即可。下面进入到最远点采样方法farthest_point_sample中,

对于第一个中心点,它是在每个batch中它会随机初始化一个最远点的索引作为第一个中心点。

五.采样得到中心点

上图中所有现在对红色的其中一个(其实它是剩下的未确定的红色的所有点都会这样做),这里只是说一个例子。上图中即最小的那个mask为ture,其它就false。下面就按这个boolean值来更新初始化的distance矩阵(直接更新值到这个矩阵中),如下图:

上图中就是把与确定点最近的点的坐标更新到更新表(distance)中了,那未更新到的点还是保持比较大的。下一步就是从distance表中选出距离最大的那个值来:

上图中的这个思想也是值得学习运用到其它项目的。

这时最远点采样点就确定,搞定了。

六.组区域划分方法

注意上面最远点采样返回的是索引值来的,下面进入index_points方法中,这方法主要就是按这些索引值去原始坐标值中检索到真实坐标值回来。如下图:

七.实现group操作得到各中心簇

进入到query_ball_point方法中,这个也核心方法,如下图:

返回结果回去,至此query_ball_point方法结束,它每一行表示簇(例512),一簇有16个点,batchsize=8,所以它的shape就是8*512*16,这个矩阵中的值都是ID值来的,不是实际的值。

八.特征提取模块整体流程

现在要进行特征提取操作了,那首先要得到实际的值来,

以前版本是特征与特征间没联系,现在簇中内容都得到了,那么肯定会有联系了

上图中是法向量特征与分组完的位置特征接拼在一起的意思。

下面开始提特征操作了:

上图中max是指选出某个维度中的最大值,本例中指定的是2,所以它就是说对在簇中的所有点(例16个)中取最大的一个出来就行了,类似做了下采样。

这时对于每一个半径围成的圆中点的特征已经算出来了,放入list中,现在for剩下半径围成的点的特征。

为什么要多个半径来提取特征,目的就是提取到的特征更丰富。下面就把放到new_points_list中的特征拼接在一起,特征个数将累加起来,shape为(8,320,512)如下图:

至此不同半径的特征已经提取完,并拼接返回回去,s1也就结束了。

九.预测结果输出模块

现在开始调用s2了,它的传入参数是s1的二个返回结果(原始位置信息和提取的特征).

s2与s1的操作是一样的。进入s3时它是当作1个簇了,如下图:

我们最终是要得到40分类的结果,那现在经过第一个全连接后得到512不满足,所以继续做全连接,bn与relu,drop,直到fc3后输出40类,如下图:

到这里由拿到数据进入网络模型进行前向传播(不同半径的特征提取与拼接,分类预测)就结束了,下面看下它的数据是怎么拿的。

十.分类任务总结

它获取数据后会做一些数据增强的操作,例如drop删除掉一些数据,又如数据缩放(相当于乘法),数据加减法等操作。如下图:

得到分类的预测结果后,将结合实际值得到损失值,再然后做反向传播与梯度下降,如下图:

十一.分割任务数据与配置概述

由上图看出分割是要对每个点都要做分类的,看它是归属那一个类别当中。而不像分类一样后面做maxpool对全局特征预测就行。

十二.分割需要解决的任务概述

而分类的话经过s3后做下采样,最后其实是变成1个点的特征,而分割就是后面做上采样变成为2048个点进行分类开,如下图:

下面就只看上采样的代码了:

十三.上采样完成分割任务

它调用fp3其实开始做上采样操作,把这四个参数值传入到pointnet_util中的PointNetFeaturePropagation类下的forward方法中

上面所说的1024维向量就当作是1024个特征。

上图中所说近的距离的权重会大一点,远距离的权重就小一点。

经过多个层运算后,得到如下图:

最后就调用softmax就结束了。


http://www.kler.cn/a/550263.html

相关文章:

  • OpenGL ES - 数学基础
  • 什么是网络安全威胁?常见威胁有哪些?
  • 从低清到4K的魔法:FlashVideo突破高分辨率视频生成计算瓶颈(港大港中文字节)
  • Java并发编程5--Java内存模型的基础
  • 同步异步日志系统-项目介绍
  • 【MySQL】第六弹---数据库表约束详解:从空属性到主键的全方位指南
  • Vue 前端开发中的路由知识:从入门到精通
  • DeepSeek 的创新融合:多行业应用实践探索
  • Android 中使用 FFmpeg 进行音视频处理
  • 网工项目理论1.7 设备选型
  • node.js + html调用ChatGPTApi实现Ai网站demo(带源码)
  • PosgreSQL比MySQL更优秀吗?
  • 容联云联络中心AICC:深度整合DeepSeek,业务验证结果公开
  • MDX语言的安全开发
  • 安全筑基,智能赋能:BeeWorks IM引领企业协同新纪元
  • 缺陷检测之图片标注工具--labme
  • 汇能感知摄像头模组/模块产品有哪些?
  • 【Linux】进程间通信——进程池
  • Python----数据结构(双向链表:节点,是否为空,长度,遍历,添加,删除,查找,循环链表)
  • BT401双模音频蓝牙模块如何开启ble的透传,有什么注意事项