Source code for otx.core.utils.config

# Copyright (C) 2023-2024 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
#
"""Utility functions for config files."""

from __future__ import annotations

from numbers import Number
from typing import TYPE_CHECKING, Literal

from omegaconf import DictConfig, OmegaConf

if TYPE_CHECKING:
    from mmengine.config import Config as MMConfig


[docs] def to_tuple(dict_: dict) -> dict: """Find and replace tuple or list values in dict to tuple recursively.""" # MMDET Mosaic asserts if "img_shape" is not tuple # File "mmdet/datasets/transforms/transforms.py", line 2324, in __init__ for k, v in dict_.items(): if isinstance(v, (tuple, list)) and all(isinstance(elem, Number) for elem in v): dict_[k] = tuple(v) elif isinstance(v, dict): to_tuple(v) return dict_
[docs] def to_list(dict_: dict) -> dict: """Find and replace tuple or list values in dict to list recursively.""" # MMDET FPN asserts if "in_channels" is not list # File "mmdet/models/necks/fpn.py", line 88, in __init__ for k, v in dict_.items(): if isinstance(v, (tuple, list)) and all(isinstance(elem, Number) for elem in v): dict_[k] = list(v) elif isinstance(v, dict): to_list(v) return dict_
[docs] def convert_conf_to_mmconfig_dict( cfg: DictConfig | dict, to: Literal["tuple", "list"] = "tuple", ) -> MMConfig: """Convert OTX format config object to MMEngine config object.""" from mmengine.config import Config as MMConfig cfg = cfg if isinstance(cfg, DictConfig) else OmegaConf.create(cfg) dict_cfg = OmegaConf.to_container(cfg) if to == "tuple": return MMConfig(cfg_dict=to_tuple(dict_cfg)) if to == "list": return MMConfig(cfg_dict=to_list(dict_cfg)) raise ValueError(to)