Spaces:
Build error
Build error
| """ | |
| @Date: 2021/07/17 | |
| @description: | |
| """ | |
| import os | |
| import logging | |
| from yacs.config import CfgNode as CN | |
| _C = CN() | |
| _C.DEBUG = False | |
| _C.MODE = 'train' | |
| _C.VAL_NAME = 'val' | |
| _C.TAG = 'default' | |
| _C.COMMENT = 'add some comments to help you understand' | |
| _C.SHOW_BAR = True | |
| _C.SAVE_EVAL = False | |
| _C.MODEL = CN() | |
| _C.MODEL.NAME = 'model_name' | |
| _C.MODEL.SAVE_BEST = True | |
| _C.MODEL.SAVE_LAST = True | |
| _C.MODEL.ARGS = [] | |
| _C.MODEL.FINE_TUNE = [] | |
| # ----------------------------------------------------------------------------- | |
| # Training settings | |
| # ----------------------------------------------------------------------------- | |
| _C.TRAIN = CN() | |
| _C.TRAIN.SCRATCH = False | |
| _C.TRAIN.START_EPOCH = 0 | |
| _C.TRAIN.EPOCHS = 300 | |
| _C.TRAIN.DETERMINISTIC = False | |
| _C.TRAIN.SAVE_FREQ = 5 | |
| _C.TRAIN.BASE_LR = 5e-4 | |
| _C.TRAIN.WARMUP_EPOCHS = 20 | |
| _C.TRAIN.WEIGHT_DECAY = 0 | |
| _C.TRAIN.WARMUP_LR = 5e-7 | |
| _C.TRAIN.MIN_LR = 5e-6 | |
| # Clip gradient norm | |
| _C.TRAIN.CLIP_GRAD = 5.0 | |
| # Auto resume from latest checkpoint | |
| _C.TRAIN.RESUME_LAST = True | |
| # Gradient accumulation steps | |
| # could be overwritten by command line argument | |
| _C.TRAIN.ACCUMULATION_STEPS = 0 | |
| # Whether to use gradient checkpointing to save memory | |
| # could be overwritten by command line argument | |
| _C.TRAIN.USE_CHECKPOINT = False | |
| # 'cpu' or 'cuda:0, 1, 2, 3' or 'cuda' | |
| _C.TRAIN.DEVICE = 'cuda' | |
| # LR scheduler | |
| _C.TRAIN.LR_SCHEDULER = CN() | |
| _C.TRAIN.LR_SCHEDULER.NAME = '' | |
| _C.TRAIN.LR_SCHEDULER.ARGS = [] | |
| # Optimizer | |
| _C.TRAIN.OPTIMIZER = CN() | |
| _C.TRAIN.OPTIMIZER.NAME = 'adam' | |
| # Optimizer Epsilon | |
| _C.TRAIN.OPTIMIZER.EPS = 1e-8 | |
| # Optimizer Betas | |
| _C.TRAIN.OPTIMIZER.BETAS = (0.9, 0.999) | |
| # SGD momentum | |
| _C.TRAIN.OPTIMIZER.MOMENTUM = 0.9 | |
| # Criterion | |
| _C.TRAIN.CRITERION = CN() | |
| # Boundary loss (Horizon-Net) | |
| _C.TRAIN.CRITERION.BOUNDARY = CN() | |
| _C.TRAIN.CRITERION.BOUNDARY.NAME = 'boundary' | |
| _C.TRAIN.CRITERION.BOUNDARY.LOSS = 'BoundaryLoss' | |
| _C.TRAIN.CRITERION.BOUNDARY.WEIGHT = 0.0 | |
| _C.TRAIN.CRITERION.BOUNDARY.WEIGHTS = [] | |
| _C.TRAIN.CRITERION.BOUNDARY.NEED_ALL = True | |
| # Up and Down depth loss (LED2-Net) | |
| _C.TRAIN.CRITERION.LEDDepth = CN() | |
| _C.TRAIN.CRITERION.LEDDepth.NAME = 'led_depth' | |
| _C.TRAIN.CRITERION.LEDDepth.LOSS = 'LEDLoss' | |
| _C.TRAIN.CRITERION.LEDDepth.WEIGHT = 0.0 | |
| _C.TRAIN.CRITERION.LEDDepth.WEIGHTS = [] | |
| _C.TRAIN.CRITERION.LEDDepth.NEED_ALL = True | |
| # Depth loss | |
| _C.TRAIN.CRITERION.DEPTH = CN() | |
| _C.TRAIN.CRITERION.DEPTH.NAME = 'depth' | |
| _C.TRAIN.CRITERION.DEPTH.LOSS = 'L1Loss' | |
| _C.TRAIN.CRITERION.DEPTH.WEIGHT = 0.0 | |
| _C.TRAIN.CRITERION.DEPTH.WEIGHTS = [] | |
| _C.TRAIN.CRITERION.DEPTH.NEED_ALL = False | |
| # Ratio(Room Height) loss | |
| _C.TRAIN.CRITERION.RATIO = CN() | |
| _C.TRAIN.CRITERION.RATIO.NAME = 'ratio' | |
| _C.TRAIN.CRITERION.RATIO.LOSS = 'L1Loss' | |
| _C.TRAIN.CRITERION.RATIO.WEIGHT = 0.0 | |
| _C.TRAIN.CRITERION.RATIO.WEIGHTS = [] | |
| _C.TRAIN.CRITERION.RATIO.NEED_ALL = False | |
| # Grad(Normal) loss | |
| _C.TRAIN.CRITERION.GRAD = CN() | |
| _C.TRAIN.CRITERION.GRAD.NAME = 'grad' | |
| _C.TRAIN.CRITERION.GRAD.LOSS = 'GradLoss' | |
| _C.TRAIN.CRITERION.GRAD.WEIGHT = 0.0 | |
| _C.TRAIN.CRITERION.GRAD.WEIGHTS = [1.0, 1.0] | |
| _C.TRAIN.CRITERION.GRAD.NEED_ALL = True | |
| # Object loss | |
| _C.TRAIN.CRITERION.OBJECT = CN() | |
| _C.TRAIN.CRITERION.OBJECT.NAME = 'object' | |
| _C.TRAIN.CRITERION.OBJECT.LOSS = 'ObjectLoss' | |
| _C.TRAIN.CRITERION.OBJECT.WEIGHT = 0.0 | |
| _C.TRAIN.CRITERION.OBJECT.WEIGHTS = [] | |
| _C.TRAIN.CRITERION.OBJECT.NEED_ALL = True | |
| # Heatmap loss | |
| _C.TRAIN.CRITERION.CHM = CN() | |
| _C.TRAIN.CRITERION.CHM.NAME = 'corner_heat_map' | |
| _C.TRAIN.CRITERION.CHM.LOSS = 'HeatmapLoss' | |
| _C.TRAIN.CRITERION.CHM.WEIGHT = 0.0 | |
| _C.TRAIN.CRITERION.CHM.WEIGHTS = [] | |
| _C.TRAIN.CRITERION.CHM.NEED_ALL = False | |
| _C.TRAIN.VIS_MERGE = True | |
| _C.TRAIN.VIS_WEIGHT = 1024 | |
| # ----------------------------------------------------------------------------- | |
| # Output settings | |
| # ----------------------------------------------------------------------------- | |
| _C.CKPT = CN() | |
| _C.CKPT.PYTORCH = './' | |
| _C.CKPT.ROOT = "./checkpoints" | |
| _C.CKPT.DIR = os.path.join(_C.CKPT.ROOT, _C.MODEL.NAME, _C.TAG) | |
| _C.CKPT.RESULT_DIR = os.path.join(_C.CKPT.DIR, 'results', _C.MODE) | |
| _C.LOGGER = CN() | |
| _C.LOGGER.DIR = os.path.join(_C.CKPT.DIR, "logs") | |
| _C.LOGGER.LEVEL = logging.DEBUG | |
| # ----------------------------------------------------------------------------- | |
| # Misc | |
| # ----------------------------------------------------------------------------- | |
| # Mixed precision opt level, if O0, no amp is used ('O0', 'O1', 'O2'), Please confirm your device support FP16(Half). | |
| # overwritten by command line argument | |
| _C.AMP_OPT_LEVEL = 'O1' | |
| # Path to output folder, overwritten by command line argument | |
| _C.OUTPUT = '' | |
| # Tag of experiment, overwritten by command line argument | |
| _C.TAG = 'default' | |
| # Frequency to save checkpoint | |
| _C.SAVE_FREQ = 1 | |
| # Frequency to logging info | |
| _C.PRINT_FREQ = 10 | |
| # Fixed random seed | |
| _C.SEED = 0 | |
| # Perform evaluation only, overwritten by command line argument | |
| _C.EVAL_MODE = False | |
| # Test throughput only, overwritten by command line argument | |
| _C.THROUGHPUT_MODE = False | |
| # ----------------------------------------------------------------------------- | |
| # FIX | |
| # ----------------------------------------------------------------------------- | |
| _C.LOCAL_RANK = 0 | |
| _C.WORLD_SIZE = 0 | |
| # ----------------------------------------------------------------------------- | |
| # Data settings | |
| # ----------------------------------------------------------------------------- | |
| _C.DATA = CN() | |
| # Sub dataset of pano_s2d3d | |
| _C.DATA.SUBSET = None | |
| # Dataset name | |
| _C.DATA.DATASET = 'mp3d' | |
| # Path to dataset, could be overwritten by command line argument | |
| _C.DATA.DIR = '' | |
| # Max wall number | |
| _C.DATA.WALL_NUM = 0 # all | |
| # Panorama image size | |
| _C.DATA.SHAPE = [512, 1024] | |
| # Really camera height | |
| _C.DATA.CAMERA_HEIGHT = 1.6 | |
| # Pin CPU memory in DataLoader for more efficient (sometimes) transfer to GPU. | |
| _C.DATA.PIN_MEMORY = True | |
| # Debug use, fast test performance of model | |
| _C.DATA.FOR_TEST_INDEX = None | |
| # Batch size for a single GPU, could be overwritten by command line argument | |
| _C.DATA.BATCH_SIZE = 8 | |
| # Number of data loading threads | |
| _C.DATA.NUM_WORKERS = 8 | |
| # Training augment | |
| _C.DATA.AUG = CN() | |
| # Flip the panorama horizontally | |
| _C.DATA.AUG.FLIP = True | |
| # Pano Stretch Data Augmentation by HorizonNet | |
| _C.DATA.AUG.STRETCH = True | |
| # Rotate the panorama horizontally | |
| _C.DATA.AUG.ROTATE = True | |
| # Gamma adjusting | |
| _C.DATA.AUG.GAMMA = True | |
| _C.DATA.KEYS = [] | |
| _C.EVAL = CN() | |
| _C.EVAL.POST_PROCESSING = None | |
| _C.EVAL.NEED_CPE = False | |
| _C.EVAL.NEED_F1 = False | |
| _C.EVAL.NEED_RMSE = False | |
| _C.EVAL.FORCE_CUBE = False | |
| def merge_from_file(cfg_path): | |
| config = _C.clone() | |
| config.merge_from_file(cfg_path) | |
| return config | |
| def get_config(args=None): | |
| config = _C.clone() | |
| if args: | |
| if 'cfg' in args and args.cfg: | |
| config.merge_from_file(args.cfg) | |
| if 'mode' in args and args.mode: | |
| config.MODE = args.mode | |
| if 'debug' in args and args.debug: | |
| config.DEBUG = args.debug | |
| if 'hidden_bar' in args and args.hidden_bar: | |
| config.SHOW_BAR = False | |
| if 'bs' in args and args.bs: | |
| config.DATA.BATCH_SIZE = args.bs | |
| if 'save_eval' in args and args.save_eval: | |
| config.SAVE_EVAL = True | |
| if 'val_name' in args and args.val_name: | |
| config.VAL_NAME = args.val_name | |
| if 'post_processing' in args and args.post_processing: | |
| config.EVAL.POST_PROCESSING = args.post_processing | |
| if 'need_cpe' in args and args.need_cpe: | |
| config.EVAL.NEED_CPE = args.need_cpe | |
| if 'need_f1' in args and args.need_f1: | |
| config.EVAL.NEED_F1 = args.need_f1 | |
| if 'need_rmse' in args and args.need_rmse: | |
| config.EVAL.NEED_RMSE = args.need_rmse | |
| if 'force_cube' in args and args.force_cube: | |
| config.EVAL.FORCE_CUBE = args.force_cube | |
| if 'wall_num' in args and args.wall_num: | |
| config.DATA.WALL_NUM = args.wall_num | |
| args = config.MODEL.ARGS[0] | |
| config.CKPT.DIR = os.path.join(config.CKPT.ROOT, f"{args['decoder_name']}_{args['output_name']}_Net", | |
| config.TAG, 'debug' if config.DEBUG else '') | |
| config.CKPT.RESULT_DIR = os.path.join(config.CKPT.DIR, 'results', config.MODE) | |
| config.LOGGER.DIR = os.path.join(config.CKPT.DIR, "logs") | |
| core_number = os.popen("grep 'physical id' /proc/cpuinfo | sort | uniq | wc -l").read() | |
| try: | |
| config.DATA.NUM_WORKERS = int(core_number) * 2 | |
| print(f"System core number: {config.DATA.NUM_WORKERS}") | |
| except ValueError: | |
| print(f"Can't get system core number, will use config: { config.DATA.NUM_WORKERS}") | |
| config.freeze() | |
| return config | |
| def get_rank_config(cfg, local_rank, world_size): | |
| local_rank = 0 if local_rank is None else local_rank | |
| config = cfg.clone() | |
| config.defrost() | |
| if world_size > 1: | |
| ids = config.TRAIN.DEVICE.split(':')[-1].split(',') if ':' in config.TRAIN.DEVICE else range(world_size) | |
| config.TRAIN.DEVICE = f'cuda:{ids[local_rank]}' | |
| config.LOCAL_RANK = local_rank | |
| config.WORLD_SIZE = world_size | |
| config.SEED = config.SEED + local_rank | |
| config.freeze() | |
| return config | |