DP3复现代码运行逻辑全流程(六)—— gen_demonstration_adroit.sh 演示生成与可视化

用于生成演示、培训和评估的脚本都在 Scripts/ 文件夹中

DP3 通过 gen_demonstration 生成演示,即训练数据,例如:

bash scripts/gen_demonstration_adroit.sh hammer

这将在 Adroit 环境中生成锤子任务的演示。数据将自动保存在 3D-Diffusion-Policy/data/ 文件夹中

接下来将详细解释一下流程逻辑,以及分享一小部分在复现过程中写了一些测试脚本

目录

1 脚本解析

1.1 切换目录

1.2 定义任务变量

1.3 运行 Python 脚本

2 运行效果

3 可视化

3.1 数据结构

3.2 数据可视化

3.3 动态可视化


1 脚本解析

1.1 切换目录

cd third_party/VRL3/src

将工作目录切换到 third_party/VRL3/src

1.2 定义任务变量

task=${1}

从脚本运行时传入的第一个参数来获取任务名称,例如:

bash scripts/gen_demonstration_adroit.sh hammer,task 将被赋值为 "hammer"

1.3 运行 Python 脚本

CUDA_VISIBLE_DEVICES=0 python gen_demonstration_expert.py --env_name $task \--num_episodes 10 \--root_dir "../../../3D-Diffusion-Policy/data/" \--expert_ckpt_path "../ckpts/vrl3_${task}.pt" \--img_size 84 \--not_use_multi_view \--use_point_crop

通过 Python 脚本 gen_demonstration_expert.py 生成演示数据,参数说明如下:

--env_name $task:指定任务名称(如 "door"、"hammer" 或 "pen")

--num_episodes 10:生成 10 个演示数据集

--root_dir "../../../3D-Diffusion-Policy/data/":设置数据存储的根目录

--expert_ckpt_path "../ckpts/vrl3_${task}.pt":指定专家模型的检查点路径,如下:

--img_size 84:设置图像尺寸为 84x84 像素

--not_use_multi_view:禁用多视角

--use_point_crop:启用点裁剪

2 运行效果

可以看到存储位置:Saved zarr file to ../../../3D-Diffusion-Policy/data/adroit_hammer_expert.zarr

3 可视化

在存储位置找到生成的训练数据,然后进行分析

3.1 数据结构

我们先来看一下生成数据的数据结构,执行代码:

import zarrpointcloud_path = "/home/yejiangchen/Desktop/Codes/3D-Diffusion-Policy-master/3D-Diffusion-Policy/data/adroit_hammer_expert.zarr"# 打开 zarr 数据集
pointcloud_dataset = zarr.open(pointcloud_path, mode='r')# 打印数据集的树状结构来查看所有路径
print(pointcloud_dataset.tree())

运行结果:

此处展开说明一下:

data 目录包含:动作数据 action、深度图数据 depth、图像数据 img、点云数据 point_cloud、状态数据 state

meta 目录包含:回合结束索引 episode_ends

1. action (1000, 26) float32:每个时间步机器人(智能体)采取的动作

1000:表示有 1000 个时间步(或帧)

26:表示每个时间步有 26 个动作特征值

2. depth (1000, 84, 84) float32:每帧对应的深度图信息,每个像素的值表示从传感器到物体表面的距离(深度)

1000:表示有 1000 帧深度图

84 x 84:深度图的分辨率为 84x84 像素

3. img (1000, 84, 84, 3) uint8:每帧的彩色图像,84x84的矩阵,每个元素是长度为3的向量

1000:表示有 1000 帧 RGB 图像

84 x 84:图像分辨率为 84x84 像素

3:表示 3 个颜色通道(Red, Green, Blue)

4. point_cloud (1000, 512, 6) float32:每帧的 3D 点云

1000:表示有 1000 帧点云数据

512:每帧有 512 个点

6:每个点有 6 个特征(通常是 x, y, z 坐标和 r, g, b 颜色值)

5. state (1000, 24) float32:每个时间步机器人(智能体)的状态

1000:表示有 1000 个时间步

24:表示每个时间步的状态特征维度为 24

6. meta/episode_ends (10,) int64:指示 10 个 episode(回合)的结束位置

10:表示有 10 个结束索引,即 1000 帧中,第 0 到第 99 帧属于第一个 episode,第 100 帧是第一个 episode 的结束,共 10 个 episode

3.2 数据可视化

既然经知道数据结构了,接下来就进行可视化,执行代码:

from flask import Flask, render_template_string, request
import zarr
import numpy as np
import plotly.graph_objs as go
import plotly.io as pio
import base64
import io
from PIL import Imageapp = Flask(__name__)# 加载 Zarr 数据集
data_path = "/home/yejiangchen/Desktop/Codes/3D-Diffusion-Policy-master/3D-Diffusion-Policy/data/adroit_hammer_expert.zarr"
dataset = zarr.open(data_path, mode='r')# 提取数据
pointclouds = dataset['data/point_cloud']
images = dataset['data/img']def generate_pointcloud_trace(frame_index):"""生成 Plotly 点云图的 Trace"""pointcloud = pointclouds[frame_index]x, y, z = pointcloud[:, 0], pointcloud[:, 1], pointcloud[:, 2]colors = ['rgb({},{},{})'.format(int(r), int(g), int(b)) for r, g, b in pointcloud[:, 3:6]]trace = go.Scatter3d(x=x,y=y,z=z,mode='markers',marker=dict(size=2,opacity=0.7,color=colors))return tracedef generate_image_data(frame_index):"""将图像数据转换为 base64 格式以便在 HTML 中显示"""img_data = images[frame_index]img = Image.fromarray(img_data)buffered = io.BytesIO()img.save(buffered, format="PNG")img_str = base64.b64encode(buffered.getvalue()).decode('utf-8')return f"data:image/png;base64,{img_str}"@app.route('/')
def index():frame_index = int(request.args.get('frame', 0))max_frame_index = pointclouds.shape[0] - 1# 确保索引在有效范围内frame_index = max(0, min(frame_index, max_frame_index))# 生成点云和图像trace = generate_pointcloud_trace(frame_index)image_data = generate_image_data(frame_index)# 生成 Plotly 图表的 HTMLlayout = go.Layout(margin=dict(l=0, r=0, b=0, t=0))fig = go.Figure(data=[trace], layout=layout)pointcloud_html = pio.to_html(fig, full_html=False)return render_template_string("""<!DOCTYPE html><html><head><title>Dynamic Point Cloud Viewer</title></head><body><h1>Dynamic Point Cloud and Image Viewer</h1><form method="get"><label for="frame">Frame Index (0-{{ max_frame }}):</label><input type="number" id="frame" name="frame" min="0" max="{{ max_frame }}" value="{{ frame }}"><input type="submit" value="Load Frame"></form><h2>Point Cloud</h2><div>{{ pointcloud_html | safe }}</div><h2>Image</h2><img src="{{ image_data }}" alt="Frame Image" style="width:400px;"></body></html>""", pointcloud_html=pointcloud_html, image_data=image_data, frame=frame_index, max_frame=max_frame_index)if __name__ == '__main__':app.run(debug=True, use_reloader=False, port=5000)

运行结果:

此处展开说明一下:

此代码使用 Flask 和 Plotly 来实现一个网页界面,可以动态切换和查看不同帧的点云数据和图像数据,它支持:

动态查看点云数据:通过滑块来选择不同的帧进行点云可视化

动态查看图像数据:同时显示对应帧的图像数据

Flask 服务器:提供网页界面来交互和展示可视化结果

简单解析:

1. 数据加载:加载 Zarr 数据集路径下的 point_cloud 和 img 数据

2. generate_pointcloud_trace:生成 Plotly 的 3D 散点图(点云可视化)

3. generate_image_data:将图像数据转换为 base64 格式,以便在 HTML 中显示

4. Flask 路由 index:通过 GET 请求获取当前帧索引,动态生成点云和图像并嵌入 HTML

5. HTML 界面:提供输入框让用户选择帧索引,显示对应帧的点云和图像

6. 注意事项:如果 5000 端口被占用,可以更改为其他端口,如 5001

3.3 动态可视化

既然可以一帧一帧显示了,那能不能生成视频流看一下呢,执行以下代码:

import zarr
import cv2
import os# 加载 Zarr 数据集
data_path = "/home/yejiangchen/Desktop/Codes/3D-Diffusion-Policy-master/3D-Diffusion-Policy/data/adroit_hammer_expert.zarr"
dataset = zarr.open(data_path, mode='r')
images = dataset['data/img']# 视频保存路径
output_path = "output_video.avi"# 获取图像帧的高度和宽度
height, width, _ = images[0].shape# 定义视频编写器 (MJPG编码格式,帧率为30)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter(output_path, fourcc, 30.0, (width, height))# 将每一帧写入视频
for frame in images:frame_bgr = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)out.write(frame_bgr)# 释放视频写入对象
out.release()print(f"视频已保存到 {os.path.abspath(output_path)}")

运行结果:

小锤40......

此处展开说明一下:

此代码使用 cv2.VideoWriter 将 Zarr 数据集的图像帧保存为视频

视频编码器:使用 MJPG 编码保存为 .avi 格式,可以改用 XVID 或 MP4V 以保存为 .mp4

帧率:在 cv2.VideoWriter 中可以更改设置帧率

输出路径:生成的视频将保存在 output_video.avi

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

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

相关文章

Python常用字符串排序●sorted()函数--一行语句简洁实现

在Python等编程中&#xff0c;时常会用到字符串排序。 今天在这里只讲讲最常用的Python字符串排序。 同时&#xff0c;只讲sorted()函数方法。 给定一个字符串列表&#xff1a; sl [共和国, 中国, 中华人民共和国, 大中华, 人民共和国]。 第一种排序方法是不使用任何参数…

知从科技总经理受邀参加上海临港新片区商会“湖畔TECS”技术分享沙龙(第五期)

11月26日&#xff0c;上海知从科技有限公司创始人陈荣波先生受邀出席临港新片区商会 “湖畔TECS”技术分享沙龙&#xff08;第五期&#xff09;活动&#xff0c;并在活动上为参会嘉宾们做了主题分享。本次活动由临港新片区商会主办&#xff0c;智能网联汽车创新联盟协办&#x…

【MySQL数据库】Ubuntu下的mysql

目录 1&#xff0c;安装mysql数据库 2&#xff0c;mysql默认安装路径 3&#xff0c;my.cnf配置文件 4&#xff0c;mysql运用的相关指令及说明 5&#xff0c;数据库、表的备份和恢复 mysql是一套给我们提供数据存取的&#xff0c;更加有利于管理数据的服务的网络程序。下面…

PKCS#7、Bit padding(位填充)、Byte padding(字节填充)、Zero padding(零填充)

PKCS#7、Bit padding&#xff08;位填充&#xff09;、Byte padding&#xff08;字节填充&#xff09;、Zero padding&#xff08;零填充&#xff09;是密码学常见的填充方式。 Bit padding&#xff08;位填充&#xff09;&#xff1a; 位填充可以应用于任意长度的消息。在消息…

Tomcat添加各种响应头 X-Download-Options、Permissions-Policy等

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 最近部署的项目被绿盟扫出来很多web漏洞,其中tomcat响应占了很大一部分。下面我们整理一下如何处理。 首先说说常见…

Docker与虚拟机:虚拟化技术的差异解析

在信息技术飞速发展的今天&#xff0c;虚拟化技术已成为现代IT架构不可或缺的一部分。而虚拟化从技术层面划分则分为以下几种&#xff1a; 完全虚拟化&#xff1a;虚拟机能够完全模拟底层硬件的特权指令的执行过程&#xff0c;客户操作系统无须进行修改。 硬件辅助虚拟化&#…

canvas保存图片

需求&#xff1a;上面有几个按钮&#xff0c;其中有一个切换是图片 用v-if会导致图片加载慢 实现方法&#xff1a; 一进来就加载&#xff0c;通过监听元素显示&#xff0c;用于控制canvas的宽高&#xff0c;从而达到隐藏的效果 组件dowolad.vue <template><view …

前端实现扫一扫,扫描二维码(VUE,H5);jsQR,zxing两种方式

文章介绍 这里使用了jsQR和zxing两种方式&#xff0c;分别在普通的H5和vue中使用&#xff0c;文章附上完整demo和一些注意事项 注意事项 这里H5也好&#xff0c;vue也好&#xff0c;如果想要部署到服务器上&#xff0c;需要用https协议&#xff0c;否则无法使用。本地启动项目…

MySQL 事务与锁机制:确保数据一致性

一、MySQL 事务与锁机制概述 &#xff08;一&#xff09;事务的概念与 ACID 特性简述 在数据库操作中&#xff0c;事务是一种极为重要的机制&#xff0c;它可以看作是一组数据库操作命令的集合。简单来说&#xff0c;事务将这些命令整合为一个不可分割的整体&#xff0c;它们…

2024.12.14 TCP/IP 网络模型有哪几层?

2024.12.14 TCP/IP 网络模型有哪几层? 2024.12.14 今天周六 看到大伙都在考六级&#xff0c;我来复盘小林coding的计算机网络的知识点&#xff1a; TCP/IP 网络模型有哪几层? 问大家&#xff0c;为什么要有 TCP/IP 网络模型? 对于同一台设备上的进程间通信&#xff0c;有…

一次Mysql查询踩坑经历(查询索引失效问题)

1、之前的sql建表脚本 CREATE TABLE crm_driver (id bigint(22) NOT NULL AUTO_INCREMENT COMMENT 主键,clue_id bigint(20) NOT NULL COMMENT 线索表id,driver_name varchar(128) NOT NULL COMMENT 试驾人姓名,driver_phone varchar(32) NOT NULL COMMENT 试驾人手机号,drive…

从 SSM 视角剖析校园一卡通密钥管理系统的技术架构演进

第2章 开发环境与技术 开发校园一卡通密钥管理系统需要搭建编程的环境&#xff0c;也需要通过调查&#xff0c;对各个相关技术进行分析&#xff0c;选取适合本系统开发的技术与工具。 2.1 MYSQL数据库 题目确定了是一个应用程序之后&#xff0c;就开始按部就班的进行设计与分析…

Vue3之响应式系统详解

Vue3中的响应式系统是其核心功能之一&#xff0c;它使得数据变化能够自动触发视图更新&#xff0c;从而简化了开发过程&#xff0c;提高了开发效率。本文将详细阐述Vue3中的响应式系统&#xff0c;包括其核心概念、工作原理、实现方式、应用场景以及优势。同时&#xff0c;本文…

RabbitMQ中的Publish-Subscribe模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信和解耦系统的关键组件。RabbitMQ 是一个功能强大且广泛使用的开源消息代理&#xff0c;支持多种消息传递模式。其中&#xff0c;Publish/Subscribe&#xff08;发布/订阅&#xff0…

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)

目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则&#xff1a; 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…

C++小白实习日记——Pollnet,Efvi,UDP,数据类型转换(上)

上周主要是熟悉了一下公司内部一些自定义结构体对应的数据类型&#xff0c;要求&#xff1a;读取文件&#xff0c;将文件中数据转化为定义的结构体中的数据类型&#xff0c;按照时间进行排序&#xff0c;用UDP发送数据&#xff1b;在另一台服务器上接收数据&#xff0c;按照定义…

路由引入问题(双点双向路由回馈问题)

简介 总所周知&#xff0c;路由引入import又称路由重分发redistribute&#xff0c;为了解决不同路由协议进程间路由信息不互通而使用的技术&#xff0c;由于不同路由协议的算法、机制、开销等因素的差异&#xff0c;它们之间无法直接交换路由信息。因此&#xff0c;路由引入技…

26. Three.js案例-自定义多面体

26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染&#xff0c;并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

【在Linux世界中追寻伟大的One Piece】HTTP Session

目录 1 -> 引入HTTP Session 1.1 -> 定义 1.2 -> 工作原理 1.3 -> 安全性 1.4 -> 超时和失效 1.5 -> 用途 2 -> 模拟session行为 3 -> 实验测试session 1 -> 引入HTTP Session 1.1 -> 定义 HTTP Session是服务器用来跟踪用户与服务器交…

Docker-Dockerfile、registry

Dockerfile 一、概述 1、commit的局限 很容易制作简单的镜像&#xff0c;但碰到复杂的情况就十分不方便&#xff0c;例如碰到下面的情况&#xff1a; 需要设置默认的启动命令需要设置环境变量需要指定镜像开放某些特定的端口 2、Dockerfile是什么 Dockerfile是一种更强大的镜…