????????三维点云语义分割结果可视化的目的是更加直观地看到语义分割的效果。上一节详细介绍了PontNet++点云分割,具体内容请参考三维点云语义分割 — PointNet++详解(二)_Coding的叶子的博客-CSDN博客。本节仍然以上一篇PointNet++源码为例。
1 数据介绍
????????测试程序仍然使用S3DIS数据集,测试数据处理流程与上一节的训练数据处理流程基本一致,请参考三维点云语义分割 — PointNet++详解(二)_Coding的叶子的博客-CSDN博客。
????????不同之处在于:训练阶段会随机选取点云中心,然后在xy方圆1m的点云内随机采样4096个点作为训练样本。这里涉及到两个随机取样,而在测试阶段这两个阶段需要变成固定的。首先,将样本全部点云空间在xy平面划分成边长为1的网格,然后在每个网格中进行采样,而不是随机选择样本中心。网格中点数量不满足4096的整数倍时,对网格点进行重复补充,使得点的数量达到要求。这样做是为了确保测试时能够对所有的点都能够采样到,而不是随机的。
????????每个网格中的点会被完全分成一个个4096的点云。在此之前,程序会对网格中点的顺序进行一次打乱,这样会导致每次取样的4096个点会有所不同,但是总体仍然覆盖网格中的全部点云。
????????测试程序会对每个网格中全部的4096个样本数据进行语义分割,最后拼接到全体点云中,从而实现了整个场景的语义分割。可以,看到这种做法某种成度上来说仍然是一种局部语义分割或者是分块语义分割。更加形象地说,这有点像盲人摸象。后续将陆续介绍其他改进类的三维点云分割算法。
2 可视化程序
????????通过运行Github上的测试程序,可以为每个场景的语义分割结果生成对应的txt文件,文件存储了每个点语义分割后的类别标签,如Area_5_office_33.txt。点云坐标和真实标签存储在上一节所述的npy文件中,如Area_5_office_33.npy。npy文件的前三维为xyz坐标,中间三维为法向量,最后一维为真实的类别标签。处理后数据也可直接下载,地址点云语义分割可视化样例数据-深度学习文档类资源-CSDN下载。
????????这里将采用Open3d对语义分割结果进行可视化。
# -*- coding: utf-8 -*-
"""
乐乐感知学堂公众号
@author: https://blog.csdn.net/suiyingy
"""
import open3d as o3d
import numpy as np
from copy import deepcopy
if __name__ == '__main__':
preds = np.loadtxt('Area_5_office_33.txt')
points = np.load('Area_5_office_33.npy')
print(preds.shape, points.shape)
print(set(preds))
#随机生成13个类别的颜色
colors_0 = np.random.randint(255, size=(13, 3))/255.
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points[:, :3])
#为各个真实标签指定颜色
colors = colors_0[points[:, -1].astype(np.uint8)]
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])
#显示预测结果
pcd1 = deepcopy(pcd)
pcd1.translate((0, 5, 0)) #整体进行y轴方向平移5
#为各个预测标签指定颜色
colors = colors_0[preds.astype(np.uint8)]
pcd1.colors = o3d.utility.Vector3dVector(colors[:, :3])
#显示预测结果和真实结果对比
pcd2 = deepcopy(pcd)
pcd2.translate((0, -5, 0)) #整体进行y轴方向平移-5
preds = preds.astype(np.uint8) == points[:, -1].astype(np.uint8)
#为各个预测标签指定颜色
colors = colors_0[preds.astype(np.uint8)]
pcd2.colors = o3d.utility.Vector3dVector(colors[:, :3])
# 点云显示
o3d.visualization.draw_geometries([pcd, pcd1, pcd2], window_name="PointNet++语义分割结果",
point_show_normal=False,
width=800, # 窗口宽度
height=600) # 窗口高度
3 点云语义分割效果
????????中间图片为点云真实分割效果,上方图片为点云预测效果。下方为真实值和预测值之间的差异,预测正确的地方为灰黄色,错误的为绿色。
4 室内效果
????????通过滚轮可以拉近显示点云,并进入到房间内部,效果如下图所示。
python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。更新完成的部分可以在三维点云专栏中查看。https://blog.csdn.net/suiyingy/category_11740467.htmlhttps://blog.csdn.net/suiyingy/category_11740467.html1、点云格式介绍(已完成)常见点云存储方式有pcd、ply、bin、txt文件。open3d读写pcd和plhttps://blog.csdn.net/suiyingy/article/details/124017716
|