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

概要

若想训练自己的场景,数据集的重要性不做过多赘述,下面就基于 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.hqwc.cn/news/344507.html

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

相关文章

靶场实战(14):OSCP备考之VulnHub SUNSET NOONTIDE

打靶思路 资产发现 主机发现服务发现漏洞发现(获取权限) irc服务提升权限 server用户 sudosuidcron内核提权信息收集 1、资产发现 1.1、主机发现 本次靶场SUNSET: NOONTIDE[1]指定IP,不涉及主机发现过程。 1.2、服务发现 使用命令sudo -u roo…

3d云渲染用什么显卡比较好?3d云渲染显卡推荐

3D云渲染能加快渲染速度,是众多公司的首选方案,作为公司负责人,选择哪个平台值得思考,今天我就说下我的选择吧。 首先我们要了解云渲染的渲染方式,云渲染的渲染方式分两种,一种是CPU渲染,一种是…

架构04-架构的分层

技术框架是一个可重复使用的设计,用于构建整个或部分技术系统,包括一组抽象构件和这些构件实例之间的交互方法。它可以被技术开发者定制为应用的骨架,以满足特定的目标和需求。 从技术层面来描述,技术框架通常采用分层模型。以下…

【VRTK】【Unity】【游戏开发】更多技巧

课程配套学习项目源码资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 本篇将较为零散但常用的VRTK开发技巧集合在一起,主要内容: 创建物理手震动反馈高亮互动对象【创建物理手】 非物理手状态下,你的手会直接…

Redis-浅谈redis.conf配置文件

Redis.conf Redis.conf是Redis的配置文件,它包含了一系列用于配置Redis服务器行为和功能的选项。 以下是Redis.conf中常见的一些选项配置: bind: 指定Redis服务器监听的IP地址,默认为127.0.0.1,表示只能本地访问,可以…

不同activity项目创建时的区别

在 Android Studio 中创建项目时,可以选择创建不同类型的 Activity 作为应用程序的入口点。其中,包括 Empty Activity、Basic Activity、Empty Compose Activity 和 Basic Compose Activity 四种类型。 Empty Activity:这是最简单的 Activity…

运动模型非线性扩展卡尔曼跟踪融合滤波算法(Matlab仿真)

卡尔曼滤波的原理和理论在CSDN已有很多文章,这里不再赘述,仅分享个人的理解和Matlab仿真代码。 1 单目标跟踪 匀速转弯(CTRV)运动模型下,摄像头输出目标状态camera_state [x, y, theta, v],雷达输出目标状…

IDEA创建springboot+mybatis项目(java8 和java21可行)

IDEA创建springbootmybatis项目(java8 和java21可行) 今天博主讲一下,IDEA创建springbootmybatis项目的文章。 步骤分别是如下几步: 1. 创建maven项目 2. 配置pom.xml文件 3. 创建目录结构 4. 创建配置项目文件 5. 生成创建…

[前车之鉴] SpringBoot原生使用Hikari数据连接池升级到动态多数据源的深坑解决方案 RocketMQ吞掉异常问题排查

文章目录 背景说明蒙蔽双眼口说无凭修补引发的新问题解决配置问题 本地监控佐证万法归元 背景说明 当前业务场景我们使用原生SpringBoot整合Hikari数据源连接池提供服务,但是近期业务迭代需要使用动态多数据源,很自然想到dynamic-source,结果…

如何把本地项目一次性上传github(避免一个一个上传)

一、方法如下(亲测有效): 如何把本地项目上传github_本地已有工程上传github-CSDN博客 执行成功截图如下: 二、如果按照上面链接遇到问题: 问题0: 上面链接方法最后一步执行后,提示不能访问g…

OpenssH 漏洞修复

文章目录 OpenSSH 漏洞修复需求:准备环境配置阿里云yum源关闭防火墙 && SELinux安装 telnet-server安装 zlib 软件包安装OpenssL安装 OpenssH报错信息 OpenSSH 漏洞修复 场景: CentOS Stream 9 系统ssh默认版本一般是OpenSSH_8.7p1 ,…

【QUARTZ】springboot+quartz动态配置定时任务

Quartz 介绍 Quartz 定时任务可分为Trigger(触发器)、Job(任务)和Scheduler(调度器),定时任务的逻辑大体为:创建触发器和任务,并将其加入到调度器中,如下图所…