code: 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)
  
file_path: lavis/lavis/common/annotator/uniformer/mmcv/runner/utils.py
imports: import os
  import random
  import sys
  import time
  import warnings
  from getpass import getuser
  from socket import gethostname
  import numpy
  import torch
  import annotator.uniformer.mmcv
label_desc: Use image node_id 3 for calling a global function with example usage: obj_from_dict(info, parent, default_args) and returns: obj_type