|
|
import os
|
|
|
import logging
|
|
|
from collections import OrderedDict
|
|
|
import json
|
|
|
from datetime import datetime
|
|
|
import argparse
|
|
|
|
|
|
|
|
|
def mkdirs(paths):
|
|
|
if isinstance(paths, str):
|
|
|
os.makedirs(paths, exist_ok=True)
|
|
|
else:
|
|
|
for path in paths:
|
|
|
os.makedirs(path, exist_ok=True)
|
|
|
|
|
|
def get_timestamp():
|
|
|
return datetime.now().strftime('%y%m%d_%H%M%S')
|
|
|
|
|
|
|
|
|
def parse(args):
|
|
|
phase = args.phase
|
|
|
opt_path =args.config
|
|
|
gpu_ids = args.gpu_ids
|
|
|
|
|
|
json_str = ''
|
|
|
with open(opt_path, 'r') as f:
|
|
|
for line in f:
|
|
|
line = line.split('//')[0] + '\n'
|
|
|
json_str += line
|
|
|
|
|
|
opt =json.loads(json_str, object_pairs_hook=OrderedDict)
|
|
|
|
|
|
|
|
|
|
|
|
experiments_root = os.path.join(
|
|
|
'experiments', '{}_{}'.format(opt['name'], get_timestamp()))
|
|
|
opt['path_cd']['experiments_root'] = experiments_root
|
|
|
for key, path in opt['path_cd'].items():
|
|
|
if 'resume' not in key and 'experiments' not in key:
|
|
|
opt['path_cd'][key] = os.path.join(experiments_root, path)
|
|
|
mkdirs(opt['path_cd'][key])
|
|
|
|
|
|
|
|
|
opt['phase'] = phase
|
|
|
|
|
|
|
|
|
if gpu_ids is not None:
|
|
|
opt['gpu_ids'] = [int(id) for id in gpu_ids.split(',')]
|
|
|
gpu_list = gpu_ids
|
|
|
else:
|
|
|
gpu_list = ','.join(str(x) for x in opt['gpu_ids'])
|
|
|
|
|
|
os.environ['CUDA_VISIBLE_DEVICES'] = gpu_list
|
|
|
print('expert CUDA_VISIBLE_DEVICES=' + gpu_list)
|
|
|
if len(gpu_list) > 1:
|
|
|
opt['distributed'] = True
|
|
|
else:
|
|
|
opt['distributed'] = False
|
|
|
|
|
|
return opt
|
|
|
|
|
|
class NoneDict(dict):
|
|
|
def __missing__(self, key):
|
|
|
return None
|
|
|
|
|
|
|
|
|
def dict_to_nonedict(opt):
|
|
|
if isinstance(opt, dict):
|
|
|
new_opt = dict()
|
|
|
for key, sub_opt in opt.items():
|
|
|
new_opt[key] = dict_to_nonedict(sub_opt)
|
|
|
return NoneDict(**new_opt)
|
|
|
elif isinstance(opt, list):
|
|
|
return [dict_to_nonedict(sub_opt) for sub_opt in opt]
|
|
|
else:
|
|
|
return opt
|
|
|
|
|
|
def dict2str(opt, indent_l=1):
|
|
|
'''dict to string for logger'''
|
|
|
msg = ''
|
|
|
for k, v in opt.items():
|
|
|
if isinstance(v, dict):
|
|
|
msg += ' ' * (indent_l * 2) + k + ':[\n'
|
|
|
msg += dict2str(v, indent_l + 1)
|
|
|
msg += ' ' * (indent_l * 2) + ']\n'
|
|
|
else:
|
|
|
msg += ' ' * (indent_l * 2) + k + ': ' + str(v) + '\n'
|
|
|
return msg
|
|
|
|
|
|
def setup_logger(logger_name, root, phase, level=logging.INFO, screen=False):
|
|
|
'''set up logger'''
|
|
|
l = logging.getLogger(logger_name)
|
|
|
formatter = logging.Formatter(
|
|
|
'%(asctime)s.%(msecs)03d - %(levelname)s: %(message)s', datefmt='%y-%m-%d %H:%M:%S')
|
|
|
print(formatter)
|
|
|
log_file = os.path.join(root, '{}.log'.format(phase))
|
|
|
print(log_file)
|
|
|
fh = logging.FileHandler(log_file, mode='w')
|
|
|
fh.setFormatter(formatter)
|
|
|
l.setLevel(level)
|
|
|
l.addHandler(fh)
|
|
|
if screen:
|
|
|
sh = logging.StreamHandler()
|
|
|
sh.setFormatter(formatter)
|
|
|
l.addHandler(sh)
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
parser = argparse.ArgumentParser()
|
|
|
parser.add_argument('-c', '--config', type=str, default='../config/levir.json')
|
|
|
parser.add_argument('-p', '--phase', type=str, choices=['train', 'test'], default='train')
|
|
|
parser.add_argument('-gpu', '--gpu_ids', type=str, default=None)
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
opt = parse(args)
|
|
|
print(opt)
|
|
|
opt = dict_to_nonedict(opt)
|
|
|
print(opt) |