Source code for otx.cli.utils.importing
"""Utils for dynamically importing stuff."""
# Copyright (C) 2021 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions
# and limitations under the License.
import importlib
import inspect
import json
import os
# TODO: To avoid error during importing yapf dynamically. After the bug is fixed, code should be removed.
try:
import yapf # noqa: F401
except ImportError:
pass
# pylint: disable=protected-access
SUPPORTED_BACKBONE_BACKENDS = {
"otx": "otx.algorithms.common.adapters.mmcv.models",
"mmcls": "mmcls.models",
"mmdet": "mmdet.models",
"mmseg": "mmseg.models",
"torchvision": "otx.algorithms.common.adapters.mmcv.models",
"pytorchcv": "mmdet.models",
"omz.mmcls": "otx.algorithms.classification.adapters.mmcls.models.backbones.mmov_backbone",
}
[docs]
def get_impl_class(impl_path):
"""Returns a class by its path in package."""
task_impl_module_name, task_impl_class_name = impl_path.rsplit(".", 1)
task_impl_module = importlib.import_module(task_impl_module_name)
task_impl_class = getattr(task_impl_module, task_impl_class_name)
return task_impl_class
[docs]
def get_backbone_list(backend):
"""Gather available backbone list from json file & imported lib."""
available_backbone_path = os.path.join(get_otx_root_path(), f"cli/builder/supported_backbone/{backend}.json")
available_backbones = {}
if os.path.exists(available_backbone_path):
with open(available_backbone_path, "r", encoding="UTF-8") as f:
available_backbones = json.load(f)
available_backbones = available_backbones["backbones"]
elif backend == "pytorchcv" and importlib.util.find_spec(backend):
backbone_list = importlib.import_module(f"{backend}.model_provider")._models
backbone_format = {"required": [], "options": {}, "available": []}
for backbone in backbone_list:
backbone_type = f"mmdet.{backbone}"
available_backbones[backbone_type] = backbone_format
else:
raise ValueError(f"{backend} cannot be imported or supported.")
return available_backbones
[docs]
def get_backbone_registry(backend=None):
"""Gather backbone list from backends."""
if backend not in SUPPORTED_BACKBONE_BACKENDS:
raise ValueError(f"{backend} is an unsupported backbone backend.")
custom_imports = []
backend_import_path = SUPPORTED_BACKBONE_BACKENDS[backend]
mm_backbones = importlib.import_module(backend_import_path)
mm_registry = mm_backbones.BACKBONES
custom_imports.append(backend_import_path)
return mm_registry, custom_imports
[docs]
def get_module_args(module):
"""Gather module's Required Args."""
if module is None:
return []
required_args = []
default_args = {}
args_signature = inspect.signature(module)
for arg_key, arg_value in args_signature.parameters.items():
if arg_value.default is inspect.Parameter.empty:
required_args.append(arg_key)
continue
default_args[arg_key] = arg_value.default
# Get args from parents
parent_module = module.__bases__
while len(parent_module):
parent_args_signature = inspect.signature(parent_module[0])
for arg_key, arg_value in parent_args_signature.parameters.items():
if arg_key == "depth" and "arch" in required_args:
continue
if arg_value.default is inspect.Parameter.empty and arg_key not in required_args:
required_args.append(arg_key)
continue
parent_module = parent_module[0].__bases__
required_args = [arg for arg in required_args if arg not in ("args", "kwargs", "self")]
return required_args, default_args
[docs]
def get_otx_root_path():
"""Get otx root path from importing otx."""
otx_module = importlib.import_module("otx")
if otx_module:
return os.path.dirname(inspect.getfile(otx_module))
return None