""" @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