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 中获取像素的主要内容,如果未能解决你的问题,请参考以下文章