Open3D-ML点云语义分割【RandLA-Net】

作为点云 Open3D-ML 实验的一部分,我撰写了文章解释如何使用 Tensorflow 和 PyTorch 支持安装此库。 为了测试安装,我解释了如何运行一个简单的 Python 脚本来可视化名为 SemanticKITTI 的语义分割标记数据集。 在本文中,我将回顾在任何点云上进行推理的步骤,包括 SemanticKITTI 的测试部分以及我的私人数据集。

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 

本文的其余部分假设你已按照我的上一篇文章成功安装并使用 PyTorch 后端测试了 Open3D-ML。 完成此操作也意味着你已经下载了 SemanticKITTI 数据集。 要对未标记的数据运行语义分割模型,你需要加载 Open3D-ML 管道。 该管道将包含语义分割模型、数据集以及可能的其他预处理/后处理步骤。 Open3D-ML 附带模块和配置文件,可以轻松加载和运行流行的管道。

为了对新点云进行推理,我们将使用一种名为 RandLA-Net 的流行模型,该模型在 2019 年题为 RandLA-Net:大规模点云的高效语义分割的论文中提出。 方便的是,Open3D-ML 具有此方法的实现,并且具有在 SemanticKITTI 数据集上加载和运行此类方法的配置,无需太多努力。

要加载配置文件,我们需要以下代码,确保将  /path/to/Open3D/ 替换为安装时克隆 Open3D 存储库的路径。

# Load an ML configuration file
cfg_file = "/path/to/Open3D/build/Open3D-ML/ml3d/configs/randlanet_semantickitti.yml"
cfg = _ml3d.utils.Config.load_from_file(cfg_file)

接下来,我们将使用配置对象创建 RandLANet 模型,并将路径添加到 SemanticKITTI 数据集以及我们的自定义数据集。 确保将 /path/to/save/dataset/SemanticKitti/ 替换为安装 Open3D-ML 时保存 SemanticKITTI 数据的路径。 目前,自定义数据集指向我的机器人收集的一些个人点云,并在本文随附的存储库中提供。

# Load the RandLANet model
model = ml3d.models.RandLANet(**cfg.model)
# Add path to the SemanticKitti dataset and your own custom dataset
cfg.dataset['dataset_path'] = '/path/to/save/dataset/SemanticKitti/'
cfg.dataset['custom_dataset_path'] = './pcds'

下一步是加载数据集。 为了加载 SementicKITTI 数据集,Open3D-ML 具有方便的帮助器类和方法。

# Load the datasets
dataset = ml3d.datasets.SemanticKITTI(cfg.dataset.pop('dataset_path', None), **cfg.dataset)
custom_dataset = load_custom_dataset(cfg.dataset.pop('custom_dataset_path', None))

添加了一个简单的自定义函数来加载自定义数据集。 请注意,该数据集必须采用 PCD 格式。

def load_custom_dataset(dataset_path):print("Loading custom dataset")pcd_paths = glob.glob(dataset_path+"/*.pcd")pcds = []for pcd_path in pcd_paths:pcds.append(o3d.io.read_point_cloud(pcd_path))return pcds

接下来,使用配置、模型和数据集对象创建管道。 如果不可用,则在加载到管道之前下载模型参数(检查点)。

# Create the ML pipeline
pipeline = ml3d.pipelines.SemanticSegmentation(model, dataset=dataset, device="gpu", **cfg.pipeline)
# Download the weights.
ckpt_folder = "./logs/"
os.makedirs(ckpt_folder, exist_ok=True)
ckpt_path = ckpt_folder + "randlanet_semantickitti_202201071330utc.pth"
randlanet_url = "https://storage.googleapis.com/open3d-releases/model-zoo/randlanet_semantickitti_202201071330utc.pth"
if not os.path.exists(ckpt_path):cmd = "wget {} -O {}".format(randlanet_url, ckpt_path)os.system(cmd)
# Load the parameters of the model.
pipeline.load_ckpt(ckpt_path=ckpt_path)

为了在 SemanticKITTI 测试集中的未标记点云上运行模型,我们首先按索引选择给定的数据点,然后从管道运行推理操作。 你可以更改变量 pc_idx 的值来选择另一个点云。

# Get one test point cloud from the SemanticKitti dataset
pc_idx = 58 # change the index to get a different point cloud
test_split = dataset.get_split("test")
data = test_split.get_data(pc_idx)
# run inference on a single example.
# returns dict with 'predict_labels' and 'predict_scores'.
result = pipeline.run_inference(data)

SemanticKITTI 数据集中的点云数据实例作为包含键“point”、“feat”和“label”的 Python 字典加载。 最后两个分别有 None 和一个用 0 填充的 Numpy 数组作为值,并且在推理过程中不使用。 “point”键与包含 LiDAR 点的 x、y 和 z 坐标的 Numpy 数组关联。 为了使用 Open3D 可视化工具可视化推理结果,我们需要从字典的“point”部分创建一个点云对象,然后使用推理返回的标签对点进行着色。

# Create a pcd to be visualized 
pcd = o3d.geometry.PointCloud()
xyz = data["point"] # Get the points
pcd.points = o3d.utility.Vector3dVector(xyz)
# Get the color associated with each predicted label
colors = [COLOR_MAP[clr] for clr in list(result['predict_labels'])] 
pcd.colors = o3d.utility.Vector3dVector(colors) # Add color data to the point cloud
# Create visualization
custom_draw_geometry(pcd)

SemanticKITTI 数据集有 19 个类以及一个背景类。 必须提供从类标签到点颜色的颜色映射。 为了便于阅读,RGB 颜色被定义为整数,但可视化工具使用从 0.0 到 1.0 的双精度数,因此提供了一些进行转换的代码。

# Class colors, RGB values as ints for easy reading
COLOR_MAP = {0: (0, 0, 0),1: (245, 150, 100),2: (245, 230, 100),3: (150, 60, 30),4: (180, 30, 80),5: (255, 0., 0),6: (30, 30, 255),7: (200, 40, 255),8: (90, 30, 150),9: (255, 0, 255),10: (255, 150, 255),11: (75, 0, 75),12: (75, 0., 175),13: (0, 200, 255),14: (50, 120, 255),15: (0, 175, 0),16: (0, 60, 135),17: (80, 240, 150),18: (150, 240, 255),19: (0, 0, 255),
}
# Convert class colors to doubles from 0 to 1, as expected by the visualizer
for label in COLOR_MAP:COLOR_MAP[label] = tuple(val/255 for val in COLOR_MAP[label])

用语义分割的结果绘制点云的自定义函数如下:

def custom_draw_geometry(pcd):vis = o3d.visualization.Visualizer()vis.create_window()vis.get_render_option().point_size = 2.0vis.get_render_option().background_color = np.asarray([1.0, 1.0, 1.0])vis.add_geometry(pcd)vis.run()vis.destroy_window()

为了对我们的私人数据进行推理,我们遵循类似的过程。 提供所需数据点的索引,并在将结果字典传递到管道之前执行加载和预处理 PCD 文件的自定义函数。 然后,我们对分割的点云进行着色并显示。

# Get one test point cloud from the custom dataset
pc_idx = 2 # change the index to get a different point cloud
data, pcd = prepare_point_cloud_for_inference(custom_dataset[pc_idx])
# Run inference
result = pipeline.run_inference(data)
# Colorize the point cloud with predicted labels
colors = [COLOR_MAP[clr] for clr in list(result['predict_labels'])]
pcd.colors = o3d.utility.Vector3dVector(colors)
# Create visualization
custom_draw_geometry(pcd)

准备数据的自定义函数接收从 PCD 列表获得的 PCD,删除非有限点(nan 和 +/-inf 值),从 PCD 获取点数据,并用它构建适合管道的字典 。 然后它返回 PCD 和字典。

def prepare_point_cloud_for_inference(pcd):# Remove NaNs and infinity valuespcd.remove_non_finite_points()# Extract the xyz pointsxyz = np.asarray(pcd.points)# Set the points to the correct format for inferencedata = {"point":xyz, 'feat': None, 'label':np.zeros((len(xyz),), dtype=np.int32)}
return data, pcd

要运行代码并亲自查看结果,请激活 Conda 环境并按照以下步骤操作。

第 1 步:克隆存储库

git clone https://github.com/carlos-argueta/open3d_experiments.git

第 2 步:运行代码

cd open3d_experiments
python3 semantic_torch.py

第 3 步:故障排除

如果出现错误:

RuntimeError: Expected all tensors to be on the same device, but found at attestate at the attesting all devices, cpu and cuda:0! 

打开文件 /path/to/your/conda-env/lib/python3.9/site-packages/open3d/_ml3d/torch/modules/losses/semseg_loss.py,确保替换  /path/to/your/conda -env 为你的 Conda 环境路径,替换python3.9 为你的 Python 版本。

接下来,找到第 9 行并在其末尾添加 .to(device)

关闭并保存文件,这应该可以解决问题。

如果出现错误: ModuleNotFoundError:no module named 'tensorboard',则运行:

pip install tensorboard

第四步:享受吧!


原文链接:Open3D-ML点云语义分割 - BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp h5发行

前端使用uniapp开发项目完成后,需要将页面打包,生成H5的静态文件,部署在服务器上。 这样通过服务器链接地址,直接可以在手机上点开来访问。 打包全步骤如下: 首先在manifest.json文件中进行基础配置,获取…

【SpringBoot篇】分页查询 | 扩展SpringMvc的消息转换器

文章目录 🛸什么是分页查询🌹代码实现⭐问题🎄解决方法 做了几个项目,发现在这几个项目里面,都实现了分页查询效果,所以就总结一下,方便学习 我们基于黑马程序员的苍穹外卖来讲解分页查询的要点…

黑马程序员微服务 分布式搜索引擎3

分布式搜索引擎03 0.学习目标 1.数据聚合 **聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售…

哪种猫罐头比较好?推荐给新手养猫的5款好口碑猫罐头!

新手养猫很容易陷入疯狂购买的模式,但有些品牌真的不能乱买!现在的大环境不太好,我们需要学会控制自己的消费欲望,把钱花在刀刃上!哪种猫罐头比较好?现在宠物市场真的很内卷,很多品牌都在比拼产…

字母不重复的子串-第15届蓝桥第二次STEMA测评Scratch真题精选

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第158讲。 第15届蓝桥第2次STEMA测评已于2023年10月29日落下帷幕,编程题一共有6题,分别如下&am…

无需云盘,不限流量实现Zotero跨平台同步:内网穿透+私有WebDAV服务器

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 无需云盘,不限流量实现Zotero跨平台同步:内网穿透私有WebDAV服务器 文章目…

2-10岁女童冬季穿搭怎么选?麻麻们看这里

分享适合女宝的羽绒服穿搭 这种黄色真的超好看 吸睛显白怎么穿都好看 长款连帽设计,精致走线 冬天穿时尚又好看!!

数据结构—LinkedList与链表

目录 一、链表 1. 链表的概念及结构 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环 二.LinkedList的使用 1.LinkedList概念及结构 2. LinkedList的构造 3. LinkedList的方法 三. ArrayList和LinkedList的区别 一、链表 1. 链表的概念及结构 链表是一种 物理…

基于Qt 多线程(继承 QObject 的线程)

​ 继承 QThread 类是创建线程的一种方法,另一种就是继承QObject 类。继承 QObject 类更加灵活。它通过 QObject::moveToThread()方法,将一个 QObeject的类转移到一个线程里执行。恩,不理解的话,我们下面也画个图捋一下。 通过上面的图不难理解,首先我们写一个类继承 QObj…

Ladybug 全景相机, 360°球形成像,带来全方位的视觉体验

360无死角全景照片总能给人带来强烈的视觉震撼,有着大片的既视感。那怎么才能拍出360球形照片呢?它的拍摄原理是通过图片某个点位为中心将图片其他部位螺旋式、旋转式处理,从而达到沉浸式体验的效果。俗话说“工欲善其事,必先利其…

Maven编译报错:javacTask: 源发行版 1.8 需要目标发行版 1.8

报错截图: IDEA中的jdk检查都正常设置的1.8一点毛病没有。参考其他帖子链接如下: https://blog.csdn.net/zhishidi/article/details/131480199https://blog.51cto.com/u_16213460/7197764https://blog.csdn.net/lck_csdn/article/details/125387878 逐…

第四代智能井盖传感器,万宾科技助力城市安全

在迈向更为智能化、相互联系更为紧密的城市发展过程中,智能创新产品无疑扮演了一种重要的角色。智能井盖传感器作为新型科学技术产物,不仅解决传统井盖管理难的问题,也让城市变得更加安全美好,是城市生命线的一层重要保障。这些平…

Mindomo Desktop for Mac(免费思维导图软件)下载

Mindomo Desktop for Mac是一款免费的思维导图软件,适用于Mac电脑用户。它可以帮助你轻松创建、编辑和共享思维导图,让你的思维更加清晰、有条理。 首先,Mindomo Desktop for Mac具有直观易用的界面。它采用了Mac独特的用户界面设计&#xf…

避免defer陷阱:拆解延迟语句,掌握正确使用方法

基本概念 Go语言的延迟语句defer有哪些特点?通常在什么情况下使用? Go语言的延迟语句(defer statement)具有以下特点: 延迟执行:延迟语句会在包含它的函数执行结束前执行,无论函数是正常返回还是…

科研学习|研究方法——Python计量Logit模型

一、离散选择模型 莎士比亚曾经说过:To be, or not to be, that is the question,这就是典型的离散选择模型。如果被解释变量时离散的,而非连续的,称为“离散选择模型”。例如,消费者在购买汽车的时候通常会比较几个不…

Vue 3.0 + vite + axios+PHP跨域问题的解决办法

最后一个Web项目,采用前后端分离。 前端:Vue 3.0 viteelement plus 后端:PHP 运行时前端和后端是两个程序,前端需要时才向后端请求数据。由于是两个程序,这就会出现跨域问题。 比如前端某个地方需要请求的接口如下…

内网穿透的应用-通过内网穿透快速搭建公网可访问的Spring Boot接口调试环境

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Python自动化测试之request库详解(三)

做过接口测试的都会发现,现在的接口都是HTTPS协议了,今天就写一篇如何通过request发送https请求。 什么是HTTPS HTTPS 的全称是Hyper Text Transfer Protocol over Secure Socket Layer ,是以安全为目标的HTTP通道,简单的讲是HTT…

Power Automate-当收到HTTP请求时触发流程

选择创建自动化云端流,点跳过 第一个操作搜索HTTP,点击当收到HTTP请求时

高质量发展项目——冠心病药物治疗管理标准化培训在京顺利举办

国家卫生健康委《关于加快药学服务高质量发展的意见》明确指出,药师应在慢性病管理中发挥积极作用,可开展用药随访、药物重整等工作。目前,国内尚无针对药师使用的冠心病患者药物治疗管理规范,不同层级医疗机构药师的理论水平和实…