| import argparse |
| import os |
| import pickle |
| import yaml |
| from typing import Dict, List |
| from tqdm import tqdm |
|
|
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| "--data_root", |
| type=str, |
| default="./data/openscene-v1.1", |
| help="root directory of raw carla data", |
| ) |
| parser.add_argument( |
| "--split", |
| type=str, |
| default="navsim", |
| help="trainval/mini/navsim/test", |
| ) |
| args = parser.parse_args() |
|
|
| def get_pkl_filelist(meta_data_dir: str) -> List[str]: |
|
|
| meta_data_list = os.listdir(meta_data_dir) |
| meta_data_list = [ |
| os.path.join(meta_data_dir, each) |
| for each in meta_data_list |
| if each.endswith(".pkl") |
| ] |
|
|
| return meta_data_list |
|
|
| if __name__ == "__main__": |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| if args.split in ['trainval', 'mini', 'test']: |
| |
| meta_data_dir = os.path.join(args.data_root, "meta_datas_paradrive", args.split) |
| meta_data_list = get_pkl_filelist(meta_data_dir) |
|
|
| |
| if args.split == 'test': |
| test_paths = meta_data_list |
| val_paths = None |
| train_paths = None |
| else: |
| train_paths = meta_data_list[: int(len(meta_data_list) * 0.85)] |
| val_paths = meta_data_list[int(len(meta_data_list) * 0.85) :] |
| print(f"total log for {args.split}: {len(meta_data_list)}") |
|
|
| elif args.split in ['navsim']: |
|
|
| |
| meta_data_dir = os.path.join(args.data_root, "meta_datas_paradrive_v2/trainval") |
| train_paths = get_pkl_filelist(meta_data_dir) |
| navtrain_filter = "navsim/navsim/planning/script/config/common/train_test_split/scene_filter/navtrain.yaml" |
| with open(navtrain_filter, 'r') as file: |
| navtrain_filter = yaml.safe_load(file) |
| log_filter_train = navtrain_filter['log_names'] |
| try: |
| scene_filter_train = navtrain_filter['tokens'] |
| except: |
| scene_filter_train = navtrain_filter['scenario_tokens'] |
|
|
| |
| meta_data_dir = os.path.join(args.data_root, "meta_datas_paradrive_v2/test") |
| val_paths = get_pkl_filelist(meta_data_dir) |
| navtest_filter = "navsim/navsim/planning/script/config/common/train_test_split/scene_filter/navtest.yaml" |
| with open(navtest_filter, 'r') as file: |
| navtest_filter = yaml.safe_load(file) |
| log_filter_test = navtest_filter['log_names'] |
| try: |
| scene_filter_test = navtest_filter['tokens'] |
| except KeyError: |
| scene_filter_test = navtest_filter['scenario_tokens'] |
|
|
| if val_paths is None: |
| print(f"test log len: {len(test_paths)}") |
| else: |
| print(f"train log len: {len(train_paths)}") |
| print(f"val log len: {len(val_paths)}") |
|
|
| save_dir = os.path.join(args.data_root, "paradrive_infos_v2") |
| save_val = os.path.join(save_dir, f"nuplan_{args.split}_test.pkl") |
|
|
| |
| |
| if not os.path.exists(save_val) and val_paths is not None: |
| data_infos = [] |
| total_len = 0 |
| for file in val_paths: |
| with open(file, "rb") as f: |
| print(f'val: loading {file}') |
| data_tmp = pickle.load(f)["infos"] |
| total_len += len(data_tmp) |
| ADD = False |
|
|
| |
| if args.split == 'navsim': |
| log_name_tmp = data_tmp[0]['log_name'] |
| if log_name_tmp not in log_filter_test: |
| continue |
|
|
| |
| history_frame_num = 3 |
| future_frame_num = 0 |
|
|
| |
| scene_filter_expanded = set() |
| for idx, data_frame in enumerate(data_tmp): |
| if data_frame['token'] in scene_filter_test: |
| start_frame_idx = idx - history_frame_num |
| end_frame_idx = idx + future_frame_num |
| for i in range(start_frame_idx, end_frame_idx + 1): |
| if i < 0 or i >= len(data_tmp): |
| continue |
| scene_filter_expanded.add(data_tmp[i]['token']) |
|
|
| data_save = [] |
| for data_frame in data_tmp: |
| token = data_frame['token'] |
| if token in scene_filter_expanded: |
| ADD = True |
| data_save.append(data_frame) |
| else: |
| ADD = True |
| data_save = data_tmp |
|
|
| if ADD: |
| data_infos.extend(data_save) |
|
|
| print(f"val info len before: {total_len}") |
| print(f"val info len after: {len(data_infos)}") |
|
|
| |
| if not os.path.exists(save_dir): |
| os.makedirs(save_dir) |
| with open(save_val, "wb") as f: |
| pickle.dump(data_infos, f) |
| else: |
| print('skipped because val is saved before') |
|
|
| |
| save_train = os.path.join(save_dir, f"nuplan_{args.split}_train.pkl") |
| if not os.path.exists(save_train): |
| |
| if train_paths is None: |
| train_paths = test_paths |
|
|
| data_infos = [] |
| total_len = 0 |
| for file in tqdm(train_paths): |
| with open(file, "rb") as f: |
| tqdm.write(f'train: loading {file}') |
| data_tmp = pickle.load(f)["infos"] |
| total_len += len(data_tmp) |
| ADD = False |
|
|
| |
| if args.split == 'navsim': |
|
|
| log_name_tmp = data_tmp[0]['log_name'] |
| if log_name_tmp not in log_filter_train: |
| continue |
|
|
| |
| history_frame_num = 3 |
| future_frame_num = 8 |
|
|
| |
| scene_filter_expanded = set() |
| for idx, data_frame in enumerate(data_tmp): |
| if data_frame['token'] in scene_filter_train: |
| start_frame_idx = idx - history_frame_num |
| end_frame_idx = idx + future_frame_num |
| for i in range(start_frame_idx, end_frame_idx + 1): |
| if i < 0 or i >= len(data_tmp): |
| continue |
| scene_filter_expanded.add(data_tmp[i]['token']) |
|
|
| data_save = [] |
| for data_frame in data_tmp: |
| token = data_frame['token'] |
| if token in scene_filter_expanded: |
| ADD = True |
| data_save.append(data_frame) |
| else: |
| ADD = True |
| data_save = data_tmp |
|
|
| if ADD: |
| data_infos.extend(data_save) |
| print(f"train info len before: {total_len}") |
| print(f"train info len after: {len(data_infos)}") |
|
|
| |
| with open(save_train, "wb") as f: |
| pickle.dump(data_infos, f) |
|
|