机器人技能学习-构建自己的数据集并进行训练

概要

若想训练自己的场景,数据集的重要性不做过多赘述,下面就基于 robomimicrobosuite 构建自己的数据集进行讲解,同时,也会附上 trainrun 的流程,这样,就形成了闭环。

自建数据集

采集数据

采集数据可使用脚本 collect_human_demonstrations.py 完成,在采集过程中,需要自己定义 env 的相关信息,在实际使用时,存在以下几个问题:

  • 无法控制机器人精准的完成抓取工作
  • 机器人在某些姿态下,运动会出现漂移的情况

在这里插入图片描述

格式转换

该功能脚本为 convert_robosuite.py,在进行执行是:

$ python conversion/convert_robosuite.py --dataset /path/to/demo.hdf5

生成OBS用于训练

python dataset_states_to_obs.py --dataset demo_myliftdraw.hdf5 --output AAA.hdf5

BUG记录

Bug1

在进行 conver_to_robosuite时,也有个小bug,当数据集中 demo数量较少时,比如为1,那么 convert 就会失败,这是因为在进行 split 时数据太少导致的,

"""
Helper script to convert a dataset collected using robosuite into an hdf5 compatible with
this repository. Takes a dataset path corresponding to the demo.hdf5 file containing the
demonstrations. It modifies the dataset in-place. By default, the script also creates a
90-10 train-validation split.For more information on collecting datasets with robosuite, see the code link and documentation
link below.Code: https://github.com/ARISE-Initiative/robosuite/blob/offline_study/robosuite/scripts/collect_human_demonstrations.pyDocumentation: https://robosuite.ai/docs/algorithms/demonstrations.htmlExample usage:python convert_robosuite.py --dataset /path/to/your/demo.hdf5
"""import h5py
import json
import argparseimport robomimic.envs.env_base as EB
from robomimic.scripts.split_train_val import split_train_val_from_hdf5if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument("--dataset",type=str,help="path to input hdf5 dataset",)args = parser.parse_args()f = h5py.File(args.dataset, "a") # edit mode# import ipdb; ipdb.set_trace()# store env metaenv_name = f["data"].attrs["env"]env_info = json.loads(f["data"].attrs["env_info"])env_meta = dict(type=EB.EnvType.ROBOSUITE_TYPE,env_name=env_name,env_version=f["data"].attrs["repository_version"],env_kwargs=env_info,)if "env_args" in f["data"].attrs:del f["data"].attrs["env_args"]f["data"].attrs["env_args"] = json.dumps(env_meta, indent=4)print("====== Stored env meta ======")print(f["data"].attrs["env_args"])# store metadata about number of samplestotal_samples = 0for ep in f["data"]:# ensure model-xml is in per-episode metadataassert "model_file" in f["data/{}".format(ep)].attrs# add "num_samples" into per-episode metadataif "num_samples" in f["data/{}".format(ep)].attrs:del f["data/{}".format(ep)].attrs["num_samples"]n_sample = f["data/{}/actions".format(ep)].shape[0]f["data/{}".format(ep)].attrs["num_samples"] = n_sampletotal_samples += n_sample# add total samples to global metadataif "total" in f["data"].attrs:del f["data"].attrs["total"]f["data"].attrs["total"] = total_samplesf.close()# create 90-10 train-validation split in the datasetsplit_train_val_from_hdf5(hdf5_path=args.dataset, val_ratio=0.1)

最后一行,只需要将 val_ration = 1 就可以了。

Bug2

描述:同样的操作过程,用自己新建的 env环境类生成数据,在进行 obs 生成时报错,但是用官方的 env 是没有问题的
在这里插入图片描述
解决方法:不要试图随性构建自己的模型库,因为这玩意是按照固定路径搜索的,坑坑坑,忙了半天,发现是路径的问题,里面有个 robosuite 的固定关键词,这个会影响 to obs 的。
在这里插入图片描述

Train && Test

Train 需要调用的脚本是:

$ python robomimic/robomimic/scripts/train.py --config bc_rnn.json

Test调用的脚本为:

$ python robomimic/robomimic/scripts/un_trained_agent.py --agent /path/to/model.pth --n_rollouts 50 --horizon 400 --seed 0 --video_path /path/to/output.mp4 --camera_names agentview robot0_eye_in_hand 

在进行训练时,需要对算法进行配置,即导入的 json 文件,以下是一个配置文件的案例,该文件来源于 mimicgen 生成的,其中,里面 有对于算法的部分参数, 比如 "algo_name": "bc",如果功底不够深厚的话,建议大家只改下数据集的 path 就可以了:

{"algo_name": "bc","experiment": {"name": "source_draw_low_dim","validate": false,"logging": {"terminal_output_to_txt": true,"log_tb": true,"log_wandb": false,"wandb_proj_name": "debug"},"save": {"enabled": true,"every_n_seconds": null,"every_n_epochs": 50,"epochs": [],"on_best_validation": false,"on_best_rollout_return": false,"on_best_rollout_success_rate": true},"epoch_every_n_steps": 100,"validation_epoch_every_n_steps": 10,"env": null,"additional_envs": null,"render": false,"render_video": true,"keep_all_videos": false,"video_skip": 5,"rollout": {"enabled": true,"n": 50,"horizon": 400,"rate": 50,"warmstart": 0,"terminate_on_success": true}},"train": {"data": "/home/idm/Documents/mimicgen/robosuite/robosuite/scripts/generate_dataset/tmp/draw_data/demo_obs.hdf5","output_dir": "/home/idm/Documents/mimicgen/robosuite/robosuite/scripts/generate_dataset/tmp/draw_data/trained_models","num_data_workers": 0,"hdf5_cache_mode": "all","hdf5_use_swmr": true,"hdf5_load_next_obs": false,"hdf5_normalize_obs": false,"hdf5_filter_key": null,"hdf5_validation_filter_key": null,"seq_length": 10,"pad_seq_length": true,"frame_stack": 1,"pad_frame_stack": true,"dataset_keys": ["actions","rewards","dones"],"goal_mode": null,"cuda": true,"batch_size": 100,"num_epochs": 2000,"seed": 1},"algo": {"optim_params": {"policy": {"optimizer_type": "adam","learning_rate": {"initial": 0.001,"decay_factor": 0.1,"epoch_schedule": [],"scheduler_type": "multistep"},"regularization": {"L2": 0.0}}},"loss": {"l2_weight": 1.0,"l1_weight": 0.0,"cos_weight": 0.0},"actor_layer_dims": [],"gaussian": {"enabled": false,"fixed_std": false,"init_std": 0.1,"min_std": 0.01,"std_activation": "softplus","low_noise_eval": true},"gmm": {"enabled": true,"num_modes": 5,"min_std": 0.0001,"std_activation": "softplus","low_noise_eval": true},"vae": {"enabled": false,"latent_dim": 14,"latent_clip": null,"kl_weight": 1.0,"decoder": {"is_conditioned": true,"reconstruction_sum_across_elements": false},"prior": {"learn": false,"is_conditioned": false,"use_gmm": false,"gmm_num_modes": 10,"gmm_learn_weights": false,"use_categorical": false,"categorical_dim": 10,"categorical_gumbel_softmax_hard": false,"categorical_init_temp": 1.0,"categorical_temp_anneal_step": 0.001,"categorical_min_temp": 0.3},"encoder_layer_dims": [300,400],"decoder_layer_dims": [300,400],"prior_layer_dims": [300,400]},"rnn": {"enabled": true,"horizon": 10,"hidden_dim": 400,"rnn_type": "LSTM","num_layers": 2,"open_loop": false,"kwargs": {"bidirectional": false}},"transformer": {"enabled": false,"context_length": 10,"embed_dim": 512,"num_layers": 6,"num_heads": 8,"emb_dropout": 0.1,"attn_dropout": 0.1,"block_output_dropout": 0.1,"sinusoidal_embedding": false,"activation": "gelu","supervise_all_steps": false,"nn_parameter_for_timesteps": true}},"observation": {"modalities": {"obs": {"low_dim": ["robot0_eef_pos","robot0_eef_quat","robot0_gripper_qpos","object"],"rgb": [],"depth": [],"scan": []},"goal": {"low_dim": [],"rgb": [],"depth": [],"scan": []}},"encoder": {"low_dim": {"core_class": null,"core_kwargs": {},"obs_randomizer_class": null,"obs_randomizer_kwargs": {}},"rgb": {"core_class": "VisualCore","core_kwargs": {},"obs_randomizer_class": null,"obs_randomizer_kwargs": {}},"depth": {"core_class": "VisualCore","core_kwargs": {},"obs_randomizer_class": null,"obs_randomizer_kwargs": {}},"scan": {"core_class": "ScanCore","core_kwargs": {},"obs_randomizer_class": null,"obs_randomizer_kwargs": {}}}},"meta": {"hp_base_config_file": null,"hp_keys": [],"hp_values": []}
}

部分训练截图如下,可以看出,因数据太少,导致模型不收敛:
在这里插入图片描述

参考资料

RoboMimic

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

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

相关文章

【MATLAB】REMD_LSTM神经网络时序预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 REMD-LSTM神经网络时序预测算法是一种结合了REMD(Reservoir Enhanced Multi-scale Deep Learning)算法和长短期记忆神经网络(LSTM)的时间序…

解决“Ubuntu系统与windows系统之间不能执行复制粘贴”之问题

在win11中,发现“Ubuntu系统与windows系统之间不能互相复制粘贴”,只能通过“FPT客户端FileZilla”才能交换文件,但遇到字符串,就没法实现了,因此,在两个系统之间实现互相复制和粘贴字符串,就很…

【Python数据可视化】matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图

文章传送门 Python 数据可视化matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

RK3568驱动指南|第十二篇 GPIO子系统-v

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Java医院智能3D导诊系统源码 微信小程序源码

医院智慧3D导诊系统, 通过输入疾病症状和选择部位进行导诊挂号,支持小程序端、APP端 开发背景 人们经常去医院因为不知道挂什么科而烦恼,有些病人不方便问又不好意思问。在互联网医院中挂号且又不知该挂什么科,找什么类型的医生&…

JavaScript的变量详解

一、变量的声明和赋值 编程中的程序其本质就是处理数据的过程,当输入指令时,就可以输出相应的内容,在输入和输出之间就是处理数据的过程。处理的数据可能有多种,多个,这时就需要使用不同的名字来存储、区分和提取不同的…

rime中州韵小狼毫 LaTex输入法配置

本文的分享一种在rime中州韵小狼毫须鼠管输入法中配置LaTex输入方案的方法,并不完美,仅供参考。 先睹为快 LaTex输入方案可以快捷的在公式模式下输入一些基础的数学公式,选词快捷,录入体验优良。 latex.schema.yaml latex.sc…

PMP学习考试经验总结

PMP备考日程计划表 我的PMP的备考大概花了三个月的时间, 可以分为以下几个阶段: Week 1-4: 读完PMBoK 前面7个知识领域(中英文版PMBoK一起看)。每看完一个知识领域,就看参考书里面的相应章节(汪博士那本)…

七通道NPN 达林顿管GC2003,专为符合标准 TTL 而制造

GC2003 内部集成了 7 个 NPN 达林顿晶体管,连接的阵列,非常适合逻辑接口电平数字电路(例 如 TTL,CMOS 或PMOS 上/NMOS)和较高的电流/电压,如电灯电磁阀,继电器,打印机或其他类似的负…

使用python连接elasticsearch

有一个困惑了好久的问题,那就是从python里面连接elasticsearch总是报错。大致长这样 一开始我是看网上把es的安全功能关闭,也就是下面的内容,这个要进入到es的docker中去改config/elasticsearch.yml配置文件,但是这样改了以后kib…

数据结构——栈(Stack)

目录 1.栈的介绍 2.栈工程 2.1 栈的定义 2.1.1 单链表实现栈 2.1.2 数组实现栈 2.1.2.1 静态数组栈 2.1.2.2 动态数组栈 2.2 栈的函数接口 2.2.1 栈的初始化 2.2.2 栈的数据插入(入栈) 2.2.3 栈的数据删除(出栈) 2.2.…

每日一题——LeetCode1160.拼写单词

方法一 个人方法: 先统计chars里每个字符出现的次数,再对words里每个字符串统计每个字符出现的字符,当: 1、字符串里出现chars里没有的字符 2、字符串里某个字符出现的次数大于该字符在chars里出现的次数 以上两种情况则不符合…

基于微信小程序的音乐平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台,包含了音乐…

【MIT 6.S081】2020, 实验记录(3),Lab: page tables

目录 TaskTask 1: Print a page table Task Task 1: Print a page table 该实验需要增加一个 vmprint 函数,用于打印一个 page table,实现过程可以参考 vm.c 文件中的 freewalk() 函数。 在 defs.h 中增加 vmprint 的定义: void …

宝塔安装redis并且远程连接redis教程

第一步:搜索redis并安装 第二步:在防火墙添加端口6379 第三步:查看宝塔防火墙是否开启了6379端口 firewall-cmd --zonepublic --list-ports 很显然并没有开启 第四步:开启防火墙的6379端口 firewall-cmd --zonepublic --add-po…

【python】搭配Miniconda使用VSCode

现在的spyder总是运行出错,启动不了,尝试使用VSCode。 一、在VSCode中使用Miniconda管理的Python环境,可以按照以下步骤进行: a. 确保Miniconda环境已经安装并且正确配置。 b. 打开VSCode,安装Python扩展。 打开VS…

linux软件安装(yum命令)

1.Linux系统的应用商店 操作系统安装软件有许多种方式,一般分为: 下载安装包自行安装 如win系统使用exe文件、msi文件等如mac系统使用dmg文件、pkg文件等 系统的应用商店内安装 如win系统有Microsoft Store商店如mac系统有AppStore商店 Linux命令行…

qt学习:多界面跳转+信号+槽函数

目录 概念 分类 多界面编程思路 新建界面 注意 头文件 无数据传输跳转界面 有数据传输跳转界面 对象公有接口 界面之间数据传输 信号与槽函数进行数据传输跳转界面 信号: 槽: 概念 格式1 关联信号和发送信号 格式2 通信步骤 自定义信号和槽函数 总结 实…

精彩手绘全解:RAG技术,从入门到精通

本文整理自IVAN ILIN发布于Towards AI的博客[1]。感谢作者的精彩讲解。 深度学习自然语言处理 分享整理:Winnie 引言 检索增强生成(Retrieval Augmented Generation,简称RAG)为大型语言模型(LLMs)提供了从某…

绘图工具用的好,头发掉的少

程序员不管是在学习,还是工作过程中,很多时候都需要画图,如产品分析、架构设计、方案选型等,良好的绘图不仅可以让绘图者的思路清晰,也可以让聆听者更好的理解。用好画图,升职加薪少不了!今天介…