这个例子来自米格尔·莫拉莱斯写的“探索深层强化学习”的第八章。
这本书出版后,wrappers.Monitor
就不再受欢迎了。有关守则如下:
env = wrappers.Monitor(
env, mdir, force=True,
mode=monitor_mode,
video_callable=lambda e_idx: record) if monitor_mode else env
我在网上搜索并尝试了两种方法,但都失败了。
1- gnwrapper.Monitor
I pip install gym-notebook-wrapper
和import gnwrapper
,然后重写代码
env = gnwrapper.Monitor(gym.make(env_name),directory="./")
返回一个[WinError 2] The system cannot find the file specified
错误消息。
2- gym.wrappers.RecordVideo
然后我from gym.wrappers import RecordVideo
重写代码
env = RecordVideo(gym.make(env_name), "./")
返回一个AttributeError: 'CartPoleEnv' object has no attribute 'videos'
错误消息。
有什么办法解决这个问题吗?
发布于 2022-07-10 13:14:29
经过一些实验,解决这个问题的最好方法是将健身房版本降到0.20.0,以保留wrappers.Monitor
函数。
此外,subprocess.Popen
和subprocess.check_output
并不像最初作者所建议的那样工作,所以我使用moviepy
(如果一开始没有这个libarary和from moviepy.editor import VideoFileClip
,请使用pip install moviepy
)将MP4更改为GIF文件。get_gif_html
中的代码被修改如下。
gif_path = basename + '.gif'
if not os.path.exists(gif_path):
videoClip = VideoFileClip(video_path)
videoClip.write_gif(gif_path, logger=None)
gif = io.open(gif_path, 'r+b').read()
这个程序现在完全起作用了。
编辑(2472022):下面的解决方案是健身版0.25.0,因为我希望这个程序适用于以后的版本。使用Windows 10和木星笔记本进行演示。
(1)保持上述moviepy
改进
(2)进口from gym.wrappers.record_video import RecordVideo
及代用品
env = wrappers.Monitor(
env, mdir, force=True,
mode=monitor_mode,
video_callable=lambda e_idx: record) if monitor_mode else
有了这个
if monitor_mode:
env = RecordVideo(env, mdir, episode_trigger=lambda e_idx:record)
env.reset()
env.start_video_recorder()
else:
env = env
RecordVideo
函数采用(env, video_folder, episode_trigger)
参数,video_callable
和episode_trigger
是相同的。
(3)新版本的env.videos
在get_gif_html
函数中的丢失。
在旧的设置中,视频录制后,MP4和meta.json文件以随机文件名存储在以下地址
C:\Users\xxx\AppData\Local\Temp
https://i.stack.imgur.com/Za3Sd.jpg
这个env.videos
函数返回一个元组列表,每个元组由MP4和meta.json的地址路径组成。
我试图通过(a)将mdir声明为全局变量来重新创建env.videos
。
def get_make_env_fn(**kargs):
def make_env_fn(env_name, seed=None, render=None, record=False,
unwrapped=False, monitor_mode=None,
inner_wrappers=None, outer_wrappers=None):
global mdir
mdir = tempfile.mkdtemp()
(b)在demo_progression
和demo_last
函数中,对所有MP4和meta_json文件进行分组,压缩它们并使用列表理解来生成一个新的env_videos
变量(与env.videos
相反)
env.close()
mp4_files = ([(mdir + '\\' + file) for file in os.listdir(mdir) if file.endswith('.mp4')])
meta_json_files = ([(mdir + '\\' + file) for file in os.listdir(mdir) if file.endswith('.meta.json')])
env_videos = [(mp4, meta_json) for mp4, meta_json in zip(mp4_files, meta_json_files)]
data = get_gif_html(env_videos=env_videos,
这些都是变化。
https://stackoverflow.com/questions/72646391
复制相似问题