OpenAI gym: как получить пиксели в CartPole-v0

Я хотел бы получить доступ к необработанным пикселям в среде 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. Это только у меня, или его просто не существует?

Редактировать: мне не нужно открывать видео для рендеринга.


person Toke Faurby    schedule 21.04.2017    source источник
comment
Вам нужно будет открыть окно где-нибудь еще в вашем коде?   -  person zaxliu    schedule 06.06.2017
comment
Нет, это не имеет значения. (добавлено в OP)   -  person Toke Faurby    schedule 07.06.2017
comment
Тогда обходным решением будет использование виртуального буфера кадра, такого как xvfb, для перенаправления ваших видеокадров в фиктивный приемник.   -  person zaxliu    schedule 07.06.2017


Ответы (3)


Мне было любопытно то же самое, поэтому я начал изучать исходный код, и вот что я нашел.

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

поэтому в основном каждое изображение, которое мы получаем, берется из буфера того, что отображается в окне. Итак, если мы ничего не рисуем в окне, мы не получаем изображения, поэтому это окно требуется для получения изображения. поэтому вам нужно найти способ, чтобы окна не отображались, но их значения сохранялись в буфере. Я знаю, что это не то, что вы хотели, но я надеюсь, что это может привести вас к решению.

person Maunish Dave    schedule 01.10.2020

Кто-то предлагает здесь ответ:

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

«Среды atari и doom дают пиксели в своих наблюдениях (то есть возвращаемое значение из step). Я не думаю, что другие делают.

render дает разные результаты в разных ОС, поэтому они не являются частью какой-либо официальной среды для целей тестирования. Но если вы хотите создать новую среду, в которой наблюдение ведется в пикселях, вы можете реализовать это, обернув существующую среду и вызвав render ".

Я также работаю над получением необработанных пикселей, и я пытаюсь найти способ узнать, соответствует ли то, что было возвращено, тем, что я ожидал.

Документацию можно найти: https://gym.openai.com/docs

И форум для обсуждения OpenAI: Discussionopenai.com

Хотя и не очень живо.

person Stacks of overflow    schedule 06.06.2017

Я столкнулся с аналогичной проблемой:

Вот как это исправлено, в файле render.py в / gym / envs / classic_control найдите следующую строку в классе 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)

Надеюсь, это поможет!!

person Shyam Swaroop    schedule 04.02.2018
comment
ОП попросил получить пиксели из окружающей среды. visible=False скроет окно, но env.render(mode='rgb_array') вернет массив, полный белых пикселей. - person Neabfi; 25.01.2019