7

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

示例代码:

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 健身房找到好的文档。只是我,还是根本不存在?

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

4

4 回答 4

2

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

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,)

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

于 2020-10-01T13:52:52.880 回答
0

我刚刚逐行浏览了一半的gym源代码,我可以告诉你1,cartpole的观察空间是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/

于 2022-01-18T04:37:23.257 回答
-1

我遇到了类似的问题:

这就是修复它的方法,在 /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)

希望能帮助到你!!

于 2018-02-04T23:20:00.983 回答
-1

有人在这里给出了答案:

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

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

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

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

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

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

虽然不是很热闹。

于 2017-06-06T00:30:49.127 回答