OpenAI gymで使えそうなツールを作ってまとめた
昨年の暮れから最近まで体調を崩していて、回復したので Python のリハビリ&研究用に gym 向けの Tool を作った。
ということで、久々にネタができたので更新。
テキストを三次元配列に変換する?text_arrayが見どころ。
開発環境
今のところ、macOS でしか使わない想定。。
gymutils
強化学習をやっている人なら誰でも知っているだろうOpenAI gym。
これでゴニョゴニョする時に使えるツール群をまとめた。
今回はこのツール群の一部を紹介。例として Pong を使用。
import gym env = gym.make('Pong-v0')
PIL を利用して observation を見る
地味に使える。
from gymutils.observation import look look(env.reset())
複数の observation を結合して一枚の画像に
用途としては、observation に何かしら加工を施した結果を1枚にまとめる等を想定。
from gymutils.observation.concat import concat_horizontally _ = env.reset() obs1, _, _, _ = env.step(0) obs2, _, _, _ = env.step(2) obs3, _, _, _ = env.step(3) observation = concat_horizontally([obs1, obs2, obs3], margin_height=5) look(observation)
テキストを三次元配列に変換して画像に結合
作っってて楽しかったやつ。文字列は ASCII の 32~126 を使用可能。
高さ 9bit、幅 1~7bit でテキストファイルに手打ちした。こんな感じ。
0000000 0001000 0111110 1001000 0111110 0001001 1111110 0001000 0000000
これは gym 以外でも用途ありそうだと思っている。
類似ライブラリは見つけられなかった。opencv とかで作れそうとは思った。
用途としては、行動ラベルを画像にくっつけたり。
from gymutils.observation.concat import concat_vertically from gymutils.text_array import TextArrayGenerator3D generator = TextArrayGenerator3D(canvas_size=(20, 160), font_size=2) text_array = generator.generate(['None']) _ = env.reset() obs, _, _, _ = env.step(0) obs = concat_vertically([obs, text_array]) look(obs)
concat は observation をいい感じに結合してくれる系の関数。
いつか色を変えたりを実装したいところ。
opencv の VideoWriter を利用した observation の動画化
用途は言わずもがな。
from gymutils.observation import Recorder recorder = Recorder(size=(230, 160), path='.', out='pong') done, _ = False, env.reset() while not done: observation, _, done, _ = obs.step(2) text = generator.generate(["{:0.5f}".format(observation.mean())]) observation = concat_vertically([observation, text]) recorder.record(observation) recorder.stop()
Pong のボールの軌跡を描画する
環境内の移動するオブジェクトの軌跡を可視化する TrajectoryDrawer。現在は Pong のみ対応。
用途と言うか、画像で一目見てオブジェクトの動きがわかるので便利。
from gymutils.observation import save from gymutils.observation import TrajectoryDrawer _ = env.reset() for _ in range(20): _ = env.step(0) drawer = TrajectoryDrawer() for _ in range(5): obs, _, _, _ = env.step(2) drawing = drawer.draw(obs) save(drawing, '.', 'torajectory')
save は PIL Image の save のラッパー。
まとめ
今後もツール作ったら追加していきたい。
良いリハビリになった。楽しかった。特にテキストファイル。
あと、初めてパッケージングした。
最初からパッケージにした方が開発しやすいと言う知見を得たので、今後はこの形で作ろうと思う。