PointNet++复现、论文和代码研读
文章目录
- 复现
- 1.创建虚拟环境并进入
- 2.安装pytorch
- 3.分割模型的训练和测试
- 3.1.下载数据处理数据
- 3.2.训练分割模型
- 3.3分割模型的测试
- 4.分类模型的训练和测试
- 论文研读
- 制作自己的数据集流程
- 分割模型数据集准备
复现
https://github.com/yanx27/Pointnet_Pointnet2_pytorch
1.创建虚拟环境并进入
conda create -n pointnet++ python=3.7
conda activate pointnet++
2.安装pytorch
查找对应版本,这里cuda是10.1,服务器上只有10.0,10.2和11.1,但我在官网上(https://pytorch.org/get-started/previous-versions/)发现10.2与pytorch1.6也匹配,先不安装cuda10.1试一试。

# CUDA 10.2
conda install pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=10.2 -c pytorc
报错:

随后出现以下内容所以没有管。

3.分割模型的训练和测试
3.1.下载数据处理数据
将Stanford3dDataset_v1.2_Aligned_Version数据集放在data目录下(代码里改一下数据集路径),运行程序生成npy文件。
cd data_utils
python collect_indoor3d_data.py

3.2.训练分割模型
python train_semseg.py
参数使用默认值,改了一下log_dir

报错:
按理说不应该报错,名字都是对的,后面弹出一个窗口,说S3DISDataLoader.py内容较新,选择比较还是覆盖,点击覆盖后问题解决。
报错:
没有tqdm
pip install tqdm
报错:

room_data = np.load(room_path, allow_pickle=True)

感觉是不是npy生成的有问题,不然为什么前面的npy可以而这个npy报错?把pointnet生成的npy复制到该目录下。但对比了两个工程处理数据的py文件,感觉没有什么区别。但这样操作后程序跑起来了:


3.3分割模型的测试

上面两个是本来就有的,里面有pointnet和pointnet++的预训练模型,可直接用来测试。用Github推荐的MeshLab看可视化效果,左侧真实值,右侧预测值。

4.分类模型的训练和测试
github上给的不同模型的效果对比:

_SSG不知道是什么
论文研读
https://proceedings.neurips.cc/paper_files/paper/2017/file/d8bf84be3800d12f74d8b05e9b89836f-Paper.pdf
PointNet++网络结构的搭建借鉴了CNN的思想,通过层次结构应用PointNet(SA层)来提取点云特征,同时在特征提取模块中引入了特殊结构(MSG、MRG)来解决点云密度分布不均匀的问题。

图中虚线圆圈类似CNN中的卷积,将圆圈内所有点提取为一个特征即为局部特征提取,所以输入点经过SA层后将会变成一个个特征点,最终点云经过一层层SA层抽象为点云的特征。可以看到SA层与CNN中的卷积层非常相似,都是选取中心点,由其领域中的所有点得到特征。但由于点云的性质导致无法直接应用3D CNN。PointNet首先对点云进行标准化(T-Net)再应用MLP,最大池化层等结构来提取整个点云的信息,最终会导致局部特征的丢失。
如何选择局部区域?
在二维图像中,局部区域即每个卷积核,卷积中心就是一个个的像素点,它们排列有序,使用固定大小的卷积核就能有效的覆盖整幅图像。但在点云中,各点之间的距离是不相等的,因此局部区域的中心的选择较为重要,它决定了最终能否有效覆盖整个点云。而局部区域的大小,即邻域的选择也要考虑到点云分布不均的特点。
如何将局部区域中的点信息提取为一个特征点?
在CNN中,特征提取就是简单的卷积操作,对卷积中心及其邻域应用卷积核相乘就能得到一个结果,即局部区域的特征。
PointNet++中使用PointNet来实现特征提取,即对每个局部区域应用小型的PointNet来得到局部区域的信息。
PointNet++定义了一个SA层解决以上两个问题。
单个SA层由采样层、分组层以及PointNet层三个模块组成。采样层用于从输入集合中选出每个局部区域的中心点,分组层用于构建局部区域点集,通过这两层完成局部区域的划分。PointNet层使用小型PointNet网络用于提取局部区域的特征,这一层用于聚合局部区域的特征。
采样层——采样层使用了最远点采样(FPS,farthest point sampling)来进行局部区域中心的选择,这种方式相比随机采样能够更好的覆盖整个输入点集。假设点云中有N个点,用向量d表示每个点的坐标,向量C表示点的特征。由PointNet++的网络结构图可以看出,输入为N*(d+C)的点云,经过采样层,由最远点采样选出了K个局部中心,用于分组层进行区域划分。
分组层——在划分局部区域时使用了球型邻域,将局部区域中心点周围球型邻域的点分为一组,用于后续的特征提取。分组层根据采样层选出的中心点将点云分为了K个不同大小的局部区域,最终输出N1K(d+C),N1为每个局部邻域中点的数量。
邻域大小的选择对特征学习较为重要,在CNN中,使用较小的卷积核一般能获得更好的性能,但并不同样适用于点云。点云的分布不均匀,有些地方稀疏,若使用较小的邻域,那么该局部区域中的点过少会导致PointNet层无法有效的学习到局部信息。为了解决这一问题,PointNet++设计了两种分组策略:多尺度分组与多分辨率分组,如下图:

多尺度分组(MSG,Multi-scale grouping)即采用不同尺寸的邻域,同时提取特征,并将这些不同尺度的特征组合起来作为局部区域的整体特征。由于在网络浅层时输入点数量较多,因此采样得到的中心点较多,使用MSG方法就意味着要在如此多的邻域中应用PointNet层提取特征,计算量太大。
多分辨率分组(MRG,Multi-resolution grouping)提取到的特征向量由两部分组成,左边的部分(s1)是由上层的3个中心点提取得到的,而每个中心点都是由上上层相应的领域中的点得到的,同时将这些点视为一个大的局部空间,并提取特征(s2)。
当点云的局部区域较为稀疏时,经过一个SA层得到的中心点就更少了,此时s1就不如s2更能表征点云中该区域的特征。当局部区域较为密集时,经过两层抽象得到的特征s1包含的信息更多。
简单概括一下:
MSG是对同一层的点,采用一组不同大小的邻域同时提取特征并组合为整体特征。MRG是分别对不同层次的点进行特征提取,并组合为整体特征。可以看出该方法相比MSG计算效率要更高。
PointNet层——这层对每个局部区域应用PointNet进行特征的提取,最终输出一个个新的特征点,对应输入邻域的局部特征。输入为K组邻域点,使用PointNet对每个局部区域进行特征提取,得到一个长度为C1的特征向量。最终输出为N1*(d+C1)的形式,即N1个特征点组成的点集,此时点的数量相比输入下降了,但每个点的特征却包含了更多的信息。
参考:https://blog.csdn.net/CirnoZhang/article/details/109085303
效果与PointNet进行对比:

https://blog.csdn.net/toCVer/article/details/126265782
https://blog.csdn.net/CirnoZhang/article/details/109085303(每周学习总结 pointnet++代码解读)
制作自己的数据集流程
分割模型数据集准备
首先看原来的数据集内容:
S3DIS数据集多用于室内点云的语义分割和实例分割(每个柱子桌椅等都是分开标注的)
6个区域:【目录名称】Area1、Area2、Area3、Area4、Area5、Area6

13个语义元素: 【annotation的类别】天花板ceiling、地板floor、墙壁wall、梁beam、柱column、窗window、门door、桌子table、椅子chair、沙发sofa、书柜bookcase、板board 、混杂元素(其他)clutter
11种场景:【单文件的名称】办公室、会议室、走廊、礼堂、开放空间、大堂、休息室、储藏室、复印室、储藏室和卫生间 office, conference room, hallway, auditorium, open space, lobby, lounge, pantry, copy room, storage and WC
每个区域有不同的房间,如会议室、走廊、办公室、厕所、存储间等。每一类下面有目录Annotations和一个对应名字的txt文件,如conferenceRoom_1.txt。(这里面是xyzrgb)

Annotations目录下每一类(每类的每个实例)有以类命名的txt文件,里面是xyzrgb。

每个物体用txt文件存储,每个txt存储了物体坐标和颜色信息。特别要注意的是,该txt文件中没有存储标签信息,其标签信息是用文件名称来进行区分。例如chair txt文件中的数据都是其中一个椅子的点云数据。因此,在正式处理之前,需要进行处理,为每个点补上标签。
上述这个过程的实现是通过PointNet++中的collect_indoor3d_data.py实现的。该脚本文件为每个点生成了标签,并转换为npy文件,加速文件的读取过程。运行collect_indoor3d_data.py处理数据得到:

数据集的整体流程:
1.通过collect_indor3d将数据进行转换,为每个点分配标签
2.初始化:读取271个小房间的信息,获取采样点信息,由于这个数据集比较大,不利于训练,PointNet++训练之前会将它进行预处理。对每个房间点的数量对其进行随机采样,随机划分划分为1mx1m的block,然后再放入网络进行训练。
3.对输入房间进行随机采样并计算法向量,进行相应归一化操作。
数据集介绍
https://blog.csdn.net/weixin_47142735/article/details/121605323
相关文章:
PointNet++复现、论文和代码研读
文章目录 复现1.创建虚拟环境并进入2.安装pytorch3.分割模型的训练和测试3.1.下载数据处理数据3.2.训练分割模型3.3分割模型的测试 4.分类模型的训练和测试 论文研读制作自己的数据集流程分割模型数据集准备 复现 https://github.com/yanx27/Pointnet_Pointnet2_pytorch 1.创…...
轨迹规划 | 图解路径跟踪PID算法(附ROS C++/Python/Matlab仿真)
目录 0 专栏介绍1 PID控制基本原理2 基于PID的路径跟踪3 仿真实现3.1 ROS C实现3.2 Python实现3.3 Matlab实现 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等)&a…...
吴恩达《机器学习》1-3:监督学习
一、监督学习 例如房屋价格的数据集。在监督学习中,我们将已知的房价作为"正确答案",并将这些价格与房屋的特征数据一起提供给学习算法。学习算法使用这些已知答案的数据来学习模式和关系,以便在未知情况下预测其他房屋的价格。这就…...
Flutter PopupMenuButton下拉菜单
下拉菜单是移动应用交互中一种常见的交互方式,可以使用下拉列表来展示多个内容标签,实现页面引导的作用。在Flutter开发中,实现下拉弹框主要有两种方式,一种是继承Dialog组件使用自定义布局的方式实现,另一种则是使用官方的PopupMenuButton组件进行实现。 如果没有特殊的…...
国家数据局正式揭牌,数据专业融合型人才迎来发展良机【文末送书五本】
国家数据局正式揭牌,数据专业融合型人才迎来发展良机 国家数据局正式揭牌,数据专业融合型人才迎来发展良机 摘要书籍简介数据要素安全流通Python数据挖掘:入门、进阶与实用案例分析数据保护:工作负载的可恢复性Data Mesh权威指南分…...
H5游戏源码分享-像素小鸟游戏(类似深海潜艇)
H5游戏源码分享-像素小鸟游戏(类似深海潜艇) 点击屏幕控制小鸟的飞行高度 整个小游戏就用JS完成 项目地址:https://download.csdn.net/download/Highning0007/88483228 <!DOCTYPE HTML> <html><head><meta http-equiv…...
Vue 3 响应式对象:ref 和 reactive 的使用和区别
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚 👉点击这里,就可以查看我的主页啦!👇&#x…...
H5游戏源码分享-密室逃脱小游戏(考验反应能力)
H5游戏源码分享-密室逃脱小游戏(考验反应能力) 预判安全位置,这个需要快速的反应能力 源码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /&…...
【LeetCode刷题-哈希】--706.设计哈希映射
706.设计哈希映射 class MyHashMap {private class Pair{private int key;private int value;public Pair(int key ,int value){this.key key;this.value value;}public int getKey(){return key;}public int getValue(){return value;}public void setValue(int value){this…...
前端 : 用HTML ,CSS ,JS 做一个点名器
1.HTML: <body><div id "content"><div id"top"><div id "name">XAiot2302班点名器</div></div><div id "center"><div id "word">你准备好了吗?</di…...
css:button实现el-radio效果
先看最终效果: 思路: 一、 首先准备好按钮内容:const a [one,two,three] 将按钮循环展示出来,并设置一些样式,将按钮背景透明: <button v-for"(item,index) in a" :key"in…...
算法工程师-机器学习-数据科学家面试准备4-ML系统设计
https://github.com/LongxingTan/Machine-learning-interview 算法工程师-机器学习-数据科学家面试准备1- 概述 外企和国外公司、春招、秋招算法工程师-机器学习-数据科学家面试准备2- Leetcode 300算法工程师-机器学习-数据科学家面试准备3-系统设计算法工程师-机器学习-数据…...
git重装后如何连接以前项目
git重装后如何连接以前项目 1、配置秘钥 点击 Git Bash Here,进入命令操作窗口 生成本地git仓库秘钥: 1、填写自己邮箱 2、一直回车 ssh-keygen -t rsa -C “xxxxxqq.com”3、使用cat查看生成的秘钥,粘贴并设置到gitee上 cat ~/.ssh/id_r…...
【java学习—十】TreeSet集合(5)
文章目录 1. TreeSet1.1. 自然排序1.2. 定制排序 1. TreeSet TreeSet 是 SortedSet 接口的实现类, TreeSet 可以确保集合元素处于排序状态。 TreeSet 支持两种排序方法:自然排序和定制排序。默认情况下, TreeSet 采用自然排序。 1.1.…...
JMeter的使用,傻瓜式学习【上】
目录 前言 1、JMeter元件及基本使用作用域(简述) 1.1、基本元件 1.2、作用域的原则 1.3、元件执行顺序 3、JMeter三个重要组件 3.1、线程组 案例: 3.2、HTTP请求 3.3、查看结果树 响应体中,中文乱码解决方案࿱…...
主定理(一般式)
主定理(Master Theorem)是用于分析递归算法时间复杂度的一个重要工具。它适用于形式化定义的一类递归关系,通常采用分治策略解决问题的情况。 目录 主定理简化版的局限主定理一般形式情况1: n l o g b a n^{log_{b}{a}} nlogba …...
WLAN的组网架构和工作原理
目录 WLAN的组网架构 FAT AP架构 AC FIT AP架构 敏捷分布式AP 下一代园区网络:智简园区(大中型园区网络) WLAN工作原理 WLAN工作流程 1.AP上线 (1)AP获取IP地址; (2)AP发…...
使用OBS Browser+访问华为云OBS存储【Windows】
背景 项目中使用华为云 S3 存储,java 代码中通过华为云 OBS 提供的esdk-obs-java 来访问文件。 但是,通过 JAVA SDK 方式不太方便运维,所以我们需要一款可视化的客户端软件。 华为云 OBS 自身也提供了一款客户端软件,名为 OBS Browser+。 OBS Browser+简介 OBS Browse…...
C++总结(3):类的动态内存分配、异常、类型转换运算符
文章目录 1 类的动态内存分配1.1 C动态内存分配1.2 拷贝构造函数1.3 赋值运算符(operator)重载 2 异常3 类型转换运算符 1 类的动态内存分配 1.1 C动态内存分配 在C/C中都可以使用malloc/free来分配内存,但C还有一种更好的方法:new和delete。下面以动态…...
折半搜索(meet in the middle)
介绍 折半搜索,又称 meet in the middle \text{meet in the middle} meet in the middle,指将整个搜索过程分为两部分,并对两部分分别进行搜索,最后得到两个答案序列,将这两个答案序列进行合并,即可得到最…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
codeforces C. Cool Partition
目录 题目简述: 思路: 总代码: https://codeforces.com/contest/2117/problem/C 题目简述: 给定一个整数数组,现要求你对数组进行分割,但需满足条件:前一个子数组中的值必须在后一个子数组中…...
