walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

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)

f:id:walkingmask:20190203225710p:plain
結合結果

テキストを三次元配列に変換して画像に結合

作っってて楽しかったやつ。文字列は 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)

f:id:walkingmask:20190203225908p:plain
ラベル付きovservation

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')

f:id:walkingmask:20190203230307p:plain
オブジェクトの軌跡の可視化

save は PIL Image の save のラッパー。

まとめ

今後もツール作ったら追加していきたい。

良いリハビリになった。楽しかった。特にテキストファイル。

あと、初めてパッケージングした。

最初からパッケージにした方が開発しやすいと言う知見を得たので、今後はこの形で作ろうと思う。