| import numpy as np |
| import os |
| import random |
| import time |
| import torch |
| from os import path as osp |
|
|
| from .dist_util import master_only |
|
|
|
|
| def set_random_seed(seed): |
| """Set random seeds.""" |
| random.seed(seed) |
| np.random.seed(seed) |
| torch.manual_seed(seed) |
| torch.cuda.manual_seed(seed) |
| torch.cuda.manual_seed_all(seed) |
|
|
|
|
| def get_time_str(): |
| return time.strftime('%Y%m%d_%H%M%S', time.localtime()) |
|
|
|
|
| def mkdir_and_rename(path): |
| """mkdirs. If path exists, rename it with timestamp and create a new one. |
| |
| Args: |
| path (str): Folder path. |
| """ |
| if osp.exists(path): |
| new_name = path + '_archived_' + get_time_str() |
| print(f'Path already exists. Rename it to {new_name}', flush=True) |
| os.rename(path, new_name) |
| os.makedirs(path, exist_ok=True) |
|
|
|
|
| @master_only |
| def make_exp_dirs(opt): |
| """Make dirs for experiments.""" |
| path_opt = opt['path'].copy() |
| if opt['is_train']: |
| mkdir_and_rename(path_opt.pop('experiments_root')) |
| else: |
| mkdir_and_rename(path_opt.pop('results_root')) |
| for key, path in path_opt.items(): |
| if ('strict_load' in key) or ('pretrain_network' in key) or ('resume' in key) or ('param_key' in key): |
| continue |
| else: |
| os.makedirs(path, exist_ok=True) |
|
|
|
|
| def scandir(dir_path, suffix=None, recursive=False, full_path=False): |
| """Scan a directory to find the interested files. |
| |
| Args: |
| dir_path (str): Path of the directory. |
| suffix (str | tuple(str), optional): File suffix that we are |
| interested in. Default: None. |
| recursive (bool, optional): If set to True, recursively scan the |
| directory. Default: False. |
| full_path (bool, optional): If set to True, include the dir_path. |
| Default: False. |
| |
| Returns: |
| A generator for all the interested files with relative paths. |
| """ |
|
|
| if (suffix is not None) and not isinstance(suffix, (str, tuple)): |
| raise TypeError('"suffix" must be a string or tuple of strings') |
|
|
| root = dir_path |
|
|
| def _scandir(dir_path, suffix, recursive): |
| for entry in os.scandir(dir_path): |
| if not entry.name.startswith('.') and entry.is_file(): |
| if full_path: |
| return_path = entry.path |
| else: |
| return_path = osp.relpath(entry.path, root) |
|
|
| if suffix is None: |
| yield return_path |
| elif return_path.endswith(suffix): |
| yield return_path |
| else: |
| if recursive: |
| yield from _scandir(entry.path, suffix=suffix, recursive=recursive) |
| else: |
| continue |
|
|
| return _scandir(dir_path, suffix=suffix, recursive=recursive) |
|
|
|
|
| def check_resume(opt, resume_iter): |
| """Check resume states and pretrain_network paths. |
| |
| Args: |
| opt (dict): Options. |
| resume_iter (int): Resume iteration. |
| """ |
| if opt['path']['resume_state']: |
| |
| networks = [key for key in opt.keys() if key.startswith('network_')] |
| flag_pretrain = False |
| for network in networks: |
| if opt['path'].get(f'pretrain_{network}') is not None: |
| flag_pretrain = True |
| if flag_pretrain: |
| print('pretrain_network path will be ignored during resuming.') |
| |
| for network in networks: |
| name = f'pretrain_{network}' |
| basename = network.replace('network_', '') |
| if opt['path'].get('ignore_resume_networks') is None or (network |
| not in opt['path']['ignore_resume_networks']): |
| opt['path'][name] = osp.join(opt['path']['models'], f'net_{basename}_{resume_iter}.pth') |
| print(f"Set {name} to {opt['path'][name]}") |
|
|
| |
| param_keys = [key for key in opt['path'].keys() if key.startswith('param_key')] |
| for param_key in param_keys: |
| if opt['path'][param_key] == 'params_ema': |
| opt['path'][param_key] = 'params' |
| print(f'Set {param_key} to params') |
|
|
|
|
| def sizeof_fmt(size, suffix='B'): |
| """Get human readable file size. |
| |
| Args: |
| size (int): File size. |
| suffix (str): Suffix. Default: 'B'. |
| |
| Return: |
| str: Formatted file size. |
| """ |
| for unit in ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z']: |
| if abs(size) < 1024.0: |
| return f'{size:3.1f} {unit}{suffix}' |
| size /= 1024.0 |
| return f'{size:3.1f} Y{suffix}' |
|
|