5 Commits

83 changed files with 176 additions and 143 deletions

View File

@@ -1,10 +1,22 @@
# InteractionImitation # InteractionImitation
Imitation Learning with the INTERACTION Dataset Imitation Learning with the [Interaction Dataset](https://interaction-dataset.com/) via the [InteractionSimulator](https://github.com/sisl/InteractionSimulator) gym environments.
Code for "[SHAIL: Safety-Aware Hierarchical Adversarial Imitation Learning for Autonomous Driving in Urban Environments](https://arxiv.org/abs/2204.01922)".
If you find this repository useful, please cite the paper:
```
@article{jamgochian2022shail,
author = {Arec Jamgochian and Etienne Buehrle and Johannes Fischer and Mykel J. Kochenderfer},
title = {{SHAIL}: Safety-Aware Hierarchical Adversarial Imitation Learning for Autonomous Driving in Urban Environments},
journal = {arXiv:2204.01922 [cs]},
year = {2022}
}
```
## Getting started ## Getting started
Clone InteractionSimulator and pip install the module. Clone the `InteractionSimulator` with the `shail` tag and pip install the module.
``` ```
git clone https://github.com/sisl/InteractionSimulator.git git clone --branch shail https://github.com/sisl/InteractionSimulator.git
cd InteractionSimulator cd InteractionSimulator
pip install -e . pip install -e .
cd .. cd ..

View File

@@ -55,6 +55,7 @@ def training_function(config):
), ),
check_collisions=True, check_collisions=True,
stop_on_collision=config['trainenv']['stop_on_collision'], stop_on_collision=config['trainenv']['stop_on_collision'],
use_idm=config['trainenv']['use_idm'],
), collision_distance=6, collision_penalty=100), ), collision_distance=6, collision_penalty=100),
lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10) lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10)
)) for _ in range(60)] )) for _ in range(60)]
@@ -68,6 +69,8 @@ def training_function(config):
), ),
check_collisions=True, check_collisions=True,
stop_on_collision=config['trainenv']['stop_on_collision'], stop_on_collision=config['trainenv']['stop_on_collision'],
use_idm=config['trainenv']['use_idm'],
track=track,
), collision_distance=6, collision_penalty=100), ), collision_distance=6, collision_penalty=100),
lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10) lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10)
)) for _ in range(15)] for track in range(4)],[]) )) for _ in range(15)] for track in range(4)],[])
@@ -159,6 +162,7 @@ if __name__ == '__main__':
'experiment': args.train, 'experiment': args.train,
'trainenv': { 'trainenv': {
'stop_on_collision': False, 'stop_on_collision': False,
'use_idm':True,
}, },
'policy': { 'policy': {
'learning_rate': 3e-4, 'learning_rate': 3e-4,

View File

@@ -1,7 +1,8 @@
{ {
"experiment": "A", "experiment": "A",
"trainenv": { "trainenv": {
"stop_on_collision": false "stop_on_collision": false,
"use_idm": true
}, },
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,

View File

@@ -1,7 +1,8 @@
{ {
"experiment": "B", "experiment": "B",
"trainenv": { "trainenv": {
"stop_on_collision": false "stop_on_collision": false,
"use_idm": true
}, },
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,

View File

@@ -1,7 +1,8 @@
{ {
"experiment": "A", "experiment": "A",
"trainenv": { "trainenv": {
"stop_on_collision": false "stop_on_collision": false,
"use_idm": true
}, },
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,

View File

@@ -1,7 +1,8 @@
{ {
"experiment": "B", "experiment": "B",
"trainenv": { "trainenv": {
"stop_on_collision": false "stop_on_collision": false,
"use_idm": true
}, },
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,

View File

@@ -3,7 +3,8 @@
"trainenv": { "trainenv": {
"stop_on_collision": false, "stop_on_collision": false,
"safe_actions_collision_method": null, "safe_actions_collision_method": null,
"abort_unsafe_collision_method": null "abort_unsafe_collision_method": null,
"use_idm": true
}, },
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,

View File

@@ -3,7 +3,8 @@
"trainenv": { "trainenv": {
"stop_on_collision": false, "stop_on_collision": false,
"safe_actions_collision_method": null, "safe_actions_collision_method": null,
"abort_unsafe_collision_method": null "abort_unsafe_collision_method": null,
"use_idm": true
}, },
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,

View File

@@ -3,7 +3,8 @@
"trainenv": { "trainenv": {
"stop_on_collision": false, "stop_on_collision": false,
"safe_actions_collision_method": "circle", "safe_actions_collision_method": "circle",
"abort_unsafe_collision_method": "circle" "abort_unsafe_collision_method": "circle",
"use_idm": true
}, },
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,

View File

@@ -3,7 +3,8 @@
"trainenv": { "trainenv": {
"stop_on_collision": false, "stop_on_collision": false,
"safe_actions_collision_method": "circle", "safe_actions_collision_method": "circle",
"abort_unsafe_collision_method": "circle" "abort_unsafe_collision_method": "circle",
"use_idm": true
}, },
"policy": { "policy": {
"learning_rate": 0.0003, "learning_rate": 0.0003,

View File

@@ -12,16 +12,16 @@ def main(method:str='expert', folder:str=None, locations=[(0,0)], skip_running=F
policy_kwargs = {} policy_kwargs = {}
if method in ['expert', 'idm']: if method in ['expert', 'idm']:
env, env_kwargs ='NRasterizedRouteIncrementingAgent', {} env, env_kwargs ='NRasterizedRouteIncrementingAgent', {'use_idm':True}
elif method in ['bc','gail']: elif method in ['bc','gail']:
env='NormalizedContinuousEvalEnv' env='NormalizedContinuousEvalEnv'
env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000} env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000, 'use_idm':True}
elif method in ['hail']: elif method in ['hail']:
env = 'NormalizedSafeOptionsEvalEnv' env = 'NormalizedSafeOptionsEvalEnv'
env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000, 'safe_actions_collision_method': None, 'abort_unsafe_collision_method': None} env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000, 'safe_actions_collision_method': None, 'abort_unsafe_collision_method': None, 'use_idm':True}
elif method in ['shail']: elif method in ['shail']:
env = 'NormalizedSafeOptionsEvalEnv' env = 'NormalizedSafeOptionsEvalEnv'
env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000} env_kwargs={'stop_on_collision':True, 'max_episode_steps':1000, 'use_idm':True}
else: else:
raise NotImplementedError raise NotImplementedError

View File

@@ -53,6 +53,7 @@ def training_function(config):
), ),
check_collisions=True, check_collisions=True,
stop_on_collision=config['trainenv']['stop_on_collision'], stop_on_collision=config['trainenv']['stop_on_collision'],
use_idm=config['trainenv']['use_idm'],
), collision_distance=6, collision_penalty=100), ), collision_distance=6, collision_penalty=100),
lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10) lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10)
)) for _ in range(60)] )) for _ in range(60)]
@@ -67,6 +68,7 @@ def training_function(config):
), ),
check_collisions=True, check_collisions=True,
stop_on_collision=config['trainenv']['stop_on_collision'], stop_on_collision=config['trainenv']['stop_on_collision'],
use_idm=config['trainenv']['use_idm'],
track=track, track=track,
), collision_distance=6, collision_penalty=100), ), collision_distance=6, collision_penalty=100),
lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10) lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10)
@@ -170,6 +172,7 @@ if __name__ == '__main__':
'experiment': args.train, 'experiment': args.train,
'trainenv': { 'trainenv': {
'stop_on_collision': False, 'stop_on_collision': False,
'use_idm': True,
}, },
'policy': { 'policy': {
'learning_rate': 3e-4, 'learning_rate': 3e-4,

View File

@@ -58,6 +58,7 @@ def training_function(config):
), ),
check_collisions=True, check_collisions=True,
stop_on_collision=config['trainenv']['stop_on_collision'], stop_on_collision=config['trainenv']['stop_on_collision'],
use_idm=config['trainenv']['use_idm'],
), collision_distance=6, collision_penalty=100), lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10)) ), collision_distance=6, collision_penalty=100), lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10))
), options=option_list[config['policy']['option']], ), options=option_list[config['policy']['option']],
safe_actions_collision_method=config['trainenv']['safe_actions_collision_method'], safe_actions_collision_method=config['trainenv']['safe_actions_collision_method'],
@@ -73,7 +74,9 @@ def training_function(config):
collision_penalty=0 collision_penalty=0
), ),
check_collisions=True, check_collisions=True,
stop_on_collision=config['trainenv']['stop_on_collision'], track=track, stop_on_collision=config['trainenv']['stop_on_collision'],
use_idm=config['trainenv']['use_idm'],
track=track,
), collision_distance=6, collision_penalty=100), lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10)) ), collision_distance=6, collision_penalty=100), lambda obs: (obs - obs_min) / (obs_max - obs_min + 1e-10))
), options=option_list[config['policy']['option']], ), options=option_list[config['policy']['option']],
safe_actions_collision_method=config['trainenv']['safe_actions_collision_method'], safe_actions_collision_method=config['trainenv']['safe_actions_collision_method'],
@@ -180,6 +183,7 @@ if __name__ == '__main__':
'stop_on_collision': False, 'stop_on_collision': False,
'safe_actions_collision_method': 'circle', 'safe_actions_collision_method': 'circle',
'abort_unsafe_collision_method': 'circle', 'abort_unsafe_collision_method': 'circle',
'use_idm':True,
}, },
'policy': { 'policy': {
'learning_rate': 3e-4, 'learning_rate': 3e-4,

View File

@@ -1,2 +0,0 @@
from src.data.expert_data import generate_expert_data, load_expert_data
from src.data.data_utils import InteractionDatasetSingleAgent

View File

@@ -1,31 +1,32 @@
{ {
"experiment": "A", "discriminator": {
"trainenv": { "activation": 0,
"stop_on_collision": false "hidden_layer_size": 10,
}, "iterations_per_epoch": 100,
"policy": { "learning_rate": 0.001,
"learning_rate": 0.0003, "n_hidden_layers_element": 4,
"learning_rate_decay": 1.0, "n_hidden_layers_global": 1,
"clip_ratio": 0.2, "weight_decay": 0.0001
"iterations_per_epoch": 100, },
"hidden_layer_size": 40, "experiment": "A",
"n_hidden_layers": 2, "policy": {
"activation": 0 "activation": 0,
}, "clip_ratio": 0.2,
"value": { "hidden_layer_size": 40,
"learning_rate": 0.0001, "iterations_per_epoch": 100,
"weight_decay": 0.001, "learning_rate": 0.0003,
"iterations_per_epoch": 1000 "learning_rate_decay": 1.0,
}, "n_hidden_layers": 2
"discriminator": { },
"learning_rate": 0.001, "seed": 5,
"weight_decay": 0.0001, "train_epochs": 100,
"iterations_per_epoch": 100, "trainenv": {
"n_hidden_layers_element": 4, "stop_on_collision": false,
"n_hidden_layers_global": 1, "use_idm": true
"hidden_layer_size": 10, },
"activation": 0 "value": {
}, "iterations_per_epoch": 1000,
"train_epochs": 100, "learning_rate": 0.0001,
"seed": 0 "weight_decay": 0.001
}
} }

View File

@@ -1,31 +1,32 @@
{ {
"experiment": "B", "discriminator": {
"trainenv": { "activation": 0,
"stop_on_collision": false "hidden_layer_size": 10,
}, "iterations_per_epoch": 100,
"policy": { "learning_rate": 0.001,
"learning_rate": 0.0003, "n_hidden_layers_element": 4,
"learning_rate_decay": 1.0, "n_hidden_layers_global": 1,
"clip_ratio": 0.2, "weight_decay": 0.0001
"iterations_per_epoch": 100, },
"hidden_layer_size": 40, "experiment": "B",
"n_hidden_layers": 2, "policy": {
"activation": 0 "activation": 0,
}, "clip_ratio": 0.2,
"value": { "hidden_layer_size": 40,
"learning_rate": 0.0001, "iterations_per_epoch": 100,
"weight_decay": 0.001, "learning_rate": 0.0003,
"iterations_per_epoch": 1000 "learning_rate_decay": 1.0,
}, "n_hidden_layers": 2
"discriminator": { },
"learning_rate": 0.001, "seed": 4,
"weight_decay": 0.0001, "train_epochs": 100,
"iterations_per_epoch": 100, "trainenv": {
"n_hidden_layers_element": 4, "stop_on_collision": false,
"n_hidden_layers_global": 1, "use_idm": true
"hidden_layer_size": 10, },
"activation": 0 "value": {
}, "iterations_per_epoch": 1000,
"train_epochs": 100, "learning_rate": 0.0001,
"seed": 0 "weight_decay": 0.001
}
} }

View File

@@ -1,33 +1,34 @@
{ {
"experiment": "A", "discriminator": {
"trainenv": { "activation": 0,
"stop_on_collision": false, "hidden_layer_size": 10,
"safe_actions_collision_method": "circle", "iterations_per_epoch": 100,
"abort_unsafe_collision_method": "circle" "learning_rate": 0.001,
}, "n_hidden_layers_element": 4,
"policy": { "n_hidden_layers_global": 1,
"learning_rate": 0.0003, "weight_decay": 0.0001
"learning_rate_decay": 1.0, },
"clip_ratio": 0.2, "experiment": "A",
"iterations_per_epoch": 100, "policy": {
"hidden_layer_size": 40, "activation": 0,
"n_hidden_layers": 2, "clip_ratio": 0.2,
"activation": 0, "hidden_layer_size": 40,
"option": 0 "iterations_per_epoch": 100,
}, "learning_rate": 0.0003,
"value": { "learning_rate_decay": 1.0,
"learning_rate": 0.001, "n_hidden_layers": 2,
"iterations_per_epoch": 1000 "option": 0
}, },
"discriminator": { "seed": 3,
"learning_rate": 0.001, "train_epochs": 90,
"weight_decay": 0.0001, "trainenv": {
"iterations_per_epoch": 100, "abort_unsafe_collision_method": "circle",
"n_hidden_layers_element": 4, "safe_actions_collision_method": "circle",
"n_hidden_layers_global": 1, "stop_on_collision": false,
"hidden_layer_size": 10, "use_idm": true
"activation": 0 },
}, "value": {
"train_epochs": 90, "iterations_per_epoch": 1000,
"seed": 0 "learning_rate": 0.001
}
} }

View File

@@ -1,33 +1,34 @@
{ {
"experiment": "B", "discriminator": {
"trainenv": { "activation": 0,
"stop_on_collision": false, "hidden_layer_size": 10,
"safe_actions_collision_method": "circle", "iterations_per_epoch": 100,
"abort_unsafe_collision_method": "circle" "learning_rate": 0.001,
}, "n_hidden_layers_element": 4,
"policy": { "n_hidden_layers_global": 2,
"learning_rate": 0.0003, "weight_decay": 0.0001
"learning_rate_decay": 1.0, },
"clip_ratio": 0.2, "experiment": "B",
"iterations_per_epoch": 100, "policy": {
"hidden_layer_size": 20, "activation": 0,
"n_hidden_layers": 2, "clip_ratio": 0.2,
"activation": 0, "hidden_layer_size": 20,
"option": 0 "iterations_per_epoch": 100,
}, "learning_rate": 0.0003,
"value": { "learning_rate_decay": 1.0,
"learning_rate": 0.001, "n_hidden_layers": 2,
"iterations_per_epoch": 1000 "option": 0
}, },
"discriminator": { "seed": 3,
"learning_rate": 0.001, "train_epochs": 85,
"weight_decay": 0.0001, "trainenv": {
"iterations_per_epoch": 100, "abort_unsafe_collision_method": "circle",
"n_hidden_layers_element": 4, "safe_actions_collision_method": "circle",
"n_hidden_layers_global": 2, "stop_on_collision": false,
"hidden_layer_size": 10, "use_idm": true
"activation": 0 },
}, "value": {
"train_epochs": 85, "iterations_per_epoch": 1000,
"seed": 0 "learning_rate": 0.001
}
} }

View File

@@ -18,11 +18,11 @@ python shail-experiment.py --train B
# Experiment A # Experiment A
python bc-experiment.py --test best_configs/bc_expA.json python bc-experiment.py --test best_configs/bc_expA.json
python gail-experiment.py --test best_configs/gail_expA.json python gail-experiment.py --test best_configs/gail_expA.json
python shail-experiment.py --train best_configs/hail_expA.json python shail-experiment.py --test best_configs/hail_expA.json
python shail-experiment.py --train best_configs/shail_expA.json python shail-experiment.py --test best_configs/shail_expA.json
# Experiment B # Experiment B
python bc-experiment.py --test best_configs/bc_expB.json python bc-experiment.py --test best_configs/bc_expB.json
python gail-experiment.py --test best_configs/gail_expB.json python gail-experiment.py --test best_configs/gail_expB.json
python shail-experiment.py --train best_configs/hail_expB.json python shail-experiment.py --test best_configs/hail_expB.json
python shail-experiment.py --train best_configs/shail_expB.json python shail-experiment.py --test best_configs/shail_expB.json