点云分类和点云分割

这篇具有很好参考价值的文章主要介绍了点云分类和点云分割。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

点云分类概念

点云的分类是将点云分类到不同的点云集。同一个点云集具有相似或相同的属性,例如地面、树木、人等;点云分割是根据空间、几何和纹理等特征点进行划分,同一划分内的点云拥有相似的特征。
基于半径选择局部区域,针对得到的每个区域进行特征提取,关键核心原理:

最远点采样法

  • 最远点采样法(farthest point sampling):尽可能覆盖到原始点云数据,例如输入1024个点,要选择128个中心点
    点云分类和点云分割
    farthest point sampling代码实现如下:
def farthest_point_sample(xyz, npoint):
    """
    Input:
        xyz: pointcloud data, [B, N, 3]
        npoint: number of samples
    Return:
        centroids: sampled pointcloud index, [B, npoint]
    """
    device = xyz.device
    B, N, C = xyz.shape
    centroids = torch.zeros(B, npoint, dtype=torch.long).to(device)#8*512
    distance = torch.ones(B, N).to(device) * 1e10 #8*1024
    farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device)#batch里每个样本随机初始化一个最远点的索引
    batch_indices = torch.arange(B, dtype=torch.long).to(device)
    for i in range(npoint):
        centroids[:, i] = farthest #第一个采样点选随机初始化的索引
        centroid = xyz[batch_indices, farthest, :].view(B, 1, 3)#得到当前采样点的坐标 B*3
        dist = torch.sum((xyz - centroid) ** 2, -1)#计算当前采样点与其他点的距离
        mask = dist < distance#选择距离最近的来更新距离(更新维护这个表)
        distance[mask] = dist[mask]#
        farthest = torch.max(distance, -1)[1]#重新计算得到最远点索引(在更新的表中选择距离最大的那个点)
    return centroids

分组

  • 分组(gouping):输入为batch10246(1024个点,每个点对应3个坐标3个法向量信息), 分组后输出为:batch12816*6(128个中心点,每个簇16个样本)
    gouping代码实现如下:
def query_ball_point(radius, nsample, xyz, new_xyz):
    """
    Input:
        radius: local region radius
        nsample: max sample number in local region
        xyz: all points, [B, N, 3]
        new_xyz: query points, [B, S, 3]
    Return:
        group_idx: grouped points index, [B, S, nsample]
    """
    device = xyz.device
    B, N, C = xyz.shape
    _, S, _ = new_xyz.shape
    group_idx = torch.arange(N, dtype=torch.long).to(device).view(1, 1, N).repeat([B, S, 1])
    sqrdists = square_distance(new_xyz, xyz)#得到B N M (就是N个点中每一个和M中每一个的欧氏距离)
    group_idx[sqrdists > radius ** 2] = N #找到距离大于给定半径的设置成一个N值(1024)索引
    group_idx = group_idx.sort(dim=-1)[0][:, :, :nsample]#做升序排序,后面的都是大的值(1024)
    group_first = group_idx[:, :, 0].view(B, S, 1).repeat([1, 1, nsample])#如果半径内的点没那么多,就直接用第一个点来代替了。。。
    mask = group_idx == N
    group_idx[mask] = group_first[mask]
    return group_idx
  • 维度变换(bnpointsnsamplefeatures,8128166->8616*128)
  • 卷积操作(例如:in=6,out=64)(86416*128)
  • MAX操作,得到(864128)
  • 多次采样,分组,卷积 ,采样中心点(1024->512->128)半径为0.1,0.2,0.4;以及簇采样点个数,每一次操作时,都要进行特征拼接,得到batch中心点个数特征,执行拼接操作(b512128,b512256,b512512)->(b512896)

特征提取

特征提取代码实现如下:

def forward(self, xyz, points):
        """
        Input:
            xyz: input points position data, [B, C, N]
            points: input points data, [B, D, N]
        Return:
            new_xyz: sampled points position data, [B, C, S]
            new_points_concat: sample points feature data, [B, D', S]
        """
        xyz = xyz.permute(0, 2, 1) #就是坐标点位置特征
        print(xyz.shape)
        if points is not None:
            points = points.permute(0, 2, 1) ##就是额外提取的特征,第一次的时候就是那个法向量特征
        print(points.shape)
        B, N, C = xyz.shape
        S = self.npoint
        new_xyz = index_points(xyz, farthest_point_sample(xyz, S))
        print(new_xyz.shape)
        new_points_list = []
        for i, radius in enumerate(self.radius_list):
            K = self.nsample_list[i]
            group_idx = query_ball_point(radius, K, xyz, new_xyz)#返回的是索引
            grouped_xyz = index_points(xyz, group_idx)#得到各个组中实际点
            grouped_xyz -= new_xyz.view(B, S, 1, C)#去mean new_xyz相当于簇的中心点
            if points is not None:
                grouped_points = index_points(points, group_idx)
                grouped_points = torch.cat([grouped_points, grouped_xyz], dim=-1)
                print(grouped_points.shape)
            else:
                grouped_points = grouped_xyz

            grouped_points = grouped_points.permute(0, 3, 2, 1)  # [B, D, K, S]
            print(grouped_points.shape)
            for j in range(len(self.conv_blocks[i])):
                conv = self.conv_blocks[i][j]
                bn = self.bn_blocks[i][j]
                grouped_points =  F.relu(bn(conv(grouped_points)))
            print(grouped_points.shape)
            new_points = torch.max(grouped_points, 2)[0]  # [B, D', S] 就是pointnet里的maxpool操作
            print(new_points.shape)
            new_points_list.append(new_points)

        new_xyz = new_xyz.permute(0, 2, 1)
        new_points_concat = torch.cat(new_points_list, dim=1)
        print(new_points_concat.shape)
        return new_xyz, new_points_concat
  • pointnet得到最终整体特征,再进行分类
    点云分类和点云分割点云分类和点云分割

点云分割概念

点云分割算法主要基于从几何约束和统计规则出发制定的严格的人工设计的特征。点云分割的主要过程是将原始3D点云分组为非重叠区域。

点云分割整体流程

pointnet得到最终整体特征,再进行分割
点云分类和点云分割
点云分类和点云分割

点云项目应用

如果需要本文完整项目代码,以上算法论文或者点云数据集的小伙伴可以私信我哦!文章来源地址https://www.toymoban.com/news/detail-427748.html

到了这里,关于点云分类和点云分割的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于深度学习方法的点云算法5——PointConv(点云分类分割)

    请点点赞,会持续更新!!! 基于深度学习方法的点云算法1——PointNetLK(点云配准) 基于深度学习方法的点云算法2——PointNet(点云分类分割) 基于深度学习方法的点云算法3——PointNet++(点云分类分割) 基于深度学习方法的点云算法4——PCT: Point Cloud Transformer(点云分类

    2024年02月06日
    浏览(42)
  • open3d 深度图和点云数据互转,RGBD和点云互转

    关键代码: (1) 深度图转点云 需要知道相机内外参数。  (2) 点云转深度图  需要知道相机内外参数。  point_cloud_to_depth.py 深度图-》RGBD-》点云 需要知道相机内外参数。 point_cloud_to_rgbd.py

    2024年02月11日
    浏览(39)
  • PointNet:利用深度学习对点云进行3D分类和语义分割

    参考自,PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation 代码仓库地址为:https://github.com/charlesq34/pointnet/ 介绍 这次介绍的是一个比较基础的工作,针对空间点云,进行分类或者语义分割的框架,现在通常也被用作对RGB-D图像进行特征提取的部分。 该工作的目的就是

    2024年02月03日
    浏览(70)
  • 【AI】AI和点云(1/2)

    目录 一、什么是点云 二、点云的应用领域 三、点云的创建 四、点云感知 在三维技术领域中,点云被定义为一种数据结构,用于表示三维空间中一组离散的点。这些点通常由它们的坐标(x,y,z)表示,并且可以包含其他信息,如颜色、法线、曲率等。 点云在三维技术领域

    2024年01月24日
    浏览(22)
  • 用Python体素化3D网格和点云

    推荐:用 NSDT设计器 快速搭建可编程3D场景。 3D 数据的持续学习正在成为机器学习和理解我们周围世界的越来越重要的部分。 随着新的 3D 数据提取硬件(如深度相机和 LiDAR)在闭路电视、相机和智能手机中变得司空见惯,越来越多的人正在使用它提供的额外维度。 此外,摄

    2024年02月12日
    浏览(34)
  • 【计算机视觉】基于三维重建和点云处理的扫地机器人寻路

    [摘要] 扫地机器人的使用已经越发普及,其中应用到了三维重建的知识。本项目旨在设计由一   定数量的图像根据算法完成三维模型的建立,并利用三维数据最终得到扫地机器人的行驶路   线,   完成打扫机器人成功寻路的任务   。本项目采用的方法是 SFM-MVS   、Colmap  

    2024年01月21日
    浏览(54)
  • PCL 快速计算点云的法向量

      PCL中计算点云法向量的方法采用的是Eigen库中的矩阵分解法,在阅读Open3D源码时发现Open3D集成了一种快速计算法向量的方法,该方法采用的文献A robust algorithm for finding the eigenvalues and eigenvectors of 3 × 3 symmetric matrices中提到的数值优化算法。   仔细研究该论文会发现其计

    2024年02月07日
    浏览(39)
  • 基于3D点云的小目标检测学习笔记

    一、与图像相比, 基于点云的目标检测 一直面临着一些 挑战 : 1、 非结构化数据 :点云作为场景中点的位置具有稀疏和非结构化的性质,因此它们的密度和数量都随着场景中对象而变化。 2、 不变性排列 :点云本质上是一长串点(nx3矩阵,其中n是点数)。 在几何上,点

    2024年02月12日
    浏览(37)
  • 配准带尺度点云的方法汇总

    如果点集之间不存在缩放关系时(即尺度相同时), 可以用经典ICP( Iterative Closest Point )方法求解得到旋转矩阵R和平移向量t来进行点集对齐。 如果存在缩放关系时,首先估计出点集S1和S2之间的缩放倍数s, 我们就可以利用ICP算法求解。 配准两组三维点集合步骤[参考]: ①找到一个

    2024年02月01日
    浏览(47)
  • 《QT+PCL》点云的点选与框选

    点选

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包