当前位置: 首页 > news >正文

iDP3复现代码数据预处理全流程(二)——vis_dataset.py

vis_dataset.py 主要作用在于点云数据的可视化,并可以做一些简单的预处理

关键参数基本都在 vis_dataset.sh 中定义了,需要改动的仅以下两点:

1. 点云图像保存位置,因为 dataset_path 被设置为了绝对路径,因此需要相应修改:

save_dir = f"{dataset_path}/{episode_idx}"  # 设置当前集的保存目录

2. 点云视频保存位置,对应修改:

        if vis_cloud:# 将图像序列转换为视频os.system(f"ffmpeg -r 10 -i {save_dir}/%d.png -vcodec mpeg4 -y {dataset_path}/{episode_idx}.mp4")

运行生成:

更详细解释如下:

目录

1 库函数调用

2 创建 ArgumentParser 对象,解析命令行参数

3 打开指定路径 Zarr 数据集并获取数据

4 分割数据、处理并保存

5 回放图像和点云数据

6 将点云图像存为视频


1 库函数调用

import zarr  # 导入 zarr 库,用于处理 zarr 格式的数据
import cv2  # 导入 OpenCV 库,用于图像处理
from termcolor import cprint  # 从 termcolor 库导入 cprint 函数,用于彩色打印输出
import time  # 导入 time 库,用于时间相关操作
from tqdm import tqdm  # 导入 tqdm 库,用于显示进度条
import visualizer  # 导入自定义的 visualizer 模块,用于点云可视化
import os  # 导入 os 库,用于操作系统相关功能
import argparse  # 导入 argparse 库,用于解析命令行参数
import numpy as np  # 导入 numpy 库,用于数值计算

除了 visualizer 为自定义库函数,其余均为标准库

2 创建 ArgumentParser 对象,解析命令行参数

# 创建 ArgumentParser 对象,用于解析命令行参数
parser = argparse.ArgumentParser()
parser.add_argument("--dataset_path", type=str, default="data/box_zarr")  # 添加 dataset_path 参数,默认值为 "data/box_zarr"
parser.add_argument("--use_img", type=int, default=0)  # 添加 use_img 参数,默认值为 0(不使用图像数据)
parser.add_argument("--vis_cloud", type=int, default=0)  # 添加 vis_cloud 参数,默认值为 0(不可视化点云数据)
parser.add_argument("--use_pc_color", type=int, default=0)  # 添加 use_pc_color 参数,默认值为 0(不使用点云颜色)
parser.add_argument("--downsample", type=int, default=0)  # 添加 downsample 参数,默认值为 0(不下采样)# 解析命令行参数
args = parser.parse_args()
use_img = args.use_img 
dataset_path = args.dataset_path
vis_cloud = args.vis_cloud
use_pc_color = args.use_pc_color
downsample = args.downsample

命令行参数均在 vis_dataset.sh 中定义,若未定义,则会使用默认参数

3 打开指定路径 Zarr 数据集并获取数据

# 使用 zarr 打开指定路径的数据集
with zarr.open(dataset_path) as zf:print(zf.tree())  # 打印数据集的树状结构# 获取数据if use_img:all_img = zf['data/img']  # 获取图像数据all_point_cloud = zf['data/point_cloud']  # 获取点云数据all_episode_ends = zf['meta/episode_ends']  # 获取集结束标记

打开 dataset_path 位置数据集,并获取对应数据

4 分割数据、处理并保存

    # 根据 episode_ends 划分每一集的数据for episode_idx, episode_end in enumerate(all_episode_ends):if episode_idx == 0:if use_img:img_episode = all_img[:episode_end]  # 获取第一集的图像数据point_cloud_episode = all_point_cloud[:episode_end]  # 获取第一集的点云数据else:if use_img:img_episode = all_img[all_episode_ends[episode_idx-1]:episode_end]  # 获取当前集的图像数据point_cloud_episode = all_point_cloud[all_episode_ends[episode_idx-1]:episode_end]  # 获取当前集的点云数据save_dir = f"visualizations/{dataset_path}/{episode_idx}"  # 设置当前集的保存目录if vis_cloud:os.makedirs(save_dir, exist_ok=True)  # 创建保存目录(如果需要可视化点云)cprint(f"replay episode {episode_idx}", "green")  # 打印当前集的重放信息,使用绿色字体

回放图像和点云数据

        # 回放每一帧的数据for i in range(point_cloud_episode.shape[0]):pc = point_cloud_episode[i]  # 获取当前帧的点云数据# 如果需要下采样if downsample:num_points = 4096  # 设置下采样点数idx = np.random.choice(pc.shape[0], num_points, replace=False)  # 随机选择点pc = pc[idx]  # 获取下采样后的点云数据if use_img:img = img_episode[i]  # 获取当前帧的图像数据img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图像从 BGR 转换为 RGBcv2.imshow('img', img)  # 显示图像cv2.waitKey(1)  # 等待 1 毫秒time.sleep(0.05)  # 暂停 0.05 秒if vis_cloud:if not use_pc_color:pc = pc[:, :3]  # 如果不使用点云颜色,只保留前三个维度(XYZ)visualizer.visualize_pointcloud(pc, img_path=f"{save_dir}/{i}.png")  # 可视化点云并保存图像print(f"vis cloud saved to {save_dir}/{i}.png")  # 打印保存路径print(f"frame {i}/{point_cloud_episode.shape[0]}")  # 打印当前帧的处理进度

6 将点云图像存为视频

        if vis_cloud:# 将图像序列转换为视频os.system(f"ffmpeg -r 10 -i {save_dir}/%d.png -vcodec mpeg4 -y {dataset_path}/{episode_idx}.mp4")

使用 ffmpeg 命令将保存在{save_dir}目录下的一系列PNG图片(按序号命名)转换为帧率为10帧每秒的MPEG-4格式视频

并保存到 {dataset_path}/{episode_idx}.mp4,如果输出文件已存在,则会直接覆盖

相关文章:

iDP3复现代码数据预处理全流程(二)——vis_dataset.py

vis_dataset.py 主要作用在于点云数据的可视化,并可以做一些简单的预处理 关键参数基本都在 vis_dataset.sh 中定义了,需要改动的仅以下两点: 1. 点云图像保存位置,因为 dataset_path 被设置为了绝对路径,因此需要相…...

容器化部署服务全流程

系列文章目录 文章目录 系列文章目录前言一、什么是容器?二、如何安装docker三、如何写dockerfile四、如何启动服务五、常见命令总结总结 前言 这篇文章,‌主要目的是通过容器化技术简化应用程序的部署、运行和管理,提高开发、测试和生产环境…...

Flutter DragTarget拖拽控件详解

文章目录 1. DragTarget 控件的构造函数主要参数: 2. DragTarget 的工作原理3. 常见用法示例 1:实现一个简单的拖拽目标解释:示例 2:与 Draggable 结合使用解释: 4. DragTarget 的回调详解5. 总结 DragTarget 是 Flutt…...

操作系统动态分区分配算法-首次适应算法c语言实现

目录 一、算法原理 二、算法特点 1.优先利用低址空闲分区: 2.查找开销: 3.内存碎片: 三、内存回收四种情况 1.回收区上面(或后面)的分区是空闲分区: 2.回收区下面(或前面)的…...

mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…...

Vite内网ip访问,两种配置方式和修改端口号教程

目录 问题 两种解决方式 结果 总结 preview.host preview.port 问题 使用vite运行项目的时候,控制台会只出现127.0.0.1(localhost)本地地址访问项目。不可以通过公司内网ip访问,其他团队成员无法访问,这是因为没…...

【星海随笔】删除ceph

cephadm shell ceph osd set noout ceph osd set norecover ceph osd set norebalance ceph osd set nobackfill ceph osd set nodown ceph osd set pause参考文献: https://blog.csdn.net/lyf0327/article/details/90294011 systemctl stop ceph-osd.targetyum re…...

HarmonyOS NEXT实战:自定义封装多种样式导航栏组件

涉及知识点和装饰器 ComponentV2,Local, Builder,BuilderParam,Extend, Require ,Param,Event等第三方库:ZRouter ,如项目中本来就用了ZRouter路由库,案例中…...

大数据面试笔试宝典之Flink面试

1.Flink 是如何支持批流一体的? F link 通过一个底层引擎同时支持流处理和批处理. 在流处理引擎之上,F link 有以下机制: 1)检查点机制和状态机制:用于实现容错、有状态的处理; 2)水印机制:用于实现事件时钟; 3)窗口和触发器:用于限制计算范围,并定义呈现结果的…...

pytorch整体环境打包安装到另一台电脑上

步骤一:安装conda-pack 首先利用 pip list 指令检查conda环境安装在哪里,在系统环境(base)下,于是我是使用的conda指令完成的。 # 使用Conda安装(如果已安装conda) conda install conda-pack …...

PostgreSQL 数据库连接

title: PostgreSQL 数据库连接 date: 2024/12/29 updated: 2024/12/29 author: cmdragon excerpt: PostgreSQL是一款功能强大的开源关系数据库管理系统,在现代应用中广泛应用于数据存储和管理。连接到数据库是与PostgreSQL进行交互的第一步,这一过程涉及到多个方面,包括连…...

【算法】复杂性理论初步

六、算法复杂性初步 重要的复杂性类 P P P 的定义 多项式时间内可解的问题 若 L ∈ P L∈P L∈P,则存在确定性多项式时间的图灵机 M M M,使得 M ( x ) 1 ⟺ x ∈ L M(x)1⟺x∈L M(x)1⟺x∈L N P NP NP 的定义 多项式时间内可验证验证解的正确性 &…...

HarmonyOS NEXT应用开发实战:免费练手的网络API接口分享

学习一项技能,最好也最快的办法就是直接动手实战。在实战中不断的总结经验和收获成就感。这里分享些好用且免费的网络API练手接口,这对于想要提升自己网络开发能力的开发者来说,无疑是极大的福音。今天,我将详细介绍一个API接口集…...

C++的第一个程序

前言 在学习c之前&#xff0c;你一定还记得c语言的第一个程序 当时刚刚开始进行语言学习 因此告诉到&#xff0c;仅仅需要记住就可以 #include <stdio.h>int main(){printf("Hello World");return 0; }而对于c中的第一个程序&#xff0c;似乎有所变化 C的…...

Java 中 Stream 流的使用详解

Java 中 Stream 流的使用详解 什么是 Stream&#xff1f; Stream 是 Java 8 引入的一种全新的操作集合的方式。它支持通过声明性方式对集合进行复杂的数据操作&#xff08;如过滤、排序、聚合等&#xff09;&#xff0c;避免使用大量的 for 循环&#xff0c;提高代码的可读性…...

【UE5.3.2】生成vs工程并rider打开

Rider是跨平台的,UE也是,当前现在windows上测试首先安装ue5.3.2 会自动有右键的菜单: windows上,右键,生成vs工程 生成的结果 sln默认是vs打开的,我的是vs2022,可以open with 选择 rider :Rider 会弹出 RiderLink是什么插...

ssh免密码登陆配置

ssh 命令本身不支持直接在命令中带上密码&#xff0c;出于安全考虑&#xff0c;SSH 协议不允许将密码明文写在命令中。直接在命令行中输入密码是一种不推荐的做法&#xff0c;因为它会暴露密码&#xff0c;增加安全风险。 如果你希望实现自动化登录而不手动输入密码&#xff0…...

Hive之import和export使用详解

在hive-0.8.0后引入了import/export命令。 Export命令可以导出一张表或分区的数据和元数据信息到一个输出位置&#xff0c;并且导出数据可以被移动到另一个hadoop集群或hive实例&#xff0c;并且可以通过import命令导入数据。 当导出一个分区表&#xff0c;原始数据可能在hdf…...

数据库锁的深入探讨

数据库锁&#xff08;Database Lock&#xff09;是多用户环境中用于保证数据一致性和隔离性的机制。随着数据库系统的发展&#xff0c;特别是在高并发的场景下&#xff0c;锁的机制变得尤为重要。通过使用锁&#xff0c;数据库能够防止并发操作导致的数据冲突或不一致。本文将深…...

【每日学点鸿蒙知识】沉浸式状态栏、类似ref 属性功能属性实现、自定义对话框背景透明、RichEditor粘贴回调、自动滚动列表

1、HarmonyOS 沉浸式状态栏&#xff1f; 实现沉浸式状态栏功能时&#xff0c;能够实现&#xff0c;但是目前每个自定义组件都需要padding top 状态栏的高度才行&#xff0c;有办法实现统一设置吗&#xff1f;不需要每个自定义组件中都padding top 状态栏的高度&#xff1f; 暂…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...