【论文复现】MimicPlay从人类演示中学习机器人技能
论文笔记
1 目标问题
从人类演示中学习,是教授机器人操作技能的一种很有前途的方法。
目前大多数模仿学习算法仍然局限于学习短期的操作,例如开门或抓取特定物品。
而关于长期任务的研究,目前有两个方向:分层模仿学习和从演示数据中学习。分层学习旨在通过端到端实现高级规划到低级运动控制的学习。从演示数据中学习是指人类通过遥控机器人于环境互动来收集数据。
本文提出了一个分层学习框架,从大量人类演示数据中学习潜在的计划,来指导机器人在少量演示中实现视觉运动控制。
2 主要方法
2.1 收集人类数据
人类在用手与环境互动的过程中,创造了一个手的轨迹。本文使用两台经过校准的相机来跟踪人类演示数据中的3D手轨迹,手部位置检测使用现有的库。
2.2 从人类数据中学习3D潜在规划
问题:给定一个由目标图像表示的长期任务,策略产生以目标为条件的行动。
将该问题转化为分层学习策略,其中高级规划器从目标图像中提取关键特征,并转化成低维的规划,利用这些规划引导运动控制器动作。为了训练高级规划器,本文使用廉价的数据源(人类演示数据)
(1)多模式潜在计划学习
利用收集的人类演示数据和对应的3D手部轨迹,将学习规程转化为目标条件的3D轨迹生成任务。即将人类演示图像,目标图像处理为低维特征,利用MLP编码为潜在计划向量,利用潜在计划向量和手的位置,利用MLP解码为3D手部轨迹的预测。
为了解决不同人演示同一任务的差异,使用基于MLP的高斯混合模型来对潜在计划的轨迹分布进行建模。
(2)处理人类演示数据和机器人之间的视觉差异
本文考虑人与机器人在同一环境中,需要解决机器人与人类外观不同导致的视觉差异。通过计算人类和机器人的视觉编码器的特征嵌入的分布,最小化两者距离(此步骤机器人与人类视频不需要是对应的)
2.3 多任务模仿学习
(1)用于潜在计划生成的视频提示
使用单镜头视频作为目标指定提示,发送给训练好的潜在规划器,生成机器人可执行的潜在计划。
规划器将视频分成多个帧,每个时间步长,规划器从序列中取一个图像帧作为目标图像,生成潜在规划引导机器人动作。
(2)基于Transformer的计划引导与模仿
在执行复杂任务时,仅使用高层规划是不够的,还需要考虑底层的细节。因此考虑将机器人腕部相机和本体感觉都转换成低维特征向量,与潜在计划进行结合,利用Trasformer架构(因为其擅长管理长期运动生成)进行处理。
(3)多任务
在同一环境中的所有任务中共享相同的规划器和策略模型。
算法复现
1 环境搭建
(1)进入所下载代码环境
1 | cd MimicPlay |
(2)创建 conda 环境
1 | conda create -n mimicplay python=3.8 -y |
(3)安装 MuJoCo
1 | pip install mujoco==2.3.0 |
如果出现问题:
imgaug 0.4.0 requires XXXXXX, which is not installed.
解决方法如下:
- 安装报错提示的imgaug所需的依赖项:
pip install imageio matplotlib Pillow scikit-image six opencv-python
- 重新安装mujoco:
pip install mujoco
(4)安装robosuite
1 | git clone https://github.com/ARISE-Initiative/robosuite.git |
第一次安装失败,然后
git checkout v1.4.1_libero
之后才安装成功
(5)安装BDDL
1 | cd .. |
(6)安装LIBERO
1 | cd .. |
(7)安装robomimic
1 | cd .. |
第一次安装失败,然后
git checkout mimicplay-libero
之后才安装成功
(8)安装MimicPlay
1 | cd .. |
2 数据准备(从虚拟机器人动作数据中学习机器人动作)
2.1 官方数据集
训练集和测试视频在此处下载。训练集是一系列没有指定特定任务(没有标签)的人类演示视频。
作者推荐下载原始数据demo.hdf5
,然后在本地电脑上将其处理为具有图像观察的训练数据集demo_image.hdf5
,因为这样可以很好的检查环境库是否安装正确,具体步骤如下:
(1)将下载的数据集移动到mimicplay/datasets
例如:
1 | cd MimicPlay/mimicplay |
(2)将原始数据转换为图像数据集
1 | 示例 |
如果出现问题:
ileNotFoundError: [Errno 2] No such file or directory: 'patchelf'
解决方法如下:sudo apt-get install patchelf
(3)提取末端轨迹用于上层规划器的训练
1 | python scripts/dataset_extract_traj_plans.py --dataset 'datasets/playdata/image_demo_local.hdf5' |
(4)检查数据:重新播放数据集中的图像,保存成视频
1 | python scripts/playback_robomimic_dataset.py --dataset 'datasets/playdata/image_demo_local.hdf5' --use-obs --render_image_names agentview_image --video_path image_demo_local_replay.mp4 |
2.2 自制数据集
(1)使用BDDL文件收集数据
1 | python scripts/collect_playdata.py --bddl-file 'scripts/bddl_files/KITCHEN_SCENE9_playdata.bddl' --device 'keyboard' |
收集的原始数据可以在robosuite/robosuite/models/assets/demonstrations/
路径下找到。
(2)将原始数据转换成robomimic格式
1 | python scripts/convert_playdata_to_robomimic_dataset.py --dataset 'path_to_your_data' |
(3)现在有了robomimic格式的数据,按照#1.3 公共数据集中的步骤生成特定任务的视频提示
3 数据准备(从人类演示中学习机器人动作)
3.1 配置人手检测模型
(1)配置开源的 hand_object_detector
1 | conda create --name handobj python=3.6 |
(2)下载fast_rcnn模型,并放置在指定位置
从Google Drive中下载faster_rcnn_1_8_132028.pth (361M),移动到下面的路径
1 | cd hand_object_detector |
(3)将mimicplay的python脚本放入人手检测器的目录下
1 | cd mimicplay/scripts/human_playdata_process/ |
3.2 从人类演示生成数据集
(1)复制两个示例视频
1 | cp vis_1.mp4 hand_object_detector/ |
(2)生成hdf5数据文件
1 | cd hand_object_detector/ |
(3)可视化数据集
1 | cd scripts/human_playdata_process/ |
4 训练
4.1 训练高级规划器
1 | cd MimicPlay/mimicplay |
训练结束后,选择评估分数最高的checkpoint,将其路径作为
4.2 训练低级机器人控制器
参考:
- Mimicplay: Long-horizon imitation learning by watching human play. [Project](MimicPlay | Long-Horizon Imitation Learning by Watching Human Play (mimic-play.github.io)) Code, arXiv