- Notifications
You must be signed in to change notification settings - Fork 509
/
Copy pathoptions.py
108 lines (86 loc) · 3.41 KB
/
options.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
importyaml
importtime
fromcollectionsimportOrderedDict
fromosimportpathasosp
frombasicsr.utils.miscimportget_time_str
defordered_yaml():
"""Support OrderedDict for yaml.
Returns:
yaml Loader and Dumper.
"""
try:
fromyamlimportCDumperasDumper
fromyamlimportCLoaderasLoader
exceptImportError:
fromyamlimportDumper, Loader
_mapping_tag=yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG
defdict_representer(dumper, data):
returndumper.represent_dict(data.items())
defdict_constructor(loader, node):
returnOrderedDict(loader.construct_pairs(node))
Dumper.add_representer(OrderedDict, dict_representer)
Loader.add_constructor(_mapping_tag, dict_constructor)
returnLoader, Dumper
defparse(opt_path, root_path, is_train=True):
"""Parse option file.
Args:
opt_path (str): Option file path.
is_train (str): Indicate whether in training or not. Default: True.
Returns:
(dict): Options.
"""
withopen(opt_path, mode='r') asf:
Loader, _=ordered_yaml()
opt=yaml.load(f, Loader=Loader)
opt['is_train'] =is_train
# opt['name'] = f"{get_time_str()}_{opt['name']}"
ifopt['path'].get('resume_state', None): # Shangchen added
resume_state_path=opt['path'].get('resume_state')
opt['name'] =resume_state_path.split("/")[-3]
else:
opt['name'] =f"{get_time_str()}_{opt['name']}"
# datasets
forphase, datasetinopt['datasets'].items():
# for several datasets, e.g., test_1, test_2
phase=phase.split('_')[0]
dataset['phase'] =phase
if'scale'inopt:
dataset['scale'] =opt['scale']
ifdataset.get('dataroot_gt') isnotNone:
dataset['dataroot_gt'] =osp.expanduser(dataset['dataroot_gt'])
ifdataset.get('dataroot_lq') isnotNone:
dataset['dataroot_lq'] =osp.expanduser(dataset['dataroot_lq'])
# paths
forkey, valinopt['path'].items():
if (valisnotNone) and ('resume_state'inkeyor'pretrain_network'inkey):
opt['path'][key] =osp.expanduser(val)
ifis_train:
experiments_root=osp.join(root_path, 'experiments', opt['name'])
opt['path']['experiments_root'] =experiments_root
opt['path']['models'] =osp.join(experiments_root, 'models')
opt['path']['training_states'] =osp.join(experiments_root, 'training_states')
opt['path']['log'] =experiments_root
opt['path']['visualization'] =osp.join(experiments_root, 'visualization')
else: # test
results_root=osp.join(root_path, 'results', opt['name'])
opt['path']['results_root'] =results_root
opt['path']['log'] =results_root
opt['path']['visualization'] =osp.join(results_root, 'visualization')
returnopt
defdict2str(opt, indent_level=1):
"""dict to string for printing options.
Args:
opt (dict): Option dict.
indent_level (int): Indent level. Default: 1.
Return:
(str): Option string for printing.
"""
msg='\n'
fork, vinopt.items():
ifisinstance(v, dict):
msg+=' '* (indent_level*2) +k+':['
msg+=dict2str(v, indent_level+1)
msg+=' '* (indent_level*2) +']\n'
else:
msg+=' '* (indent_level*2) +k+': '+str(v) +'\n'
returnmsg