| |
| import os |
| import random |
| import sys |
| import time |
| import warnings |
| from getpass import getuser |
| from socket import gethostname |
|
|
| import numpy as np |
| import torch |
|
|
| import annotator.uniformer.mmcv as mmcv |
|
|
|
|
| def get_host_info(): |
| """Get hostname and username. |
| |
| Return empty string if exception raised, e.g. ``getpass.getuser()`` will |
| lead to error in docker container |
| """ |
| host = '' |
| try: |
| host = f'{getuser()}@{gethostname()}' |
| except Exception as e: |
| warnings.warn(f'Host or user not found: {str(e)}') |
| finally: |
| return host |
|
|
|
|
| def get_time_str(): |
| return time.strftime('%Y%m%d_%H%M%S', time.localtime()) |
|
|
|
|
| def obj_from_dict(info, parent=None, default_args=None): |
| """Initialize an object from dict. |
| |
| The dict must contain the key "type", which indicates the object type, it |
| can be either a string or type, such as "list" or ``list``. Remaining |
| fields are treated as the arguments for constructing the object. |
| |
| Args: |
| info (dict): Object types and arguments. |
| parent (:class:`module`): Module which may containing expected object |
| classes. |
| default_args (dict, optional): Default arguments for initializing the |
| object. |
| |
| Returns: |
| any type: Object built from the dict. |
| """ |
| assert isinstance(info, dict) and 'type' in info |
| assert isinstance(default_args, dict) or default_args is None |
| args = info.copy() |
| obj_type = args.pop('type') |
| if mmcv.is_str(obj_type): |
| if parent is not None: |
| obj_type = getattr(parent, obj_type) |
| else: |
| obj_type = sys.modules[obj_type] |
| elif not isinstance(obj_type, type): |
| raise TypeError('type must be a str or valid type, but ' |
| f'got {type(obj_type)}') |
| if default_args is not None: |
| for name, value in default_args.items(): |
| args.setdefault(name, value) |
| return obj_type(**args) |
|
|
|
|
| def set_random_seed(seed, deterministic=False, use_rank_shift=False): |
| """Set random seed. |
| |
| Args: |
| seed (int): Seed to be used. |
| deterministic (bool): Whether to set the deterministic option for |
| CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` |
| to True and `torch.backends.cudnn.benchmark` to False. |
| Default: False. |
| rank_shift (bool): Whether to add rank number to the random seed to |
| have different random seed in different threads. Default: False. |
| """ |
| if use_rank_shift: |
| rank, _ = mmcv.runner.get_dist_info() |
| seed += rank |
| random.seed(seed) |
| np.random.seed(seed) |
| torch.manual_seed(seed) |
| torch.cuda.manual_seed(seed) |
| torch.cuda.manual_seed_all(seed) |
| os.environ['PYTHONHASHSEED'] = str(seed) |
| if deterministic: |
| torch.backends.cudnn.deterministic = True |
| torch.backends.cudnn.benchmark = False |
|
|