前提・実現したいこと
OpenAi gymの実行アニメーションを保存したいのですが、
プログラム実行時にエラーが発生し、なにも映像が表示されないmp4ファイルが生成されてしまう。
つくりながら学ぶ!深層強化学習を参考に強化学習の勉強をしているのですが、上記の内容で躓いています。
どなたかお力を貸していただけないでしょうか。
下記は著者様の元記事
https://book.mynavi.jp/manatee/detail/id=88961
Anacondaにて環境を構築し、以下は手動にて追加したパッケージ。
gym==0.9.7
matplotlib
JSAnimation
pyglet==1.2.4
conda install -c conda-forge ffmpeg
使用言語、Python3
問題解決法をご存じであれば、ご教授のほど宜しくお願い致します。
発生している問題・エラーメッセージ
AttributeError Traceback (most recent call last) <ipython-input-5-2d605f8148aa> in <module> 1 # 動画を保存と描画 ----> 2 display_frames_as_gif(frames) <ipython-input-3-9d95926f2835> in display_frames_as_gif(frames) 22 23 anim.save('movie_cartpole.mp4') # 追記:動画の保存です ---> 24 display(display_animation(anim, default_mode='loop')) E:\Anaconda3\envs\rl_env2\lib\site-packages\JSAnimation\IPython_display.py in display_animation(anim, **kwargs) 84 """Display the animation with an IPython HTML object""" 85 from IPython.display import HTML ---> 86 return HTML(anim_to_html(anim, **kwargs)) 87 88 E:\Anaconda3\envs\rl_env2\lib\site-packages\JSAnimation\IPython_display.py in anim_to_html(anim, fps, embed_frames, default_mode) 74 anim.save(f.name, writer=HTMLWriter(fps=fps, 75 embed_frames=embed_frames, ---> 76 default_mode=default_mode)) 77 html = open(f.name).read() 78 E:\Anaconda3\envs\rl_env2\lib\site-packages\matplotlib\animation.py in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs, progress_callback) 1150 progress_callback(frame_number, total_frames) 1151 frame_number += 1 -> 1152 writer.grab_frame(**savefig_kwargs) 1153 1154 # Reconnect signal for first draw if necessary E:\Anaconda3\envs\rl_env2\lib\contextlib.py in __exit__(self, type, value, traceback) 86 if type is None: 87 try: ---> 88 next(self.gen) 89 except StopIteration: 90 return False E:\Anaconda3\envs\rl_env2\lib\site-packages\matplotlib\animation.py in saving(self, fig, outfile, dpi, *args, **kwargs) 230 yield self 231 finally: --> 232 self.finish() 233 234 E:\Anaconda3\envs\rl_env2\lib\site-packages\matplotlib\animation.py in finish(self) 526 # Call run here now that all frame grabbing is done. All temp files 527 # are available to be assembled. --> 528 self._run() 529 MovieWriter.finish(self) # Will call clean-up 530 E:\Anaconda3\envs\rl_env2\lib\site-packages\JSAnimation\html_writer.py in _run(self) 321 of.write(JS_INCLUDE) 322 of.write(DISPLAY_TEMPLATE.format(id=self.new_id(), --> 323 Nframes=len(self._temp_names), 324 fill_frames=fill_frames, 325 interval=interval, AttributeError: 'HTMLWriter' object has no attribute '_temp_names'
該当のソースコード
python
1# 使用するパッケージの宣言 2import numpy as np 3import matplotlib.pyplot as plt 4%matplotlib inline 5import gym 6 7# 動画の描画関数の宣言 8# 参考URL http://nbviewer.jupyter.org/github/patrickmineault/xcorr-notebooks/blob/master/Render%20OpenAI%20gym%20as%20GIF.ipynb 9from JSAnimation.IPython_display import display_animation 10from matplotlib import animation 11from IPython.display import display 12 13 14def display_frames_as_gif(frames): 15 """ 16 Displays a list of frames as a gif, with controls 17 """ 18 plt.figure(figsize=(frames[0].shape[1]/72.0, frames[0].shape[0]/72.0), 19 dpi=72) 20 patch = plt.imshow(frames[0]) 21 plt.axis('off') 22 23 def animate(i): 24 patch.set_data(frames[i]) 25 26 anim = animation.FuncAnimation(plt.gcf(), animate, frames=len(frames), 27 interval=50) 28 29 anim.save('movie_cartpole.mp4') # 追記:動画の保存です 30 display(display_animation(anim, default_mode='loop')) 31 32# CartPoleをランダムに動かす 33 34frames = [] 35env = gym.make('CartPole-v0') 36observation = env.reset() # 最初に環境のresetが必要 37 38for step in range(0, 200): 39 frames.append(env.render(mode='rgb_array')) # framesに各時刻の画像を追加していく 40 action = np.random.choice(2) # 0(カートを左に押す), 1(カートを右に押す)をランダムに返す 41 observation, reward, done, info = env.step(action) # actionを実行する 42 43# 注意:実行後にipykernel_launcher.p...というindowが開いて固まりますが放置しておいてください 44 45# 動画を保存と描画 46display_frames_as_gif(frames)
試したこと
カーネルの更新
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。