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