概述
问题
由于服务器上没有图形化界面,所以在调用gym中的render()
函数时,会报错pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"
。
思路是:把视频保存下来,下载到本地再看。
解决方案
直接调用gym.wrappers.Monitor
把视频保存到本地
代码示例如下:
# test.py
import gym
from gym.wrappers import Monitor
outdir = 'video_record'
env = gym.make('MountainCar-v0')
env = Monitor(env, outdir, video_callable=lambda episode_id: True, force=True) # 主要是修改这行代码,把env传递给Monitor函数
state = env.reset()
done = False
while not done:
action = env.action_space.sample()
state_next, reward, done, info = env.step(action)
env.close()
outdir
为视频保存路径;video_callable
表示多少个episode记录一次视频,可将True改为指定的episode数,只记录特定的episode;force
为是否覆盖之前的视频。
然后在终端输入:
xvfb-run -a -s "-screen 0 640x480x24" python test.py
如果不适用xvfb运行的话,还是会报错
可能遇到的问题
当运行之后,发现视频无法打开,那是因为在源码中有一个bug,参考Fix video recording
gym/wrappers/monitoring/video_recorder.py
源代码如下:
if frame.dtype != np.uint8:
raise error.InvalidFrame("Your frame has data type {}, but we require uint8 (i.e. RGB values from 0-255).".format(frame.dtype))
self.proc.stdin.write(frame.tobytes())
应该修改为:
if frame.dtype != np.uint8:
raise error.InvalidFrame("Your frame has data type {}, but we require uint8 (i.e. RGB values from 0-255).".format(frame.dtype))
self.proc.stdin.write(frame.tobytes())
即:找到gym包的安装目录,把video_recorder.py
中的self.proc.stdin.write(frame.tobytes())
这一行代码放到if代码块外面来
总结
- 调用Monitor保存录像
- 要使用
xvfb-run
运行代码 - 修改gym源码中的一个bug
参考资料
- Extending OpenAI Gym environments with Wrappers and Monitors [Tutorial]
- Fix video recording.
- Record OpenAI gym Video with Monitor
最后
以上就是有魅力绿茶为你收集整理的服务器无法调用gym中的render,采用Monitor保存视频的方法解决的全部内容,希望文章能够帮你解决服务器无法调用gym中的render,采用Monitor保存视频的方法解决所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复