【计算机图形学】PointNet文章的简单理解与运用,点云特征提取

2023-12-19

PointNet论文原文: PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
PointNet官方代码是使用tensorflow实现的: PointNet官方实现-TensorFlow
因为我写的代码是Pytorch的,我想用Pytorch来实现点的特征提取,我使用了下面的库:

1. 为什么要提出PointNet这种技术

在2D图像和3D体素中都可以运用卷积来进行特征的提取,但是这种卷积的方法并不适用于点云,因为点云是高自由度的,用论文里的话说, point clouds or meshes are not in a regular format ,所以没有办法做一些指定锚点、并在局部共享权重等等在regular format下可以做的操作,所以作者提出了PointNet来对点云中点的特征进行处理。如果是mesh的话,就在mesh表面进行点采样以后再使用PointNet进行处理。

2. 之前运用的一些技术(Related Work)

点云特征: 大部分点云的特征都是针对于特定的任务进行手工设计的,且这些特征对于transformation而言是不变的。但对于特定任务而言,找到一组最优的特征组合是一件非常不容易的事情。

运用在3D数据上的深度学习:

  • 体素CNN(卷积神经网络):在体素shape上使用神经网络进行3D卷积,但由于体素稀疏的问题,这种表达限制了分辨率,且会产生大量的计算消耗。FPNN和Vote3D提出了特定的方法来解决稀疏性的问题,但实际上操作仍然是在稀疏的体素上进行的,处理较大的点云对这种设计而言仍然是一种不小的挑战。
  • 多视角CNN:这种方法将3D点云或形状通过渲染的方式形成2D图像,因为图像CNN领域发展得已经很好了,所以这一类方法在形状分类和检索任务上取得了主导性能。但是这种方法很难被拓展到逐点分类和形状补全的3D任务上。
  • Spectral CNN(不太会翻译,我翻译为频谱CNN,我也不是很了解这种做法):只适用于流形网格,很难拓展到非流形网格。举一个非流形网格的例子:如果一个网格有一些尖点,或者两个面共用一条边但边的法线不同,这种网格也不是流形
  • 基于特征的DNN(残差神经网络):将3D数据转换成一个特征向量,并将其通过一个全连接网络进行分类,作者认为这种方法受限于特征提取的表达能力

无序集上的深度学习: 从数据结构的视角来看点云,其实是一组无序的向量集合。大部分深度学习的工作都聚焦在规则输入的表达上,比如序列、图像和体素。Oriol Vinyals等人注意到了这个问题,使用了一种带有注意力机制的 read-process-write 网络来处理无序输入,从结果看来他们的网络有能力去排序这些无序的输入。但是他们聚焦泛型集的应用和NLP的应用,缺乏了几何上的应用。

3. Pipeline理解

在这里插入图片描述
我在这里mask了原本pipeline的一些内容,mask掉的地方就是在PointNet核心架构上的一些运用(比如运用到分类和分割任务中)

这个网络架构的输入是 n*3 的点云,然后在开始的时候运用了一个 T-Net 进行配准得到对齐后的 n*3 点云,无论你输入点云经过怎样的刚性变换,只要是相同的点云,最终在canonical space中都会被align到相同的位置。
接着就是通过一个MLP来提取逐点特征得到每个点64维的特征 n*64 ,将点云的特征在高维空间中再通过 T-Net 再进行一次配准,就是做了一个类似于特征对齐的操作。
再往后就是进一步提取点的信息,通过MLP什么的,得到每个点1024维的特征,输出是 n*1024
再通过这 n*1024 的信息获得一个 1024 维的全局特征,表示输入点云的整体全局特征。

我认为这个网络的好处就是加上了一个align的操作,无论相同的点云发生了怎样的刚性变换,都保证其特征本身不会发生改变。

基于以上架构,实际上:

  • 分类(Classification)任务就是将核心pipeline得到的global feature输入到一个MLP里面,让MLP做分类
  • 分割(Segmentation)任务就是结合global feature和点的feature,进一步地提取点特征,实现分割(当然,这里只使用了global的特征和点的特征,没有包含局部点的信息,这也是PointNet的弊端,也引出了后来作者进一步提出PointNet++这个架构,在PointNet++架构里就进一步运用了局部的信息,以产生更好的结果)

4. 代码的相关运用

其实我所需要用到的就是PointNet中点云的特征和提取,直接指向Pytorch代码的这个部分: pointnet_utils.py
这里面就是pointnet的实现核心:

  • STN3d 的作用就是学习一个transformation matrix,来保持在输入点云或提取特征在刚性变换后,仍然可以被align到一个canonical space中(也就是将有刚性变换的输入进行了对齐)
  • STNkd 就是学习k维的刚性变换矩阵,实现对齐
  • PointNetEncoder 相当于原文中得到了global feature的那部分,从红框处可以很明显地看出来:
    在这里插入图片描述
    既然我想要的是特征提取的这部分,实际上就是在最大池化层之前的结果,也就是在上图红框上的 x=self.bn3(self.conv3(x)) 就可以得到我想要的 N×features_channel 特征值,所以如果想要特征实现,只需要使用这一部分的代码即可:
def forward(self, x):
    B, D, N = x.size()
    trans = self.stn(x)
    x = x.transpose(2, 1)
    if D > 3:
        feature = x[:, :, 3:]
        x = x[:, :, :3]
    x = torch.bmm(x, trans)
    if D > 3:
        x = torch.cat([x, feature], dim=2)
    x = x.transpose(2, 1)
    x = F.relu(self.bn1(self.conv1(x)))

    if self.feature_transform:
        trans_feat = self.fstn(x)
        x = x.transpose(2, 1)
        x = torch.bmm(x, trans_feat)
        x = x.transpose(2, 1)
    else:
        trans_feat = None

    pointfeat = x
    x = F.relu(self.bn2(self.conv2(x)))
    x = self.bn3(self.conv3(x))
    return x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机图形学】PointNet文章的简单理解与运用,点云特征提取 的相关文章

  • C++ STL(2)--算法(1)

    算法 1 STL里的查找函数 主要分顺序查找和二分查找 一 顺序查找9个 元素若是对象必须支持 运算符 1 find 用于在指定范围内查找和目标元素值相等的第一个元素 find 函数除了可以作用于序列式容器 还可以作用于普通数组 代码示例
  • 美创出席“智能计算产业链合作大会”,见证浙江省智能硬件创新能力中心启动

    近日 由浙江省经济和信息化厅 杭州市人民政府和之江实验室指导下 浙江省 十链百场万企 系列对接活动之 智能计算产业链合作大会 在杭州未来科技城国际会议中心举行 浙江省经信厅党组成员 副厅长 一级巡视员厉敏 杭州市政府党组成员 副市长孙旭东
  • 年前去面了 6 家大厂,拿下 5 家 offer,进大厂好像也没有那么难吧......

    前言 十一月份的时候因为换工作的缘故 陆续参加了华为 阿里巴巴 字节跳动 拼多多 百度 Paypal 的社招面试 除了字节跳动流程较长 我主动结束面试以外 其他的都顺利拿到了 Offer 最近时间稍微宽裕点了 写个面经 希望对大家找工作有所
  • AI原创文章在线生成工具:颠覆你的写作体验

    1 引言 身为热爱数码科技的爱好者 我始终对人工智能技术有着浓厚兴趣 近日 我偶然得知有一款名为 AI原创文章在线生成工具 的实用神器 据称能够自动生成各类主题的文章 为确认它的实证性及可信度 我亲身进行了一次细致的测评与比较 2 实用性评
  • fedora 38 39 内核编译与安装

    sudo yum install kernel devel ncurses devel openssl 缺包裹自己按上就可以 首先编译内核 make menuconfig 配置界面 在 config 里找到 CONFIG DEBUG INF

随机推荐

  • fedora 通过sysctl.conf配置内核

    linux 一切皆文件 所以配置内核的地方也是文件 需要配置的目录 proc sys 修改文件的地方在 etc sysctl conf 例如 我们配置网络 让icmp包裹停止接收 net ipv4 icmp echo ignore all
  • 充电器如何测试?有哪些测试参数?用电源模块自动化测试系统测试需要哪些步骤?

    充电器测试参数 1 输入 输出电压测试 通过万用表或者其它精密测试设备测量充电器的输入 输出电压测试 检测输入 输出电压是否在规定范围内 以免造成设备损坏 2 输入 输出电流测试 测试充电器的输入 输出电流 确保其符合设计要求 提供稳定的输
  • AMBA协议王者归来:揭秘AHB&APB设计奥秘

    AMBA协议已经成为业界的事实标准 因此在市场上有大量可重用的AMBA兼容IP核 IC工程师掌握这些总线 可以更容易地集成来自不同供应商的IP核 降低开发成本 缩短产品上市时间 AMBA 高级微处理器总线架构 定义了高性能嵌入式微控制器的通
  • Todesk突然高速通道使用已结束

    今天使用Todesk直接报出如下错误 好像对于海外用户需要付费购买海外会员 大家有没有什么可以替换的远程控制软件的吗 能分享一下吗
  • 怎么检测DC-DC电源模块稳定性?电源测试系统测试有什么优势?

    DC DC电源模块稳定性测试 稳定性是衡量DC电源模块的重要指标 电源模块的稳定性直接影响着电源产品和设备的工作稳定性 DC DC电源模块的稳定性 可以通过检测输出电压 输出电流 负载 波形 效率等参数来评估 1 静态测试方法 静态测试是通
  • 搭建电子商务网站建设步骤

    随着目前电子商务网站开发技术的迭代 电商网站的交互设计得到了很大程度的提升 可以认为现在的新型的商城平台都呈现出交互效果 那么电子商务网站建设步骤包括什么呢 电子商务网站建设第一步 网站的规划与设计 电子商务网站算是一个比较复杂的系统 电商
  • 如何在Linux系统中删除文件或目录?

    Linux作为流行的操作系统之一 许多公司和组织都在使用Linux来运行其关键业务和服务 例如谷歌 亚马逊和Facebook等 在Linux中 删除文件和目录是基本操作 那么该如何实现这一功能呢 以下是详细的内容 一 使用命令行删除文件 如
  • 渗透测试报告怎么写?

    1 准备好渗透测试记录 测试记录是执行过程的日志 在每日测试工作结束后 应将当日的成果做成记录 虽然内容不必太过细致 但测试的重点必须记录在案 拟检测的项目 使用的工具或方法 检测过程描述 检测结果说明 过程的重点截图 有结果的画面 2 撰
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以
  • binlog日志,二进制日志的简介

    binlog的bin就暴露了他是二进制的文件 你用vi或者vim是没办法读的 得用专门的方式 比如mysqlbinlog工具 那么binlog其实只要了解几点应该就足够了 Q 首先 binlog记录的是啥呢 A 记录的是数据库的修改过程 注
  • 2023_Spark_实验二十八:Flume部署及配置

    实验目的 熟悉掌握Flume部署及配置 实验方法 通过在集群中部署Flume 掌握Flume配置 实验步骤 一 Flume简介 Flume是一种分布式的 可靠的和可用的服务 用于有效地收集 聚合和移动大量日志数据 它有一个简单灵活的基于流数
  • 2023_Spark_实验二十九:Flume配置KafkaSink

    实验目的 掌握Flume采集数据发送到Kafka的方法 实验方法 通过配置Flume的KafkaSink采集数据到Kafka中 实验步骤 一 明确日志采集方式 一般Flume采集日志source有两种方式 1 Exec类型的Source 可
  • 线性连续控制系统

    线性连续控制系统 可以用线性微分方程表示 形式为 上式中 是被控制量 是系统的输入量 线性定常连续系统 当系数 和 常数时 称为定常系统 线性时变连续系统 当 和 随时间变化时 称为时变系统 线性定常连续系统按照输入量 的变化规律不同 又分
  • PyCharm中缓存有何作用?如何清理?

    在使用pycharm开发软件的过程中 我们经常会遇到卡顿 运行慢等问题 这时第一应对措施就是清理缓存 从而提高效率 那么pycharm如何清理缓存 以下是常用方法介绍 PyCharm缓存的作用 在使用PyCharm进行开发时 PyCharm
  • 推动行业未来的八个数字化转型趋势

    根据 Gartner 最新估计 在2023 年 已有40 的组织把虚拟体验与物理体验结合起来 以提高员工生产力和客户覆盖范围 而到 2024 年 工业企业将通过将自我管理技术与重新设计的运营流程相结合 将运营成本降低 30 到 2025 年
  • 低代码助力全栈开发

    目录 低代码功能展示 1 拖拽式 UI 组件 2 更快的开发速度 3 敏捷原型设计 4 与数据库集成 低代码开发工具正变得日益强大 它正不断弥合着前后端开发之间的差距 对于后端来说 基于低代码平台开发应用时 完全不用担心 前端的打包 部署
  • JavaOOP篇----第三篇

    系列文章目录 文章目录 系列文章目录 前言 一 标识符的命名规则 二 instanceof关键字的作用 三 什么是隐式转换 什么是显式转换 前言 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网
  • Linux中动态路由协议有哪些?

    Linux动态路由是一种在Linux操作系统中实现动态路由的机制 动态路由是指路由器能够根据网络的变化自动更新路由表 以实现更高效的数据传输 在Linux中 动态路由可以通过配置路由规则来实现 那么Linux中动态路由协议有哪些 以下是具体
  • kubernetes入门到进阶(2)

    被隔离的进程 一起来看看容器的本质 大家好 我们继续来一起学习k8s 在上一个章节里 我们初步了解了容器技术 在Linux虚拟机里安装了当前最流行的容器docker 还是用了docker ps docker run 等命令简单操作了容器 广
  • 【计算机图形学】PointNet文章的简单理解与运用,点云特征提取

    PointNet论文原文 PointNet Deep Learning on Point Sets for 3D Classification and Segmentation PointNet官方代码是使用tensorflow实现的 Po