人工智能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就结束了。
相关文章:
人工智能3d点云之Pointnet++项目实战源码解读(点云分类与分割)
一.项目文件概述 二.数据读取模块配置 实际代码运行时是先定义与加载好模型,然后再去读取数据进来传入到模型网络中去训练。但现在反过来先读取数据开始。 进入ModelNetDataLoader类的_getitem方法, 做标准化的目的是处理异常大的数值 上面返回的cls是类别,相当于…...
IP 路由基础 | 路由条目生成 / 路由表内信息获取
注:本文为 “IP 路由” 相关文章合辑。 未整理去重。 IP 路由基础 秦同学学学已于 2022-04-09 18:44:20 修改 一. IP 路由产生背景 我们都知道 IP 地址可以标识网络中的一个节点,并且每个 IP 地址都有自己的网段,各个网段并不相同…...
Redis 启用自动内存碎片清理异常
Redis 启用自动内存碎片清理异常 127.0.0.1:6379> config set activedefrag yes (error) DISABLED Active defragmentation cannot be enabled: it requires a Redis server compiled with a modified Jemalloc like the one shipped by default with the Redis source dis…...
java后端开发day16--字符串(二)
(以下内容全部来自上述课程) 1.StringBuilder 因为StringBuilder是Java已经写好的类。 java在底层对他进行了一些特殊处理。 打印对象不是地址值而是属性值。 1.概述 StringBuilder可以看成是一个容器,创建之后里面的内容是可变的。 作用…...
LabVIEW危化品仓库的安全监测系统
本案例展示了基于LabVIEW平台设计的危化品仓库安全监测系统,结合ZigBee无线通信技术、485串口通讯技术和传感器技术,实现了对危化品仓库的实时无线监测。该系统不仅能提高安全性,还能大幅提升工作效率,确保危化品仓库的安全运营。…...
深度学习框架探秘|Keras 应用案例解析以及 Keras vs TensorFlow vs PyTorch
引言 上一篇文章《深度学习框架探秘|Keras:深度学习的魔法钥匙》 我们初步学习了 Keras,包括它是什么、具备哪些优势(简洁易用的 API、强大的兼容性、广泛的应用领域),以及基本使用方法。本文,…...
VINS-mono代码笔记
feature_tracker_node.cpp: 一、通过roslaunch文件的参数服务器获得配置参数 二、获得相机的内参 三、订阅图像,img_callback: 1、第一帧图像只记录时间戳 2、与之前时间戳比较一下,判断是否要发布当前帧,避免高频率发送ÿ…...
Maven下载安装IDEA使用MavenJava在pom.xml配置教程
一、Maven 简介 Maven 是一个强大的项目管理和构建工具,主要用于 Java 项目的构建、依赖管理和文档生成等。它通过一个统一的 XML 文件(pom.xml)来管理项目的整个生命周期,包括编译、测试、打包、发布等环节。 二、Maven 下载与…...
NAT(网络地址转换)技术详解:网络安全渗透测试中的关键应用与防御策略
目录 NAT的作用 NAT类型 NAT工作流程示例 NAT 转换技术的原理 源地址转换(SNAT,Source NAT): 目标地址转换(DNAT,Destination NAT): 端口地址转换(PAT,…...
newgrp docker需要每次刷新问题
每次都需要运行 newgrp docker 的原因: 当用户被添加到 docker 组后,当前会话并不会立即更新组信息,因此需要通过 newgrp docker 切换到新的用户组以使权限生效 如果不想每次都手动运行 newgrp docker,可以在终端中配置一个自动刷新的脚本。…...
【FastAPI 使用FastAPI和uvicorn来同时运行HTTP和HTTPS的Python应用程序】
在本文中,我们将介绍如何使用 FastAPI和uvicorn来同时运行HTTP和HTTPS的 Python应用程序。 简介 FastAPI是一个高性能的Web框架,可以用于构建快速、可靠的API。它基于Python的类型提示和异步支持,使得开发者可以轻松地编写出安全且高效的代…...
容器化部署Kafka的最佳实践:基于KRaft模式的无ZooKeeper方案
一、docker 部署kafka单节点 1.1安装docker 可以参考这篇CentOS 7安装docker并配置镜像加速 1.3 运行kafka(注意修改zookeeper,kafka地址) docker run -d --name kafka -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://172.16.10.180:9092 -p …...
20250214 随笔 线程安全 线程不安全
1. 什么是线程安全 & 线程不安全? 线程安全(Thread-Safe):在多线程环境下访问同一个对象时,不会产生数据竞争、不会出现数据不一致的问题。线程不安全(Not Thread-Safe):在多线…...
rem、em、vw区别
在前端开发里,rem、em、vw都是用来设置元素大小的单位,下面就用大白话讲讲它们的区别。 参考标准不一样 rem:就像大家都用同一把“大尺子”来量东西,这把“大尺子”就是网页里根元素(也就是 <html> 标签&#…...
【PHP】php+mysql 活动信息管理系统(源码+论文+数据库+数据库文件)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【PHP】php 活动信息管理系统(源码论文…...
cURL请求与Javascript请求转换工具
cURL请求与Javascript请求在线转换工具(如 curlconverter) 首先,看看各个证据中关于curl的定义。提到cURL是“Client for URLs”的缩写,最初全大写是为了方便记忆,社区也将其解释为“Client URL Request Library”或递归的“Curl URL Request Library”。同时,还指出cURL…...
rv1103b编译opencv
opencv-3.4.16,png的neon会报错,如果想开可以参考 https://blog.csdn.net/m0_60827485/article/details/137561429 rm -rf build mkdir build cd build cmake -DCMAKE_BUILD_TYPERELEASE \ -DCMAKE_C_COMPILERxxx/arm-rockchip831-linux-uclibcgnueabih…...
thingboard告警信息格式美化
原始报警json内容: { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…...
OpenHarmonry 5.0.1源码下载与编译
预置环境:硬盘500G、内存32G、Ubuntu 20.04.6 LTS Ubuntu系统下载路径:ubuntu-releases安装包下载_开源镜像站-阿里云 一、必需环境 sudo apt-get update && sudo apt-get install binutils binutils-dev git git-lfs gnupg flex bison gperf…...
【Python深入浅出㊸】解锁Python3中的TensorFlow:开启深度学习之旅
目录 一、TensorFlow 简介1.1 定义与背景1.2 特点 二、Python 3 与 TensorFlow 的关系2.1 版本对应2.2 为何选择 Python 3 三、安装 TensorFlow3.1 安装步骤3.2 验证安装 四、TensorFlow 基本概念与使用方法4.1 计算图(Graph)4.2 会话(Sessio…...
STM32 外部中断和NVIC嵌套中断向量控制器
目录 背景 外部中断/事件控制器(EXTI) 主要特性 功能说明 外部中断线 嵌套向量中断控制器 特性 中断线(Interrupt Line) 中断线的定义和作用 STM32中断线的分类和数量 优先级分组 抢占优先级(Preemption Priority) …...
string类详解(上)
文章目录 目录1. STL简介1.1 什么是STL1.2 STL的版本1.3 STL的六大组件 2. 为什么学习string类3. 标准库中的string类3.1 string类3.2 string类的常用接口说明 目录 STL简介为什么学习string类标准库中的string类string类的模拟实现现代版写法的String类写时拷贝 1. STL简介 …...
DeepSeek教unity------Dotween
1、命名法 Tweener(补间器):一种控制某个值并对其进行动画处理的补间。 Sequence(序列):一种特殊的补间,它不直接控制某个值,而是控制其他补间并将它们作为一个组进行动画处理。 Tw…...
AIP-146 泛化域
编号146原文链接AIP-146: Generic fields状态批准创建日期2019-05-28更新日期2019-05-28 API中的大多数域,无论是在请求、资源还是自定义应答中,都有具体的类型或模式。这个模式是约定的一部分,开发者依此约定进行编码。 然而,偶…...
【Go并发编程】Goroutine 调度器揭秘:从 GMP 模型到 Work Stealing 算法
每天一篇Go语言干货,从核心到百万并发实战,快来关注魔法小匠,一起探索Go语言的无限可能! 在 Go 语言中,Goroutine 是一种轻量级的并发执行单元,它使得并发编程变得简单高效。而 Goroutine 的高效调度机制是…...
【前端】Vue组件库之Element: 一个现代化的 UI 组件库
文章目录 前言一、官网1、官网主页2、设计原则3、导航4、组件 二、核心功能:开箱即用的组件生态1、丰富的组件体系2、特色功能亮点 三、快速上手:三步开启组件化开发1、安装(使用Vue 3)2、全局引入3、按需导入(推荐&am…...
第十五天 学习并实践HarmonyOS应用的基本结构、页面导航和状态管理
HarmonyOS应用开发入门:从基本结构到状态管理实战指南 前言 (约300字,说明HarmonyOS的发展前景,应用开发的市场需求,以及本教程的核心价值。强调手把手教学特点,降低学习门槛) 一、HarmonyOS应…...
Cursor生成JAVA相关的关键词提示规则
在项目根目录创建一个.curstorrules文件(注意有个小数点),之后在该文件内填入下面内容 你是 Java 编程、Spring Boot、Spring Framework、Maven、JUnit 及相关 Java 技术的专家。 代码风格与结构 编写整洁、高效且文档完善的 Java 代码&am…...
数据结构:队列(Queue)及其实现
队列(Queue)是一种广泛使用的线性数据结构,它遵循先进先出(FIFO,First In, First Out)的原则。也就是说,最早插入队列的元素会最先被移除。队列是一种典型的顺序存取结构,它与栈&…...
MoE架构中的专家选择门控机制:稀疏激活如何实现百倍效率突破?
技术原理(数学公式与核心逻辑) 核心公式 门控网络输出: G ( x ) Softmax ( W g ⋅ x b g ) G(x) \text{Softmax}(W_g \cdot x b_g) G(x)Softmax(Wg⋅xbg) 最终输出: y ∑ i 1 n G i ( x ) ⋅ E i ( x ) (仅保留Top-…...
