OpenAI 健身房:如何在 CartPole-v0 中获取像素

Posted

技术标签:

【中文标题】OpenAI 健身房:如何在 CartPole-v0 中获取像素【英文标题】:OpenAI gym: How to get pixels in CartPole-v0 【发布时间】:2017-09-18 01:29:41 【问题描述】:

我想在不打开渲染窗口的情况下访问 OpenAI gym CartPole-v0 环境中的原始像素。我该怎么做?

示例代码:

import gym
env = gym.make("CartPole-v0")
env.reset()
img = env.render(mode='rgb_array', close=True) # Returns None
print(img)
img = env.render(mode='rgb_array', close=False) 
          # Opens annoying window, but gives me the array that I want
print(img.shape)

PS。我很难为 OpenAI 健身房找到好的文档。只是我,还是根本不存在?

编辑:我不需要打开渲染视频。

【问题讨论】:

您是否需要在代码中的其他位置打开窗口? 不,没关系。 (添加到 OP) 那么一种解决方法是使用像xvfb 这样的虚拟帧缓冲区将您的视频帧重新路由到一个虚拟接收器中。 【参考方案1】:

我很好奇,所以我开始研究源代码,这就是我发现的。

Open AI 使用 pyglet 来显示窗口和动画。

为了显示动画,所有内容都被绘制到窗口上然后渲染。

然后 pyglet 将正在显示的内容存储到缓冲区中。

在开放 AI 中如何编写代码的虚拟版本

import pyglet
from pyglet.gl import *
import numpy as np

display = pyglet.canvas.get_display()
screen = display.get_screens()
config = screen[0].get_best_config()

pyglet.window.Window(width=500, height=500, display=display, config=config)

# draw what ever you want

#get image from the buffer

buffer = pyglet.image.get_buffer_manager().get_color_buffer()

image_data=buffer.get_image_data()

arr = np.frombuffer(image_data.get_data(),dtype=np.uint8)

print(arr)
print(arr.shape)

输出: [0 0 0 ... 0 0 0] (1000000,)

所以基本上我们得到的每一个图像都来自窗口上显示的缓冲区。 因此,如果我们不在窗口上绘制任何东西,我们就不会得到图像,因此需要窗口来获取图像。 所以你需要找到一种不显示窗口但将其值存储在缓冲区中的方法。 我知道这不是您想要的,但我希望它可以引导您找到解决方案。

【讨论】:

【参考方案2】:

我刚刚逐行浏览了一半的gym源代码,我可以告诉你1,cartpole的观察空间是ai到ai的数字,而不是像素。例如,从他们的 cartpole env py 文件中......

Observation:
        Type: Box(4)
        Num     Observation               Min                     Max
        0       Cart Position             -2.4                    2.4
        1       Cart Velocity             -Inf                    Inf
        2       Pole Angle                -0.209 rad (-12 deg)    0.209 rad (12 deg)
        3       Pole Angular Velocity     -Inf                    Inf

因此,此时像素适合您。 2,如果您的目标是在像素上教授人工智能,您将需要从数据输入数组中渲染图像,然后将它们作为像素数组通过观察空间传递,就像 Maunish Dave 展示的那样。 OpenAI 的 Atari 版本可以做到这一点。

如果您想要更好的指南,请不要阅读 OpenAI 文档,请阅读此处的稳定基线文档:https://stable-baselines.readthedocs.io/

【讨论】:

【参考方案3】:

有人在这里提供了答案:

https://github.com/openai/gym/issues/374

“atari 和 doom 环境在他们的观察中给出像素(即 step 的返回值)。我认为其他任何环境都没有。

render 在不同的操作系统上产生不同的结果,因此它们不是用于基准测试的任何官方环境的一部分。但是如果你想创建一个以像素为单位观察的新环境,你可以通过包装现有环境并调用渲染来实现它。”

我也在努力获取原始像素,并试图找到一种方法来查看返回的内容是否符合我的预期。

可以找到文档: https://gym.openai.com/docs

还有一个讨论 OpenAI 的论坛: 讨论.openai.com

虽然不是很热闹。

【讨论】:

【参考方案4】:

我也遇到过类似的问题:

这是修复它的方法,在 /gym/envs/classic_control 的 rendering.py 文件中,在 Viewer 类中找到以下行:

self.window = pyglet.window.Window(width=width, height=height, display=display)

将此行更改为:

self.window = pyglet.window.Window(width=width, height=height, display=display, visible=False)

希望对你有帮助!!

【讨论】:

OP 要求从环境中获取像素。 visible=False 将隐藏窗口,但 env.render(mode='rgb_array') 将返回一个充满白色像素的数组。

以上是关于OpenAI 健身房:如何在 CartPole-v0 中获取像素的主要内容,如果未能解决你的问题,请参考以下文章

OpenAI 健身房的月球着陆器模型未收敛

python TORCS包裹在openai健身房环境中

观察的意义 - OpenAI Gym

openAi-gym 名称错误

mujoco_py.MjModel(<filepath>) 定义在哪里?

演员评论家政策损失为零(没有改善)