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