点云分割网络PointConv

news/2024/9/28 6:54:57

PDF:《PointConv: Deep Convolutional Networks on 3D Point Clouds》
CODE: https://github.com/DylanWusee/pointconv

一、大体内容

PointConv是一种在非均匀采样下对3D点云进行卷积的运算,可以用来构建深度卷积网络,其将卷积核视为由权重函数和密度函数组成的三维点的局部坐标的非线性函数。对于给定的点,使用多层感知器网络和密度函数通过核密度估计来学习权重函数。为了更有效地计算权函数,还提出了一种新的改进方案,让其能够大幅扩展网络并显著提高其性能,这种卷积在3D空间中具有平移和旋转不变性。此外,PointConv还可以用作反卷积算子,将子采样点云的特征传播回其原始分辨率。在ModelNet40、ShapeNet和ScanNet数据集上取得了很好的效果。

二、贡献点

  1. 提出基于核密度估计的卷积运算PointConv
  2. 并提出加速版本(将PointConv用矩阵乘法和2d卷积实现)提升性能
  3. 将pointConv扩展到反卷积版本PointDeconv,可以获取更好的分割结果

三、细节

3.1 PointConv

点云处理的一些算法通常第一步就是对借助最远点采样对点云进行采样处理,可以减少样本数量并尽可能地保留点云原始的空间结构,但是这种采样是非均匀的,这样会导致某些局部区域点大量聚集,而某些区域的的点的数量又不足。另外3D点云不同于2D图像那样那么规则,点云具有更灵活的形状。点云中某个点的坐标\(p=(x,y,z) \in R^3\)不在固定网格上,而是可以采用任意连续值。因此,每个局部区域中不同点的相对位置是不同的。图像上的常规卷积滤波器无法直接应用于点云。

针对这些问题,本文提出PointConv来解决,其将卷积核视为由权重函数和密度函数组成的三维点的局部坐标的非线性函数,通过核密度估计可以避免非均匀采样带来的影响。PointConv结构如下:

如图a中所示为FPS采样后P0周围的采样点,将采样点坐标转换为局部相对坐标\(P_{local}\),特征记为\(F_{in}\)
图b中上半部分将相对坐标直接经过MLP1中,最终得到特征作为权重\(W\)
下半部分局部坐标先经过核密度估计(KDE)得到邻近点的密度(密度越大值越大),这里的\(d_1, d2, ..., d_k\)采用密度的倒数,然后输入到MLP2得到S,并借助tile进行扩充后与输入特征进行相乘,这样就可以通过密度来干预特征的权重。

其中KDE可以参考源码的实现,其计算出每个点的高斯核密度。

# pts:一个形状为(batch_size, num_points, num_dimensions)的张量,包含了需要进行密度估计的点集。
# sigma:高斯核的带宽参数,控制核的宽度和平滑程度。
# kpoint:用于密度估计的邻居点的数量。如果点的数量少于kpoint,则将kpoint设置为点的数量减一。
# is_norm:一个布尔标志,指示是否对密度值进行归一化。
def kernel_density_estimation(pts, sigma, kpoint = 32, is_norm = False):with tf.variable_scope("ComputeDensity") as sc:batch_size = pts.get_shape()[0]num_points = pts.get_shape()[1]if num_points < kpoint:kpoint = num_points.value - 1with tf.device('/cpu:0'):point_indices = tf.py_func(knn_kdtree, [kpoint, pts, pts], tf.int32)batch_indices = tf.tile(tf.reshape(tf.range(batch_size), (-1, 1, 1, 1)), (1, num_points, kpoint, 1))idx = tf.concat([batch_indices, tf.expand_dims(point_indices, axis = 3)], axis = 3)idx.set_shape([batch_size, num_points, kpoint, 2])grouped_pts = tf.gather_nd(pts, idx)grouped_pts -= tf.tile(tf.expand_dims(pts, 2), [1,1,kpoint,1]) # translation normalizationR = tf.sqrt(sigma)xRinv = tf.div(grouped_pts, R)quadform = tf.reduce_sum(tf.square(xRinv), axis = -1)logsqrtdetSigma = tf.log(R) * 3mvnpdf = tf.exp(-0.5 * quadform - logsqrtdetSigma - 3 * tf.log(2 * 3.1415926) / 2)mvnpdf = tf.reduce_sum(mvnpdf, axis = 2, keepdims = True)scale = 1.0 / kpointdensity = tf.multiply(mvnpdf, scale)if is_norm:#grouped_xyz_sum = tf.reduce_sum(grouped_xyz, axis = 1, keepdims = True)density_max = tf.reduce_max(density, axis = 1, keepdims = True)density = tf.div(density, density_max)return density

注意其中tile算子是为了让两个不同维度的张量能进行点乘运算,为了提高计算效率,通常把小维度张量进行扩充

3.2 优化版本

由3.1中介绍可以直到每个滤波器需要一个网络近似,如果多个PointConv组合会导致效率较低,太少性能又不太行,因此论文中提出了一种改进方案,将PointConv用矩阵乘法和2d卷积实现,具体的证明直接参考原文比较详细,这里直接给出图,大家对比下就清晰了。主要的改动是Compute Weight部分,把其中一个\(1\times 1\)卷积移动到末尾了,它对GPU显存的需求比原来的少了64倍。

3.3 PointDeconv

对于分割任务,我们需要逐点预测,为了获得所有输入点的特征,需要一种将特征从子采样点云传播到原始的点云上。pointNet++中采用的是基于距离的插值,但没有充分利用反卷积操作的优势(从粗糙级别捕获传播信息的局部相关性),论文中提出pointDeconv(由插值和pointConv组成)来解决此问题。首先,采用插值法传播来自上一层的粗略特征。然后,使用skip-links将内插特征与来自具有相同分辨率的卷积层中的特征连接起来。连接后,我们对连接的特征应用PointDeConv以获得最终的特征输出。

四、效果

4.1 ModelNet40上分类效果

4.2 ShapeNet上部件分割效果


4.3 场景语义分割效果


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/47017.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

算法金 | 一个强大的算法模型:t-SNE !!

大侠幸会,在下全网同名「算法金」0 基础转 AI 上岸,多个算法赛 Top「日更万日,让更多人享受智能乐趣」t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种用于降维和数据可视化的非线性算法。它被广泛应用于图像处理、文本挖掘和生物信息学等领域,特别擅长处理高…

软件测试理论基础Part2

测试用例设计 等价类划分法有效等价类满足需求的无效等价类不满足需求的等价类划分方法操作步骤明确需求 确定有效和无效等价类 编写测试用例边界值划分法 边界范围上点处在边界上的点(正好等于)离点离上点最近的点内点范围内的点开区间,闭区间[开始值,结束值] - 闭区间,包含开…

解决Ubuntu 下 idea Dock 图标显示错乱

问题表现 通过官网下载的 idea ubuntu 安装包安装之后,默认是需要通过 sh 脚本运行的,我们可以通过在 /usr/share/applications 创建一个 .desktop 的文件,来生成一个可以被 ubuntu 识别的应用。在我的 Ubuntu 下,idea 的配置如下: [Desktop Entry]Name=IntelliJ IDEA Com…

kettle从入门到精通 第七十一课 ETL之kettle 再谈http post,轻松掌握body中传递json参数

场景: kettle中http post步骤如何发送http请求且传递body参数? 解决方案: http post步骤中直接设置Request entity field字段即可。 1、手边没有现成的post接口,索性用python搭建一个简单的接口,关键代码如下(安装python环境略):from flask import Flask, request, jso…

Dynamics CRM 365 验证客户端的网络容量和吞吐量

如何检查延迟 Customer Engagement 应用包括一个基本的诊断工具,用于分析客户端与组织的连接并生成报告。若要运行诊断工具,请按照下列步骤操作。在用户的计算机或设备上,启动 Web 浏览器,然后登录到组织。 输入以下 URL https://myorg.crm.dynamics.com/tools/diagnostics…

博客园美化教程 可自制(附代码)

博客美化 由于有小伙伴需要这些好看的代码,我就把自己从网上整合的一些代码分享给各位。 主要参考了凌云_void大佬的博客 申请JS权限 第一步你需要申请一个博客, 审核通过之后在博客后台的设置中找到申请js权限 理由积极向上即可 通过后就可以开始后门的步骤了,差不多半个小…

中考后刷题补题合集

T1(莫队,增量式维护答案) https://www.luogu.com.cn/problem/P1494 1731。 看上一篇总结的莫队。双倍经验。QAQ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath>using namespace std;typed…