RandLA-Net结果可视化(将结果保存到本地再通过cloudcompare可视化)

2023-11-17

RandLA-Net结果可视化(将结果保存到本地再通过cloudcompare可视化)

问题:

RandLA-Net官网提供代码的可视化部分是通过open3d的方式呈现的,但如果使用远端服务器去跑,可能就无法实现可视化;或者当我们的需要可视化的点云文件过大时(几个G),在本地电脑运行这个代码就会直接导致电脑卡死
本文提供一种将最终的测试结果保存为ply/txt文件,再通过一些常用的点云处理工具,如meshlab、cloudcompare等进行可视化的方式

官方可视化代码解释

RandLA-Net官方提供的代码中,可视化的部分在utils/6_fold_cv.py中,将在这里插入图片描述

中的visualization = False设置为Ture即可;代码将执行以下部分,主要是绘制原始点云、按照真实标签赋颜色的点云以及按照预测标签赋颜色的点云:
在这里插入图片描述

其中draw_pc_sem_ins方法来自于RandLA-Net的helper_tool.py,主要是将标签和颜色进行一个映射,然后通过open3d进行绘图展示;

def draw_pc_sem_ins(pc_xyz, pc_sem_ins, plot_colors=None):
    """
    pc_xyz: 3D coordinates of point clouds
    pc_sem_ins: semantic or instance labels
    plot_colors: custom color list
    """
    if plot_colors is not None:
        ins_colors = plot_colors
    else:
        ins_colors = Plot.random_colors(len(np.unique(pc_sem_ins)) + 1, seed=2)
    sem_ins_labels = np.unique(pc_sem_ins)
    sem_ins_bbox = []
    Y_colors = np.zeros((pc_sem_ins.shape[0], 3))
    for id, semins in enumerate(sem_ins_labels):
        valid_ind = np.argwhere(pc_sem_ins == semins)[:, 0]
        if semins <= -1:
            tp = [0, 0, 0]
        else:
            if plot_colors is not None:
                tp = ins_colors[semins]
            else:
                tp = ins_colors[id]

        Y_colors[valid_ind] = tp

        ### bbox
        valid_xyz = pc_xyz[valid_ind]

        xmin = np.min(valid_xyz[:, 0]);
        xmax = np.max(valid_xyz[:, 0])
        ymin = np.min(valid_xyz[:, 1]);
        ymax = np.max(valid_xyz[:, 1])
        zmin = np.min(valid_xyz[:, 2]);
        zmax = np.max(valid_xyz[:, 2])
        sem_ins_bbox.append(
            [[xmin, ymin, zmin], [xmax, ymax, zmax], [min(tp[0], 1.), min(tp[1], 1.), min(tp[2], 1.)]])

    Y_semins = np.concatenate([pc_xyz[:, 0:3], Y_colors], axis=-1)
    Plot.draw_pc(Y_semins)
    return Y_semins

如果需要使用open3d进行可视化,只需要将utils/6_fold_cv.py中可视化的这部分代码和读取文件部分的提取出来即可,此处不多做介绍,下面主要介绍一下通过将最终预测结果保存为ply/txt到本地的方式,通过点云处理工具进行可视化的方法。

实现过程:

首先需要将helper_tool.py当中的draw_pc_ins方法进行一些修改,由于我们不需要使用open3d进行绘图,所以注释掉PC.draw_pc相关的代码即可,具体可以参考下面的代码:

 def draw_pc_sem_ins(pc_xyz, pc_sem_ins, plot_colors=None):
        """
        pc_xyz: 3D coordinates of point clouds
        pc_sem_ins: semantic or instance labels
        plot_colors: custom color list
        """
        if plot_colors is not None:
            ins_colors = plot_colors
        else:
            ins_colors = Plot.random_colors(len(np.unique(pc_sem_ins)) + 1, seed=2)

        ##############################
        sem_ins_labels = np.unique(pc_sem_ins)
        #sem_ins_bbox = []
        Y_colors = np.zeros((pc_sem_ins.shape[0], 3))
        for id, semins in enumerate(sem_ins_labels):
            valid_ind = np.argwhere(pc_sem_ins == semins)[:, 0]
            if semins <= -1:
                tp = [0, 0, 0]
            else:
                if plot_colors is not None:
                    tp = ins_colors[semins]
                else:
                    tp = ins_colors[id]

            Y_colors[valid_ind] = tp

            ## bbox
            #valid_xyz = pc_xyz[valid_ind]

            # xmin = np.min(valid_xyz[:, 0]);
            # xmax = np.max(valid_xyz[:, 0])
            # ymin = np.min(valid_xyz[:, 1]);
            # ymax = np.max(valid_xyz[:, 1])
            # zmin = np.min(valid_xyz[:, 2]);
            # zmax = np.max(valid_xyz[:, 2])
           # sem_ins_bbox.append(
            #    [[xmin, ymin, zmin], [xmax, ymax, zmax], [min(tp[0], 1.), min(tp[1], 1.), min(tp[2], 1.)]])
        Y_semins = np.concatenate([pc_xyz[:, 0:3], Y_colors], axis=-1)
        #Plot.draw_pc(Y_semins)
        return Y_semins

以下将预测结果保存为ply/txt的代码,其中base_dir是使用randla-net模型预测后的ply文件所在路径,注意:使用RandLa-Net官方代码运行测试代码后生成的ply文件只保存了预测标签和真实标签,没有其他信息,不能直接将此ply丢到cloudcompare中进行可视化!
original_data_dir是真实点云对应的ply文件,data_path中 ’Area_1.ply‘是我实际想要可视化的那一个点云文件,当然也可以直接写成’*.ply‘,不过后面的保存生成文件的代码也需要在一个循环中进行。需要根据实际点云类别标签数量修改rang(5)中的值。保存为ply的话需要用到trimesh,可以直接用pip install trimesh安装这个库。保存为txt的话可以直接用我注释掉的那一行代码,最后将保存的文件拿到cloudcompare中即可完成可视化。

import numpy as np
import glob, os, sys
import trimesh

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = os.path.dirname(BASE_DIR)
sys.path.append(ROOT_DIR)
from helper_ply import read_ply
from helper_tool import Plot

if __name__ == '__main__':
    base_dir = 'D:\\mageechan\\randlanet-vis\\randla-net-tf2-main\\results'
    original_data_dir = 'D:\\mageechan\\randlanet-vis\\original_ply'
    data_path = glob.glob(os.path.join(base_dir, 'Area_1.ply'))
    data_path = np.sort(data_path)

    test_total_correct = 0
    test_total_seen = 0
    gt_classes = [0 for _ in range(5)]
    positive_classes = [0 for _ in range(5)]
    true_positive_classes = [0 for _ in range(5)]
    visualization = True

    for file_name in data_path:
        pred_data = read_ply(file_name)
        pred = pred_data['pred']
        original_data = read_ply(os.path.join(original_data_dir, file_name.split('\\')[-1][:-4] + '.ply'))
        labels = original_data['class']
        #print(labels)
        points = np.vstack((original_data['x'], original_data['y'], original_data['z'])).T

        ##################
        # Visualize data #
        ##################
        if visualization:
            #colors = np.vstack((original_data['red'], original_data['green'], original_data['blue'])).T
            #xyzrgb = np.concatenate([points, colors], axis=-1)
            print("绘制颜色信息")
            pred_point=Plot.draw_pc_sem_ins(points, pred)
            true_point=Plot.draw_pc_sem_ins(points, labels)
            vertices1 = pred_point[:, :3]
            colors1 = pred_point[:, 3:]
            vertices2 = true_point[:, :3]
            colors2 = true_point[:, 3:]
            mesh1 = trimesh.Trimesh(vertices=vertices1, vertex_colors=colors1)
            mesh2= trimesh.Trimesh(vertices=vertices2, vertex_colors=colors2)
            print("开始保存")
            mesh1.export('D:\\mageechan\\randlanet-vis\\randla-net-tf2-main\\results\\Area_1_pred_point.ply')
            mesh2.export('D:\\mageechan\\randlanet-vis\\randla-net-tf2-main\\results\\Area_1_true_point.ply')
            #np.savetxt('D:\\mageechan\\randlanet-vis\\randla-net-tf2-main\\results\\true_point.txt', pred_point,fmt='%.4f')
            print("保存成功")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RandLA-Net结果可视化(将结果保存到本地再通过cloudcompare可视化) 的相关文章

  • httplib.BadStatusLine: '' 在 Linux 上,但在 Mac 上则不然

    这个错误已经困扰我几个小时了 我决定编写一个单独的项目 只是为了看看我是否可以复制它 而且我可以 但只能在我的服务器上复制 这适用于我的 Mac Mac OSX El Capitan 10 11 6 服务器 CentOS 7 2 1511
  • python类型中的__flags__有什么用

    我最近阅读了pickle源代码 以下代码在copy reg让我很困惑 HEAPTYPE 1 lt lt 9 def reduce ex self proto assert proto lt 2 for base in self class
  • 为什么最新的 Python 3.8.x 版本不提供 Windows 安装程序?

    我需要在Windows计算机上安装Python 3 8并希望使用最新的小版本3 8 12 https www python org downloads release python 3812 官方发布网页提供了源代码的 tarball 文件
  • matplotlib get_color 用于子图

    我正在按照这里的教程进行操作 https matplotlib org gallery ticks and spines multiple yaxis with spines html https matplotlib org galler
  • matplotlib 的 pcolor 中的白线

    在某些 pdf 查看器 例如 OSX 上的 Preview 中 使用以下命令绘制的图matplotlib的 pcolor 有白线 见下图 我怎样才能摆脱它们 源代码非常简单 选择任何数据x y z import matplotlib mat
  • 使用 OpenCV 进行图像模糊检测

    我正在研究图像的模糊检测 我已经用过拉普拉斯方法的方差在 OpenCV 中 img cv2 imread imgPath gray cv2 cvtColor img cv2 COLOR BGR2GRAY value cv2 Laplacia
  • gcloud app deploy:此部署有太多文件

    当我尝试通过 gcloud 部署我的 GAE 应用程序时 出现以下错误 Updating service default failed ERROR gcloud app deploy Error Response 400 This depl
  • 如果工作表不存在,Pandas 将工作表附加到工作簿,否则覆盖工作表

    我正在使用 pandas 更新现有的 Excel 工作簿 当使用ExcelWriter对象 我可以覆盖工作表 如果存在 否则创建一个新工作表吗 我的代码附加了新工作表 但是当我尝试覆盖现有工作表时 它会附加一个名称略有不同的新工作表 例如
  • Python服务器“通常只允许每个套接字地址使用一次”

    我正在尝试用 python 创建一个非常基本的服务器 它侦听端口 当客户端尝试连接时创建 TCP 连接 接收数据 发回某些内容 然后再次侦听 并无限期地重复该过程 这是我到目前为止所拥有的 from socket import server
  • Odoo:如何覆盖原始功能

    在 Odoo 中 每次打开产品表单时都会计算产品的数量 这发生在模型中product product gt function product available 该函数返回一个名为 res 的字典 Example res 8 qty ava
  • 并行磁盘 I/O

    我有几个想要阅读的日志文件 不失一般性 假设日志文件处理如下 def process infilepath answer 0 with open infilepath as infile for line in infile if line
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • Python:使用Excel CSV文件仅读取某些列和行

    虽然我可以读取 csv 文件而不是读取整个文件 但如何仅打印某些行和列 想象一下这是 Excel A B C D E State Heart Disease Rate Stroke Death Rate HIV Diagnosis Rate
  • pygame.image.load 不工作

    我正在尝试为游戏创建世界地图 但是当我尝试将世界地图加载到屏幕上时 命令行告诉我无法执行此操作 这是代码 import sys import pygame from pygame locals import pygame init Surf
  • 无法从源 pylance 解析导入烧瓶

    我正在学习 Python 课程的一部分是使用 Flask 设置网络服务器 我按照 Flask 安装文档执行了步骤 由于某种原因 flask 模块带有下划线 如下所示 当我将鼠标悬停时 我会得到如下附加信息 无法从源 pylance 解析导入
  • Python,质数检查器[重复]

    这个问题在这里已经有答案了 你好 我正在创建一个函数来检查一个数字是否是素数 但它告诉我 9 是一个素数 def eprimo num if num lt 2 return False if num 2 return True else f
  • 在 python 中,VSCode 调试器不会单步执行外部代码。无法弄清楚如何编辑 launch.json 中的“justMyCode”

    我一直在提到https code visualstudio com docs python debugging justmycode https code visualstudio com docs python debugging jus
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • centos上无法安装Pillow

    我上面有 centos 6 3 和 python 2 6 当我尝试通过 easy install 安装它时 出现以下错误 imaging c 76 20 error Python h No such file or directory In
  • 根据键的重复值从列表中删除字典

    我是Python新手 假设我有以下字典列表 mydictList a 1 b 2 c 3 a 2 b 2 c 4 a 2 b 3 c 4 从上面的列表中 我想删除具有相同键 b 值的字典 所以结果列表应该是 mydictList a 1 b

随机推荐

  • 【论文党福利】如何提取图像中的数据

    论文党福利 如何提取图像中的数据 从事科研的老师和同学们在撰写论文时 经常需要将文献中的曲线与自己的结果进行对比 为获取原始数据 最靠谱的方法当然是找原作者要 如果没有要到呢 本文将成为论文党的福利 为你提供你两种解决方案 均是用matla
  • Vue2.0+webpack 引入字体文件(eot,ttf,woff)

    webpack base config js 需要配置 test woff2 eot ttf otf loader url loader options limit 10000 name utils assetsPath fonts nam
  • 图形学相关期刊和会议的基本信息

    目录 期刊 A类 ACM TOG A类 IEEE TIP A类 IEEE TVCG B类 TOMCCAP B类 CAGD B类 CGF B类 CAD B类 GM B类 TCSVT B类 TMM B类 SIIMS C类 CGTA C类 CAV
  • Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉)

    0x00 前言 使用各种的shell工具获取到目标权限 即可进行数据操作 今天来简要分析一下目前常使用的各类shell管理工具的流量特诊 帮助蓝队同学在风险识别上快速初值 0x01 中国菜刀流量分析 payload特征 PHP ASP AS
  • ElasticSearch系列-索引原理与数据读写流程详解

    索引原理 倒排索引 倒排索引 Inverted Index 也叫反向索引 有反向索引必有正向索引 通俗地来讲 正向索引是通过key找value 反向索引则是通过value找key ES底层在检索时底层使用的就是倒排索引 索引模型 现有索引和
  • JAVA(Object和String)一 Object类和String字符串的理解和使用

    JAVA Object和String 一 Object类和String字符串的理解和使用 Object类 String类 Object类 理解 在JAVA中有一个非常特殊的类叫做Object类 JAVA里面所有的类都继承自Object类 我
  • Git下载/查看/切换/新建分支

    1 git下载指定分支代码 git clone b branchname https github com xxx xxx git 2 看分支 git branch 列出本地已经存在的分支 并且当前分支会用 标记 git branch r
  • Element ui Dialog弹出框宽度固定不变

    一般我们引用Dialog弹出框时 弹出框的大小都是用width 30 这样来设置 这样的话我们在缩小屏幕的时候弹出框就会根据你缩小屏幕的宽度的百分比来设置 这样你弹出框里面的东西就会溢出 如果你不想溢出就把宽度写成width 500px 这
  • 文件上传服务器例子,服务器端的程序优化

    package cn dali4 code04ex 此程序优化了文件名 这样可以随机生成文件名 给服务器写了循环 可以一直监听 开启了多线程 优化了执行的效率 import java io import java net ServerSoc
  • C++代码注释详解

    常用注释语法 注释写在对应的函数或变量前面 JavaDoc类型的多行注释风格如下 这里为注释 一般注释中有简要注释和详细注释 简要注释有多种标识方式 这里推荐使用 brief命令强制说明 例如 brief 这里为简要注释 这里为详细注释 b
  • 正确使用g2o各类线性方程求解器

    g2o LinearSolverEigen g2o LinearSolverDense g2o LinearSolverCSparse g2o LinearSolverCholmod是常用的线性方程求解器 一套可运行程序 包括不同梯度下降优
  • Python中的异常处理raise介绍

    文章目录 0 介绍 1 raise 介绍 案例 2 raise 不需要参数 案例 3 raise 单独一个 raise 正常程序使用无参的 raise 4 其它案例 4 1 案例1 4 2 案例2 5 处理流程 总结 0 介绍 问题1 是否
  • eslint 搭配 vscode 的简单使用

    前言 刚开始时 由于嫌麻烦 并没有安装eslint 最近在新的项目上使用了eslint再配合vscode的插件 真是爽的不要太爽 因此打算写一篇简单的食用说明来记录食用过程 前期准备 没啥好准备的 作为开发肯定是具备yarn和node的 编
  • WINDOWS键盘钩子

    最近有个需求做的时候碰到需要捕获某个程序的特定按键并且在该程序处于焦点并且按下特定键 如F1 时让主板的蜂鸣器响一声以提示 由于该程序没有源码 因此只能通过编写服务挂全局钩子来对该程序的键盘消息进行捕获 大致的代码结构是使用VC现编写了一个
  • Linux Debian上快速安装Docker并运行

    要在Debian上安装Docker 可以按照以下步骤进行 更新系统软件包 在终端中执行以下命令 更新系统软件包 sudo apt get update 安装依赖包 在终端中执行以下命令 安装Docker需要的依赖包 sudo apt get
  • Echarts折线图x轴刻度距离

    在 ECharts 折线图中 x 轴刻度的距离是根据数据的数量和实际绘图区域的宽度来确定的 ECharts 会根据数据的数量自动计算出 x 轴上每个刻度之间的距离 以适应绘图区域的宽度 如果希望手动设置 x 轴刻度的距离 可以使用以下两种方
  • 解决PowerDesigner里允许字段重名约束的设置问题

    让tomcat支持中文路径名 将conf server xml中的
  • mfc入门基础(六)创建模态对话框与非模态对话框

    参考博客 VS2010 MFC编程入门之十一 对话框 模态对话框及其弹出过程 软件开发 鸡啄米 一 创建模态对话框 1 接着上节中的test02的例子来讲 找到test02 cpp文件 找到函数InitInstance 然后 因为上节我们实
  • setuptools清华源_setuptools与pip的依赖关系解决方案之间的差异

    我最近开始用SetupTools打包我的第一个项目 并且大部分都取得了成功 setuptools与pip的依赖关系解决方案之间的差异 不幸的是 我遇到了一个令人困惑的情况 我的项目依赖于PyPI上没有的单个文件模块 我已经能够使用depen
  • RandLA-Net结果可视化(将结果保存到本地再通过cloudcompare可视化)

    RandLA Net结果可视化 将结果保存到本地再通过cloudcompare可视化 问题 RandLA Net官网提供代码的可视化部分是通过open3d的方式呈现的 但如果使用远端服务器去跑 可能就无法实现可视化 或者当我们的需要可视化的