12 Commits

Author SHA1 Message Date
Etienne Bührle
6e8986b3d4 Merge pull request #6 from sisl/dev-idm-videos
Optionally save videos of evaluated policies
2022-10-04 21:03:25 +02:00
ebuehrle
bc33b786aa helper script for copying videos 2022-10-04 20:52:51 +02:00
ebuehrle
dd201738cb when using IDM expert, update interaction graph in order to correctly display ego target agent 2022-10-04 20:51:19 +02:00
ebuehrle
5fb358d725 do not enable IDM for expert data 2022-09-22 11:17:03 +02:00
ebuehrle
740e0ea9f4 Merge branch 'save-videos' into dev-idm-videos 2022-09-22 10:55:38 +02:00
ebuehrle
88213e7d76 remove --skip_running flag in evaluate_models.sh 2022-09-22 10:43:28 +02:00
ebuehrle
388c80007e Revert "committing learned policies and summary files"
This reverts commit 3aaf252dbe.
2022-09-22 10:42:23 +02:00
Arec Jamgochian
3aaf252dbe committing learned policies and summary files 2022-08-29 01:30:11 -07:00
Arec Jamgochian
779a0ea89f adding use idm to test scripts and running test suite 2022-08-24 02:44:21 -07:00
Arec Jamgochian
3a09a6eb7d adding idm override option flag, set to true. current running experiments for gail and shail experiment A to see how different times are. Since were on cpus on the cluster, guessing it will be 10x 2022-08-07 16:33:09 -07:00
Arec
9c9ee8f21b clearing stale __init__ 2022-04-11 21:46:40 -07:00
Arec Jamgochian
f814516072 Update README.md 2022-04-11 10:49:29 -07:00
18 changed files with 70 additions and 27 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,

10
cp-videos.sh Executable file
View File

@@ -0,0 +1,10 @@
# cp-videos videos/ videos/icra23/
agents=( 5 27 39 43 47 53 63 81 83 87 93 96 105 113 124 127 130 134 )
for a in "${agents[@]}"
do
cp "$1/expert_agent/loc0/track0/agent${a}_ani.mp4" "$2/t${a}expert.mp4"
cp "$1/idm/loc0/track0/agent${a}_ani.mp4" "$2/t${a}idm.mp4"
cp "$1/shail/loc0/track0/agent${a}_ani.mp4" "$2/t${a}shail.mp4"
done

View File

@@ -11,17 +11,19 @@ def main(method:str='expert', folder:str=None, locations=[(0,0)], skip_running=F
exclude_keys_from_policy_kwargs = {'learning_rate', 'learning_rate_decay', 'clip_ratio', 'iterations_per_epoch', 'option'} exclude_keys_from_policy_kwargs = {'learning_rate', 'learning_rate_decay', 'clip_ratio', 'iterations_per_epoch', 'option'}
policy_kwargs = {} policy_kwargs = {}
if method in ['expert', 'expert_agent', 'idm']: if method in ['expert', 'expert_agent']:
env, env_kwargs ='NRasterizedRouteIncrementingAgent', {} env, env_kwargs ='NRasterizedRouteIncrementingAgent', {}
elif method in ['idm']:
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

@@ -11,8 +11,8 @@ python -m eval_experiments --method shail --folder='test_policies/shail/expA'
# Experiment B # Experiment B
python -m eval_experiments --locations='[(0,4)]' python -m eval_experiments --locations='[(0,4)]'
python -m eval_experiments --method idm --locations='[(0,4)]' --skip_running python -m eval_experiments --method idm --locations='[(0,4)]'
python -m eval_experiments --method bc --folder='test_policies/bc/expB' --locations='[(0,4)]' --skip_running python -m eval_experiments --method bc --folder='test_policies/bc/expB' --locations='[(0,4)]'
python -m eval_experiments --method gail --folder='test_policies/gail/expB' --locations='[(0,4)]' --skip_running python -m eval_experiments --method gail --folder='test_policies/gail/expB' --locations='[(0,4)]'
python -m eval_experiments --method hail --folder='test_policies/hail/expB' --locations='[(0,4)]' --skip_running python -m eval_experiments --method hail --folder='test_policies/hail/expB' --locations='[(0,4)]'
python -m eval_experiments --method shail --folder='test_policies/shail/expB' --locations='[(0,4)]' --skip_running python -m eval_experiments --method shail --folder='test_policies/shail/expB' --locations='[(0,4)]'

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)
@@ -169,7 +171,8 @@ if __name__ == '__main__':
config={ config={
'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 +0,0 @@

View File

@@ -172,6 +172,7 @@ class IDMRulePolicy(BaseAlgorithm):
# Update environment interaction graph with leader # Update environment interaction graph with leader
self._env._env._graph._neighbor_dict={agent:[leader]} self._env._env._graph._neighbor_dict={agent:[leader]}
self._env._update_graph = True
delta_v = v_ego - v[leader, 0] delta_v = v_ego - v[leader, 0]
d_des = self.d_min + self.tau * v_ego + v_ego * delta_v / (2* (self.a_max*self.b_pref)**0.5 ) d_des = self.d_min + self.tau * v_ego + v_ego * delta_v / (2* (self.a_max*self.b_pref)**0.5 )

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