点云分类和点云分割

news/2024/9/22 1:41:01/

点云分类概念

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

最远点采样法

  • 最远点采样法(farthest point sampling):尽可能覆盖到原始点云数据,例如输入1024个点,要选择128个中心点
    pointnet++最远采样法
    farthest point sampling代码实现如下:
def farthest_point_sample(xyz, npoint):"""Input:xyz: pointcloud data, [B, N, 3]npoint: number of samplesReturn:centroids: sampled pointcloud index, [B, npoint]"""device = xyz.deviceB, N, C = xyz.shapecentroids = torch.zeros(B, npoint, dtype=torch.long).to(device)#8*512distance = torch.ones(B, N).to(device) * 1e10 #8*1024farthest = 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*3dist = 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 radiusnsample: max sample number in local regionxyz: all points, [B, N, 3]new_xyz: query points, [B, S, 3]Return:group_idx: grouped points index, [B, S, nsample]"""device = xyz.deviceB, N, C = xyz.shape_, S, _ = new_xyz.shapegroup_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 == Ngroup_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.shapeS = self.npointnew_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_xyzgrouped_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得到最终整体特征,再进行分类
    pointnet++分类模型pointnet++点云分类

点云分割概念

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

点云分割整体流程

pointnet得到最终整体特征,再进行分割
pointnet++分割模型
点云分割

点云项目应用

如果需要本文完整项目代码,以上算法论文或者点云数据集的小伙伴可以私信我哦!


http://www.ppmy.cn/news/241196.html

相关文章

激光雷达和点云算法汇总(长期更新)

文章目录 1.1 激光雷达硬件平台1.2 激光雷达原理1.3 三维激光系统研发难点1.4 点云应用方向1.5 点云分类&#xff0c;点云分割&#xff0c;点云特征提取&#xff08;pointnet&#xff09;1.6 点云补全&#xff08;PF-Net&#xff09;1.7 点云配准&#xff08;RPM-Net&#xff0…

激光雷达与相机融合(五)-------ros实时版点云投影到图像平面

基于第一部分在单帧中将点云投影到图像的基础上&#xff0c;现将上述代码改写为ros实时处理的版本。以后还可以在此基础上进行一步一步的扩展。将原先的离线代码改写为ros在线版本&#xff0c;需要将原本的代码写成package的形式&#xff0c;并配置好相应的依赖包、环境等&…

linux命令之ssh详解

ssh openssh套件中的客户端连接工具 Linux在线工具&#xff1a;linux命令在线工具 个人博客网站&#xff1a;博客 Java17中文文档&#xff1a;JDK17中文手册 Gradle8.1.1中文文档&#xff1a;Gradle中文文档 补充说明 ssh命令 是openssh套件中的客户端连接工具&#xff0c;可…

使用ros将点云投影到图像平面实时显示,激光雷达和相机融合处理

1、下载投影处理代码 代码链接&#xff1a;https://github.com/jhzhang19/ros_project_pc_to_image 2、将其解压到ros工作空间catkin_ws/src中 &#xff08;如果不知道如何创建ros工作空间可以参考我的另一篇博客&#xff0c;里面有记录如何创建ros工作空间 博客链接&#x…

三维激光雷达点云处理分类

目录 激光雷达点云的研究激光雷达数据的处理方法分类体素转化为图像直接对点云操作 三种方式的优劣 激光雷达点云的研究 目前&#xff0c;学术界和业界对于激光雷达点云的处理方式的研究变的非常热门。我认为原因有二&#xff1a; 来自学术界的推力&#xff1a;对于图片中的许…

【​观察】加速推进全球云生态布局,为何说锐角云正在下一盘“大棋”?

申耀的科技观察 读懂科技&#xff0c;赢取未来&#xff01; 风口里发生的事儿总是那么引人瞩目。6月6日&#xff0c;于台北文华东方酒店举办的“PC联盟暨锐角云生态全球战略发布会”&#xff0c;着实吸引了业界的目光。 在此次发布会上&#xff0c;锐角云不仅发布了作为区块链电…

锐角云生态,未来能否比肩云存储巨头?

如果你平时喜欢经常上网、打游戏&#xff0c;你一定会考虑到这样的问题&#xff0c;网页内容从哪来、谁来实时同步游戏数据、我下载的电影从哪传过来&#xff1f;他们都是来自中心服务器&#xff0c;但是如果其中账号泄露、数据被窃取怎么办&#xff1f;&#xff08;当然&#…

锐角云hdmi直通,PVE直通核显给WIN10, 并实现hdmi输出做HTPC

一、开启VT-D&#xff0c;安装pve、虚拟机win10 锐角云是hd500核显&#xff0c;根据该文章开启VT-D https://blog.csdn.net/maxuearn/article/details/107573139 注&#xff1a;为了提高性能&#xff0c;可调整显存DVMT Pre-Allocated到512M&#xff0c;DVMT Total Gfx Mem到m…