「つくりながら学ぶ!深層強化学習」という本の中で、CartPoleなどで動画を生成して表示しているものがあります。
Google Colab上で実行している場合、本の例ではそのまま動画で表示することができないのですが、Colab(Jupyter)のセル上で動画表示可能にすることができるようにしました。
といっても、こちらの「ChainerRL を Colaboratory で動かす - Qiita」を参考にさせていただいただけなのですが。
下記のように必要なツールやライブラリを入れて、HTMLへの出力(Javascriptでのアニメーション化)を利用します。
必要なツールやライブラリのインストール
!apt -qq install xvfb ffmpeg> /dev/null
!pip -q install gym
!pip -q install JSAnimation
!pip -q install pyglet==1.2.4
!pip -q install pyopengl
!pip -q install pyvirtualdisplay
!apt -qq install python-opengl
出力用の仮想ディスプレイを生成
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
import os
os.environ["DISPLAY"] = ":" + str(display.display) + "." + str(display.screen)
必要なPythonのライブラリをimport
import matplotlib
import gym
import JSAnimation
import pyglet
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
CartPoleの動きをランダムで行わせる
frames = []
env = gym.make('CartPole-v0')
observation = env.reset()
for step in range(0, 200):
frames.append(env.render(mode='rgb_array'))
action = np.random.choice(2)
observation, reward, done, info = env.step(action)
動画をフレームごとに生成して表示
from JSAnimation.IPython_display import display_animation
from matplotlib import animation
from IPython.display import HTML
plt.figure(figsize=(frames[0].shape[1]/72.0, frames[0].shape[0]/72.0), dpi=72)
patch = plt.imshow(frames[0])
plt.axis('off')
def animate(i):
patch.set_data(frames[i])
anim = matplotlib.animation.FuncAnimation(plt.gcf(), animate, frames=len(frames), interval=50)
HTML(anim.to_jshtml())