栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

服务器无法调用gym中的render,采用Monitor保存视频的方法解决

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

服务器无法调用gym中的render,采用Monitor保存视频的方法解决

问题

由于服务器上没有图形化界面,所以在调用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 = Monitor(gym.make('MountainCar-v0'), outdir, 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为视频保存路径,force为是否覆盖之前的视频。

然后在终端输入:

xvfb-run -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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923695.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号