首页 > 其他分享 >点云分割网络PointConv

点云分割网络PointConv

时间:2024-06-18 23:34:15浏览次数:13  
标签:分割 卷积 tf PointConv 点云 kpoint pts

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 - 1
        with 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 normalization

        R = tf.sqrt(sigma)
        xRinv = tf.div(grouped_pts, R)
        quadform = tf.reduce_sum(tf.square(xRinv), axis = -1)
        logsqrtdetSigma = tf.log(R) * 3
        mvnpdf = 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 / kpoint
        density = 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 场景语义分割效果


标签:分割,卷积,tf,PointConv,点云,kpoint,pts
From: https://www.cnblogs.com/xiaxuexiaoab/p/18253906

相关文章

  • 六、在Qt下通过PCL在VTK9.3.0下显示自己的pcd点云文件
    前几天刚整理好VTK8.2.0,发现我们的项目使用的PCL自带的VTK是9.3.0的,脸黑了快VTK8.2.0可参考该篇博文:五、在Qt下加载QVTKWidget控件(VTK8.2.0),生成VisualStudio项目,显示点云(C++)没办法,重新搞下VTK9.3.0区别:VTK8.2.0采用的是拖拽QVTKWidget控件进行相应的操作;VTK9.3.0把这个......
  • vue中的代码分割
    随着Web应用的日益复杂化,用户对页面加载速度的期望越来越高。在这种背景下,前端性能优化成为了开发者们必须面对的挑战。Vue.js,作为现代前端开发的首选框架之一,其轻量级和灵活性为构建高性能的Web应用提供了可能。然而,即使是使用Vue.js,如果不进行适当的优化,应用的加载时间和......
  • 知识库的创建(1) - KnowledgeFile文件加载和分割
    文章目录前言一、类的初始化方法`__init__`1.参数解析2.初始化步骤二、方法`file2docs`1.功能2.参数3.步骤三、方法`docs2texts`1.功能2.参数3.步骤四、方法`file2text`1.功能2.参数3.步骤五、方法`file_exist`1.功能2.返回3.方法`get_mtim......
  • 9.2.1 简述图像分割中经常用到的编码器-解码器网络结构的设计理念。
    9.2图像分割场景描述:图像分类图像识别图像分割不同标注出每个目标的类别像素级别的图像识别,标注出图像中每个像素所属的对象类别不同对整张图像进行识别进行稠密的像素级分类应用场景视频软件中的背景替换、避开人物的弹幕模板、自动驾驶以及医疗辅助判断等分类前景分割(f......
  • 硬核解读KubeEdge基于大模型边云协同的机器人语义分割算法
    本文分享自华为云社区《KubeEdge:基于大模型边云协同的机器人语义分割算法》,作者:云容器大未来。近年来快速发展的视觉大模型(例如SAM)在促进高精度的智能感知方面具有很大的潜力。然而,边缘环境中的资源限制往往会限制这种视觉大模型在本地部署,从而产生相当大的推理延迟,导致难以......
  • 雨后彩虹图像分割
          不经历风雨,怎么见彩虹!2024年6月14日下午一场及时雨,不仅消除了暑热,也带来了美丽彩虹,就想着尝试把空中的彩虹从自然场景中提取出来,希望对学习图像的有所帮助。     读入自然场景下雨后彩虹图像,然后对彩虹从背景分割出来。算法思想:通过提取红、绿和蓝各分量图......
  • 图像分割(二)——低照度下自然场景下图像分割的一种新方法
    一天傍晚,在景观河散步,看到景观河旁边雕塑鸭子,就用手机拍摄下来,但由于是晚上光线不是太好,且雕塑下面的地板有条纹和阴影。想着尝试用传统的数字图像处理方法把鸭子从自然场景中提取出来。读入低照度下图像,然后把鸭子从背景分割出来。算法主要步骤:1.读入彩色图像;2.图像裁剪;3.彩......
  • CVPR2024 分割Segmentation相关论文37篇速览
    Paper1MFP:MakingFullUseofProbabilityMapsforInteractiveImageSegmentation摘要小结:最近的交互式分割算法中,将先前的概率图作为网络输入,以帮助当前分割轮次的预测。然而,尽管使用了先前的掩膜,概率图中包含的有用信息并没有很好地传播到当前预测中。在本文中,为......
  • OpenCV 双目三角法计算点云
    文章目录一、简介二、实现代码三、实现效果参考资料一、简介基于三角法计算点坐标的过程类似于我们人类眼睛观察事物的过程:如上图所示,通过两个相机观察到同一位置,我们可以通过两个相机得到这一位置的投影坐标(ur,vr),(ul,vl)......
  • 华为OD机试C卷(100分)-字符串分割(二)(C语言)
    题目描述给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含有的大写字母比......