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

人工智能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就结束了。

相关文章:

  • 自然语言处理:第九十章 如何使用Jina API进行语义切分
  • 王炸 用AI+飞书 分解 一键生成 项目计划表模版
  • AF3​​​​​​​ parse函数解读
  • 以下是C++从入门到精通的学习路径及实践方法,结合系统学习框架与实战经验,帮助普通人和程序员高效掌握并开发第一个产品
  • LlamaFactory可视化模型微调-Deepseek模型微调+CUDA Toolkit+cuDNN安装
  • Spark Streaming是如何实现实时大数据处理的
  • 前端如何播放二进制音频数据
  • 使用AWS Amplify AI Kit和Neon Postgres构建基于RAG的应用程序
  • string类详解(上)
  • 【AscendC】复现AI原生创新算子挑战赛S1(二)
  • 以 Serverless 低成本的⽅式 快速在亚马逊云科技上部署 DeepSeek
  • linux中(base) [root@ZS ~]# 是什么情况,怎么退出
  • DeepSeek 对成语理解能力的研究与分析
  • npm install --legacy-peer-deps和npm install --force的区别
  • Cookie介绍及使用场景
  • 图片属性——位深度
  • 学习threejs,使用PointLight点光源
  • EasyExcel的简单使用
  • es-head 正则查询和标准正则查询的差异
  • 基于Dify、Ollama与DeepSeek的私有化AI知识库构建:工具作用、场景与优势分析
  • 人社部:将会同更多部门分行业、分领域制定专项培训计划
  • 多地征集农村假冒伪劣食品违法线索,全链条整治“三无”产品
  • 三杀皇马剑指四冠,硬扛到底的巴萨,赢球又赢人
  • 民航局:预计五一假期民航旅客运输量创同期历史新高,将加强价格管理
  • 2025年“畅游江淮 合肥等侬”文旅推介会在沪成功举办
  • 视频丨伊朗阿巴斯港一处油罐发生高强度爆炸:造成大面积破坏,伤亡不明