diff --git a/pcdet/config.py b/pcdet/config.py index 02e5daf16..862c34853 100644 --- a/pcdet/config.py +++ b/pcdet/config.py @@ -1,7 +1,9 @@ from pathlib import Path +from typing import List import yaml from easydict import EasyDict +from runcon import Config def log_config_to_file(cfg, pre='cfg', logger=None): @@ -80,6 +82,74 @@ def cfg_from_yaml_file(cfg_file, config): return config +def dict_representer(dumper, ed: EasyDict): + return dumper.represent_mapping('tag:yaml.org,2002:map', ed) + + +yaml.add_representer(EasyDict, dict_representer) + + +def cfg_to_yaml_file(config, cfg_file): + with open(cfg_file, 'w') as f: + yaml.dump(config, f, default_flow_style=False) + + +def check_recursive_dict_type(cfg, type): + if isinstance(cfg, dict): + if not isinstance(cfg, type): + raise ValueError( + "The config is of type %s but was expected to be of type %s!\n%s" + % (type(cfg), type, cfg) + ) + for k in cfg: + check_recursive_dict_type(cfg[k], type) + + +def ed_to_rc(ed_cfg: EasyDict) -> Config: + check_recursive_dict_type(ed_cfg, EasyDict) + rc_cfg = Config(ed_cfg) + check_recursive_dict_type(rc_cfg, Config) + return rc_cfg + + +def rc_to_ed(rc_cfg: Config) -> EasyDict: + check_recursive_dict_type(rc_cfg, Config) + ed_cfg = EasyDict() + for k in rc_cfg: + if isinstance(rc_cfg[k], Config): + ed_cfg[k] = rc_to_ed(rc_cfg[k]) + else: + ed_cfg[k] = rc_cfg[k] + check_recursive_dict_type(ed_cfg, EasyDict) + return ed_cfg + + +def modify_rc_cfg(cfg: Config, modify_cfgs: List[Path]) -> Config: + from copy import deepcopy + cfg = deepcopy(cfg) + for m in modify_cfgs: + m = cfg_from_yaml_file(m, EasyDict()) + cfg.rupdate(ed_to_rc(m)) + cfg = cfg.resolve_transforms() + return cfg + + +def create_cfg_from_sets( + cfg_file: Path, + modify_cfgs: List[Path], + set_cfgs: List[str], + cfg: EasyDict = None, +) -> EasyDict: + if cfg is None: + cfg = EasyDict() + cfg_from_yaml_file(cfg_file, cfg) + cfg = ed_to_rc(cfg) + cfg = modify_rc_cfg(cfg, modify_cfgs) + cfg = rc_to_ed(cfg) + cfg_from_list(set_cfgs, cfg) + return cfg + + cfg = EasyDict() cfg.ROOT_DIR = (Path(__file__).resolve().parent / '../').resolve() cfg.LOCAL_RANK = 0 diff --git a/requirements.txt b/requirements.txt index a730fd7e3..08362c4f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,5 @@ tqdm torchvision SharedArray opencv-python -pyquaternion \ No newline at end of file +pyquaternion +runcon diff --git a/tools/cfgs/dataset_configs/modifiers/waymo/multiframe.yaml b/tools/cfgs/dataset_configs/modifiers/waymo/multiframe.yaml new file mode 100644 index 000000000..3ea65c0eb --- /dev/null +++ b/tools/cfgs/dataset_configs/modifiers/waymo/multiframe.yaml @@ -0,0 +1,64 @@ +SEQUENCE_CONFIG: + ENABLED: True + SAMPLE_OFFSET: [-3, 0] + +TRAIN_WITH_SPEED: True + + +DATA_AUGMENTOR: + AUG_CONFIG_LIST: + - NAME: gt_sampling + USE_ROAD_PLANE: False + DB_INFO_PATH: + - waymo_processed_data_v0_5_0_waymo_dbinfos_train_sampled_1_multiframe_-4_to_0.pkl + + USE_SHARED_MEMORY: False # set it to True to speed up (it costs about 50GB? shared memory) + DB_DATA_PATH: + - waymo_processed_data_v0_5_0_gt_database_train_sampled_1_multiframe_-4_to_0_global.npy + + PREPARE: { + filter_by_min_points: ['Vehicle:5', 'Pedestrian:5', 'Cyclist:5'], + filter_by_difficulty: [-1], + } + + SAMPLE_GROUPS: ['Vehicle:15', 'Pedestrian:10', 'Cyclist:10'] + NUM_POINT_FEATURES: 6 + REMOVE_EXTRA_WIDTH: [0.0, 0.0, 0.0] + LIMIT_WHOLE_SCENE: True + + FILTER_OBJ_POINTS_BY_TIMESTAMP: True + TIME_RANGE: [0.3, 0.0] # 0.3s-0.0s indicates 4 frames + + - NAME: random_world_flip + ALONG_AXIS_LIST: ['x', 'y'] + + - NAME: random_world_rotation + WORLD_ROT_ANGLE: [-0.78539816, 0.78539816] + + - NAME: random_world_scaling + WORLD_SCALE_RANGE: [0.95, 1.05] + + +POINT_FEATURE_ENCODING: + used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'timestamp'] + src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'timestamp'] + + +DATA_PROCESSOR: + - NAME: mask_points_and_boxes_outside_range + REMOVE_OUTSIDE_BOXES: True + USE_CENTER_TO_FILTER: True + + - NAME: shuffle_points + SHUFFLE_ENABLED: { + 'train': True, + 'test': True + } + + - NAME: transform_points_to_voxels + VOXEL_SIZE: [0.1, 0.1, 0.15] + MAX_POINTS_PER_VOXEL: 5 + MAX_NUMBER_OF_VOXELS: { + 'train': 180000, + 'test': 400000 + } diff --git a/tools/cfgs/waymo_models/modifiers/mppnet/16frames.yaml b/tools/cfgs/waymo_models/modifiers/mppnet/16frames.yaml new file mode 100644 index 000000000..272a39b45 --- /dev/null +++ b/tools/cfgs/waymo_models/modifiers/mppnet/16frames.yaml @@ -0,0 +1,16 @@ +DATA_CONFIG: + SEQUENCE_CONFIG: + SAMPLE_OFFSET: [-15,0] + +MODEL: + ROI_HEAD: + TRANS_INPUT: 64 + + ROI_GRID_POOL: + MLPS: [[64,64]] + POOL_RADIUS: [0.8] + NSAMPLE: [16] + + Transformer: + num_frames: 16 + sequence_stride: 4 diff --git a/tools/cfgs/waymo_models/modifiers/mppnet/4frames.yaml b/tools/cfgs/waymo_models/modifiers/mppnet/4frames.yaml new file mode 100644 index 000000000..7cec9de64 --- /dev/null +++ b/tools/cfgs/waymo_models/modifiers/mppnet/4frames.yaml @@ -0,0 +1,15 @@ +DATA_CONFIG: + SEQUENCE_CONFIG: + SAMPLE_OFFSET: [-3,0] + +MODEL: + ROI_HEAD: + TRANS_INPUT: 256 + + ROI_GRID_POOL: + MLPS: [[128,128], [128,128]] + POOL_RADIUS: [0.8, 1.6] + NSAMPLE: [16, 16] + + Transformer: + num_frames: 4 diff --git a/tools/cfgs/waymo_models/modifiers/mppnet/e2e_memorybank_inference.yaml b/tools/cfgs/waymo_models/modifiers/mppnet/e2e_memorybank_inference.yaml new file mode 100644 index 000000000..bea260600 --- /dev/null +++ b/tools/cfgs/waymo_models/modifiers/mppnet/e2e_memorybank_inference.yaml @@ -0,0 +1,93 @@ +DATA_CONFIG: + _BASE_CONFIG_: cfgs/dataset_configs/modifiers/waymo/multiframe.yaml + _TRANSFORM: + - name: remove_element + target: ROI_BOXES_PATH + - name: remove_element + target: USE_PREDBOX + + SAMPLED_INTERVAL: { + 'train': 5, + 'test': 1 + } + + POINT_FEATURE_ENCODING: + encoding_type: absolute_coordinates_encoding + used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'] + src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'] + +MODEL: + NAME: MPPNetE2E + + VFE: + NAME: DynMeanVFE + + BACKBONE_3D: + NAME: VoxelResBackBone8x + + MAP_TO_BEV: + NAME: HeightCompression + NUM_BEV_FEATURES: 256 + + BACKBONE_2D: + NAME: BaseBEVBackbone + NUM_FRAME: 2 + LAYER_NUMS: [5, 5] + LAYER_STRIDES: [1, 2] + NUM_FILTERS: [128, 256] + UPSAMPLE_STRIDES: [1, 2] + NUM_UPSAMPLE_FILTERS: [256, 256] + + DENSE_HEAD: + NAME: CenterHead + CLASS_AGNOSTIC: False + + CLASS_NAMES_EACH_HEAD: [ + ['Vehicle', 'Pedestrian', 'Cyclist'] + ] + + SHARED_CONV_CHANNEL: 64 + USE_BIAS_BEFORE_NORM: True + NUM_HM_CONV: 2 + SEPARATE_HEAD_CFG: + HEAD_ORDER: ['center', 'center_z', 'dim', 'rot','vel'] + HEAD_DICT: { + 'center': {'out_channels': 2, 'num_conv': 2}, + 'center_z': {'out_channels': 1, 'num_conv': 2}, + 'dim': {'out_channels': 3, 'num_conv': 2}, + 'rot': {'out_channels': 2, 'num_conv': 2}, + 'vel': {'out_channels': 2, 'num_conv': 2}, + + } + + TARGET_ASSIGNER_CONFIG: + FEATURE_MAP_STRIDE: 8 + NUM_MAX_OBJS: 500 + GAUSSIAN_OVERLAP: 0.1 + MIN_RADIUS: 2 + + LOSS_CONFIG: + LOSS_WEIGHTS: { + 'cls_weight': 1.0, + 'loc_weight': 2.0, + 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2] + } + + POST_PROCESSING: + SCORE_THRESH: 0.1 + POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] + MAX_OBJ_PER_SAMPLE: 500 + NMS_CONFIG: + NMS_TYPE: nms_gpu + NMS_THRESH: 0.7 + NMS_PRE_MAXSIZE: 4096 + NMS_POST_MAXSIZE: 500 + + ROI_HEAD: + NAME: MPPNetHeadE2E + USE_BOX_ENCODING: + NORM_T0: True + ALL_YAW_T0: True + + Transformer: + sequence_stride: 1 #16frame using 4 diff --git a/tools/cfgs/waymo_models/mppnet_4frames.yaml b/tools/cfgs/waymo_models/mppnet.yaml similarity index 95% rename from tools/cfgs/waymo_models/mppnet_4frames.yaml rename to tools/cfgs/waymo_models/mppnet.yaml index db5593ea2..f0e7f99f8 100644 --- a/tools/cfgs/waymo_models/mppnet_4frames.yaml +++ b/tools/cfgs/waymo_models/mppnet.yaml @@ -45,9 +45,9 @@ DATA_CONFIG: } POINT_FEATURE_ENCODING: { - encoding_type: absolute_coordinates_encoding, - used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'], - src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'], + encoding_type: absolute_coordinates_encoding, + used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'], + src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'], } @@ -75,13 +75,16 @@ MODEL: POOL_METHOD: max_pool + _TRANSFORM: + name: copy + src: TRANS_INPUT + dest: Transformer.hidden_dim Transformer: num_lidar_points: 128 num_proxy_points: 64 # GRID_SIZE*GRID_SIZE*GRID_SIZE pos_hidden_dim: 64 enc_layers: 3 dim_feedforward: 512 - hidden_dim: 256 #equal to ROI_HEAD.TRANS_INPUT dropout: 0.1 nheads: 4 pre_norm: False diff --git a/tools/cfgs/waymo_models/mppnet_16frames.yaml b/tools/cfgs/waymo_models/mppnet_16frames.yaml deleted file mode 100644 index d36848b4c..000000000 --- a/tools/cfgs/waymo_models/mppnet_16frames.yaml +++ /dev/null @@ -1,162 +0,0 @@ -CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] - -DATA_CONFIG: - _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset.yaml - PROCESSED_DATA_TAG: 'waymo_processed_data_v0_5_0' - - SAMPLED_INTERVAL: { - 'train': 1, - 'test': 1 - } - FILTER_EMPTY_BOXES_FOR_TRAIN: True - DISABLE_NLZ_FLAG_ON_POINTS: True - - SEQUENCE_CONFIG: - ENABLED: True - SAMPLE_OFFSET: [-15,0] - - USE_PREDBOX: True - ROI_BOXES_PATH: { - 'train': '../output/xxxxx/train/result.pkl', # example: predicted boxes of RPN in training set - 'test': '../output/xxxxx/val/result.pkl', # example: predicted boxes of RPN in evalulation set - } - - DATA_AUGMENTOR: - DISABLE_AUG_LIST: [ 'placeholder' ] - AUG_CONFIG_LIST: - - NAME: random_world_flip - ALONG_AXIS_LIST: [ 'x', 'y' ] - - - NAME: random_world_rotation - WORLD_ROT_ANGLE: [ -0.78539816, 0.78539816 ] - - - NAME: random_world_scaling - WORLD_SCALE_RANGE: [ 0.95, 1.05 ] - - DATA_PROCESSOR: - - NAME: mask_points_and_boxes_outside_range - REMOVE_OUTSIDE_BOXES: True - - - NAME: shuffle_points - SHUFFLE_ENABLED: { - 'train': True, - 'test': True - } - - - POINT_FEATURE_ENCODING: { - encoding_type: absolute_coordinates_encoding, - used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'], - src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation', 'time'], - } - - -MODEL: - NAME: MPPNet - - ROI_HEAD: - NAME: MPPNetHead - TRANS_INPUT: 64 - CLASS_AGNOSTIC: True - USE_BOX_ENCODING: - ENABLED: True - AVG_STAGE1_SCORE: True - USE_TRAJ_EMPTY_MASK: True - USE_AUX_LOSS: True - IOU_WEIGHT: [0.5,0.4] - - ROI_GRID_POOL: - GRID_SIZE: 4 - MLPS: [[64,64]] - POOL_RADIUS: [0.8] - NSAMPLE: [16] - POOL_METHOD: max_pool - - Transformer: - num_lidar_points: 128 - num_proxy_points: 64 # GRID_SIZE*GRID_SIZE*GRID_SIZE - pos_hidden_dim: 64 - enc_layers: 3 - dim_feedforward: 512 - hidden_dim: 64 #equal to ROI_HEAD.TRANS_INPUT - dropout: 0.1 - nheads: 4 - pre_norm: False - num_frames: 16 - num_groups: 4 - sequence_stride: 4 - use_grid_pos: - enabled: True - init_type: index - use_mlp_mixer: - enabled: True - hidden_dim: 16 - - TARGET_CONFIG: - BOX_CODER: ResidualCoder - ROI_PER_IMAGE: 96 - FG_RATIO: 0.5 - REG_AUG_METHOD: single - ROI_FG_AUG_TIMES: 10 - RATIO: 0.2 - USE_ROI_AUG: True - USE_TRAJ_AUG: - ENABLED: True - THRESHOD: 0.8 - SAMPLE_ROI_BY_EACH_CLASS: True - CLS_SCORE_TYPE: roi_iou - - CLS_FG_THRESH: 0.75 - CLS_BG_THRESH: 0.25 - CLS_BG_THRESH_LO: 0.1 - HARD_BG_RATIO: 0.8 - - REG_FG_THRESH: 0.55 - - LOSS_CONFIG: - CLS_LOSS: BinaryCrossEntropy - REG_LOSS: smooth-l1 - CORNER_LOSS_REGULARIZATION: True - LOSS_WEIGHTS: { - 'rcnn_cls_weight': 1.0, - 'rcnn_reg_weight': 1.0, - 'rcnn_corner_weight': 2.0, - 'traj_reg_weight': [2.0, 2.0, 2.0], - 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] - } - - POST_PROCESSING: - RECALL_THRESH_LIST: [0.3, 0.5, 0.7] - SCORE_THRESH: 0.1 - OUTPUT_RAW_SCORE: False - SAVE_BBOX: False - EVAL_METRIC: waymo - NOT_APPLY_NMS_FOR_VEL: True - - NMS_CONFIG: - MULTI_CLASSES_NMS: False - NMS_TYPE: nms_gpu - NMS_THRESH: 0.7 - NMS_PRE_MAXSIZE: 4096 - NMS_POST_MAXSIZE: 500 - -OPTIMIZATION: - BATCH_SIZE_PER_GPU: 2 - NUM_EPOCHS: 6 - - OPTIMIZER: adam_onecycle - LR: 0.003 - WEIGHT_DECAY: 0.01 - MOMENTUM: 0.9 - - MOMS: [0.95, 0.85] - PCT_START: 0.4 - DIV_FACTOR: 10 - DECAY_STEP_LIST: [35, 45] - LR_DECAY: 0.1 - LR_CLIP: 0.0000001 - - LR_WARMUP: False - WARMUP_EPOCH: 1 - - GRAD_NORM_CLIP: 10 diff --git a/tools/cfgs/waymo_models/mppnet_e2e_memorybank_inference.yaml b/tools/cfgs/waymo_models/mppnet_e2e_memorybank_inference.yaml deleted file mode 100644 index 585747340..000000000 --- a/tools/cfgs/waymo_models/mppnet_e2e_memorybank_inference.yaml +++ /dev/null @@ -1,194 +0,0 @@ -CLASS_NAMES: ['Vehicle', 'Pedestrian', 'Cyclist'] - -DATA_CONFIG: - - _BASE_CONFIG_: cfgs/dataset_configs/waymo_dataset_multiframe.yaml - PROCESSED_DATA_TAG: 'waymo_processed_data_v0_5_0' - - SEQUENCE_CONFIG: - ENABLED: True - SAMPLE_OFFSET: [-3, 0] #16frame using [-15,0] - - POINT_FEATURE_ENCODING: { - encoding_type: absolute_coordinates_encoding, - used_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'], - src_feature_list: ['x', 'y', 'z', 'intensity', 'elongation','time'], - } - - -MODEL: - NAME: MPPNetE2E - - VFE: - NAME: DynMeanVFE - - BACKBONE_3D: - NAME: VoxelResBackBone8x - - MAP_TO_BEV: - NAME: HeightCompression - NUM_BEV_FEATURES: 256 - - BACKBONE_2D: - NAME: BaseBEVBackbone - NUM_FRAME: 2 - LAYER_NUMS: [5, 5] - LAYER_STRIDES: [1, 2] - NUM_FILTERS: [128, 256] - UPSAMPLE_STRIDES: [1, 2] - NUM_UPSAMPLE_FILTERS: [256, 256] - - DENSE_HEAD: - NAME: CenterHead - CLASS_AGNOSTIC: False - - CLASS_NAMES_EACH_HEAD: [ - ['Vehicle', 'Pedestrian', 'Cyclist'] - ] - - SHARED_CONV_CHANNEL: 64 - USE_BIAS_BEFORE_NORM: True - NUM_HM_CONV: 2 - SEPARATE_HEAD_CFG: - HEAD_ORDER: ['center', 'center_z', 'dim', 'rot','vel'] - HEAD_DICT: { - 'center': {'out_channels': 2, 'num_conv': 2}, - 'center_z': {'out_channels': 1, 'num_conv': 2}, - 'dim': {'out_channels': 3, 'num_conv': 2}, - 'rot': {'out_channels': 2, 'num_conv': 2}, - 'vel': {'out_channels': 2, 'num_conv': 2}, - - } - - TARGET_ASSIGNER_CONFIG: - FEATURE_MAP_STRIDE: 8 - NUM_MAX_OBJS: 500 - GAUSSIAN_OVERLAP: 0.1 - MIN_RADIUS: 2 - - LOSS_CONFIG: - LOSS_WEIGHTS: { - 'cls_weight': 1.0, - 'loc_weight': 2.0, - 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.2] - } - - POST_PROCESSING: - SCORE_THRESH: 0.1 - POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -2, 75.2, 75.2, 4] - MAX_OBJ_PER_SAMPLE: 500 - NMS_CONFIG: - NMS_TYPE: nms_gpu - NMS_THRESH: 0.7 - NMS_PRE_MAXSIZE: 4096 - NMS_POST_MAXSIZE: 500 - - ROI_HEAD: - NAME: MPPNetHeadE2E - TRANS_INPUT: 256 - CLASS_AGNOSTIC: True - USE_BOX_ENCODING: - ENABLED: True - NORM_T0: True - ALL_YAW_T0: True - AVG_STAGE1_SCORE: True - USE_TRAJ_EMPTY_MASK: True - USE_AUX_LOSS: True - IOU_WEIGHT: [0.5,0.4] - - ROI_GRID_POOL: #if using 16frame, change to the corresponding setting - GRID_SIZE: 4 - MLPS: [[128,128], [128,128]] - POOL_RADIUS: [0.8, 1.6] - NSAMPLE: [16, 16] - POOL_METHOD: max_pool - - Transformer: - num_lidar_points: 128 - num_proxy_points: 64 - pos_hidden_dim: 64 - enc_layers: 3 - dim_feedforward: 512 - hidden_dim: 256 - dropout: 0.1 - nheads: 4 - pre_norm: False - num_frames: 4 #16frame using 16 - num_groups: 4 - sequence_stride: 1 #16frame using 4 - use_grid_pos: - enabled: True - init_type: index - use_mlp_mixer: - enabled: True - hidden_dim: 16 - - TARGET_CONFIG: - BOX_CODER: ResidualCoder - ROI_PER_IMAGE: 96 - FG_RATIO: 0.5 - REG_AUG_METHOD: single - ROI_FG_AUG_TIMES: 10 - RATIO: 0.2 - USE_ROI_AUG: True - USE_TRAJ_AUG: - ENABLED: True - THRESHOD: 0.8 - SAMPLE_ROI_BY_EACH_CLASS: True - CLS_SCORE_TYPE: roi_iou - - CLS_FG_THRESH: 0.75 - CLS_BG_THRESH: 0.25 - CLS_BG_THRESH_LO: 0.1 - HARD_BG_RATIO: 0.8 - - REG_FG_THRESH: 0.55 - - LOSS_CONFIG: - CLS_LOSS: BinaryCrossEntropy - REG_LOSS: smooth-l1 - CORNER_LOSS_REGULARIZATION: True - LOSS_WEIGHTS: { - 'rcnn_cls_weight': 1.0, - 'rcnn_reg_weight': 1.0, - 'rcnn_corner_weight': 2.0, - 'traj_reg_weight': [2.0, 2.0, 2.0], - 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] - } - - POST_PROCESSING: - RECALL_THRESH_LIST: [0.3, 0.5, 0.7] - SCORE_THRESH: 0.1 - OUTPUT_RAW_SCORE: False - SAVE_BBOX: False - EVAL_METRIC: waymo - NOT_APPLY_NMS_FOR_VEL: True - - NMS_CONFIG: - MULTI_CLASSES_NMS: False - NMS_TYPE: nms_gpu - NMS_THRESH: 0.7 - NMS_PRE_MAXSIZE: 4096 - NMS_POST_MAXSIZE: 500 - - -OPTIMIZATION: - BATCH_SIZE_PER_GPU: 2 - NUM_EPOCHS: 6 - - OPTIMIZER: adam_onecycle - LR: 0.003 - WEIGHT_DECAY: 0.01 - MOMENTUM: 0.9 - - MOMS: [0.95, 0.85] - PCT_START: 0.4 - DIV_FACTOR: 10 - DECAY_STEP_LIST: [35, 45] - LR_DECAY: 0.1 - LR_CLIP: 0.0000001 - - LR_WARMUP: False - WARMUP_EPOCH: 1 - - GRAD_NORM_CLIP: 10 \ No newline at end of file diff --git a/tools/train.py b/tools/train.py index 29a88bde9..abd6e1d04 100644 --- a/tools/train.py +++ b/tools/train.py @@ -10,7 +10,7 @@ import torch.nn as nn from tensorboardX import SummaryWriter -from pcdet.config import cfg, cfg_from_list, cfg_from_yaml_file, log_config_to_file +from pcdet.config import cfg, log_config_to_file, create_cfg_from_sets from pcdet.datasets import build_dataloader from pcdet.models import build_network, model_fn_decorator from pcdet.utils import common_utils @@ -19,6 +19,8 @@ def parse_config(): + global cfg + parser = argparse.ArgumentParser(description='arg parser') parser.add_argument('--cfg_file', type=str, default=None, help='specify the config for training') @@ -38,6 +40,8 @@ def parse_config(): parser.add_argument('--merge_all_iters_to_one_epoch', action='store_true', default=False, help='') parser.add_argument('--set', dest='set_cfgs', default=None, nargs=argparse.REMAINDER, help='set extra config keys if needed') + parser.add_argument('--modify', type=str, dest='modify_cfgs', default=None, nargs='*', + help='specify extra modifier configs') parser.add_argument('--max_waiting_mins', type=int, default=0, help='max waiting minutes') parser.add_argument('--start_epoch', type=int, default=0, help='') @@ -52,15 +56,22 @@ def parse_config(): args = parser.parse_args() + if args.set_cfgs is None: + args.set_cfgs = [] + if args.modify_cfgs is None: + args.modify_cfgs = [] + + cfg = create_cfg_from_sets(args.cfg_file, args.modify_cfgs, args.set_cfgs, cfg) - cfg_from_yaml_file(args.cfg_file, cfg) - cfg.TAG = Path(args.cfg_file).stem cfg.EXP_GROUP_PATH = '/'.join(args.cfg_file.split('/')[1:-1]) # remove 'cfgs' and 'xxxx.yaml' args.use_amp = args.use_amp or cfg.OPTIMIZATION.get('USE_AMP', False) - if args.set_cfgs is not None: - cfg_from_list(args.set_cfgs, cfg) + cfg.TAG = Path(args.cfg_file).stem + if len(args.modify_cfgs): + cfg.TAG += '__' + '__'.join([Path(m).stem for m in args.modify_cfgs]) + if len(args.set_cfgs): + cfg.TAG += '__s__' + '__'.join([s.replace('/', '_') for s in args.set_cfgs]) return args, cfg @@ -109,7 +120,9 @@ def main(): logger.info('{:16} {}'.format(key, val)) log_config_to_file(cfg, logger=logger) if cfg.LOCAL_RANK == 0: - os.system('cp %s %s' % (args.cfg_file, output_dir)) + os.system('cp %s %s' % (args.cfg_file, output_dir / ("BASE_" + Path(args.cfg_file).name))) + set_cfg = create_cfg_from_sets(args.cfg_file, args.modify_cfgs, args.set_cfgs) + cfg_to_yaml_file(set_cfg, output_dir / Path(args.cfg_file).name) tb_log = SummaryWriter(log_dir=str(output_dir / 'tensorboard')) if cfg.LOCAL_RANK == 0 else None