你不应该整天玩电子游戏,你的人工智能也不应该!我们构建了一个虚拟环境模拟器 Gibson,它为学习感知提供了真实世界的体验。
摘要: 感知和活跃(即具有一定程度的运动自由度)密切相关。在物理世界中学习主动感知和感觉运动控制非常麻烦,因为现有算法太慢,无法有效地实时学习,而且机器人脆弱且成本高昂。这使得模拟学习取得了丰硕的成果,从而提出了如何转移到现实世界的问题。我们开发的 Gibson 环境具有以下主要特征:
一、来自现实世界,通过虚拟现实空间反映其语义复杂性,
二.具有转移到现实世界的内置机制(护目镜功能),以及
III。代理的体现,并通过集成物理引擎(Bulletphysicals)使其受到空间和物理的约束。
命名:吉布森环境以James J. Gibson命名,他是《视觉感知的生态方法》一书的作者,1979 年。“我们必须感知才能移动,但我们也必须移动才能感知” – JJ Gibson
请访问网站( http://gibsonenv.stanford.edu/ ) 了解更多技术细节。该存储库旨在用于分发环境和安装/运行说明。
“Gibson Env:体现代理的真实世界感知”, CVPR 2018 [Spotlight Oral]。
这是 0.3.1 版本。我们鼓励并赞赏错误报告、改进建议以及社区发展。 更改日志文件。
完整的数据库包括 572 个空间和 1440 个楼层,可以在此处下载。在这里可以看到吉布森所有空间的多样化可视化。为了使核心资产下载包对用户来说更轻松,我们包含了一小部分空间 (39)。用户可以下载其余空间并将其添加到资产文件夹中。如果您希望将 Gibson 的模拟器与这些数据集一起使用,我们还将斯坦福 2D3DS和Matterport 3D集成为单独的数据集(在此处访问)。
安装 gibson 有两种方法,A. 使用我们的 docker 镜像(推荐)和 B. 从源代码构建。
最低系统要求如下:
对于 docker 安装(A):
- 乌班图16.04
- Nvidia GPU,显存 > 6.0GB
- Nvidia 驱动程序 >= 384
- CUDA >= 9.0,CuDNN >= v7
对于从源头构建(B):
- 乌班图 >= 14.04
- Nvidia GPU,显存 > 6.0GB
- Nvidia 驱动程序 >= 375
- CUDA >= 8.0,CuDNN >= v5
首先,我们的环境核心资产数据可以在这里获取。您可以按照下面的安装指南正确下载并设置它们。gibson/assets
文件夹存储运行gibson环境所需的数据(代理模型、环境等)。用户可以添加更多环境文件以gibson/assets/dataset
在更多环境中运行gibson。访问数据库自述文件以下载更多空间。使用Gibson的数据库之前请签署许可协议。
我们使用docker来分发我们的软件,您需要先安装docker和nvidia-docker2.0。
运行docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
以验证您的安装。
您可以 1. 从我们的 docker 映像中提取(推荐)或 2. 构建您自己的 docker 映像。
- 从我们的 docker 镜像中提取(推荐)
# download the dataset from https://storage.googleapis.com/gibson_scenes/dataset.tar.gz docker pull xf1280/gibson:0.3.1 xhost +local:root docker run --runtime=nvidia -ti --rm -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v <host path to dataset folder>:/root/mount/gibson/gibson/assets/dataset xf1280/gibson:0.3.1
- 构建您自己的 docker 镜像
git clone https://github.com/StanfordVL/GibsonEnv.git cd GibsonEnv ./download.sh # this script downloads assets data file and decompress it into gibson/assets folder docker build . -t gibson ### finish building inside docker, note by default, dataset will not be included in the docker images xhost +local:root ## enable display from docker
如果安装成功,您应该能够运行docker run --runtime=nvidia -ti --rm -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v <host path to dataset folder>:/root/mount/gibson/gibson/assets/dataset gibson
来创建容器。请注意,我们不会在 docker 镜像中包含数据集文件以保持镜像精简,因此您需要在启动容器时将其安装到容器中。
Gibson Env 支持在无头服务器上部署以及使用x11vnc
. 您可以使用上面的 docker 文件构建自己的 docker 镜像Dockerfile
。在无头服务器上运行 gibson 的说明(需要运行 X 服务器):
- 按照入门指南安装 nvidia-docker2 依赖项。安装
x11vnc
与sudo apt-get install x11vnc
. - 让 xserver 在您的主机上运行,并
x11vnc
在 DISPLAY :0 上运行。 docker run --runtime=nvidia -ti --rm -e DISPLAY -v /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 -v <host path to dataset folder>:/root/mount/gibson/gibson/assets/dataset <gibson image name>
- 使用
python <gibson example or training>
内部 docker 运行 gibson。 - 访问您的
host:5900
,您应该能够看到 GUI。
如果您没有运行 X 服务器,您仍然可以运行 gibson,请参阅本指南了解更多详细信息。
如果你不想使用我们的docker镜像,你也可以在本地安装gibson。这将需要安装一些依赖项。
首先,确保您安装了 Nvidia 驱动程序和 CUDA。如果从源代码安装,则不需要 CUDA 9,因为它适用于 nvidia-docker 2.0。然后,让我们安装一些依赖项:
apt-get update apt-get install libglew-dev libglm-dev libassimp-dev xorg-dev libglu1-mesa-dev libboost-dev \ mesa-common-dev freeglut3-dev libopenmpi-dev cmake golang libjpeg-turbo8-dev wmctrl \ xdotool libzmq3-dev zlib1g-dev
安装所需的深度学习库:推荐使用python3.5。可以先创建一个python3.5环境。
conda create -n py35 python=3.5 anaconda source activate py35 # the rest of the steps needs to be performed in the conda environment conda install -c conda-forge opencv pip install http://download.pytorch.org/whl/cu90/torch-0.3.1-cp35-cp35m-linux_x86_64.whl pip install torchvision==0.2.0 pip install tensorflow==1.3
克隆存储库、下载数据并构建
git clone https://github.com/StanfordVL/GibsonEnv.git cd GibsonEnv ./download.sh # this script downloads assets data file and decompress it into gibson/assets folder ./build.sh build_local ### build C++ and CUDA files pip install -e . ### Install python libraries
如果您需要运行训练演示,请安装 OpenAI 基线。
git clone https://github.com/fxia22/baselines.git pip install -e baselines
卸载 gibson 很简单。如果你使用docker安装,只需运行docker images -a | grep "gibson" | awk '{print $3}' | xargs docker rmi
清理镜像即可。如果您从源安装,请使用卸载pip uninstall gibson
xhost +local:root
首先在您的主机上运行以启用显示。您可能需要export DISPLAY=:0
先跑步。使用 进入 docker 容器后docker run --runtime=nvidia -ti --rm -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v <host path to dataset folder>:/root/mount/gibson/gibson/assets/dataset gibson
,您将获得一个交互式 shell。现在您可以运行一些演示。
如果您是从源代码安装的,则可以使用以下命令直接运行它们,而无需使用 docker。
python examples/demo/play_husky_nonviz.py ### Use ASWD keys on your keyboard to control a car to navigate around Gates building
您将能够使用键盘上的 ASWD 键来控制汽车在盖茨大楼周围导航。此特定演示中不会显示相机输出。
python examples/demo/play_husky_camera.py ### Use ASWD keys on your keyboard to control a car to navigate around Gates building, while RGB and depth camera outputs are also shown.
您将能够使用键盘上的 ASWD 键来控制汽车在盖茨大楼周围导航。您还可以看到 RGB 和深度相机输出。
python examples/train/train_husky_navigate_ppo2.py ### Use PPO2 to train a car to navigate down the hallway in Gates building, using visual input from the camera.
python examples/train/train_ant_navigate_ppo1.py ### Use PPO1 to train an ant to navigate down the hallway in Gates building, using visual input from the camera.
以下是 Gibson Environment 在不同平台上的帧率基准。请参阅fps 分支以获取重现结果的代码。
平台 | 在 Intel E5-2697 v4 + NVIDIA Tesla V100 上测试 | ||
---|---|---|---|
分辨率 [nxn] | 128 | 256 | 第512章 |
RGBD,预网络f |
109.1 | 58.5 | 26.5 |
RGBD、后网络f |
77.7 | 30.6 | 14.5 |
RGBD,后小网络f |
87.4 | 40.5 | 21.2 |
仅深度 | 253.0 | 197.9 | 124.7 |
仅表面法线 | 207.7 | 129.7 | 57.2 |
仅语义 | 190.0 | 144.2 | 55.6 |
非视觉感官 | 396.1 | 396.1 | 396.1 |
我们还在Intel I7 7700 + NVIDIA GeForce GTX 1070Ti
和Tested on Intel I7 6580k + NVIDIA GTX 1080Ti
平台上进行了测试。每个任务的 FPS 差异在 10% 以内。
平台 | 在 Intel E5-2697 v4 + NVIDIA Tesla V100 上测试多进程 FPS | |||||
---|---|---|---|---|---|---|
配置 | 512x512 剧集同步 | 512x512 帧同步 | 256x256 剧集同步 | 256x256 帧同步 | 128x128 剧集同步 | 128x128 帧同步 |
1 进程 | 12.8 | 12.02 | 32.98 | 32.98 | 52 | 52 |
2个过程 | 23.4 | 20.9 | 60.89 | 53.63 | 86.1 | 101.8 |
4道工序 | 42.4 | 31.97 | 105.26 | 76.23 | 97.6 | 145.9 |
8道工序 | 72.5 | 48.1 | 138.5 | 97.72 | 113 | 151 |
运行 Gibson 时,您可以使用 启动 Web 用户界面python gibson/utils/web_ui.py python gibson/utils/web_ui.py 5552
。当您无法物理访问运行 gibson 的计算机或在无头云环境中运行时,这非常有用。您需要更改mode
配置文件才能web_ui
使用 Web 用户界面。
当模型被语义注释时,Gibson 可以提供逐像素的逐帧语义掩码。截至目前,我们已为此目的整合了斯坦福 2D-3D-语义数据集和Matterport 3D的模型。您可以在Gibson 中访问它们。我们建议您参考原始数据集的参考,以获取其语义类和注释的列表。
有关 Gibson 中渲染语义的详细说明,请参阅语义说明。作为安装附带的入门数据集中的一个示例,space7
包括斯坦福 2D-3D-Semantics 风格注释。
Gibson 提供了一组基本代理。请在此处查看这些代理的视频及其相应的感知观察。
为了(可选)抽象出低级控制和机器人动力学来执行高级任务,我们还为每个代理提供了一组实用且理想的控制器。
代理名称 | 自由度 | 信息 | 控制器 |
---|---|---|---|
穆乔科蚂蚁 | 8 | 开放人工智能链接 | 扭矩 |
穆乔科人形生物 | 17 号 | 开放人工智能链接 | 扭矩 |
哈士奇机器人 | 4 | 活性氧,制造商 | 扭矩、速度、位置 |
小牛机器人 | 8 | 机器人页面,制造商 | 正弦控制器 |
兔子杰克 | 2 | 斯坦福项目链接 | 扭矩、速度、位置 |
海龟机器人 | 2 | 活性氧,制造商 | 扭矩、速度、位置 |
四旋翼飞行器 | 6 | 纸 | 位置 |
examples/demo
更多演示示例可以在文件夹中找到
例子 | 解释 |
---|---|
play_ant_camera.py |
使用键盘上的 1234567890qwerty 键控制蚂蚁在盖茨大楼周围导航,同时还会显示 RGB 和深度相机输出。 |
play_ant_nonviz.py |
使用键盘上的 1234567890qwerty 键来控制蚂蚁在盖茨大楼周围导航。 |
play_drone_camera.py |
使用键盘上的 ASWDZX 键控制无人机在盖茨大楼周围导航,同时还会显示 RGB 和深度相机输出。 |
play_drone_nonviz.py |
使用键盘上的 ASWDZX 键控制无人机在盖茨大楼周围导航 |
play_humanoid_camera.py |
使用键盘上的 1234567890qwertui 键来控制人形机器人在盖茨大楼周围导航。开个玩笑,用键盘控制人形太难了,只能眼睁睁看着它掉下来。按 R 重置。还显示了 RGB 和深度相机输出。 |
play_humanoid_nonviz.py |
观看人形物体坠落。按 R 重置。 |
play_husky_camera.py |
使用键盘上的 ASWD 键控制汽车在盖茨大楼周围导航,同时还会显示 RGB 和深度摄像头输出。 |
play_husky_nonviz.py |
使用键盘上的 ASWD 键控制汽车在盖茨大楼周围导航 |
更多训练代码可以在文件夹中找到examples/train
。
例子 | 解释 |
---|---|
train_husky_navigate_ppo2.py |
使用 PPO2 使用摄像头的 RGBD 输入来训练汽车沿着盖茨大楼的走廊行驶。 |
train_husky_navigate_ppo1.py |
使用 PPO1 使用摄像头的 RGBD 输入来训练汽车沿着盖茨大楼的走廊行驶。 |
train_ant_navigate_ppo1.py |
使用 PPO1 训练蚂蚁通过摄像头的视觉输入沿着盖茨大楼的走廊导航。 |
train_ant_climb_ppo1.py |
使用 PPO1 通过摄像头的视觉输入来训练蚂蚁爬下盖茨大楼的楼梯。 |
train_ant_gibson_flagrun_ppo1.py |
使用 PPO1 训练蚂蚁追逐盖茨大楼中的目标(红色立方体)。每当蚂蚁到达目标(或超时)时,目标就会改变位置。 |
train_husky_gibson_flagrun_ppo1.py |
使用 PPO1 训练汽车追逐盖茨大楼中的目标(红色立方体)。每次汽车到达目标(或超时)时,目标都会改变位置。 |
我们在这里提供了使用 ROS 配置 Gibson 的示例。我们以turtlebot为例,在Gibson中训练策略后,只需进行最少的更改即可部署到turtlebot上。有关更多详细信息,请参阅自述文件。
您可以按照我们的约定对您的 RL 代理进行编码。我们的环境的接口非常简单(请参阅本节末尾的一些示例)。
首先,您可以通过在文件夹中创建类的实例来创建环境gibson/core/envs
。
env = AntNavigateEnv(is_discrete=False, config = config_file)
然后用 进行一步模拟env.step
。并重置env.reset()
obs, rew, env_done, info = env.step(action)
obs
给出机器人的观察结果。它是一个字典,每个组件作为键值对。它的键由用户在配置文件中指定。例如obs['nonviz_sensor']
是本体感受传感器数据,obs['rgb_filled']
是RGB相机数据。
rew
是定义的奖励。env_done
标志着一集的结束,例如机器人死亡时。
info
给出此步骤的一些附加信息;有时我们用它来传递额外的非视觉传感器值。
在设计 RL 算法和环境的接口时,我们主要遵循OpenAIgym惯例。为了帮助用户更快地开始使用该环境,我们在Examples/train中提供了一些示例。我们使用的强化学习算法来自openAI 基线,并进行了一些调整,以处理混合视觉和非视觉感官数据。特别是,我们使用了PPO和PPO的速度优化版本。
每个环境都配置有一个yaml
文件。文件示例yaml
可以在文件夹中找到examples/configs
。该文件的参数解释如下。有关 Bullet 物理引擎的更多信息,您可以在此处查看文档。
参数名称 | 示例值 | 解释 |
---|---|---|
环境名称 | AntClimb环境 | 环境名称,确保与环境的类名相同 |
型号_id | 空间1-空间8 | 场景id,在测试版中,从space1-space8中选择 |
目标_orn | [0, 0, 3.14] | 欧拉角(弧度)导航目标方向,参考系为世界系。对于非导航任务,该参数被忽略。 |
目标位置 | [-7, 2.6, -1.5] | 导航的目标位置(以米为单位),参考系为世界系。对于非导航任务,该参数被忽略。 |
初始_orn | [0, 0, 3.14] | 导航的初始方向(以弧度为单位),参考系为世界系 |
初始位置 | [-7, 2.6, 0.5] | 导航的初始位置(以米为单位),参考系为世界系 |
视场 | 1.57 | 相机的视野,以弧度为单位 |
使用填充剂 | 真假 | 是否使用神经网络填充器。建议将此参数保留为真。请参阅吉布森环境网站了解更多信息。 |
显示用户界面 | 真假 | Gibson 有两种显示视觉输出的方式,要么在多个窗口中,要么将它们聚合到一个 pygame 窗口中。该参数决定是否显示pygame ui,如果在生产环境(训练),则需要将其关闭 |
显示诊断 | 真假 | 显示叠加在 RGB 图像上的诊断信息(包括 fps、机器人位置和方向、累积奖励) |
用户界面编号 | 2 | 要显示多少个 ui 组件,这应该是 ui_components 的长度。 |
用户界面组件 | [RGB_FILLED,深度] | 这是 ui 组件,从 [RGB_FILLED、DEPTH、NORMAL、SEMANTICS、RGB_PREFILLED] 中选择 |
输出 | [nonviz_sensor、rgb_filled、深度] | 将环境输出到机器人,从 [nonviz_sensor、rgb_filled、深度] 中选择。这些值与 无关ui_components ,因为ui_components 它决定了显示内容并output 决定了机器人接收的内容。 |
解决 | 第512章 | 从 [128, 256, 512] 分辨率中选择 RGB/深度图像 |
初始_orn | [0, 0, 3.14] | 导航的初始方向(以弧度为单位),参考系为世界系 |
速度:时间步长 | 0.01 | 一个物理模拟步骤的长度(以秒为单位)(如Bullet中所定义)。例如,如果 timestep=0.01 秒,frameskip=10,并且环境以 100fps 运行,则它将是 10 倍实时。注意:将时间步设置为高于 0.1 可能会导致当前版本的 Bullet 模拟器不稳定,因为对象在一个时间步内的移动速度不应超过其自身半径。您可以将时间步长保持在较低值,但增加跳帧以更快的速度进行模拟。有关详细信息,请参阅“离散碰撞检测”下的项目符号指南。 |
速度:跳帧 | 10 | 渲染帧时要跳过多少时间步。请参阅上行的示例。对于不需要高频控制的任务,可以将frameskip设置为更大的值以获得进一步的加速。 |
模式 | 图形用户界面/无头/web_ui | gui 或 headless,如果在生产环境(训练),则需要将其转为 headless。gui模式下,会有视觉输出;在无头模式下,不会有任何视觉输出。除此之外,如果将模式设置为 web_ui,它将像无头模式一样运行,但视觉效果将呈现到 Web UI 服务器。(更多信息) |
冗长的 | 真假 | 在终端中显示诊断信息 |
fast_lq_render | 真假 | 如果 yaml 文件中有 fast_lq_render,Gibson 将使用较小的填充网络,这将渲染速度更快,但生成质量稍低的相机输出。此选项对于快速训练 RL 代理非常有用。 |
Gibson 提供了一组方法供您定义自己的环境。您可以按照里面现有的环境进行操作gibson/core/envs
。
方法名称 | 用法 |
---|---|
机器人.render_observation(姿势) | 根据姿势渲染新的观察结果,返回字典。 |
机器人.get_observation() | 以当前姿势进行观察。需要在robot.render_observation(pose)之后调用。这不会引起额外的计算。 |
机器人.get_position() | 获取当前机器人位置。 |
机器人.get_orientation() | 获取当前机器人方向。 |
机器人.眼睛.get_position() | 获取当前机器人感知相机位置。 |
机器人.眼睛.get_orientation() | 获取当前机器人感知相机方向。 |
机器人.get_target_position() | 获取机器人目标位置。 |
机器人.apply_action(动作) | 对机器人应用动作。 |
机器人.reset_new_pose(pos, orn) | 将机器人重置为任意姿势。 |
机器人.dist_to_target() | 获取机器人到目标的当前距离。 |
Gibson 包含一个名为 Goggles 的内置域适应机制,用于在 Gibson 中训练的代理将被部署到现实世界中时(即根据来自机载摄像头的图像进行操作)。该机制本质上是一种学习的逆函数,它将来自真实相机的帧更改为通过吉布森渲染的帧,从而消除域间隙。
更多细节:由于点云渲染存在所有缺陷,事实证明很难通过神经网络修复来获得完全逼真的渲染。剩下的问题使得合成图像和真实图像之间存在域差距。因此,我们将渲染问题表述为形成一个联合空间,确保渲染图像和真实图像之间的对应关系,而不是尝试(不成功地)渲染与真实图像相同的图像。这为穿越这些域提供了一条确定性的路径,从而消除了差距。我们为目标图像(I_t)添加另一个网络“u”,并定义渲染损失以最小化f(I_s)和u(I_t)之间的距离,其中“f”和“I_s”代表填充神经网络和点云渲染分别输出(参见上图的损失)。我们对 f 和 u 使用相同的网络结构。函数 u(I) 经过训练,可以改变现实世界中的观察值 I_t,使其看起来像相应的 I_s,从而消除间隙。我们将 u 网络护目镜命名为 u 网络护目镜,因为它类似于现实世界中部署的代理的矫正镜片。该机制的详细阐述和讨论可以在论文中找到。您可以下载函数 u 并在现实世界中部署训练有素的代理时应用它。
为了使用护目镜,您最好需要一个带有深度传感器的相机,我们在这里提供了Kinect 的示例。训练好的护目镜函数存储在 中assets/unfiller_{resolution}.pth
,并且每一个函数都与一个填充函数配对。您需要根据使用的填充函数来使用正确的填充函数。如果您没有带深度传感器的相机,我们在这里也仅提供 RGB 的示例。
如果您使用 Gibson Environment 的软件或数据库,请引用:
@inproceedings{xiazamirhe2018gibsonenv,
title={Gibson {Env}: real-world perception for embodied agents},
author={Xia, Fei and R. Zamir, Amir and He, Zhi-Yang and Sax, Alexander and Malik, Jitendra and Savarese, Silvio},
booktitle={Computer Vision and Pattern Recognition (CVPR), 2018 IEEE Conference on},
year={2018},
organization={IEEE}
}