AsaHP
AI・深層学習

Getting Started - 交通流の強化学習ツール highway-env

強化学習におけるOpenAI Gymを拡張させたツールに、交通流を扱うhighway-envがある。その解説ページにあるGetting Startedについて説明する。

以下は2023/2時点での情報である。

取り合えずGoogle Colabで動かす

Getting Startedとあるので簡単に動きそうに見えるが、残念ながら研究用ツールなのでそう簡単ではない。Google Colabで動かす場合、最初にツールのインストール作業が必要である。

##### 修正点、追加
!apt update
!apt install xvfb
!pip install pyvirtualdisplay
!pip install highway-env
!pip install gym-notebook-wrapper

上記の「修正点」は私がソースを修正した箇所である。このページに書いてあるソースは、上から順に実行すると2023/1時点のColabで動作するようになっている。

次に前処理を行う。

##### 修正点、追加
import highway_env
from IPython import display
from pyvirtualdisplay import Display
import matplotlib.pyplot as plt

d = Display()
d.start()

最後にGetting Startedのソースを実行すると、車線の画像が表示される。車の位置は毎回変わる。envという変数が強化学習の実行環境を示す。highway-envは環境を作成するツールである。画像・動画作成はOpenAI Gymが持つ機能である。

import gym
from matplotlib import pyplot as plt
%matplotlib inline

env = gym.make('highway-v0')
env.reset()
for _ in range(3):
    action = env.action_type.actions_indexes["IDLE"]
    obs, reward, done, truncated, info = env.step(action)
    env.render()

plt.imshow(env.render(mode="rgb_array"))
plt.show()

なお、Training an agentの項は実質的には別のサンプルなので、別のページで説明する

環境の中身を見る

envの中に環境の情報が記載されている。"highway-v0"以外にも様々な環境がhighway-envで構築できる。

import pprint

env = gym.make("highway-v0")
pprint.pprint(env.config)
{'action': {'type': 'DiscreteMetaAction'},
 'centering_position': [0.3, 0.5],
 'collision_reward': -1,
 'controlled_vehicles': 1,
 'duration': 40,
 'ego_spacing': 2,
 'high_speed_reward': 0.4,
 'initial_lane_id': None,
 'lane_change_reward': 0,
 'lanes_count': 4,
 'manual_control': False,
 'normalize_reward': True,
 'observation': {'type': 'Kinematics'},
 'offroad_terminal': False,
 'offscreen_rendering': False,
 'other_vehicles_type': 'highway_env.vehicle.behavior.IDMVehicle',
 'policy_frequency': 1,
 'real_time_rendering': False,
 'render_agent': True,
 'reward_speed_range': [20, 30],
 'right_lane_reward': 0.1,
 'scaling': 5.5,
 'screen_height': 150,
 'screen_width': 600,
 'show_trajectories': False,
 'simulation_frequency': 15,
 'vehicles_count': 50,
 'vehicles_density': 1}

envの内容を変えると環境が変わる。

env.config["lanes_count"] = 2
env.reset()
plt.imshow(env.render(mode="rgb_array"))
plt.show()

画像の連続表示

OpenAI Gymは動画作成機能を持ち、実行結果の確認として重要である。しかし互換性などの問題でうまく動かない事が多い。一応画像を連続表示すれば動画的になるので、以下にその方法を記載しておく。これはGetting Startedにはない内容である。動画作成した場合と内容は同じだが、動画に比べると見にくく、結果ファイルも扱いにくい。

車の挙動はランダムになるようにしてある。何回か動かすと事故になるのが確認できる。

##### 修正点、追加、ランダム挙動
o = env.reset()

img = plt.imshow(env.render('rgb_array'))
for _ in range(5):
    o, r, d, t, i = env.step(env.action_space.sample()) 

    display.clear_output(wait=True)
    img.set_data(env.render('rgb_array'))
    plt.axis('off')
    display.display(plt.gcf())

    if d:
        env.reset()

目次

背景と概要

Getting Started

SB3 DQN サンプル

Highway Planning サンプル

Parking HER サンプル

Social Attention DQN サンプル

利用論文

AI・深層学習