Spaces:
Paused
Paused
# Copyright (c) OpenMMLab. All rights reserved. | |
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 | |