草庐IT

【三维目标分类】PointNet++详解(一)

Coding的叶子 2023-04-08 原文

         上一节主要介绍了PointNet分类,本节将进一步介绍PointNet++点云分类。本节仍然参考Github上的源码进行介绍,PointNet采用全局最大值池化的方式对全体点云进行了特征抽取,这导致了对局部特征的考虑不足。PointNet++通过分组采用PointNet的方式对局部特征进行了提取。GitHub地址为GitHub - yanx27/Pointnet_Pointnet2_pytorch: PointNet and PointNet++ implemented by pytorch (pure python) and on ModelNet, ShapeNet and S3DIS.。 PointNet文章作者关于三维物体检测的讲解请参考3D物体检测的发展与未来 - 深蓝学院 - 专注人工智能与自动驾驶的学习平台。

        文中涉及到PointNet的地方请参考上一篇文章的详细介绍三维目标检测 — PointNet详解(一)_Coding的叶子的博客-CSDN博客

1 代码环境部署

conda create -n torch16cu101 python=3.7
conda activate torch16cu101
pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
pip install tqdm
git clone https://github.com/yehx1/Pointnet_Pointnet2_pytorch.git
cd Pointnet_Pointnet2_pytorch
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg

2 数据介绍

         以Pointnet的modelnet40为例,其点云文件中含有x、y、z、normal_x、normal_y、normal_z,前三个为坐标,后三个为法向量。关于txt存储的点云文件格式请参考点云格式介绍(三)_Coding的叶子的博客-CSDN博客。样例文件下载地址:modelnet40点云样例数据-深度学习文档类资源-CSDN下载

        解压后文件主要包含:

        (1)各个类别的点云,每个点云文件共有10000个点。分别存储在以类别名称命名的为文件夹中,共40个类别的文件夹。

        (2)filelist.txt中列举了全部点云文件的文件名,共12311个点云文件。

        (3)modelnet40_train.txt中列举了用于训练的点云文件名,共9843个点云文件,占比80%。

        (4)modelnet40_test.txt中列举了用于测试的点云文件名,共2468个点云文件,占比20%。

        PointNet模型的输入为点云points和标签targets。其中,points的维度为Bx3xN,B为batch_size,3为点云坐标,N为点云个数。如果使用法向量(use normls),则points的维度维Bx6xN。模型会通过截断或者最远点采样截取1024个点,即N=1024。points还会经过中心归一化和随机增强等操作。标签targets维度为Nx1,即各个类别对应的标签序号。

3 SA(Set Abstraction)模块

        SA(Set Abstraction)模块使PointNet++中的核心模块,主要包含随机采样、分组和PointNet特征提取三个步骤。首先,SA模块会利用最远点采样在原始点云中随机采样npoint个点,以采样到的点为中心点在指定半径内球体内选择nsample个点。以这nsample个点为一组,对每一组按照PointNet的方式提取特征,并用最大池化得到每一组点的全局特征。假设特征数量为nfeature,那么SA模块返回的特征维度为nfeature X npoint,同时SA模块会返回最远点采样的坐标,以便于进一步连续进行SA操作。

        可以看到,SA模块会对点云进行随机采样,一般采样会降低点云中点的数量。连续的SA操作会使点的数量逐渐下降,这类似与图像当中连续卷积操作降低特征图的尺寸。既然点的数量下降了,那么特征通道的数量需要增加以保持足够的维度去表达原始的点云信息。因此,在模型中SA输出的点云数量下降,同时通道数逐步增加。

        另一方面,点数量的下降会导致点和点之间的平均距离越来越大,也就是点会更加稀疏。那么分组过程中的球体半径在连续SA过程中需要设置越来越大。由于点数的下降,分组过程也将更多的点分到一组,这样上面的nsample也会增加。

        通过SA操作,PointNet++充分提取了分组的点云特征,也就是局部点云特征。        

4 模型简介

        PointNet++模型结构如下图所示。

         PointNet++网络提取特征的各个步骤如下:

        (1)SA1:输入为xyz坐标值和法向量,以法向量作为原始特征,也可以设置不输入法向量。这里假设不输入法向量,那么输入维度为3x1024(N=1024)。随机最远点采样的点数为512,分组半径为0.2,分组内点数为32个,那么采样分组后的特征维度为512x32x(3+0),其中分组内每个点的坐标都已减去中心点坐标,0表示原有特征维度,对应上图中的C,若用法向量作为输入特征,则会将坐标与法向量拼接作为新的特征。经过PointNet卷积Conv1d(3, 64)、Conv1d(64, 64)、Conv1d(64, 128)和最大池化后。每个分组点云的特征维度为128,共512个分组。这相当于512个采样点的特征维度为128,即128x512,128对应上图中的C1

        (2)SA2:输入为(1)中采样得到的512个点坐标和128x512维度特征。随机最远点采样的点数为128,分组半径为0.4,分组内点数为64个,那么采样分组后的特征维度为128x64x131,其中分组内每个点的坐标都已减去中心点坐标,并将坐标与原特征拼接作为新的特征(3+128=131)。经过PointNet卷积Conv1d(131, 128)、Conv1d(128, 128)、Conv1d(128, 256)和最大池化后。每个分组点云的特征维度为256,共128个分组。这相当于128个采样点的特征维度为256,即256x128,256对应上图中的C2

        (3)SA3:输入为(2)中采样得到的128个点坐标和256x128维度特征。将全部128个点分为1组,采样中心设置为为坐标原点。那么采样分组后的特征维度为1x128x259,将坐标与原特征拼接作为新的特征(3+256=259)。经过PointNet卷积Conv1d(259, 256)、Conv1d(256, 512)、Conv1d(512, 1024)和最大池化后。每个分组点云的特征维度为1024,共1个分组。这相当于1个采样点的特征维度为1024,即1024x1,1024对应上图中的C4

        (4)(3)中输出1024维度特征经过FC(1024, 512)、FC(512, 256)、FC(256, 40)、log_softmaxt得到40维度的输出,即40个类别log softmax,即图中的class scores

5 损失函数

        与PointNet不一样的地方在于,PointNet++不含特征变换矩阵。因此。损失函数仅由交叉熵损失函数组成,不再包括64维特征的变换矩阵的损失。这里考虑到类别的均衡性,交叉熵损失函数会为每个类别分配一个权重。在全部原始点云中,同一类别的空间点数量最多的权重最小,取值为1。其他,类别的权重是最大点数量与该类别数量的比值的三分之一次方,显然其他类别的权重大于1。

6 训练评估程序

        将2中的数据集解压到1中工程目录下data文件夹中,data文件夹需要新建,默认是没有的。将model参数设置为pointnet2_cls_ssg(ssg,Single-Scale Group,单一尺度分类,下节会介绍多尺度分类),然后直接运行train_classification.py和test_classdification.py即可完成训练和测试,通过将use_normals设置为True将在输入中引入法向量。

python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。https://blog.csdn.net/suiyingy/article/details/124017716

有关【三维目标分类】PointNet++详解(一)的更多相关文章

  1. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  2. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  3. ruby - Watir-Webdriver 是否支持点击目标为 javascript 的链接? - 2

    我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click

  4. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  5. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  6. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  7. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  8. 详解Unity中的粒子系统Particle System (二) - 2

    前言上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指正。目录前言本系列提要一、粒子系统主模块1.阅读前注意事项2.参考图3.参数讲解DurationLoopingPrewarmStartDelayStartLifetimeStartSpeed3DStartSizeStartSize3DStartRotationStartRotationFlipRotationStartColorGravityModif

  9. VMware虚拟机与本地主机进行磁盘共享(详解) - 2

    VMware虚拟机与本地主机进行磁盘共享前提虚拟机版本为Windows10(专业版,不是可能有问题)本地主机为家庭版或学生版(此版本会有问题,但有替代方式)最好是专业版VMware操作1.关闭防火墙,全部关闭。2.打开电脑属性3.点击共享-》高级共享-》权限4.如果没有everyone,就添加权限选择完全控制,然后应用确定。5.打开cmd输入lusrmgr.msc(只有专业版可以打开)如果不是专业版,可以跳过这一步。点击用户-》administrator密码要复杂密码,否则不行。推荐admaiN@1234类型的密码。设置完密码,点击属性,将禁用解开。6.如果虚拟机的windows不是专业版,可

  10. ruby-on-rails - 带有分类器 gem 的无效编码符号 - 2

    当我将项目添加到我的Postgres数据库时,一切似乎都运行良好。在不做任何更改的情况下,只要在我的应用程序中的任何位置启动Madeleine,我的Rails应用程序就会开始失败:EncodingErrorinEventsController#updateinvalidencodingsymbolapp/controllers/events_controller.rb:137:in`update'137是问题行:135defupdate136@event=Event.find(params[:id])137m=SnapshotMadeleine.new("bayes_data")...

随机推荐