From f8e31db2c65392c2caed28b2d7977b3f56e628fe Mon Sep 17 00:00:00 2001 From: Songki Choi Date: Tue, 28 Mar 2023 18:07:23 +0900 Subject: [PATCH] Merge back changes in release 1.1.0 (#1947) * Bump up version to 1.1.0rc1 * Updated daily workflow (#1905) - remove if statement to allow running on any branch by manually * [FIX] Wrong test temp directory path (#1902) * Fix wrong test temp directory * Update tests/unit/algorithms/action/adapters/mmaction/utils/test_action_config_utils.py * Update test_action_config_utils.py * Update PR template (#1914) * Update . location. * Fix OTX1.1 -> Geti1.4 integration issues (#1910) * Add dill to requirements/api.txt * Return None instead of raising NotImplementedError in IMedia2DEntity.path * Move utils HPO uses into HPO directory (#1912) move utils into hpo dir * [FIX] Add stability to explain detection (#1901) Add stability to explain detection * [Fix] e2e tests FQ references (#1918) Fix FQ references * Move mpa.deploy to otx.algorithms.common (#1903) * Move deploy modules to otx * test: fix mmdeploy api replacement error * Fix pre-commit issues * Update otx/mpa/det/exporter.py * Update otx/mpa/exporter_mixin.py * Update otx/mpa/seg/exporter.py * Update otx/mpa/cls/exporter.py * Update otx/algorithms/common/adapters/mmdeploy/utils/mmdeploy.py * Update otx/algorithms/common/adapters/mmdeploy/utils/operations_domain.py * Add mmcls.VisionTransformer backbone support (#1908) * Add mmcls transformer backbones * Fix VisionTransformeroutput check * Add changes * Disable recording forward hooks in inferrer * Remove unused import * Move semantic-segmentation related codes to otx adapters (#1911) * Added security.md Add the security related notification * Update security.md fix prettier issue * Add custom exception class for CLI (#1919) * Add custom exception class for CLI * Fixed TCs for config_manager * Correct License to Apache * Remove temp hot key values (#1916) * Refactor OTX classification phase 1: move modules from MPA to OTX (#1893) * Revert TrainType typo (#1928) * Fix Conflict * Fix conflict * Fix unit-tests * Fix cli tests * Fix cli tests * Fix type * Move all hooks in MPA into OTX common mmcv adapter (#1922) * Add explanation for XAI & minor doc fixes (#1923) * [CI] Updated daily workflow (#1904) Updated daily workflow - remove if statement to allow running on any branch by manually * [FIX] re-bugfix: ATSS head loss (#1907) re bugfix * Fix typos * Explanation of Explanation * Add images & typo fixes * Fixes from comments * Add accuracy for OD explanation * Tutorial update * Add accuracy for BCCD and WGISD * Fix * Move utils to OTX common & adapter (#1931) * [CI] Updated daily workflow (#1904) Updated daily workflow - remove if statement to allow running on any branch by manually * [FIX] re-bugfix: ATSS head loss (#1907) re bugfix * Added security.md Added the security related notification. * Update security.md fix prettier issue * Move utils * Fix typo * Move classification unit tests to OTX tests (#1932) * [CI] Updated daily workflow (#1904) Updated daily workflow - remove if statement to allow running on any branch by manually * [FIX] re-bugfix: ATSS head loss (#1907) re bugfix * Added security.md Added the security related notification. * Update security.md fix prettier issue * Move classification unit tests * Apply mocker in RandAugment TC * Move otx.mpa.modules.ov -> otx.core.ov (#1929) * First Refactoring * Refactor mpa.modules.ov -> otx.core.ov * Remove otx.mpa.modules.ov * Fix docs & unit test paths * Fix some import * Add TODO comments * Add github icon link in doc head (#1934) * Fix invalid temp_dir inside unit tests (#1937) * Move all model utils and dataloaders/samplers in mpa to otx adapter (#1930) * Move stages to each algorithms (#1938) * Move stages to each algorithms * Change docs for action recognition (#1940) * Change docs for action recognition * Fix typo * Update MoViNet related parts * Add MoViNet performance * Revert table include Complexity and Model size * Fix tox to run tests on non-editable install * Fix packaging errors including cython module build / import issues (#1936) * Avoid cychon compile on Windows * Fix packaging errors * Fix pre-commit * Remove use_develop option from tox tests * Fix pre-commit * Fix tox -e -> -re for clean build * Fix import error * Add missing __init__.py * Fix relative -> absolute import * Revert to editable package in tox tests * Release 1.1.0 (#1933) * Release OTX 1.1.0 * Update known issues in CHANGELOG.md * Fix PR / issue # to links * Fix pre-commit * Bump-up version to 1.2 * Fix pre-commit --------- Signed-off-by: Songki Choi Co-authored-by: Yunchu Lee Co-authored-by: Harim Kang Co-authored-by: Eunwoo Shin Co-authored-by: Emily Chun Co-authored-by: emily.chun Co-authored-by: Sungman Cho Co-authored-by: Inhyuk Andy Cho Co-authored-by: Jaeguk Hyun Co-authored-by: Jihwan Eom Co-authored-by: Soobee Lee Co-authored-by: Galina Zalesskaya --- .github/pull_request_template.md | 20 +- .github/workflows/pre_merge.yml | 14 +- CHANGELOG.md | 54 ++ MANIFEST.in | 3 + README.md | 26 +- docs/source/_static/logos/github_icon.png | Bin 0 -> 2161 bytes docs/source/conf.py | 10 +- .../explanation/additional_features/index.rst | 1 + .../explanation/additional_features/xai.rst | 95 +++ .../action/action_classification.rst | 20 +- .../multi_class_classification.rst | 2 +- .../object_detection/object_detection.rst | 33 +- .../segmentation/semantic_segmentation.rst | 2 +- .../quick_start_guide/cli_commands.rst | 6 +- docs/source/guide/index.rst | 2 +- .../classification/adapters/mmcls.rst | 54 +- .../algorithm/detection/adapters/mmdet.rst | 54 +- .../algorithm/segmentation/adapters/mmseg.rst | 54 +- docs/source/guide/reference/core/index.rst | 8 + .../{mpa/modules => core}/ov/graph.rst | 8 +- .../{mpa/modules => core}/ov/index.rst | 8 +- .../source/guide/reference/core/ov/models.rst | 22 + docs/source/guide/reference/core/ov/ops.rst | 82 ++ .../guide/reference/mpa/classification.rst | 58 -- docs/source/guide/reference/mpa/deploy.rst | 34 - docs/source/guide/reference/mpa/detection.rst | 58 -- docs/source/guide/reference/mpa/index.rst | 4 - .../guide/reference/mpa/modules/datasets.rst | 23 - .../guide/reference/mpa/modules/hooks.rst | 86 -- .../guide/reference/mpa/modules/index.rst | 12 - .../mpa/modules/models/backbones.rst | 14 - .../mpa/modules/models/classifiers.rst | 26 - .../reference/mpa/modules/models/heads.rst | 63 -- .../reference/mpa/modules/models/index.rst | 13 - .../reference/mpa/modules/models/losses.rst | 51 -- .../mpa/modules/models/scalar_schedulers.rst | 10 - .../mpa/modules/models/segmentors.rst | 30 - .../reference/mpa/modules/models/utils.rst | 10 - .../guide/reference/mpa/modules/optimizer.rst | 14 - .../guide/reference/mpa/modules/ov/models.rst | 30 - .../guide/reference/mpa/modules/ov/ops.rst | 82 -- .../guide/reference/mpa/modules/utils.rst | 22 - .../guide/reference/mpa/segmentation.rst | 58 -- docs/source/guide/reference/mpa/utils.rst | 30 - .../guide/tutorials/advanced/self_sl.rst | 32 +- .../guide/tutorials/advanced/semi_sl.rst | 22 +- docs/source/guide/tutorials/base/demo.rst | 6 +- docs/source/guide/tutorials/base/explain.rst | 23 +- .../how_to_train/action_classification.rst | 18 +- .../base/how_to_train/action_detection.rst | 71 ++ .../base/how_to_train/classification.rst | 3 +- .../tutorials/base/how_to_train/detection.rst | 10 +- docs/source/guide/tutorials/index.rst | 1 + docs/utils/images/xai_cls.jpg | Bin 0 -> 251865 bytes docs/utils/images/xai_det.jpg | Bin 0 -> 171342 bytes docs/utils/images/xai_example.jpg | Bin 0 -> 80216 bytes otx/__init__.py | 2 +- otx/algorithms/__init__.py | 2 + .../configs/classification/configuration.yaml | 6 +- .../classification/movinet/template.yaml | 4 +- .../configs/classification/x3d/template.yaml | 4 +- .../configs/detection/configuration.yaml | 6 +- .../detection/x3d_fast_rcnn/template.yaml | 2 +- .../classification/adapters/mmcls/__init__.py | 4 +- .../mmcls/{data => datasets}/__init__.py | 30 +- .../datasets.py => datasets/otx_datasets.py} | 2 +- .../mmcls/datasets/pipelines/__init__.py | 36 + .../pipelines/otx_pipelines.py} | 0 .../datasets/pipelines/transforms/__init__.py | 19 + .../datasets/pipelines/transforms/augmix.py | 99 +-- .../pipelines/transforms/otx_transforms.py} | 20 +- .../pipelines/transforms/random_augment.py | 194 +++++ .../pipelines/transforms/twocrop_transform.py | 4 +- .../adapters/mmcls/models/__init__.py | 51 +- .../mmcls/models/backbones/__init__.py | 19 + .../mmcls/models/backbones/mmov_backbone.py | 43 + .../mmcls/models/classifiers/__init__.py | 8 +- .../adapters/mmcls/models/classifiers/byol.py | 2 +- .../models/classifiers/sam_classifier.py | 205 ++--- .../classifiers/sam_classifier_mixin.py | 9 +- .../models/classifiers/semisl_classifier.py | 8 +- .../semisl_multilabel_classifier.py | 15 +- .../models/classifiers/supcon_classifier.py | 6 +- .../adapters/mmcls/models/heads/__init__.py | 34 +- .../adapters/mmcls/models}/heads/cls_head.py | 11 +- .../adapters/mmcls/models}/heads/conv_head.py | 25 +- .../mmcls}/models/heads/custom_cls_head.py | 28 +- .../custom_hierarchical_linear_cls_head.py | 32 +- ...custom_hierarchical_non_linear_cls_head.py | 49 +- .../custom_multi_label_linear_cls_head.py | 32 +- .../custom_multi_label_non_linear_cls_head.py | 42 +- .../mmcls/models}/heads/mmov_cls_head.py | 37 +- .../models/heads/non_linear_cls_head.py | 36 +- .../mmcls}/models/heads/semisl_cls_head.py | 52 +- .../heads/semisl_multilabel_cls_head.py | 175 +++- .../mmcls}/models/heads/supcon_cls_head.py | 23 +- .../adapters/mmcls/models/losses/__init__.py | 29 + .../asymmetric_angular_loss_with_ignore.py | 23 +- .../losses/asymmetric_loss_with_ignore.py | 26 +- .../mmcls}/models/losses/barlowtwins_loss.py | 24 +- .../models/losses/cross_entropy_loss.py | 9 +- .../adapters/mmcls}/models/losses/ib_loss.py | 32 +- .../adapters/mmcls/models/necks/__init__.py | 3 +- .../adapters/mmcls/models/necks/mmov_neck.py | 27 + .../adapters/mmcls/models/necks/selfsl_mlp.py | 6 +- .../adapters/mmcls/optimizer/__init__.py | 19 + .../adapters/mmcls}/optimizer/lars.py | 49 +- .../adapters/mmcls/tasks/__init__.py | 16 + .../adapters/mmcls/tasks}/evaluator.py | 13 +- .../adapters/mmcls/tasks}/explainer.py | 25 +- .../adapters/mmcls/tasks}/exporter.py | 18 +- .../mmcls/tasks}/incremental/__init__.py | 1 + .../mmcls/tasks/incremental/inferrer.py | 21 + .../mmcls/tasks}/incremental/stage.py | 26 +- .../mmcls/tasks/incremental/trainer.py | 21 + .../adapters/mmcls/tasks}/inferrer.py | 35 +- .../adapters/mmcls/tasks}/semisl/__init__.py | 1 + .../adapters/mmcls/tasks/semisl/inferrer.py | 21 + .../adapters/mmcls/tasks}/semisl/stage.py | 11 +- .../adapters/mmcls/tasks/semisl/trainer.py | 21 + .../adapters/mmcls/tasks}/stage.py | 56 +- .../adapters/mmcls/tasks}/trainer.py | 16 +- .../adapters/mmcls/utils/builder.py | 2 +- .../adapters/mmcls/utils/config_utils.py | 2 +- .../configs/base/data/semisl/data_pipeline.py | 2 +- .../classification/configs/configuration.yaml | 12 +- .../selfsl/hparam.yaml | 2 +- .../semisl/hparam.yaml | 2 +- .../efficientnet_b0_cls_incr/template.yaml | 2 +- .../selfsl/hparam.yaml | 2 +- .../semisl/hparam.yaml | 2 +- .../efficientnet_v2_s_cls_incr/template.yaml | 2 +- .../selfsl/hparam.yaml | 2 +- .../template_experiment.yaml | 2 +- .../selfsl/hparam.yaml | 2 +- .../semisl/hparam.yaml | 2 +- .../supcon/model.py | 1 + .../template.yaml | 2 +- .../selfsl/hparam.yaml | 2 +- .../template_experiment.yaml | 2 +- .../classification/tasks/__init__.py | 2 +- .../classification/tasks/inference.py | 22 +- otx/algorithms/classification/tasks/nncf.py | 2 +- otx/algorithms/classification/tasks/train.py | 4 +- .../common/adapters/mmcv/__init__.py | 14 + otx/algorithms/common/adapters/mmcv/hooks.py | 750 ------------------ .../common/adapters/mmcv/hooks/__init__.py | 89 +++ .../mmcv/hooks/adaptive_training_hook.py} | 17 +- .../common/adapters/mmcv/hooks/cancel_hook.py | 89 +++ .../adapters/mmcv}/hooks/checkpoint_hook.py | 42 +- .../mmcv}/hooks/composed_dataloaders_hook.py | 24 +- .../mmcv/hooks/custom_model_ema_hook.py | 113 +++ .../mmcv/hooks/dual_model_ema_hook.py} | 36 +- .../mmcv}/hooks/early_stopping_hook.py | 96 ++- .../common/adapters/mmcv}/hooks/eval_hook.py | 24 +- .../adapters/mmcv/hooks/force_train_hook.py | 38 + .../mmcv}/hooks/fp16_sam_optimizer_hook.py | 9 +- .../adapters/mmcv}/hooks/ib_loss_hook.py | 15 +- .../common/adapters/mmcv/hooks/logger_hook.py | 87 ++ .../adapters/mmcv}/hooks/model_ema_v2_hook.py | 23 +- .../adapters/mmcv/hooks/no_bias_decay_hook.py | 73 ++ .../adapters/mmcv/hooks/progress_hook.py | 101 +++ .../mmcv/hooks/recording_forward_hook.py} | 70 +- .../mmcv}/hooks/sam_optimizer_hook.py | 9 +- .../adapters/mmcv}/hooks/semisl_cls_hook.py | 13 +- .../adapters/mmcv}/hooks/task_adapt_hook.py | 14 +- .../mmcv/hooks/two_crop_transform_hook.py | 92 +++ .../mmcv}/hooks/unbiased_teacher_hook.py | 13 +- .../adapters/mmcv/hooks/workflow_hook.py} | 57 +- .../mmcv/models/backbones/efficientnet.py | 2 +- .../mmcv/models/backbones/efficientnetv2.py | 2 +- .../mmcv/models/backbones/mobilenetv3.py | 2 +- .../common/adapters/mmcv/nncf/patches.py | 8 +- .../common/adapters/mmcv/nncf/utils.py | 2 +- .../adapters/mmcv/pipelines}/__init__.py | 4 +- .../mmcv/pipelines/transforms}/__init__.py | 4 +- .../mmcv}/pipelines/transforms/augments.py | 94 ++- .../transforms/cython_augments}/__init__.py | 3 +- .../transforms/cython_augments/cv_augment.pyx | 0 .../cython_augments/pil_augment.pyx | 0 .../common/adapters/mmcv/tasks}/__init__.py | 16 +- .../common/adapters/mmcv/tasks}/builder.py | 54 +- .../adapters/mmcv/tasks}/exporter_mixin.py | 16 +- .../common/adapters/mmcv/tasks}/registry.py | 1 + .../common/adapters/mmcv/tasks}/stage.py | 192 +++-- .../common/adapters/mmcv/tasks}/version.py | 2 + .../common/adapters/mmcv/tasks}/workflow.py | 12 +- .../common/adapters/mmcv/utils/__init__.py | 2 + .../adapters/mmcv/utils/config_utils.py | 225 +++++- .../common/adapters/mmdeploy/__init__.py | 10 + .../common/adapters/mmdeploy}/apis.py | 37 +- .../adapters/mmdeploy}/utils/__init__.py | 1 + .../adapters/mmdeploy}/utils/mmdeploy.py | 20 +- .../common/adapters/mmdeploy}/utils/onnx.py | 3 + .../mmdeploy}/utils/operations_domain.py | 2 + .../common/adapters/mmdeploy}/utils/utils.py | 3 + .../common/adapters/torch}/__init__.py | 4 +- .../adapters/torch/dataloaders/__init__.py | 10 + .../torch/dataloaders}/composed_dataloader.py | 32 +- .../torch/dataloaders/samplers/__init__.py | 11 + .../dataloaders}/samplers/balanced_sampler.py | 14 +- .../dataloaders}/samplers/cls_incr_sampler.py | 14 +- .../common/configs/training_base.py | 16 +- otx/algorithms/common/tasks/nncf_base.py | 5 +- otx/algorithms/common/tasks/training_base.py | 28 +- otx/algorithms/common/utils/distance_utils.py | 15 + otx/algorithms/common/utils/ext_loader.py | 21 + .../common}/utils/logger.py | 41 +- .../common}/utils/mo_wrapper.py | 52 +- .../common}/utils/task_adapt.py | 49 +- otx/algorithms/common/utils/utils.py | 76 +- .../mmdet/datasets/task_adapt_dataset.py | 5 +- .../mmdet/hooks/det_saliency_map_hook.py | 4 +- .../mmdet/models/backbones/mmov_backbone.py | 2 +- .../mmdet/models/dense_heads/mmov_rpn_head.py | 4 +- .../mmdet/models/dense_heads/mmov_ssd_head.py | 2 +- .../models/dense_heads/mmov_yolov3_head.py | 2 +- .../models/detectors/custom_atss_detector.py | 10 +- .../detectors/custom_maskrcnn_detector.py | 8 +- .../detectors/custom_single_stage_detector.py | 10 +- .../detectors/custom_two_stage_detector.py | 4 +- .../models/detectors/custom_vfnet_detector.py | 4 +- .../models/detectors/custom_yolox_detector.py | 10 +- .../models/detectors/unbiased_teacher.py | 2 +- .../adapters/mmdet/models/necks/mmov_fpn.py | 2 +- .../mmdet/models/necks/mmov_ssd_neck.py | 2 +- .../mmdet/models/necks/mmov_yolov3_neck.py | 4 +- .../roi_heads/bbox_heads/mmov_bbox_head.py | 2 +- .../roi_heads/mask_heads/mmov_mask_head.py | 2 +- .../detection/adapters/mmdet/nncf/patches.py | 2 +- .../adapters/mmdet/tasks}/__init__.py | 7 +- .../adapters/mmdet/tasks}/explainer.py | 35 +- .../adapters/mmdet/tasks}/exporter.py | 18 +- .../mmdet/tasks}/incremental/__init__.py | 3 +- .../mmdet/tasks/incremental/inferrer.py | 21 + .../mmdet/tasks}/incremental/stage.py | 15 +- .../mmdet/tasks/incremental/trainer.py | 21 + .../adapters/mmdet/tasks}/inferrer.py | 53 +- .../adapters/mmdet/tasks}/semisl/__init__.py | 3 +- .../adapters/mmdet/tasks}/semisl/exporter.py | 11 +- .../adapters/mmdet/tasks}/semisl/inferrer.py | 10 +- .../adapters/mmdet/tasks}/semisl/stage.py | 20 +- .../adapters/mmdet/tasks/semisl/trainer.py | 21 + .../detection/adapters/mmdet/tasks}/stage.py | 64 +- .../adapters/mmdet/tasks}/trainer.py | 18 +- .../detection/adapters/mmdet/utils/builder.py | 2 +- .../adapters/mmdet/utils/config_utils.py | 2 +- .../configs/detection/configuration.yaml | 8 +- .../cspdarknet_yolox/semisl/hparam.yaml | 2 +- .../detection/cspdarknet_yolox/template.yaml | 2 +- .../mobilenetv2_atss/semisl/hparam.yaml | 2 +- .../detection/mobilenetv2_atss/template.yaml | 2 +- .../mobilenetv2_ssd/semisl/hparam.yaml | 2 +- .../detection/mobilenetv2_ssd/template.yaml | 2 +- .../resnet50_vfnet/template_experimental.yaml | 2 +- .../instance_segmentation/configuration.yaml | 8 +- .../efficientnetb2b_maskrcnn/template.yaml | 2 +- .../resnet50_maskrcnn/template.yaml | 2 +- .../rotated_detection/configuration.yaml | 8 +- .../efficientnetb2b_maskrcnn/template.yaml | 2 +- .../resnet50_maskrcnn/template.yaml | 2 +- otx/algorithms/detection/tasks/__init__.py | 2 +- otx/algorithms/detection/tasks/inference.py | 12 +- otx/algorithms/detection/tasks/nncf.py | 2 +- otx/algorithms/detection/tasks/openvino.py | 2 +- otx/algorithms/detection/tasks/train.py | 5 +- .../segmentation/adapters/__init__.py | 14 +- .../segmentation/adapters/mmseg/__init__.py | 54 +- .../mmseg/{data => datasets}/__init__.py | 12 +- .../mmseg/{data => datasets}/dataset.py | 2 +- .../mmseg/datasets/pipelines/__init__.py | 21 + .../mmseg}/datasets/pipelines/compose.py | 21 +- .../mmseg/datasets/pipelines/loads.py | 57 ++ .../pipelines/transforms.py} | 160 +++- .../adapters/mmseg/models/__init__.py | 36 +- .../mmseg/models/backbones/__init__.py | 24 + .../mmseg}/models/backbones/litehrnet.py | 87 +- .../mmseg/models}/backbones/mmov_backbone.py | 14 +- .../adapters/mmseg/models/heads/__init__.py | 21 + .../mmseg}/models/heads/custom_fcn_head.py | 18 +- .../adapters/mmseg/models/heads/mixin.py} | 149 +++- .../mmseg/models/heads}/mmov_decode_head.py | 26 +- .../adapters/mmseg/models/losses/__init__.py | 5 +- .../mmseg}/models/losses/base_pixel_loss.py | 21 +- .../models/losses/base_weighted_loss.py | 21 +- .../losses/cross_entropy_loss_with_ignore.py | 10 +- .../mmseg/models/losses/detcon_loss.py | 2 +- .../mmseg/models/losses/otx_pixel_base.py} | 13 +- .../adapters/mmseg/models/necks/__init__.py | 2 +- .../adapters/mmseg/models/necks/selfsl_mlp.py | 2 +- .../mmseg/models/schedulers/__init__.py | 25 + .../adapters/mmseg/models/schedulers}/base.py | 7 +- .../mmseg/models/schedulers}/constant.py | 9 +- .../adapters/mmseg/models/schedulers}/poly.py | 9 +- .../adapters/mmseg/models/schedulers}/step.py | 8 +- .../mmseg/models/segmentors/__init__.py | 6 +- .../segmentors/class_incr_encoder_decoder.py | 109 +++ .../mmseg/models/segmentors/detcon.py | 17 +- .../segmentors/mean_teacher_segmentor.py | 66 +- .../mmseg/models/segmentors/mixin.py} | 17 +- .../models/segmentors/otx_encoder_decoder.py | 27 +- .../adapters/mmseg}/models/utils/__init__.py | 8 +- .../mmseg}/models/utils/aggregator.py | 28 +- .../mmseg}/models/utils/angular_pw_conv.py | 12 +- .../utils/asymmetric_position_attention.py | 23 +- .../mmseg}/models/utils/channel_shuffle.py | 3 +- .../mmseg}/models/utils/local_attention.py | 15 +- .../mmseg/models/utils/loss_equalizer.py} | 6 +- .../adapters/mmseg}/models/utils/normalize.py | 22 +- .../adapters/mmseg}/models/utils/psp_layer.py | 15 +- .../adapters/mmseg/nncf/__init__.py | 17 +- .../adapters/mmseg/nncf/builder.py | 2 +- .../segmentation/adapters/mmseg/nncf/hooks.py | 2 +- .../adapters/mmseg/nncf/patches.py | 2 +- .../adapters/mmseg/tasks/__init__.py | 21 + .../adapters/mmseg/tasks}/exporter.py | 16 +- .../mmseg/tasks}/incremental/__init__.py | 3 + .../mmseg/tasks/incremental/inferrer.py | 18 + .../mmseg/tasks}/incremental/stage.py | 24 +- .../mmseg/tasks/incremental/trainer.py | 21 + .../adapters/mmseg/tasks}/inferrer.py | 28 +- .../adapters/mmseg/tasks/semisl/__init__.py | 10 + .../adapters/mmseg/tasks}/semisl/exporter.py | 12 +- .../adapters/mmseg/tasks}/semisl/inferrer.py | 9 +- .../adapters/mmseg/tasks}/semisl/stage.py | 15 +- .../adapters/mmseg/tasks/semisl/trainer.py | 21 + .../adapters/mmseg/tasks}/stage.py | 41 +- .../adapters/mmseg/tasks}/trainer.py | 17 +- .../adapters/mmseg/utils/__init__.py | 21 +- .../adapters/mmseg/utils/builder.py | 19 +- .../adapters/mmseg/utils/data_utils.py | 14 +- .../segmentation/configs/configuration.yaml | 10 +- .../ocr_lite_hrnet_18/selfsl/hparam.yaml | 2 +- .../ocr_lite_hrnet_18/semisl/hparam.yaml | 2 +- .../configs/ocr_lite_hrnet_18/template.yaml | 2 +- .../ocr_lite_hrnet_18_mod2/selfsl/hparam.yaml | 2 +- .../ocr_lite_hrnet_18_mod2/semisl/hparam.yaml | 2 +- .../ocr_lite_hrnet_18_mod2/template.yaml | 2 +- .../ocr_lite_hrnet_s_mod2/selfsl/hparam.yaml | 2 +- .../ocr_lite_hrnet_s_mod2/semisl/hparam.yaml | 2 +- .../ocr_lite_hrnet_s_mod2/template.yaml | 2 +- .../ocr_lite_hrnet_x_mod3/selfsl/hparam.yaml | 2 +- .../ocr_lite_hrnet_x_mod3/semisl/hparam.yaml | 2 +- .../ocr_lite_hrnet_x_mod3/template.yaml | 2 +- otx/algorithms/segmentation/tasks/__init__.py | 2 +- .../segmentation/tasks/inference.py | 16 +- otx/algorithms/segmentation/tasks/nncf.py | 2 +- otx/algorithms/segmentation/tasks/openvino.py | 2 +- otx/algorithms/segmentation/tasks/train.py | 5 +- otx/api/entities/media.py | 2 +- .../exportable_code/demo/requirements.txt | 2 +- otx/cli/builder/builder.py | 13 +- otx/cli/builder/supported_backbone/mmcls.json | 6 +- otx/cli/manager/config_manager.py | 52 +- otx/cli/tools/build.py | 2 +- otx/cli/tools/train.py | 2 +- otx/cli/utils/errors.py | 30 + otx/cli/utils/importing.py | 2 +- otx/core/data/adapter/__init__.py | 32 +- .../adapter/segmentation_dataset_adapter.py | 2 +- otx/core/data/caching/mem_cache_handler.py | 2 +- otx/core/ov/__init__.py | 9 + otx/core/ov/graph/__init__.py | 9 + otx/{mpa/modules => core}/ov/graph/graph.py | 147 +++- otx/core/ov/graph/parsers/__init__.py | 8 + otx/core/ov/graph/parsers/builder.py | 8 + otx/core/ov/graph/parsers/cls/__init__.py | 8 + .../ov/graph/parsers/cls/cls_base_parser.py | 31 +- .../ov/graph/parsers/parser.py | 8 +- otx/{mpa/modules => core}/ov/graph/utils.py | 52 +- otx/core/ov/models/__init__.py | 14 + .../modules => core}/ov/models/mmov_model.py | 20 +- .../modules => core}/ov/models/ov_model.py | 100 ++- .../ov/models/parser_mixin.py | 16 +- otx/{mpa/modules => core}/ov/omz_wrapper.py | 251 +++--- otx/core/ov/ops/__init__.py | 140 ++++ otx/core/ov/ops/activations.py | 356 +++++++++ .../modules => core}/ov/ops/arithmetics.py | 55 +- otx/{mpa/modules => core}/ov/ops/builder.py | 38 +- .../modules => core}/ov/ops/convolutions.py | 41 +- .../modules => core}/ov/ops/generation.py | 16 +- .../ov/ops/image_processings.py | 50 +- .../ov/ops/infrastructures.py | 54 +- otx/{mpa/modules => core}/ov/ops/matmuls.py | 19 +- otx/core/ov/ops/modules/__init__.py | 8 + otx/core/ov/ops/modules/op_module.py | 104 +++ otx/{mpa/modules => core}/ov/ops/movements.py | 242 ++++-- .../modules => core}/ov/ops/normalizations.py | 67 +- .../ov/ops/object_detections.py | 64 +- otx/{mpa/modules => core}/ov/ops/op.py | 41 +- otx/{mpa/modules => core}/ov/ops/poolings.py | 54 +- .../modules => core}/ov/ops/reductions.py | 61 +- .../ov/ops/shape_manipulations.py | 72 +- .../ov/ops/sorting_maximization.py | 41 +- .../ov/ops/type_conversions.py | 20 +- otx/core/ov/ops/utils.py | 39 + otx/{mpa/modules => core}/ov/registry.py | 18 +- otx/{mpa/modules => core}/ov/utils.py | 72 +- otx/hpo/hpo_base.py | 2 +- otx/hpo/hyperband.py | 4 +- otx/hpo/resource_manager.py | 2 +- otx/hpo/search_space.py | 2 +- otx/hpo/utils.py | 91 +++ otx/mpa/cls/__init__.py | 37 - otx/mpa/cls/incremental/inferrer.py | 17 - otx/mpa/cls/incremental/trainer.py | 17 - otx/mpa/cls/semisl/inferrer.py | 17 - otx/mpa/cls/semisl/trainer.py | 17 - otx/mpa/csrc/mpl/lib_mpl.cpp | 70 -- otx/mpa/csrc/mpl/lib_mpl.h | 12 - otx/mpa/csrc/mpl/pybind.cpp | 20 - otx/mpa/deploy/__init__.py | 9 - otx/mpa/det/incremental/inferrer.py | 17 - otx/mpa/det/incremental/trainer.py | 17 - otx/mpa/det/semisl/trainer.py | 17 - otx/mpa/modules/__init__.py | 12 - .../datasets/pipelines/transforms/__init__.py | 5 - .../transforms/cython_augments/__init__.py | 0 .../pipelines/transforms/random_augment.py | 171 ---- .../transforms/seg_custom_pipelines.py | 122 --- otx/mpa/modules/hooks/__init__.py | 24 - .../modules/hooks/cancel_interface_hook.py | 40 - otx/mpa/modules/hooks/logger_replace_hook.py | 24 - otx/mpa/modules/hooks/no_bias_decay_hook.py | 70 -- .../modules/hooks/save_initial_weight_hook.py | 19 - otx/mpa/modules/models/__init__.py | 5 - otx/mpa/modules/models/backbones/__init__.py | 5 - otx/mpa/modules/models/builder.py | 20 - .../modules/models/classifiers/__init__.py | 11 - otx/mpa/modules/models/heads/__init__.py | 5 - .../modules/models/heads/aggregator_mixin.py | 63 -- .../modules/models/heads/mix_loss_mixin.py | 40 - .../models/heads/segment_out_norm_mixin.py | 32 - otx/mpa/modules/models/heads/utils.py | 56 -- otx/mpa/modules/models/losses/__init__.py | 5 - .../models/scalar_schedulers/__init__.py | 13 - otx/mpa/modules/models/segmentors/__init__.py | 6 - .../segmentors/class_incr_encoder_decoder.py | 67 -- .../models/segmentors/mix_loss_mixin.py | 40 - otx/mpa/modules/optimizer/__init__.py | 5 - otx/mpa/modules/ov/__init__.py | 8 - otx/mpa/modules/ov/graph/__init__.py | 6 - otx/mpa/modules/ov/graph/parsers/__init__.py | 8 - otx/mpa/modules/ov/graph/parsers/builder.py | 7 - .../modules/ov/graph/parsers/cls/__init__.py | 6 - otx/mpa/modules/ov/models/mmcls/__init__.py | 6 - .../ov/models/mmcls/backbones/__init__.py | 6 - .../models/mmcls/backbones/mmov_backbone.py | 27 - .../modules/ov/models/mmcls/heads/__init__.py | 9 - .../modules/ov/models/mmcls/necks/__init__.py | 6 - .../ov/models/mmcls/necks/mmov_neck.py | 23 - otx/mpa/modules/ov/models/mmseg/__init__.py | 6 - .../ov/models/mmseg/backbones/__init__.py | 6 - .../ov/models/mmseg/decode_heads/__init__.py | 6 - otx/mpa/modules/ov/ops/__init__.py | 23 - otx/mpa/modules/ov/ops/activations.py | 271 ------- otx/mpa/modules/ov/ops/modules/__init__.py | 6 - otx/mpa/modules/ov/ops/modules/op_module.py | 76 -- otx/mpa/modules/ov/ops/utils.py | 48 -- otx/mpa/modules/utils/__init__.py | 0 otx/mpa/modules/utils/distance_utils.py | 14 - otx/mpa/modules/utils/seg_utils.py | 15 - otx/mpa/seg/__init__.py | 19 - otx/mpa/seg/incremental/inferrer.py | 14 - otx/mpa/seg/incremental/trainer.py | 17 - otx/mpa/seg/semisl/__init__.py | 7 - otx/mpa/seg/semisl/trainer.py | 17 - otx/mpa/utils/__init__.py | 0 otx/mpa/utils/config_utils.py | 185 ----- otx/mpa/utils/convert_keys.py | 0 otx/mpa/utils/ext_loader.py | 13 - otx/mpa/utils/file.py | 8 - pyproject.toml | 4 + requirements/api.txt | 1 + setup.py | 12 +- .../compressed_model.yml | 4 +- .../compressed_model.yml | 4 +- .../compressed_model.yml | 4 +- .../cli/classification/test_classification.py | 6 +- .../compressed_model.yml | 4 +- .../compressed_model.yml | 4 +- .../compressed_model.yml | 4 +- .../compressed_model.yml | 4 +- .../compressed_model.yml | 4 +- tests/e2e/cli/detection/test_detection.py | 2 +- .../e2e/cli/segmentation/test_segmentation.py | 4 +- tests/fuzzing/cli_fuzzing.py | 3 + .../api/xai/test_api_xai_validity.py | 6 +- .../cli/classification/test_classification.py | 8 +- .../cli/detection/test_detection.py | 2 +- .../cli/segmentation/test_segmentation.py | 4 +- tests/integration/cli/test_cli.py | 12 +- .../classification/test_classification.py | 4 +- tests/regression/detection/test_detection.py | 2 +- .../segmentation/test_segmentation.py | 4 +- tests/test_suite/run_test_command.py | 6 +- .../utils/test_action_config_utils.py | 46 +- .../test_action_sample_classification.py | 2 +- .../tools/test_action_sample_detection.py | 2 +- ...test_action_convert_public_data_to_cvat.py | 64 +- .../adapters/mmcls/data/test_datasets.py | 4 +- .../adapters/mmcls/data/test_pipelines.py | 12 +- .../models/classifiers/test_sam_classifier.py | 2 +- .../classifiers/test_semisl_classifier.py | 2 +- .../classifiers/test_semisl_mlc_classifier.py | 2 +- .../classifiers/test_supcon_classifier.py | 2 +- .../models}/heads/test_custom_cls_head.py | 2 +- .../test_custom_hierarchical_cls_head.py | 6 +- .../heads/test_custom_multilabel_cls_head.py | 6 +- .../models}/heads/test_multilabel_semisl.py | 8 +- .../models}/heads/test_semisl_cls_head.py | 2 +- .../adapters/mmcls/models/losses/__init__.py | 4 + .../losses/test_asymmetric_multilabel.py | 4 +- .../models}/losses/test_cross_entropy.py | 4 +- .../adapters/mmcls/optimizer/__init__.py | 4 + .../adapters/mmcls}/optimizer/test_lars.py | 4 +- .../incremental/test_cls_incremental_stage.py | 13 +- .../tasks}/semisl/test_cls_semisl_stage.py | 6 +- .../mmcls/tasks}/test_cls_evaluator.py | 4 +- .../mmcls/tasks}/test_cls_explanier.py | 10 +- .../mmcls/tasks}/test_cls_exporter.py | 6 +- .../mmcls/tasks}/test_cls_inferrer.py | 4 +- .../adapters/mmcls/tasks}/test_cls_stage.py | 14 +- .../adapters/mmcls/tasks}/test_cls_trainer.py | 6 +- .../adapters/mmcls/test_cls_config_builder.py | 2 +- .../test_mmcls_data_params_validation.py | 2 +- .../algorithms/classification/test_helper.py | 2 +- .../hooks/test_adaptive_training_hooks.py} | 10 +- .../mmcv/hooks/test_cancel_interface_hook.py} | 4 +- .../mmcv/hooks/test_checkpoint_hook.py} | 8 +- .../hooks/test_composed_dataloader_hook.py} | 6 +- .../mmcv/hooks/test_early_stopping_hook.py} | 26 +- .../adapters/mmcv/hooks/test_ema_v2_hook.py} | 7 +- .../adapters/mmcv/hooks/test_eval_hook.py} | 6 +- .../hooks/test_fp16_sam_optimizer_hook.py} | 6 +- .../adapters/mmcv/hooks/test_ib_loss_hook.py} | 4 +- .../mmcv/hooks/test_logger_replace_hook.py} | 4 +- .../mmcv/hooks/test_model_ema_hook.py} | 7 +- .../mmcv/hooks/test_no_bias_decay_hook.py} | 4 +- .../hooks/test_recording_forward_hooks.py} | 4 +- .../hooks/test_save_initial_weight_hook.py} | 4 +- .../mmcv/hooks/test_semisl_cls_hook.py} | 4 +- .../mmcv/hooks/test_task_adapt_hook.py} | 4 +- .../mmcv/hooks/test_unbiased_teacher_hook.py} | 6 +- .../mmcv/hooks/test_workflow_hooks.py} | 4 +- .../adapters/mmcv/pipelines/__init__.py | 4 + .../mmcv/pipelines/transforms/__init__.py | 4 + .../pipelines/transforms/test_augments.py | 2 +- .../mmcv}/pipelines/transforms/test_augmix.py | 14 +- .../transforms/test_otx_transforms.py} | 4 +- .../transforms/test_random_augment.py | 28 +- .../transforms/test_twocrop_transform.py | 2 +- .../adapters/mmcv/tasks/test_builder.py | 37 + .../adapters/mmcv/tasks}/test_export_mixin.py | 4 +- .../adapters/mmcv/tasks}/test_helpers.py | 0 .../common/adapters/mmcv/tasks}/test_stage.py | 16 +- .../adapters/mmcv/tasks}/test_version.py | 2 +- .../adapters/mmcv/tasks}/test_workflow.py | 11 +- .../common/adapters/mmdeploy/__init__.py | 3 + .../adapters/mmdeploy}/test_deploy_apis.py | 15 +- .../common/adapters/mmdeploy}/test_helpers.py | 0 .../utils/test_deploy_utils_mmdeploy.py | 7 +- .../mmdeploy}/utils/test_deploy_utils_onnx.py | 9 +- .../test_deploy_utils_operations_domain.py | 5 +- .../utils/test_deploy_utils_utils.py | 5 +- .../adapters/torch/dataloaders/__init__.py | 4 + .../samplers/test_balanced_sampler.py | 5 +- .../samplers/test_cls_incr_sampler.py | 2 +- .../incremental/test_det_incremental_stage.py | 8 +- .../tasks}/semisl/test_det_semisl_stage.py | 8 +- .../mmdet/tasks}/test_det_exporter.py | 8 +- .../mmdet/tasks}/test_det_inferrer.py | 7 +- .../adapters/mmdet/tasks}/test_det_stage.py | 22 +- .../adapters/mmdet/tasks}/test_det_trainer.py | 8 +- .../mmdet/utils/test_detection_builder.py | 2 +- .../utils/test_detection_config_utils.py | 2 +- .../adapters/mmseg/data/__init__.py | 4 - .../adapters/mmseg/data/test_pipelines.py | 151 ---- .../adapters/mmseg/datasets}/__init__.py | 3 +- .../mmseg/datasets/pipelines}/__init__.py | 3 +- .../mmseg}/datasets/pipelines/test_compose.py | 2 +- .../mmseg/datasets/pipelines/test_loads.py | 53 ++ .../test_pipelines_params_validation.py | 2 +- .../datasets/pipelines/test_transforms.py | 313 ++++++++ .../mmseg/{ => datasets}/test_dataset.py | 2 +- .../test_dataset_params_validation.py | 2 +- .../mmseg/models/backbones/__init__.py | 4 + .../mmseg}/models/backbones/test_litehrnet.py | 2 +- .../backbones/test_mmseg_mmov_backbone.py} | 2 +- .../adapters/mmseg/models/heads/__init__.py | 4 + .../heads/test_mmseg_mmov_decode_head.py} | 2 +- .../models/scalar_schedulers/__init__.py | 4 + .../scalar_schedulers/test_schedulers.py | 2 +- .../mmseg/models/utils}/test_utils.py | 2 +- .../adapters/mmseg/tasks}/__init__.py | 0 .../mmseg/tasks/incremental}/__init__.py | 0 .../incremental/test_seg_incremental_stage.py | 10 +- .../adapters/mmseg/tasks/semisl}/__init__.py | 0 .../tasks}/semisl/test_seg_semisl_inferrer.py | 6 +- .../tasks}/semisl/test_seg_semisl_stage.py | 10 +- .../mmseg/tasks}/test_seg_exporter.py | 8 +- .../mmseg/tasks}/test_seg_inferrer.py | 7 +- .../adapters/mmseg/tasks}/test_seg_stage.py | 14 +- .../adapters/mmseg/tasks}/test_seg_trainer.py | 8 +- .../adapters/mmseg/test_pipelines.py | 122 --- .../adapters/mmseg/utils}/__init__.py | 3 +- .../mmseg/{ => utils}/test_config_utils.py | 0 .../test_config_utils_params_validation.py | 0 .../mmseg/{ => utils}/test_data_utils.py | 0 .../test_data_utils_params_validation.py | 0 tests/unit/cli/builder/test_cli_builder.py | 2 +- tests/unit/cli/manager/test_config_manager.py | 42 +- tests/unit/cli/tools/test_build.py | 4 +- tests/unit/core/data/adapter/test_init.py | 6 +- .../graph/parsers/test_ov_graph_cls_parser.py | 6 +- .../ov/graph/parsers/test_ov_graph_parser.py | 6 +- .../ov/graph/test_ov_graph_grapy.py | 2 +- .../ov/graph/test_ov_graph_utils.py | 6 +- .../modules => core}/ov/models/__init__.py | 0 .../ov/models/mmcls/__init__.py | 0 .../backbones/test_ov_mmcls_mmov_backbone.py | 6 +- .../mmcls/heads/test_ov_mmcls_cls_head.py | 2 +- .../mmcls/heads/test_ov_mmcls_conv_head.py | 4 +- .../heads/test_ov_mmcls_mmcv_cls_head.py | 6 +- .../mmcls/necks/test_ov_mmcls_mmov_neck.py | 4 +- .../ov/models/mmcls/test_helpers.py | 0 .../ov/models/test_ov_models_ov_model.py | 2 +- .../ov/ops/test_ov_ops_activations.py | 2 +- .../ov/ops/test_ov_ops_arithmetics.py | 8 +- .../ov/ops/test_ov_ops_builder.py | 4 +- .../ov/ops/test_ov_ops_convolutions.py | 2 +- .../ov/ops/test_ov_ops_generation.py | 2 +- .../ov/ops/test_ov_ops_image_processings.py | 2 +- .../ov/ops/test_ov_ops_infrastructures.py | 2 +- .../ov/ops/test_ov_ops_matmuls.py | 2 +- .../ov/ops/test_ov_ops_module.py | 4 +- .../ov/ops/test_ov_ops_movements.py | 2 +- .../ov/ops/test_ov_ops_normalizations.py | 2 +- .../ov/ops/test_ov_ops_object_detections.py | 2 +- .../modules => core}/ov/ops/test_ov_ops_op.py | 2 +- .../ov/ops/test_ov_ops_poolings.py | 2 +- .../ov/ops/test_ov_ops_reductions.py | 2 +- .../ov/ops/test_ov_ops_shape_manipulations.py | 2 +- .../ops/test_ov_ops_sorting_maximization.py | 2 +- .../ov/ops/test_ov_ops_type_conversions.py | 2 +- .../ov/ops/test_ov_ops_utils.py | 3 +- .../ov/test_ov_omz_wrapper.py | 2 +- .../modules => core}/ov/test_ov_registry.py | 2 +- .../{mpa/modules => core}/ov/test_ov_utils.py | 10 +- tests/unit/mpa/deploy/__init__.py | 12 +- tests/unit/mpa/modules/__init__.py | 4 - tests/unit/mpa/modules/datasets/__init__.py | 4 - .../modules/datasets/pipelines/__init__.py | 4 - .../datasets/pipelines/transforms/__init__.py | 4 - .../transforms/test_seg_custom_pipelines.py | 103 --- tests/unit/mpa/modules/heads/__init__.py | 4 - .../hooks/test_mpa_fp16_sam_optimizer_hook.py | 18 - tests/unit/mpa/modules/losses/__init__.py | 4 - tests/unit/mpa/modules/optimizer/__init__.py | 4 - tests/unit/mpa/seg/semisl/__init__.py | 3 - tests/unit/mpa/test_augments.py | 2 +- tests/unit/mpa/test_builder.py | 37 - tox.ini | 6 +- 663 files changed, 8301 insertions(+), 6731 deletions(-) create mode 100644 docs/source/_static/logos/github_icon.png create mode 100644 docs/source/guide/explanation/additional_features/xai.rst create mode 100644 docs/source/guide/reference/core/index.rst rename docs/source/guide/reference/{mpa/modules => core}/ov/graph.rst (51%) rename docs/source/guide/reference/{mpa/modules => core}/ov/index.rst (56%) create mode 100644 docs/source/guide/reference/core/ov/models.rst create mode 100644 docs/source/guide/reference/core/ov/ops.rst delete mode 100644 docs/source/guide/reference/mpa/classification.rst delete mode 100644 docs/source/guide/reference/mpa/deploy.rst delete mode 100644 docs/source/guide/reference/mpa/detection.rst delete mode 100644 docs/source/guide/reference/mpa/modules/datasets.rst delete mode 100644 docs/source/guide/reference/mpa/modules/hooks.rst delete mode 100644 docs/source/guide/reference/mpa/modules/index.rst delete mode 100644 docs/source/guide/reference/mpa/modules/models/backbones.rst delete mode 100644 docs/source/guide/reference/mpa/modules/models/classifiers.rst delete mode 100644 docs/source/guide/reference/mpa/modules/models/heads.rst delete mode 100644 docs/source/guide/reference/mpa/modules/models/index.rst delete mode 100644 docs/source/guide/reference/mpa/modules/models/losses.rst delete mode 100644 docs/source/guide/reference/mpa/modules/models/scalar_schedulers.rst delete mode 100644 docs/source/guide/reference/mpa/modules/models/segmentors.rst delete mode 100644 docs/source/guide/reference/mpa/modules/models/utils.rst delete mode 100644 docs/source/guide/reference/mpa/modules/optimizer.rst delete mode 100644 docs/source/guide/reference/mpa/modules/ov/models.rst delete mode 100644 docs/source/guide/reference/mpa/modules/ov/ops.rst delete mode 100644 docs/source/guide/reference/mpa/modules/utils.rst delete mode 100644 docs/source/guide/reference/mpa/segmentation.rst delete mode 100644 docs/source/guide/reference/mpa/utils.rst create mode 100644 docs/utils/images/xai_cls.jpg create mode 100644 docs/utils/images/xai_det.jpg create mode 100644 docs/utils/images/xai_example.jpg rename otx/algorithms/classification/adapters/mmcls/{data => datasets}/__init__.py (69%) rename otx/algorithms/classification/adapters/mmcls/{data/datasets.py => datasets/otx_datasets.py} (99%) create mode 100644 otx/algorithms/classification/adapters/mmcls/datasets/pipelines/__init__.py rename otx/algorithms/classification/adapters/mmcls/{data/pipelines.py => datasets/pipelines/otx_pipelines.py} (100%) create mode 100644 otx/algorithms/classification/adapters/mmcls/datasets/pipelines/transforms/__init__.py rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/datasets/pipelines/transforms/augmix.py (74%) rename otx/{mpa/modules/datasets/pipelines/transforms/ote_transforms.py => algorithms/classification/adapters/mmcls/datasets/pipelines/transforms/otx_transforms.py} (80%) create mode 100644 otx/algorithms/classification/adapters/mmcls/datasets/pipelines/transforms/random_augment.py rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/datasets/pipelines/transforms/twocrop_transform.py (81%) create mode 100644 otx/algorithms/classification/adapters/mmcls/models/backbones/__init__.py create mode 100644 otx/algorithms/classification/adapters/mmcls/models/backbones/mmov_backbone.py rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/classifiers/sam_classifier.py (57%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/classifiers/sam_classifier_mixin.py (54%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/classifiers/semisl_classifier.py (91%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/classifiers/semisl_multilabel_classifier.py (76%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/classifiers/supcon_classifier.py (82%) rename otx/{mpa/modules/ov/models/mmcls => algorithms/classification/adapters/mmcls/models}/heads/cls_head.py (67%) rename otx/{mpa/modules/ov/models/mmcls => algorithms/classification/adapters/mmcls/models}/heads/conv_head.py (75%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/heads/custom_cls_head.py (74%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/heads/custom_hierarchical_linear_cls_head.py (85%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/heads/custom_hierarchical_non_linear_cls_head.py (81%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/heads/custom_multi_label_linear_cls_head.py (80%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/heads/custom_multi_label_non_linear_cls_head.py (76%) rename otx/{mpa/modules/ov/models/mmcls => algorithms/classification/adapters/mmcls/models}/heads/mmov_cls_head.py (57%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/heads/non_linear_cls_head.py (71%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/heads/semisl_cls_head.py (82%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/heads/semisl_multilabel_cls_head.py (52%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/heads/supcon_cls_head.py (86%) create mode 100644 otx/algorithms/classification/adapters/mmcls/models/losses/__init__.py rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/losses/asymmetric_angular_loss_with_ignore.py (88%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/losses/asymmetric_loss_with_ignore.py (83%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/losses/barlowtwins_loss.py (70%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/losses/cross_entropy_loss.py (83%) rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/models/losses/ib_loss.py (59%) create mode 100644 otx/algorithms/classification/adapters/mmcls/models/necks/mmov_neck.py create mode 100644 otx/algorithms/classification/adapters/mmcls/optimizer/__init__.py rename otx/{mpa/modules => algorithms/classification/adapters/mmcls}/optimizer/lars.py (74%) create mode 100644 otx/algorithms/classification/adapters/mmcls/tasks/__init__.py rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/evaluator.py (78%) rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/explainer.py (86%) rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/exporter.py (76%) rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/incremental/__init__.py (77%) create mode 100644 otx/algorithms/classification/adapters/mmcls/tasks/incremental/inferrer.py rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/incremental/stage.py (81%) create mode 100644 otx/algorithms/classification/adapters/mmcls/tasks/incremental/trainer.py rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/inferrer.py (82%) rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/semisl/__init__.py (80%) create mode 100644 otx/algorithms/classification/adapters/mmcls/tasks/semisl/inferrer.py rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/semisl/stage.py (63%) create mode 100644 otx/algorithms/classification/adapters/mmcls/tasks/semisl/trainer.py rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/stage.py (75%) rename otx/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/trainer.py (90%) delete mode 100644 otx/algorithms/common/adapters/mmcv/hooks.py create mode 100644 otx/algorithms/common/adapters/mmcv/hooks/__init__.py rename otx/{mpa/modules/hooks/adaptive_training_hooks.py => algorithms/common/adapters/mmcv/hooks/adaptive_training_hook.py} (91%) create mode 100644 otx/algorithms/common/adapters/mmcv/hooks/cancel_hook.py rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/checkpoint_hook.py (77%) rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/composed_dataloaders_hook.py (58%) create mode 100644 otx/algorithms/common/adapters/mmcv/hooks/custom_model_ema_hook.py rename otx/{mpa/modules/hooks/model_ema_hook.py => algorithms/common/adapters/mmcv/hooks/dual_model_ema_hook.py} (83%) rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/early_stopping_hook.py (84%) rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/eval_hook.py (83%) create mode 100644 otx/algorithms/common/adapters/mmcv/hooks/force_train_hook.py rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/fp16_sam_optimizer_hook.py (93%) rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/ib_loss_hook.py (74%) create mode 100644 otx/algorithms/common/adapters/mmcv/hooks/logger_hook.py rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/model_ema_v2_hook.py (90%) create mode 100644 otx/algorithms/common/adapters/mmcv/hooks/no_bias_decay_hook.py create mode 100644 otx/algorithms/common/adapters/mmcv/hooks/progress_hook.py rename otx/{mpa/modules/hooks/recording_forward_hooks.py => algorithms/common/adapters/mmcv/hooks/recording_forward_hook.py} (80%) rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/sam_optimizer_hook.py (93%) rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/semisl_cls_hook.py (81%) rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/task_adapt_hook.py (86%) create mode 100644 otx/algorithms/common/adapters/mmcv/hooks/two_crop_transform_hook.py rename otx/{mpa/modules => algorithms/common/adapters/mmcv}/hooks/unbiased_teacher_hook.py (83%) rename otx/{mpa/modules/hooks/workflow_hooks.py => algorithms/common/adapters/mmcv/hooks/workflow_hook.py} (67%) rename {tests/unit/mpa/modules/models => otx/algorithms/common/adapters/mmcv/pipelines}/__init__.py (66%) rename {tests/unit/mpa/modules/models/scalar_schedulers => otx/algorithms/common/adapters/mmcv/pipelines/transforms}/__init__.py (60%) rename otx/{mpa/modules/datasets => algorithms/common/adapters/mmcv}/pipelines/transforms/augments.py (69%) rename {tests/unit/mpa/modules/models/backbones => otx/algorithms/common/adapters/mmcv/pipelines/transforms/cython_augments}/__init__.py (60%) rename otx/{mpa/modules/datasets => algorithms/common/adapters/mmcv}/pipelines/transforms/cython_augments/cv_augment.pyx (100%) rename otx/{mpa/modules/datasets => algorithms/common/adapters/mmcv}/pipelines/transforms/cython_augments/pil_augment.pyx (100%) rename otx/{mpa => algorithms/common/adapters/mmcv/tasks}/__init__.py (68%) rename otx/{mpa => algorithms/common/adapters/mmcv/tasks}/builder.py (70%) rename otx/{mpa => algorithms/common/adapters/mmcv/tasks}/exporter_mixin.py (89%) rename otx/{mpa => algorithms/common/adapters/mmcv/tasks}/registry.py (81%) rename otx/{mpa => algorithms/common/adapters/mmcv/tasks}/stage.py (78%) rename otx/{mpa => algorithms/common/adapters/mmcv/tasks}/version.py (64%) rename otx/{mpa => algorithms/common/adapters/mmcv/tasks}/workflow.py (92%) create mode 100644 otx/algorithms/common/adapters/mmdeploy/__init__.py rename otx/{mpa/deploy => algorithms/common/adapters/mmdeploy}/apis.py (90%) rename otx/{mpa/deploy => algorithms/common/adapters/mmdeploy}/utils/__init__.py (80%) rename otx/{mpa/deploy => algorithms/common/adapters/mmdeploy}/utils/mmdeploy.py (71%) rename otx/{mpa/deploy => algorithms/common/adapters/mmdeploy}/utils/onnx.py (87%) rename otx/{mpa/deploy => algorithms/common/adapters/mmdeploy}/utils/operations_domain.py (73%) rename otx/{mpa/deploy => algorithms/common/adapters/mmdeploy}/utils/utils.py (90%) rename {tests/unit/mpa/modules/models/classifiers => otx/algorithms/common/adapters/torch}/__init__.py (60%) create mode 100644 otx/algorithms/common/adapters/torch/dataloaders/__init__.py rename otx/{mpa/modules/datasets => algorithms/common/adapters/torch/dataloaders}/composed_dataloader.py (59%) create mode 100644 otx/algorithms/common/adapters/torch/dataloaders/samplers/__init__.py rename otx/{mpa/modules/datasets => algorithms/common/adapters/torch/dataloaders}/samplers/balanced_sampler.py (90%) rename otx/{mpa/modules/datasets => algorithms/common/adapters/torch/dataloaders}/samplers/cls_incr_sampler.py (91%) create mode 100644 otx/algorithms/common/utils/distance_utils.py create mode 100644 otx/algorithms/common/utils/ext_loader.py rename otx/{mpa => algorithms/common}/utils/logger.py (68%) rename otx/{mpa => algorithms/common}/utils/mo_wrapper.py (63%) rename otx/{mpa/modules => algorithms/common}/utils/task_adapt.py (53%) rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/__init__.py (75%) rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/explainer.py (88%) rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/exporter.py (76%) rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/incremental/__init__.py (66%) create mode 100644 otx/algorithms/detection/adapters/mmdet/tasks/incremental/inferrer.py rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/incremental/stage.py (75%) create mode 100644 otx/algorithms/detection/adapters/mmdet/tasks/incremental/trainer.py rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/inferrer.py (84%) rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/semisl/__init__.py (76%) rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/semisl/exporter.py (54%) rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/semisl/inferrer.py (56%) rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/semisl/stage.py (76%) create mode 100644 otx/algorithms/detection/adapters/mmdet/tasks/semisl/trainer.py rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/stage.py (85%) rename otx/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/trainer.py (88%) rename otx/algorithms/segmentation/adapters/mmseg/{data => datasets}/__init__.py (89%) rename otx/algorithms/segmentation/adapters/mmseg/{data => datasets}/dataset.py (99%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/datasets/pipelines/__init__.py rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/datasets/pipelines/compose.py (87%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/datasets/pipelines/loads.py rename otx/algorithms/segmentation/adapters/mmseg/{data/pipelines.py => datasets/pipelines/transforms.py} (65%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/models/backbones/__init__.py rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/backbones/litehrnet.py (96%) rename otx/{mpa/modules/ov/models/mmseg => algorithms/segmentation/adapters/mmseg/models}/backbones/mmov_backbone.py (65%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/models/heads/__init__.py rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/heads/custom_fcn_head.py (62%) rename otx/{mpa/modules/models/heads/pixel_weights_mixin.py => algorithms/segmentation/adapters/mmseg/models/heads/mixin.py} (59%) rename otx/{mpa/modules/ov/models/mmseg/decode_heads => algorithms/segmentation/adapters/mmseg/models/heads}/mmov_decode_head.py (79%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/losses/base_pixel_loss.py (89%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/losses/base_weighted_loss.py (83%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/losses/cross_entropy_loss_with_ignore.py (88%) rename otx/{mpa/modules/models/losses/mpa_pixel_base.py => algorithms/segmentation/adapters/mmseg/models/losses/otx_pixel_base.py} (88%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/models/schedulers/__init__.py rename otx/{mpa/modules/models/scalar_schedulers => algorithms/segmentation/adapters/mmseg/models/schedulers}/base.py (70%) rename otx/{mpa/modules/models/scalar_schedulers => algorithms/segmentation/adapters/mmseg/models/schedulers}/constant.py (73%) rename otx/{mpa/modules/models/scalar_schedulers => algorithms/segmentation/adapters/mmseg/models/schedulers}/poly.py (90%) rename otx/{mpa/modules/models/scalar_schedulers => algorithms/segmentation/adapters/mmseg/models/schedulers}/step.py (89%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/models/segmentors/class_incr_encoder_decoder.py rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/segmentors/mean_teacher_segmentor.py (65%) rename otx/{mpa/modules/models/segmentors/pixel_weights_mixin.py => algorithms/segmentation/adapters/mmseg/models/segmentors/mixin.py} (94%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/segmentors/otx_encoder_decoder.py (68%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/utils/__init__.py (83%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/utils/aggregator.py (90%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/utils/angular_pw_conv.py (77%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/utils/asymmetric_position_attention.py (82%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/utils/channel_shuffle.py (93%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/utils/local_attention.py (83%) rename otx/{mpa/modules/models/losses/utils.py => algorithms/segmentation/adapters/mmseg/models/utils/loss_equalizer.py} (94%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/utils/normalize.py (54%) rename otx/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/utils/psp_layer.py (65%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/tasks/__init__.py rename otx/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/exporter.py (77%) rename otx/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/incremental/__init__.py (61%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/tasks/incremental/inferrer.py rename otx/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/incremental/stage.py (56%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/tasks/incremental/trainer.py rename otx/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/inferrer.py (90%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/tasks/semisl/__init__.py rename otx/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/semisl/exporter.py (61%) rename otx/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/semisl/inferrer.py (66%) rename otx/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/semisl/stage.py (65%) create mode 100644 otx/algorithms/segmentation/adapters/mmseg/tasks/semisl/trainer.py rename otx/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/stage.py (80%) rename otx/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/trainer.py (89%) create mode 100644 otx/cli/utils/errors.py create mode 100644 otx/core/ov/__init__.py create mode 100644 otx/core/ov/graph/__init__.py rename otx/{mpa/modules => core}/ov/graph/graph.py (80%) create mode 100644 otx/core/ov/graph/parsers/__init__.py create mode 100644 otx/core/ov/graph/parsers/builder.py create mode 100644 otx/core/ov/graph/parsers/cls/__init__.py rename otx/{mpa/modules => core}/ov/graph/parsers/cls/cls_base_parser.py (74%) rename otx/{mpa/modules => core}/ov/graph/parsers/parser.py (60%) rename otx/{mpa/modules => core}/ov/graph/utils.py (86%) create mode 100644 otx/core/ov/models/__init__.py rename otx/{mpa/modules => core}/ov/models/mmov_model.py (73%) rename otx/{mpa/modules => core}/ov/models/ov_model.py (84%) rename otx/{mpa/modules => core}/ov/models/parser_mixin.py (83%) rename otx/{mpa/modules => core}/ov/omz_wrapper.py (60%) create mode 100644 otx/core/ov/ops/__init__.py create mode 100644 otx/core/ov/ops/activations.py rename otx/{mpa/modules => core}/ov/ops/arithmetics.py (70%) rename otx/{mpa/modules => core}/ov/ops/builder.py (50%) rename otx/{mpa/modules => core}/ov/ops/convolutions.py (74%) rename otx/{mpa/modules => core}/ov/ops/generation.py (59%) rename otx/{mpa/modules => core}/ov/ops/image_processings.py (78%) rename otx/{mpa/modules => core}/ov/ops/infrastructures.py (84%) rename otx/{mpa/modules => core}/ov/ops/matmuls.py (68%) create mode 100644 otx/core/ov/ops/modules/__init__.py create mode 100644 otx/core/ov/ops/modules/op_module.py rename otx/{mpa/modules => core}/ov/ops/movements.py (58%) rename otx/{mpa/modules => core}/ov/ops/normalizations.py (73%) rename otx/{mpa/modules => core}/ov/ops/object_detections.py (80%) rename otx/{mpa/modules => core}/ov/ops/op.py (64%) rename otx/{mpa/modules => core}/ov/ops/poolings.py (79%) rename otx/{mpa/modules => core}/ov/ops/reductions.py (58%) rename otx/{mpa/modules => core}/ov/ops/shape_manipulations.py (64%) rename otx/{mpa/modules => core}/ov/ops/sorting_maximization.py (76%) rename otx/{mpa/modules => core}/ov/ops/type_conversions.py (70%) create mode 100644 otx/core/ov/ops/utils.py rename otx/{mpa/modules => core}/ov/registry.py (67%) rename otx/{mpa/modules => core}/ov/utils.py (68%) create mode 100644 otx/hpo/utils.py delete mode 100644 otx/mpa/cls/__init__.py delete mode 100644 otx/mpa/cls/incremental/inferrer.py delete mode 100644 otx/mpa/cls/incremental/trainer.py delete mode 100644 otx/mpa/cls/semisl/inferrer.py delete mode 100644 otx/mpa/cls/semisl/trainer.py delete mode 100644 otx/mpa/csrc/mpl/lib_mpl.cpp delete mode 100644 otx/mpa/csrc/mpl/lib_mpl.h delete mode 100644 otx/mpa/csrc/mpl/pybind.cpp delete mode 100644 otx/mpa/deploy/__init__.py delete mode 100644 otx/mpa/det/incremental/inferrer.py delete mode 100644 otx/mpa/det/incremental/trainer.py delete mode 100644 otx/mpa/det/semisl/trainer.py delete mode 100644 otx/mpa/modules/__init__.py delete mode 100644 otx/mpa/modules/datasets/pipelines/transforms/__init__.py delete mode 100644 otx/mpa/modules/datasets/pipelines/transforms/cython_augments/__init__.py delete mode 100644 otx/mpa/modules/datasets/pipelines/transforms/random_augment.py delete mode 100644 otx/mpa/modules/datasets/pipelines/transforms/seg_custom_pipelines.py delete mode 100644 otx/mpa/modules/hooks/__init__.py delete mode 100644 otx/mpa/modules/hooks/cancel_interface_hook.py delete mode 100644 otx/mpa/modules/hooks/logger_replace_hook.py delete mode 100644 otx/mpa/modules/hooks/no_bias_decay_hook.py delete mode 100644 otx/mpa/modules/hooks/save_initial_weight_hook.py delete mode 100644 otx/mpa/modules/models/__init__.py delete mode 100644 otx/mpa/modules/models/backbones/__init__.py delete mode 100644 otx/mpa/modules/models/builder.py delete mode 100644 otx/mpa/modules/models/classifiers/__init__.py delete mode 100644 otx/mpa/modules/models/heads/__init__.py delete mode 100644 otx/mpa/modules/models/heads/aggregator_mixin.py delete mode 100644 otx/mpa/modules/models/heads/mix_loss_mixin.py delete mode 100644 otx/mpa/modules/models/heads/segment_out_norm_mixin.py delete mode 100644 otx/mpa/modules/models/heads/utils.py delete mode 100644 otx/mpa/modules/models/losses/__init__.py delete mode 100644 otx/mpa/modules/models/scalar_schedulers/__init__.py delete mode 100644 otx/mpa/modules/models/segmentors/__init__.py delete mode 100644 otx/mpa/modules/models/segmentors/class_incr_encoder_decoder.py delete mode 100644 otx/mpa/modules/models/segmentors/mix_loss_mixin.py delete mode 100644 otx/mpa/modules/optimizer/__init__.py delete mode 100644 otx/mpa/modules/ov/__init__.py delete mode 100644 otx/mpa/modules/ov/graph/__init__.py delete mode 100644 otx/mpa/modules/ov/graph/parsers/__init__.py delete mode 100644 otx/mpa/modules/ov/graph/parsers/builder.py delete mode 100644 otx/mpa/modules/ov/graph/parsers/cls/__init__.py delete mode 100644 otx/mpa/modules/ov/models/mmcls/__init__.py delete mode 100644 otx/mpa/modules/ov/models/mmcls/backbones/__init__.py delete mode 100644 otx/mpa/modules/ov/models/mmcls/backbones/mmov_backbone.py delete mode 100644 otx/mpa/modules/ov/models/mmcls/heads/__init__.py delete mode 100644 otx/mpa/modules/ov/models/mmcls/necks/__init__.py delete mode 100644 otx/mpa/modules/ov/models/mmcls/necks/mmov_neck.py delete mode 100644 otx/mpa/modules/ov/models/mmseg/__init__.py delete mode 100644 otx/mpa/modules/ov/models/mmseg/backbones/__init__.py delete mode 100644 otx/mpa/modules/ov/models/mmseg/decode_heads/__init__.py delete mode 100644 otx/mpa/modules/ov/ops/__init__.py delete mode 100644 otx/mpa/modules/ov/ops/activations.py delete mode 100644 otx/mpa/modules/ov/ops/modules/__init__.py delete mode 100644 otx/mpa/modules/ov/ops/modules/op_module.py delete mode 100644 otx/mpa/modules/ov/ops/utils.py delete mode 100644 otx/mpa/modules/utils/__init__.py delete mode 100644 otx/mpa/modules/utils/distance_utils.py delete mode 100644 otx/mpa/modules/utils/seg_utils.py delete mode 100644 otx/mpa/seg/__init__.py delete mode 100644 otx/mpa/seg/incremental/inferrer.py delete mode 100644 otx/mpa/seg/incremental/trainer.py delete mode 100644 otx/mpa/seg/semisl/__init__.py delete mode 100644 otx/mpa/seg/semisl/trainer.py delete mode 100644 otx/mpa/utils/__init__.py delete mode 100644 otx/mpa/utils/config_utils.py delete mode 100644 otx/mpa/utils/convert_keys.py delete mode 100644 otx/mpa/utils/ext_loader.py delete mode 100644 otx/mpa/utils/file.py rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls}/models/classifiers/test_sam_classifier.py (97%) rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls}/models/classifiers/test_semisl_classifier.py (90%) rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls}/models/classifiers/test_semisl_mlc_classifier.py (90%) rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls}/models/classifiers/test_supcon_classifier.py (89%) rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls/models}/heads/test_custom_cls_head.py (95%) rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls/models}/heads/test_custom_hierarchical_cls_head.py (90%) rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls/models}/heads/test_custom_multilabel_cls_head.py (87%) rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls/models}/heads/test_multilabel_semisl.py (89%) rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls/models}/heads/test_semisl_cls_head.py (97%) create mode 100644 tests/unit/algorithms/classification/adapters/mmcls/models/losses/__init__.py rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls/models}/losses/test_asymmetric_multilabel.py (91%) rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls/models}/losses/test_cross_entropy.py (92%) create mode 100644 tests/unit/algorithms/classification/adapters/mmcls/optimizer/__init__.py rename tests/unit/{mpa/modules => algorithms/classification/adapters/mmcls}/optimizer/test_lars.py (94%) rename tests/unit/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/incremental/test_cls_incremental_stage.py (77%) rename tests/unit/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/semisl/test_cls_semisl_stage.py (88%) rename tests/unit/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/test_cls_evaluator.py (85%) rename tests/unit/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/test_cls_explanier.py (81%) rename tests/unit/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/test_cls_exporter.py (83%) rename tests/unit/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/test_cls_inferrer.py (90%) rename tests/unit/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/test_cls_stage.py (92%) rename tests/unit/{mpa/cls => algorithms/classification/adapters/mmcls/tasks}/test_cls_trainer.py (82%) rename tests/unit/{mpa/modules/hooks/test_mpa_adaptive_training_hooks.py => algorithms/common/adapters/mmcv/hooks/test_adaptive_training_hooks.py} (89%) rename tests/unit/{mpa/modules/hooks/test_mpa_cancel_interface_hook.py => algorithms/common/adapters/mmcv/hooks/test_cancel_interface_hook.py} (89%) rename tests/unit/{mpa/modules/hooks/test_mpa_checkpoint_hook.py => algorithms/common/adapters/mmcv/hooks/test_checkpoint_hook.py} (84%) rename tests/unit/{mpa/modules/hooks/test_mpa_composed_dataloader_hook.py => algorithms/common/adapters/mmcv/hooks/test_composed_dataloader_hook.py} (65%) rename tests/unit/{mpa/modules/hooks/test_mpa_early_stopping_hook.py => algorithms/common/adapters/mmcv/hooks/test_early_stopping_hook.py} (90%) rename tests/unit/{mpa/modules/hooks/test_mpa_ema_v2_hook.py => algorithms/common/adapters/mmcv/hooks/test_ema_v2_hook.py} (75%) rename tests/unit/{mpa/modules/hooks/test_mpa_eval_hook.py => algorithms/common/adapters/mmcv/hooks/test_eval_hook.py} (96%) rename tests/unit/{mpa/modules/hooks/test_mpafp16_sam_optimizer_hook.py => algorithms/common/adapters/mmcv/hooks/test_fp16_sam_optimizer_hook.py} (66%) rename tests/unit/{mpa/modules/hooks/test_mpa_ib_loss_hook.py => algorithms/common/adapters/mmcv/hooks/test_ib_loss_hook.py} (70%) rename tests/unit/{mpa/modules/hooks/test_mpa_logger_replace_hook.py => algorithms/common/adapters/mmcv/hooks/test_logger_replace_hook.py} (72%) rename tests/unit/{mpa/modules/hooks/test_mpa_model_ema_hook.py => algorithms/common/adapters/mmcv/hooks/test_model_ema_hook.py} (94%) rename tests/unit/{mpa/modules/hooks/test_mpa_no_bias_decay_hook.py => algorithms/common/adapters/mmcv/hooks/test_no_bias_decay_hook.py} (90%) rename tests/unit/{mpa/modules/hooks/test_mpa_recording_forward_hooks.py => algorithms/common/adapters/mmcv/hooks/test_recording_forward_hooks.py} (95%) rename tests/unit/{mpa/modules/hooks/test_mpa_save_initial_weight_hook.py => algorithms/common/adapters/mmcv/hooks/test_save_initial_weight_hook.py} (70%) rename tests/unit/{mpa/modules/hooks/test_mpa_semisl_cls_hook.py => algorithms/common/adapters/mmcv/hooks/test_semisl_cls_hook.py} (69%) rename tests/unit/{mpa/modules/hooks/test_mpa_task_adapt_hook.py => algorithms/common/adapters/mmcv/hooks/test_task_adapt_hook.py} (69%) rename tests/unit/{mpa/modules/hooks/test_mpa_unbiased_teacher_hook.py => algorithms/common/adapters/mmcv/hooks/test_unbiased_teacher_hook.py} (66%) rename tests/unit/{mpa/modules/hooks/test_mpa_workflow_hooks.py => algorithms/common/adapters/mmcv/hooks/test_workflow_hooks.py} (89%) create mode 100644 tests/unit/algorithms/common/adapters/mmcv/pipelines/__init__.py create mode 100644 tests/unit/algorithms/common/adapters/mmcv/pipelines/transforms/__init__.py rename tests/unit/{mpa/modules/datasets => algorithms/common/adapters/mmcv}/pipelines/transforms/test_augments.py (97%) rename tests/unit/{mpa/modules/datasets => algorithms/common/adapters/mmcv}/pipelines/transforms/test_augmix.py (91%) rename tests/unit/{mpa/modules/datasets/pipelines/transforms/test_ote_transforms.py => algorithms/common/adapters/mmcv/pipelines/transforms/test_otx_transforms.py} (91%) rename tests/unit/{mpa/modules/datasets => algorithms/common/adapters/mmcv}/pipelines/transforms/test_random_augment.py (64%) rename tests/unit/{mpa/modules/datasets => algorithms/common/adapters/mmcv}/pipelines/transforms/test_twocrop_transform.py (92%) create mode 100644 tests/unit/algorithms/common/adapters/mmcv/tasks/test_builder.py rename tests/unit/{mpa => algorithms/common/adapters/mmcv/tasks}/test_export_mixin.py (94%) rename tests/unit/{mpa => algorithms/common/adapters/mmcv/tasks}/test_helpers.py (100%) rename tests/unit/{mpa => algorithms/common/adapters/mmcv/tasks}/test_stage.py (91%) rename tests/unit/{mpa => algorithms/common/adapters/mmcv/tasks}/test_version.py (66%) rename tests/unit/{mpa => algorithms/common/adapters/mmcv/tasks}/test_workflow.py (77%) create mode 100644 tests/unit/algorithms/common/adapters/mmdeploy/__init__.py rename tests/unit/{mpa/deploy => algorithms/common/adapters/mmdeploy}/test_deploy_apis.py (93%) rename tests/unit/{mpa/deploy => algorithms/common/adapters/mmdeploy}/test_helpers.py (100%) rename tests/unit/{mpa/deploy => algorithms/common/adapters/mmdeploy}/utils/test_deploy_utils_mmdeploy.py (83%) rename tests/unit/{mpa/deploy => algorithms/common/adapters/mmdeploy}/utils/test_deploy_utils_onnx.py (85%) rename tests/unit/{mpa/deploy => algorithms/common/adapters/mmdeploy}/utils/test_deploy_utils_operations_domain.py (67%) rename tests/unit/{mpa/deploy => algorithms/common/adapters/mmdeploy}/utils/test_deploy_utils_utils.py (95%) create mode 100644 tests/unit/algorithms/common/adapters/torch/dataloaders/__init__.py rename tests/unit/{mpa/modules/datasets => algorithms/common/adapters/torch/dataloaders}/samplers/test_balanced_sampler.py (81%) rename tests/unit/{mpa/modules/datasets => algorithms/common/adapters/torch/dataloaders}/samplers/test_cls_incr_sampler.py (92%) rename tests/unit/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/incremental/test_det_incremental_stage.py (66%) rename tests/unit/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/semisl/test_det_semisl_stage.py (81%) rename tests/unit/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/test_det_exporter.py (85%) rename tests/unit/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/test_det_inferrer.py (95%) rename tests/unit/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/test_det_stage.py (92%) rename tests/unit/{mpa/det => algorithms/detection/adapters/mmdet/tasks}/test_det_trainer.py (87%) delete mode 100644 tests/unit/algorithms/segmentation/adapters/mmseg/data/__init__.py delete mode 100644 tests/unit/algorithms/segmentation/adapters/mmseg/data/test_pipelines.py rename {otx/mpa/modules/datasets/pipelines => tests/unit/algorithms/segmentation/adapters/mmseg/datasets}/__init__.py (54%) rename {otx/mpa/modules/datasets/samplers => tests/unit/algorithms/segmentation/adapters/mmseg/datasets/pipelines}/__init__.py (50%) rename tests/unit/{mpa/modules => algorithms/segmentation/adapters/mmseg}/datasets/pipelines/test_compose.py (98%) create mode 100644 tests/unit/algorithms/segmentation/adapters/mmseg/datasets/pipelines/test_loads.py rename tests/unit/algorithms/segmentation/adapters/mmseg/{ => datasets/pipelines}/test_pipelines_params_validation.py (97%) create mode 100644 tests/unit/algorithms/segmentation/adapters/mmseg/datasets/pipelines/test_transforms.py rename tests/unit/algorithms/segmentation/adapters/mmseg/{ => datasets}/test_dataset.py (97%) rename tests/unit/algorithms/segmentation/adapters/mmseg/{ => datasets}/test_dataset_params_validation.py (99%) create mode 100644 tests/unit/algorithms/segmentation/adapters/mmseg/models/backbones/__init__.py rename tests/unit/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/backbones/test_litehrnet.py (97%) rename tests/unit/{mpa/modules/ov/models/mmseg/backbones/test_ov_mmseg_mmov_backbone.py => algorithms/segmentation/adapters/mmseg/models/backbones/test_mmseg_mmov_backbone.py} (94%) create mode 100644 tests/unit/algorithms/segmentation/adapters/mmseg/models/heads/__init__.py rename tests/unit/{mpa/modules/ov/models/mmseg/decode_heads/test_ov_mmseg_mmov_decode_head.py => algorithms/segmentation/adapters/mmseg/models/heads/test_mmseg_mmov_decode_head.py} (95%) create mode 100644 tests/unit/algorithms/segmentation/adapters/mmseg/models/scalar_schedulers/__init__.py rename tests/unit/{mpa/modules => algorithms/segmentation/adapters/mmseg}/models/scalar_schedulers/test_schedulers.py (98%) rename tests/unit/{mpa/modules/losses => algorithms/segmentation/adapters/mmseg/models/utils}/test_utils.py (90%) rename {otx/mpa/modules/ov/models => tests/unit/algorithms/segmentation/adapters/mmseg/tasks}/__init__.py (100%) rename tests/unit/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks/incremental}/__init__.py (100%) rename tests/unit/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/incremental/test_seg_incremental_stage.py (63%) rename tests/unit/{mpa/seg/incremental => algorithms/segmentation/adapters/mmseg/tasks/semisl}/__init__.py (100%) rename tests/unit/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/semisl/test_seg_semisl_inferrer.py (84%) rename tests/unit/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/semisl/test_seg_semisl_stage.py (74%) rename tests/unit/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/test_seg_exporter.py (81%) rename tests/unit/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/test_seg_inferrer.py (92%) rename tests/unit/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/test_seg_stage.py (93%) rename tests/unit/{mpa/seg => algorithms/segmentation/adapters/mmseg/tasks}/test_seg_trainer.py (79%) delete mode 100644 tests/unit/algorithms/segmentation/adapters/mmseg/test_pipelines.py rename {otx/mpa/modules/datasets => tests/unit/algorithms/segmentation/adapters/mmseg/utils}/__init__.py (55%) rename tests/unit/algorithms/segmentation/adapters/mmseg/{ => utils}/test_config_utils.py (100%) rename tests/unit/algorithms/segmentation/adapters/mmseg/{ => utils}/test_config_utils_params_validation.py (100%) rename tests/unit/algorithms/segmentation/adapters/mmseg/{ => utils}/test_data_utils.py (100%) rename tests/unit/algorithms/segmentation/adapters/mmseg/{ => utils}/test_data_utils_params_validation.py (100%) rename tests/unit/{mpa/modules => core}/ov/graph/parsers/test_ov_graph_cls_parser.py (81%) rename tests/unit/{mpa/modules => core}/ov/graph/parsers/test_ov_graph_parser.py (78%) rename tests/unit/{mpa/modules => core}/ov/graph/test_ov_graph_grapy.py (99%) rename tests/unit/{mpa/modules => core}/ov/graph/test_ov_graph_utils.py (90%) rename tests/unit/{mpa/modules => core}/ov/models/__init__.py (100%) rename tests/unit/{mpa/modules => core}/ov/models/mmcls/__init__.py (100%) rename tests/unit/{mpa/modules => core}/ov/models/mmcls/backbones/test_ov_mmcls_mmov_backbone.py (86%) rename tests/unit/{mpa/modules => core}/ov/models/mmcls/heads/test_ov_mmcls_cls_head.py (90%) rename tests/unit/{mpa/modules => core}/ov/models/mmcls/heads/test_ov_mmcls_conv_head.py (91%) rename tests/unit/{mpa/modules => core}/ov/models/mmcls/heads/test_ov_mmcls_mmcv_cls_head.py (86%) rename tests/unit/{mpa/modules => core}/ov/models/mmcls/necks/test_ov_mmcls_mmov_neck.py (73%) rename tests/unit/{mpa/modules => core}/ov/models/mmcls/test_helpers.py (100%) rename tests/unit/{mpa/modules => core}/ov/models/test_ov_models_ov_model.py (96%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_activations.py (99%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_arithmetics.py (97%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_builder.py (92%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_convolutions.py (97%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_generation.py (93%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_image_processings.py (97%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_infrastructures.py (97%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_matmuls.py (97%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_module.py (93%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_movements.py (99%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_normalizations.py (98%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_object_detections.py (98%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_op.py (92%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_poolings.py (98%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_reductions.py (98%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_shape_manipulations.py (98%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_sorting_maximization.py (95%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_type_conversions.py (97%) rename tests/unit/{mpa/modules => core}/ov/ops/test_ov_ops_utils.py (90%) rename tests/unit/{mpa/modules => core}/ov/test_ov_omz_wrapper.py (96%) rename tests/unit/{mpa/modules => core}/ov/test_ov_registry.py (94%) rename tests/unit/{mpa/modules => core}/ov/test_ov_utils.py (89%) delete mode 100644 tests/unit/mpa/modules/__init__.py delete mode 100644 tests/unit/mpa/modules/datasets/__init__.py delete mode 100644 tests/unit/mpa/modules/datasets/pipelines/__init__.py delete mode 100644 tests/unit/mpa/modules/datasets/pipelines/transforms/__init__.py delete mode 100644 tests/unit/mpa/modules/datasets/pipelines/transforms/test_seg_custom_pipelines.py delete mode 100644 tests/unit/mpa/modules/heads/__init__.py delete mode 100644 tests/unit/mpa/modules/hooks/test_mpa_fp16_sam_optimizer_hook.py delete mode 100644 tests/unit/mpa/modules/losses/__init__.py delete mode 100644 tests/unit/mpa/modules/optimizer/__init__.py delete mode 100644 tests/unit/mpa/seg/semisl/__init__.py delete mode 100644 tests/unit/mpa/test_builder.py diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 39e05772c3a..50ad5eb3d04 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -22,20 +22,20 @@ not fully covered by unit tests or manual testing can be complicated. --> -- [ ] I submit my changes into the `develop` branch -- [ ] I have added description of my changes into [CHANGELOG](https://github.com/openvinotoolkit/training_extensions/blob/develop/CHANGELOG.md) -- [ ] I have updated the [documentation](https://github.com/openvinotoolkit/training_extensions/tree/develop/docs) accordingly -- [ ] I have added tests to cover my changes -- [ ] I have [linked related issues](https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) +- [ ] I have added unit tests to cover my changes.​ +- [ ] I have added integration tests to cover my changes.​ +- [ ] I have added e2e tests for validation. +- [ ] I have added the description of my changes into CHANGELOG in my target branch (e.g., [CHANGELOG](https://github.com/openvinotoolkit/training_extensions/blob/develop/CHANGELOG.md) in develop).​ +- [ ] I have updated the documentation in my target branch accordingly (e.g., [documentation](https://github.com/openvinotoolkit/training_extensions/tree/develop/docs) in develop). +- [ ] I have [linked related issues](https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword). ### License -- [ ] I submit _my code changes_ under the same [MIT License](https://github.com/openvinotoolkit/training_extensions/blob/develop/LICENSE) that covers the project. +- [ ] I submit _my code changes_ under the same [Apache License](https://github.com/openvinotoolkit/training_extensions/blob/develop/LICENSE) that covers the project. Feel free to contact the maintainers if that's a concern. -- [ ] I have updated the license header for each file (see an example below) +- [ ] I have updated the license header for each file (see an example below). ```python -# Copyright (C) 2023 Intel Corporation -# -# SPDX-License-Identifier: MIT +# Copyright (C) 2022 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 ``` diff --git a/.github/workflows/pre_merge.yml b/.github/workflows/pre_merge.yml index f90e9911ac3..05b5011a526 100644 --- a/.github/workflows/pre_merge.yml +++ b/.github/workflows/pre_merge.yml @@ -43,7 +43,7 @@ jobs: - name: Install dependencies run: python -m pip install -r requirements/dev.txt - name: Unit-testing - run: tox -re pre-merge -- tests/unit + run: tox -e pre-merge -- tests/unit - name: Upload coverage reports to Codecov run: | # If the workflow is triggered from PR then it gets the commit id from the PR. @@ -72,7 +72,7 @@ jobs: - name: Install dependencies run: python -m pip install -r requirements/dev.txt - name: Integration-testing - run: tox -re pre-merge -- tests/integration/cli/test_cli.py + run: tox -e pre-merge -- tests/integration/cli/test_cli.py Pre-Merge-Integration-Cls-Test: runs-on: [self-hosted, linux, x64, dev] needs: Pre-Merge-Unit-Test @@ -83,7 +83,7 @@ jobs: - name: Install dependencies run: python -m pip install -r requirements/dev.txt - name: Integration-testing - run: tox -re pre-merge-cls + run: tox -e pre-merge-cls Pre-Merge-Integration-Det-Test: runs-on: [self-hosted, linux, x64, dev] needs: Pre-Merge-Unit-Test @@ -94,7 +94,7 @@ jobs: - name: Install dependencies run: python -m pip install -r requirements/dev.txt - name: Integration-testing - run: tox -re pre-merge-det + run: tox -e pre-merge-det Pre-Merge-Integration-Seg-Test: runs-on: [self-hosted, linux, x64, dev] needs: Pre-Merge-Unit-Test @@ -105,7 +105,7 @@ jobs: - name: Install dependencies run: python -m pip install -r requirements/dev.txt - name: Integration-testing - run: tox -re pre-merge-seg + run: tox -e pre-merge-seg Pre-Merge-Integration-Action-Test: runs-on: [self-hosted, linux, x64, dev] needs: Pre-Merge-Unit-Test @@ -116,7 +116,7 @@ jobs: - name: Install dependencies run: python -m pip install -r requirements/dev.txt - name: Integration-testing - run: tox -re pre-merge-action + run: tox -e pre-merge-action Pre-Merge-Integration-Anomaly-Test: runs-on: [self-hosted, linux, x64, dev] needs: Pre-Merge-Unit-Test @@ -127,4 +127,4 @@ jobs: - name: Install dependencies run: python -m pip install -r requirements/dev.txt - name: Integration-testing - run: tox -re pre-merge-anomaly + run: tox -e pre-merge-anomaly diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c22002aaa1..c36aeaac4f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,60 @@ All notable changes to this project will be documented in this file. +## \[v1.2.0\] + +### New features + +- + +### Enhancements + +- + +### Bug fixes + +- + +### Known issues + +- OpenVINO(==2022.3) IR inference is not working well on 2-stage models (e.g. Mask-RCNN) exported from torch==1.13.1 + (working well up to torch==1.12.1) () + +## \[v1.1.0\] + +### New features + +- Add FP16 IR export support () +- Add in-memory caching in dataloader () +- Add MoViNet template for action classification () +- Add Semi-SL multilabel classification algorithm () +- Integrate multi-gpu training for semi-supervised learning and self-supervised learning () +- Add train-type parameter to otx train () +- Add embedding of inference configuration to IR for classification () +- Enable VOC dataset in OTX () +- Add mmcls.VisionTransformer backbone support () + +### Enhancements + +- Parametrize saliency maps dumping in export () +- Bring mmdeploy to action recognition model export & Test optimization of action tasks () +- Update backbone lists () +- Add explanation for XAI & minor doc fixes () +- Refactor phase#1: MPA modules + +### Bug fixes + +- Handle unpickable update_progress_callback () +- Dataset Adapter: Avoid duplicated annotation and permit empty image () +- Arrange scale between bbox preds and bbox targets in ATSS () +- Fix label mismatch of evaluation and validation with large dataset in semantic segmentation () +- Fix packaging errors including cython module build / import issues () + +### Known issues + +- OpenVINO(==2022.3) IR inference is not working well on 2-stage models (e.g. Mask-RCNN) exported from torch==1.13.1 + (working well up to torch==1.12.1) () + ## \[v1.0.1\] ### Enhancements diff --git a/MANIFEST.in b/MANIFEST.in index a1932f526f8..7216109b97d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,3 +2,6 @@ recursive-include requirements * recursive-include otx *.pyx recursive-include otx *.yaml recursive-include otx *.json +recursive-exclude otx *.c +graft tests +global-exclude *.py[cod] diff --git a/README.md b/README.md index a5f78ca9fdb..8c82e9dd2ca 100644 --- a/README.md +++ b/README.md @@ -89,19 +89,19 @@ You can find more details with examples in the [CLI command intro](https://openv ## Updates -### v1.0.0 (1Q23) - -- Package Installation via PyPI - - OpenVINO™ Training Extensions installation will be supported via PyPI -- CLI update - - Update `find` command to find configurations of tasks/algorithms - - Introduce `build` command to customize task or model configurations - - Automatic algorihm selection for the `train` command using the given input dataset -- Adaptation of [Datumaro](https://github.com/openvinotoolkit/datumaro) component as a dataset interface -- Integrate hyper-parameter optimizations -- Support action recognition task - -### v1.1+ (2Q23) +### v1.1.0 (1Q23) + +- Add FP16 IR export support () +- Add in-memory caching in dataloader () +- Add MoViNet template for action classification () +- Add Semi-SL multilabel classification algorithm () +- Integrate multi-gpu training for semi-supervised learning and self-supervised learning () +- Add train-type parameter to otx train () +- Add embedding of inference configuration to IR for classification () +- Enable VOC dataset in OTX () +- Add mmcls.VisionTransformer backbone support () + +### v1.2+ (2Q23) - In planning diff --git a/docs/source/_static/logos/github_icon.png b/docs/source/_static/logos/github_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..30183508885fbb50e6d0c3d15c72a7d89d59d8a1 GIT binary patch literal 2161 zcmV-%2#)uOP)klhprG!{@BPbQLY87#ns!^j{8rmAI75bBt@7(xYz3w;8bJqL(k|s@i?|IMj zyyrdZS;i=eq9}@@D2k#eilQirq9}@@WC$=A*bf*FTnBUj(}7OlQ(yt`yZf`i{adH| z8T+%>y5F^J42~_2@;?CmfT6${z~jJt{PVqQ`waK2e)>`(0t^5S0VV?T2+utC?2)!F zIvB#e`0aoRz&E7BeBgFqFC7SSQ~Y7T8>G+cz!+U3{Ji*OfYHEP?PMa zreuIkfDd~JuKdF%z!s+9mp`{oSY_#09c^Mt0$3ZE)r-K&fB6_#*OUOTlCJqJ?+I2m z1swGzw^_PEaE2ynQEOP6|;;Rj4F$oHOacz#4VVsaBSDn4itbz^(h%E2dqh|BrXj-oS$%6zhXOop0b? zy?FrvuX=dSt6A&^fQ#|Nl?^;=Yv2LmF%j6Rfqq`)>3J8J49vRL=Iw*AO+0sB=Xn!y zsvprr|Bm(a+{H;dl>n3Q$IdMnm_m3G-DB@In(W&y9-sf1N!W+aCmXidj|=Pe1~%&F zHRrN@Ixq?t1`M*BG-~^ae(vvs-2aVoKYNGU%h)z>ZMHN80~>kP%}A3HKz{)T&XwBe z&u}|Mx6?+Cn@ro*aML1gcJhfesP#9g;Bk$sCmjL(_&fUM7?T2S3bj7)zA0${^cT?2 zyGaC}xQHDI@-~FXE&<()Hn9;5*BV@yIb4F*Vhgq-ax`@eOc`J+K|KwNDcJRbf~B#^ z@qkM*A;mQ@Y6=IqOh|X%g%V&rApw2>Rx^bItO6_)(&3;G z0$BGe2_~3|09-Ak!@YC9)#}r^vJ|K}vr2GMh|XKzeBaD46$5xDOS^zecjlWuUBF9& zTDn``ObXF)iR>N+nTkOz(#bc|LUdfh{j1ose?U)R%ezJzf!MsClkjZ|jI*cswhzq7 z@e)YB(}@Cnk=afu=hEd_!WkT=mcvqE&-raJdcUO8~mji`D(M8_W!=y)+M;Ee*@ zoTXEUkTK|UyC#}yt^Z#N=<(_hoj(m3T8_WZ4d6f_9iEzVK*(fM5r7wjba+s%MvQLu zH-&@T*KgS%ln^!^O#*wwT)`9yu%fF8Ai>;_f;@s8_nATg?h@47Lm>q@A6d>cg#nx+ ztg~}N3bVVgFg8K*$)*sfInqj3N82^@Ikrn!pe4?4u3zR(AD0Js`CkXulS{rBs%S!X z`GSCTfF}d#=+;u48hfLwncTq%eD%i(htK!q;246gAQ%1TM8EXaAyW~0`6bR?b~9PdNtaH2!Hn%eX&6DenSM{$R-4Qudic`wRpMG zD_a7qn*;#PB@9QH9I=+FCWJiRWCpU8K)SinjRmF-ZK9_~jePkz1bpUh%<8rcXq<&-^-Am+cY6D;zFe>N77CF@1ySy$! zCxrpf<$ND@h}D>p@|H6ivPL00000NkvXXu0mjf+(r*I literal 0 HcmV?d00001 diff --git a/docs/source/conf.py b/docs/source/conf.py index 0f2fb9f6937..d4834d06e9b 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -52,7 +52,15 @@ "logo": { "image_light": 'logos/otx-logo.png', "image_dark": 'logos/otx-logo.png', - } + }, + "icon_links": [ + { + "name": "GitHub", + "url": "https://github.com/openvinotoolkit/training_extensions", + "icon": "_static/logos/github_icon.png", + "type": "local", + }, + ], } html_css_files = [ 'css/custom.css', diff --git a/docs/source/guide/explanation/additional_features/index.rst b/docs/source/guide/explanation/additional_features/index.rst index 5bfdaf77e16..9e76843e82e 100644 --- a/docs/source/guide/explanation/additional_features/index.rst +++ b/docs/source/guide/explanation/additional_features/index.rst @@ -9,3 +9,4 @@ Additional Features models_optimization hpo auto_configuration + xai diff --git a/docs/source/guide/explanation/additional_features/xai.rst b/docs/source/guide/explanation/additional_features/xai.rst new file mode 100644 index 00000000000..3c91c2c71e1 --- /dev/null +++ b/docs/source/guide/explanation/additional_features/xai.rst @@ -0,0 +1,95 @@ +Explainable AI (XAI) +==================== + +**Explainable AI (XAI)** is a field of research that aims to make machine learning models more transparent and interpretable to humans. +The goal is to help users understand how and why AI systems make decisions and provide insight into their inner workings. It allows us to detect, analyze, and prevent common mistakes, for example, when the model uses irrelevant features to make a prediction. +XAI can help to build trust in AI, make sure that the model is safe for development and increase its adoption in various domains. + +Most XAI methods generate **saliency maps** as a result. Saliency map is a visual representation, suitable for human comprehension, that highlights the most important parts of the image from the model point of view. +It looks like a heatmap, where warm-colored areas represent the areas with main focus. + + +.. figure:: ../../../../utils/images/xai_example.jpg + :width: 600 + :alt: this image shows the result of XAI algorithm + + These images are taken from `D-RISE paper `_. + + +We can generate saliency maps for a certain model that was trained in OpenVINO™ Training Extensions, using ``otx explain`` command line. Learn more about its usage in :doc:`../../tutorials/base/explain` tutorial. + +********************************* +XAI algorithms for classification +********************************* + +.. image:: ../../../../utils/images/xai_cls.jpg + :width: 600 + :align: center + :alt: this image shows the comparison of XAI classification algorithms + + +For classification networks these algorithms are used to generate saliency maps: + +- **Activation Map​** - this is the most basic and naive approach. It takes the outputs of the model's feature extractor (backbone) and averages it in channel dimension. The results highly rely on the backbone and ignore neck and head computations. Basically, it gives a relatively good and fast result. + +- `Eigen-Cam `_ uses Principal Component Analysis (PCA). It returns the first principal component of the feature extractor output, which most of the time corresponds to the dominant object. The results highly rely on the backbone as well and ignore neck and head computations. + +- `Recipro-CAM​ `_ uses Class Activation Mapping (CAM) to weigh the activation map for each class, so it can generate different saliency per class. Recipro-CAM is a fast gradient-free Reciprocal CAM method. The method involves spatially masking the extracted feature maps to exploit the correlation between activation maps and network predictions for target classes. + + +Below we show the comparison of described algorithms. ``Access to the model internal state`` means the necessity to modify the model's outputs and dump inner features. +``Per-class explanation support`` means generation different saliency maps for different classes. + ++-------------------------------------------+----------------+----------------+-------------------------------------------------------------------------+ +| Classification algorithm | Activation Map | Eigen-Cam | Recipro-CAM | ++===========================================+================+================+=========================================================================+ +| Need access to model internal state | Yes | Yes | Yes | ++-------------------------------------------+----------------+----------------+-------------------------------------------------------------------------+ +| Gradient-free | Yes | Yes | Yes | ++-------------------------------------------+----------------+----------------+-------------------------------------------------------------------------+ +| Single-shot | Yes | Yes | No (re-infer neck + head H*W times, where HxW – feature map size) | ++-------------------------------------------+----------------+----------------+-------------------------------------------------------------------------+ +| Per-class explanation support | No | No | Yes | ++-------------------------------------------+----------------+----------------+-------------------------------------------------------------------------+ +| Execution speed | Fast | Fast | Medium | ++-------------------------------------------+----------------+----------------+-------------------------------------------------------------------------+ + + +**************************** +XAI algorithms for detection +**************************** + +For detection networks these algorithms are used to generate saliency maps: + +- **Activation Map​** - the same approach as for classification networks, which uses the outputs from feature extractor. This is an algorithm is used to generate saliency maps for two-stage detectors. + +- **DetClassProbabilityMap** - this approach takes the raw classification head output and uses class probability maps to calculate regions of interest for each class. So, it creates different salience maps for each class. This algorithm is implemented for single-stage detectors only. + +.. image:: ../../../../utils/images/xai_det.jpg + :width: 600 + :align: center + :alt: this image shows the detailed description of XAI detection algorithm + + +The main limitation of this method is that, due to training loss design of most single-stage detectors, activation values drift towards the center of the object while propagating through the network. +This prevents from getting clear explanation in the input image space using intermediate activations. + +Below we show the comparison of described algorithms. ``Access to the model internal state`` means the necessity to modify the model's outputs and dump inner features. +``Per-class explanation support`` means generation different saliency maps for different classes. ``Per-box explanation support`` means generation standalone saliency maps for each detected prediction. + + ++-------------------------------------------+----------------------------+--------------------------------------------+ +| Detection algorithm | Activation Map | DetClassProbabilityMap | ++===========================================+============================+============================================+ +| Need access to model internal state | Yes | Yes | ++-------------------------------------------+----------------------------+--------------------------------------------+ +| Gradient-free | Yes | Yes | ++-------------------------------------------+----------------------------+--------------------------------------------+ +| Single-shot | Yes | Yes | ++-------------------------------------------+----------------------------+--------------------------------------------+ +| Per-class explanation support | No | Yes | ++-------------------------------------------+----------------------------+--------------------------------------------+ +| Per-box explanation support | No | No | ++-------------------------------------------+----------------------------+--------------------------------------------+ +| Execution speed | Fast | Fast | ++-------------------------------------------+----------------------------+--------------------------------------------+ diff --git a/docs/source/guide/explanation/algorithms/action/action_classification.rst b/docs/source/guide/explanation/algorithms/action/action_classification.rst index 09fe5cb9350..6069d6932de 100644 --- a/docs/source/guide/explanation/algorithms/action/action_classification.rst +++ b/docs/source/guide/explanation/algorithms/action/action_classification.rst @@ -27,21 +27,23 @@ Refer to our tutorial for more information on how to train, validate, and optimi Models ****** -We support `X3D `_ for action classification. X3D is a deep learning model that was proposed in the paper "X3D: Expanding Architectures for Efficient Video Recognition" by Christoph Feichtenhofer. The model is an extension of the popular 2D convolutional neural network (CNN) architectures to the 3D domain, allowing it to efficiently process spatiotemporal information in videos. +Currently OpenVINO™ Training Extensions supports `X3D `_ and `MoViNet `_ for action classification. -Currenly OpenVINO™ Training Extensions supports X3D-S model with below template: ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------------+-------------------------+ +| Template ID | Name | Complexity (GFLOPs) | Model size (MB) | ++========================================================================================================================================================================================+=========+=====================+=========================+ +| `Custom_Action_Classification_X3D `_ | X3D | 2.49 | 3.79 | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------------+-------------------------+ +| `Custom_Action_Classificaiton_MoViNet `_ | MoViNet | 2.71 | 3.10 | ++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------------+-------------------------+ -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------------+-------------------------+ -| Template ID | Name | Complexity (GFLOPs) | Model size (MB) | -+===============================================================================================================================================================================+=========+=====================+=========================+ -| `Custom_Action_Classification_X3D `_ | X3D | 2.49 | 3.79 | -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------------+-------------------------+ - -In the table below the **top-1 accuracy** on some academic datasets are presented. Each model is trained with single Nvidia GeForce RTX3090. +In the table below the **top-1 accuracy** on some academic datasets are presented. Each model is trained with single NVIDIA GeForce RTX 3090. +-----------------------+------------+-----------------+ | Model name | HMDB51 | UCF101 | +=======================+============+=================+ | X3D | 67.19 | 87.89 | +-----------------------+------------+-----------------+ +| MoViNet | 62.74 | 81.32 | ++-----------------------+------------+-----------------+ diff --git a/docs/source/guide/explanation/algorithms/classification/multi_class_classification.rst b/docs/source/guide/explanation/algorithms/classification/multi_class_classification.rst index 07b571cefec..3923b077434 100644 --- a/docs/source/guide/explanation/algorithms/classification/multi_class_classification.rst +++ b/docs/source/guide/explanation/algorithms/classification/multi_class_classification.rst @@ -206,7 +206,7 @@ Unlike other tasks, ``--val-data-root`` is not needed. $ otx train otx/algorithms/classification/configs/efficientnet_b0_cls_incr/template.yaml \ --train-data-root=tests/assets/imagenet_dataset_class_incremental \ params \ - --algo_backend.train_type=SELFSUPERVISED + --algo_backend.train_type=Selfsupervised After self-supervised training, pretrained weights can be use for supervised (incremental) learning like the below command: diff --git a/docs/source/guide/explanation/algorithms/object_detection/object_detection.rst b/docs/source/guide/explanation/algorithms/object_detection/object_detection.rst index 7cbe49852b3..e2528c20541 100644 --- a/docs/source/guide/explanation/algorithms/object_detection/object_detection.rst +++ b/docs/source/guide/explanation/algorithms/object_detection/object_detection.rst @@ -95,20 +95,25 @@ To see which public backbones are available for the task, the following command $ otx find --backbone {torchvision, pytorchcv, mmcls, omz.mmcls} -.. In the table below the test mAP on some academic datasets using our :ref:`supervised pipeline ` is presented. -.. The results were obtained on our templates without any changes. -.. For hyperparameters, please, refer to the related template. -.. We trained each model with a single Nvidia GeForce RTX3090. +In the table below the test mAP on some academic datasets using our :ref:`supervised pipeline ` is presented. -.. +-----------+------------+-----------+-----------+ -.. | Model name| COCO | PASCAL VOC| MinneApple| -.. +===========+============+===========+===========+ -.. | YOLOX | N/A | N/A | 24.5 | -.. +-----------+------------+-----------+-----------+ -.. | SSD | N/A | N/A | 31.2 | -.. +-----------+------------+-----------+-----------+ -.. | ATSS | N/A | N/A | 42.5 | -.. +-----------+------------+-----------+-----------+ +For `COCO `__ dataset the accuracy of pretrained weights is shown. That means that weights are undertrained for COCO dataset and don't achieve the best result. +That is because the purpose of pretrained models is to learn basic features from a such large and diverse dataset as COCO and to use these weights to get good results for other custom datasets right from the start. + +The results on `Pascal VOC `_, `BCCD `_, `MinneApple `_ and `WGISD `_ were obtained on our templates without any changes. +BCCD is an easy dataset with focused large objects, while MinneApple and WGISD have small objects that are hard to distinguish from the background. +For hyperparameters, please, refer to the related template. +We trained each model with a single Nvidia GeForce RTX3090. + ++-----------+------------+-----------+-----------+-----------+-----------+ +| Model name| COCO | PASCAL VOC| BCCD | MinneApple| WGISD | ++===========+============+===========+===========+===========+===========+ +| YOLOX | 32.0 | 66.6 | 60.3 | 24.5 | 44.1 | ++-----------+------------+-----------+-----------+-----------+-----------+ +| SSD | 13.5 | 50.0 | 54.2 | 31.2 | 45.9 | ++-----------+------------+-----------+-----------+-----------+-----------+ +| ATSS | 32.5 | 68.7 | 61.5 | 42.5 | 57.5 | ++-----------+------------+-----------+-----------+-----------+-----------+ @@ -133,7 +138,7 @@ Overall, OpenVINO™ Training Extensions utilizes powerful techniques for improv Please, refer to the :doc:`tutorial <../../../tutorials/advanced/semi_sl>` how to train semi supervised learning. -In the table below the mAP on toy data sample from `COCO `_ dataset using our pipeline is presented. +In the table below the mAP on toy data sample from `COCO `__ dataset using our pipeline is presented. We sample 400 images that contain one of [person, car, bus] for labeled train images. And 4000 images for unlabeled images. For validation 100 images are selected from val2017. diff --git a/docs/source/guide/explanation/algorithms/segmentation/semantic_segmentation.rst b/docs/source/guide/explanation/algorithms/segmentation/semantic_segmentation.rst index ede1c246464..5ae38d350fb 100644 --- a/docs/source/guide/explanation/algorithms/segmentation/semantic_segmentation.rst +++ b/docs/source/guide/explanation/algorithms/segmentation/semantic_segmentation.rst @@ -165,7 +165,7 @@ To enable self-supervised training, the command below can be executed: $ otx train otx/algorithms/segmentation/configs/ocr_lite_hrnet_s_mod2/template.yaml \ --train-data-roots=tests/assets/common_semantic_segmentation_dataset/train/images \ params \ - --algo_backend.train_type=SELFSUPERVISED + --algo_backend.train_type=Selfsupervised After self-supervised training, pretrained weights can be use for supervised (incremental) learning like the below command: diff --git a/docs/source/guide/get_started/quick_start_guide/cli_commands.rst b/docs/source/guide/get_started/quick_start_guide/cli_commands.rst index 2d628d9c4a9..f7878dce927 100644 --- a/docs/source/guide/get_started/quick_start_guide/cli_commands.rst +++ b/docs/source/guide/get_started/quick_start_guide/cli_commands.rst @@ -92,7 +92,7 @@ Building workspace folder Comma-separated paths to unlabeled file list --task TASK The currently supported options: ('CLASSIFICATION', 'DETECTION', 'INSTANCE_SEGMENTATION', 'SEGMENTATION', 'ACTION_CLASSIFICATION', 'ACTION_DETECTION', 'ANOMALY_CLASSIFICATION', 'ANOMALY_DETECTION', 'ANOMALY_SEGMENTATION'). --train-type TRAIN_TYPE - The currently supported options: dict_keys(['INCREMENTAL', 'SEMISUPERVISED', 'SELFSUPERVISED']). + The currently supported options: dict_keys(['Incremental', 'Semisupervised', 'Selfsupervised']). --work-dir WORK_DIR Location where the workspace. --model MODEL Enter the name of the model you want to use. (Ex. EfficientNet-B0). --backbone BACKBONE Available Backbone Type can be found using 'otx find --backbone {framework}'. @@ -181,7 +181,7 @@ However, if you created a workspace with ``otx build``, the training process can --unlabeled-file-list UNLABELED_FILE_LIST Comma-separated paths to unlabeled file list --train-type TRAIN_TYPE - The currently supported options: dict_keys(['INCREMENTAL', 'SEMISUPERVISED', 'SELFSUPERVISED']). + The currently supported options: dict_keys(['Incremental', 'Semisupervised', 'Selfsupervised']). --load-weights LOAD_WEIGHTS Load model weights from previously saved checkpoint. --resume-from RESUME_FROM @@ -399,7 +399,7 @@ The command below will evaluate the trained model on the provided dataset: Explanation *********** -``otx explain`` runs the explanation algorithm of a model on the specific dataset. It helps explain the model's decision-making process in a way that is easily understood by humans. +``otx explain`` runs the explainable AI (XAI) algorithm of a model on the specific dataset. It helps explain the model's decision-making process in a way that is easily understood by humans. With the ``--help`` command, you can list additional information, such as its parameters common to all model templates: diff --git a/docs/source/guide/index.rst b/docs/source/guide/index.rst index f798f932241..2715ced60c0 100644 --- a/docs/source/guide/index.rst +++ b/docs/source/guide/index.rst @@ -30,7 +30,7 @@ Guide reference/api/index reference/algorithm/index - reference/core/data + reference/core/index reference/hpo/hpo reference/mpa/index diff --git a/docs/source/guide/reference/algorithm/classification/adapters/mmcls.rst b/docs/source/guide/reference/algorithm/classification/adapters/mmcls.rst index d25ccf195a3..540b104e094 100644 --- a/docs/source/guide/reference/algorithm/classification/adapters/mmcls.rst +++ b/docs/source/guide/reference/algorithm/classification/adapters/mmcls.rst @@ -7,4 +7,56 @@ mmclassification .. automodule:: otx.algorithms.classification.adapters.mmcls :members: - :undoc-members: \ No newline at end of file + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.exporter + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.inferrer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.stage + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.trainer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.incremental + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.incremental.inferrer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.incremental.stage + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.incremental.trainer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.semisl + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.semisl.inferrer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.semisl.stage + :members: + :undoc-members: + +.. automodule:: otx.algorithms.classification.adapters.mmcls.task.semisl.trainer + :members: + :undoc-members: diff --git a/docs/source/guide/reference/algorithm/detection/adapters/mmdet.rst b/docs/source/guide/reference/algorithm/detection/adapters/mmdet.rst index 6be3c0ea081..67b2d413d82 100644 --- a/docs/source/guide/reference/algorithm/detection/adapters/mmdet.rst +++ b/docs/source/guide/reference/algorithm/detection/adapters/mmdet.rst @@ -7,4 +7,56 @@ mmdetection .. automodule:: otx.algorithms.detection.adapters.mmdet :members: - :undoc-members: \ No newline at end of file + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.exporter + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.inferrer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.stage + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.trainer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.incremental + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.incremental.inferrer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.incremental.stage + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.incremental.trainer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.semisl + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.semisl.inferrer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.semisl.stage + :members: + :undoc-members: + +.. automodule:: otx.algorithms.detection.adapters.mmdet.tasks.semisl.trainer + :members: + :undoc-members: diff --git a/docs/source/guide/reference/algorithm/segmentation/adapters/mmseg.rst b/docs/source/guide/reference/algorithm/segmentation/adapters/mmseg.rst index 9d72fcdc48a..c03e42319c6 100644 --- a/docs/source/guide/reference/algorithm/segmentation/adapters/mmseg.rst +++ b/docs/source/guide/reference/algorithm/segmentation/adapters/mmseg.rst @@ -7,4 +7,56 @@ mmsegmentation .. automodule:: otx.algorithms.segmentation.adapters.mmseg :members: - :undoc-members: \ No newline at end of file + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.exporter + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.inferrer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.stage + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.trainer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.incremental + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.incremental.inferrer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.incremental.stage + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.incremental.trainer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.semisl + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.semisl.inferrer + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.semisl.stage + :members: + :undoc-members: + +.. automodule:: otx.algorithms.segmentation.adapters.mmseg.tasks.semisl.trainer + :members: + :undoc-members: diff --git a/docs/source/guide/reference/core/index.rst b/docs/source/guide/reference/core/index.rst new file mode 100644 index 00000000000..b55754cce07 --- /dev/null +++ b/docs/source/guide/reference/core/index.rst @@ -0,0 +1,8 @@ +Core +==== + +.. toctree:: + :maxdepth: 1 + + data + ov/index diff --git a/docs/source/guide/reference/mpa/modules/ov/graph.rst b/docs/source/guide/reference/core/ov/graph.rst similarity index 51% rename from docs/source/guide/reference/mpa/modules/ov/graph.rst rename to docs/source/guide/reference/core/ov/graph.rst index 01bab6ca9b4..6f47f9e154b 100644 --- a/docs/source/guide/reference/mpa/modules/ov/graph.rst +++ b/docs/source/guide/reference/core/ov/graph.rst @@ -5,18 +5,18 @@ Graph :maxdepth: 3 :caption: Contents: -.. automodule:: otx.mpa.modules.ov.graph +.. automodule:: otx.core.ov.graph :members: :undoc-members: -.. automodule:: otx.mpa.modules.ov.graph.graph +.. automodule:: otx.core.ov.graph.graph :members: :undoc-members: -.. automodule:: otx.mpa.modules.ov.graph.utils +.. automodule:: otx.core.ov.graph.utils :members: :undoc-members: -.. automodule:: otx.mpa.modules.ov.graph.parsers +.. automodule:: otx.core.ov.graph.parsers :members: :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/ov/index.rst b/docs/source/guide/reference/core/ov/index.rst similarity index 56% rename from docs/source/guide/reference/mpa/modules/ov/index.rst rename to docs/source/guide/reference/core/ov/index.rst index ec585d95c7e..07ce1abd4cf 100644 --- a/docs/source/guide/reference/mpa/modules/ov/index.rst +++ b/docs/source/guide/reference/core/ov/index.rst @@ -8,18 +8,18 @@ OpenVINO models ops -.. automodule:: otx.mpa.modules.ov +.. automodule:: otx.core.ov :members: :undoc-members: -.. automodule:: otx.mpa.modules.ov.omz_wrapper +.. automodule:: otx.core.ov.omz_wrapper :members: :undoc-members: -.. automodule:: otx.mpa.modules.ov.registry +.. automodule:: otx.core.ov.registry :members: :undoc-members: -.. automodule:: otx.mpa.modules.ov.utils +.. automodule:: otx.core.ov.utils :members: :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/core/ov/models.rst b/docs/source/guide/reference/core/ov/models.rst new file mode 100644 index 00000000000..c3f535e82ab --- /dev/null +++ b/docs/source/guide/reference/core/ov/models.rst @@ -0,0 +1,22 @@ +Models +^^^^^^^^ + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + +.. automodule:: otx.core.ov.models + :members: + :undoc-members: + +.. automodule:: otx.core.ov.models.mmov_model + :members: + :undoc-members: + +.. automodule:: otx.core.ov.models.ov_model + :members: + :undoc-members: + +.. automodule:: otx.core.ov.models.parser_mixin + :members: + :undoc-members: diff --git a/docs/source/guide/reference/core/ov/ops.rst b/docs/source/guide/reference/core/ov/ops.rst new file mode 100644 index 00000000000..7b249e02702 --- /dev/null +++ b/docs/source/guide/reference/core/ov/ops.rst @@ -0,0 +1,82 @@ +OPS +^^^ + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + +.. automodule:: otx.core.ov.ops + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.activations + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.arithmetics + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.builder + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.convolutions + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.generation + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.image_processings + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.infrastructures + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.matmuls + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.movements + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.normalizations + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.object_detections + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.op + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.poolings + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.reductions + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.shape_manipulations + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.sorting_maximization + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.type_conversions + :members: + :undoc-members: + +.. automodule:: otx.core.ov.ops.utils + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/classification.rst b/docs/source/guide/reference/mpa/classification.rst deleted file mode 100644 index ff8abf3bccc..00000000000 --- a/docs/source/guide/reference/mpa/classification.rst +++ /dev/null @@ -1,58 +0,0 @@ -Classification -^^^^^^^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.cls - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.exporter - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.inferrer - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.stage - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.trainer - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.incremental - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.incremental.inferrer - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.incremental.stage - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.incremental.trainer - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.semisl - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.semisl.inferrer - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.semisl.stage - :members: - :undoc-members: - -.. automodule:: otx.mpa.cls.semisl.trainer - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/deploy.rst b/docs/source/guide/reference/mpa/deploy.rst deleted file mode 100644 index 7a4d154095a..00000000000 --- a/docs/source/guide/reference/mpa/deploy.rst +++ /dev/null @@ -1,34 +0,0 @@ -Deploy -^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.deploy - :members: - :undoc-members: - -.. automodule:: otx.mpa.deploy.apis - :members: - :undoc-members: - -.. automodule:: otx.mpa.deploy.utils - :members: - :undoc-members: - -.. automodule:: otx.mpa.deploy.utils.mmdeploy - :members: - :undoc-members: - -.. automodule:: otx.mpa.deploy.utils.onnx - :members: - :undoc-members: - -.. automodule:: otx.mpa.deploy.utils.operations_domain - :members: - :undoc-members: - -.. automodule:: otx.mpa.deploy.utils.utils - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/detection.rst b/docs/source/guide/reference/mpa/detection.rst deleted file mode 100644 index 365b4fad1a7..00000000000 --- a/docs/source/guide/reference/mpa/detection.rst +++ /dev/null @@ -1,58 +0,0 @@ -Detection -^^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.det - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.exporter - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.inferrer - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.stage - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.trainer - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.incremental - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.incremental.inferrer - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.incremental.stage - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.incremental.trainer - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.semisl - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.semisl.inferrer - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.semisl.stage - :members: - :undoc-members: - -.. automodule:: otx.mpa.det.semisl.trainer - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/index.rst b/docs/source/guide/reference/mpa/index.rst index d1e88cd2ae8..2b7ebc58cf3 100644 --- a/docs/source/guide/reference/mpa/index.rst +++ b/docs/source/guide/reference/mpa/index.rst @@ -5,8 +5,4 @@ Model Preparation Algorithm :maxdepth: 1 modules/index - classification - detection - segmentation - deploy utils diff --git a/docs/source/guide/reference/mpa/modules/datasets.rst b/docs/source/guide/reference/mpa/modules/datasets.rst deleted file mode 100644 index 3d52750d3f6..00000000000 --- a/docs/source/guide/reference/mpa/modules/datasets.rst +++ /dev/null @@ -1,23 +0,0 @@ -Datasets -^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.datasets - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.datasets.composed_dataloader - :members: - :undoc-members: - - -.. automodule:: otx.mpa.modules.datasets.pipelines - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.datasets.samplers - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/hooks.rst b/docs/source/guide/reference/mpa/modules/hooks.rst deleted file mode 100644 index 522a1d3a61f..00000000000 --- a/docs/source/guide/reference/mpa/modules/hooks.rst +++ /dev/null @@ -1,86 +0,0 @@ -Hooks -^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.hooks - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.adaptive_training_hooks - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.cancel_interface_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.checkpoint_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.composed_dataloaders_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.early_stopping_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.eval_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.fp16_sam_optimizer_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.ib_loss_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.logger_replace_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.model_ema_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.model_ema_v2_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.no_bias_decay_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.recording_forward_hooks - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.sam_optimizer_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.save_initial_weight_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.semisl_cls_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.task_adapt_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.unbiased_teacher_hook - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.hooks.workflow_hooks - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/index.rst b/docs/source/guide/reference/mpa/modules/index.rst deleted file mode 100644 index 0f463fdd61d..00000000000 --- a/docs/source/guide/reference/mpa/modules/index.rst +++ /dev/null @@ -1,12 +0,0 @@ -Modules -=================== - -.. toctree:: - :maxdepth: 1 - - models/index - datasets - hooks - optimizer - ov/index - utils diff --git a/docs/source/guide/reference/mpa/modules/models/backbones.rst b/docs/source/guide/reference/mpa/modules/models/backbones.rst deleted file mode 100644 index 249f934ebb5..00000000000 --- a/docs/source/guide/reference/mpa/modules/models/backbones.rst +++ /dev/null @@ -1,14 +0,0 @@ -Backbones -^^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.models.backbones - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.backbones.litehrnet - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/models/classifiers.rst b/docs/source/guide/reference/mpa/modules/models/classifiers.rst deleted file mode 100644 index 7f11ac3ca4a..00000000000 --- a/docs/source/guide/reference/mpa/modules/models/classifiers.rst +++ /dev/null @@ -1,26 +0,0 @@ -Classifiers -^^^^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.models.classifiers - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.classifiers.sam_classifier - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.classifiers.sam_classifier_mixin - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.classifiers.semisl_classifier - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.classifiers.supcon_classifier - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/models/heads.rst b/docs/source/guide/reference/mpa/modules/models/heads.rst deleted file mode 100644 index 5b5a5de1c83..00000000000 --- a/docs/source/guide/reference/mpa/modules/models/heads.rst +++ /dev/null @@ -1,63 +0,0 @@ -Heads -^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.models.heads - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.aggregator_mixin - :members: - :undoc-members: - - -.. automodule:: otx.mpa.modules.models.heads.custom_cls_head - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.custom_fcn_head - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.custom_hierarchical_linear_cls_head - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.custom_hierarchical_non_linear_cls_head - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.custom_multi_label_linear_cls_head - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.custom_multi_label_non_linear_cls_head - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.mix_loss_mixin - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.non_linear_cls_head - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.pixel_weights_mixin - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.segment_out_norm_mixin - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.semisl_cls_head - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.heads.supcon_cls_head - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/models/index.rst b/docs/source/guide/reference/mpa/modules/models/index.rst deleted file mode 100644 index 45d93070e47..00000000000 --- a/docs/source/guide/reference/mpa/modules/models/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -Models -^^^^^^^ - -.. toctree:: - :maxdepth: 1 - - backbones - classifiers - heads - losses - scalar_schedulers - segmentors - utils \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/models/losses.rst b/docs/source/guide/reference/mpa/modules/models/losses.rst deleted file mode 100644 index d084ee3a9ab..00000000000 --- a/docs/source/guide/reference/mpa/modules/models/losses.rst +++ /dev/null @@ -1,51 +0,0 @@ -Losses -^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.models.losses - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.losses.asymmetric_angular_loss_with_ignore - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.losses.asymmetric_loss_with_ignore - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.losses.barlowtwins_loss - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.losses.base_pixel_loss - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.losses.base_weighted_loss - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.losses.cross_entropy_loss_with_ignore - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.losses.cross_entropy_loss - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.losses.ib_loss - :members: - :undoc-members: - - -.. automodule:: otx.mpa.modules.models.losses.mpa_pixel_base - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.losses.utils - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/models/scalar_schedulers.rst b/docs/source/guide/reference/mpa/modules/models/scalar_schedulers.rst deleted file mode 100644 index 869c52a169b..00000000000 --- a/docs/source/guide/reference/mpa/modules/models/scalar_schedulers.rst +++ /dev/null @@ -1,10 +0,0 @@ -Scalar Schedulers -^^^^^^^^^^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.models.scalar_schedulers - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/models/segmentors.rst b/docs/source/guide/reference/mpa/modules/models/segmentors.rst deleted file mode 100644 index 48184f2e04c..00000000000 --- a/docs/source/guide/reference/mpa/modules/models/segmentors.rst +++ /dev/null @@ -1,30 +0,0 @@ -Segmentors -^^^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.models.segmentors - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.segmentors.class_incr_encoder_decoder - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.segmentors.mean_teacher_segmentor - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.segmentors.mix_loss_mixin - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.segmentors.otx_encoder_decoder - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.models.segmentors.pixel_weights_mixin - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/models/utils.rst b/docs/source/guide/reference/mpa/modules/models/utils.rst deleted file mode 100644 index dd67394313b..00000000000 --- a/docs/source/guide/reference/mpa/modules/models/utils.rst +++ /dev/null @@ -1,10 +0,0 @@ -Utils -^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.models.utils - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/optimizer.rst b/docs/source/guide/reference/mpa/modules/optimizer.rst deleted file mode 100644 index 767da78bc9f..00000000000 --- a/docs/source/guide/reference/mpa/modules/optimizer.rst +++ /dev/null @@ -1,14 +0,0 @@ -Optimizer -^^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.optimizer - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.optimizer.lars - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/ov/models.rst b/docs/source/guide/reference/mpa/modules/ov/models.rst deleted file mode 100644 index 362d788172d..00000000000 --- a/docs/source/guide/reference/mpa/modules/ov/models.rst +++ /dev/null @@ -1,30 +0,0 @@ -Models -^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.ov.models - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.models.mmov_model - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.models.ov_model - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.models.parser_mixin - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.models.mmcls - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.models.mmseg - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/ov/ops.rst b/docs/source/guide/reference/mpa/modules/ov/ops.rst deleted file mode 100644 index 72b59b1770f..00000000000 --- a/docs/source/guide/reference/mpa/modules/ov/ops.rst +++ /dev/null @@ -1,82 +0,0 @@ -OPS -^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.ov.ops - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.activations - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.arithmetics - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.builder - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.convolutions - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.generation - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.image_processings - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.infrastructures - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.matmuls - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.movements - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.normalizations - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.object_detections - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.op - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.poolings - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.reductions - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.shape_manipulations - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.sorting_maximization - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.type_conversions - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.ov.ops.utils - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/modules/utils.rst b/docs/source/guide/reference/mpa/modules/utils.rst deleted file mode 100644 index a22e69d158c..00000000000 --- a/docs/source/guide/reference/mpa/modules/utils.rst +++ /dev/null @@ -1,22 +0,0 @@ -Utils -^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.modules.utils - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.utils.distance_utils - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.utils.seg_utils - :members: - :undoc-members: - -.. automodule:: otx.mpa.modules.utils.task_adapt - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/segmentation.rst b/docs/source/guide/reference/mpa/segmentation.rst deleted file mode 100644 index a59c5463524..00000000000 --- a/docs/source/guide/reference/mpa/segmentation.rst +++ /dev/null @@ -1,58 +0,0 @@ -Segmentation -^^^^^^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.seg - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.exporter - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.inferrer - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.stage - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.trainer - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.incremental - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.incremental.inferrer - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.incremental.stage - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.incremental.trainer - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.semisl - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.semisl.inferrer - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.semisl.stage - :members: - :undoc-members: - -.. automodule:: otx.mpa.seg.semisl.trainer - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/reference/mpa/utils.rst b/docs/source/guide/reference/mpa/utils.rst deleted file mode 100644 index 9419a4a872c..00000000000 --- a/docs/source/guide/reference/mpa/utils.rst +++ /dev/null @@ -1,30 +0,0 @@ -Utils -^^^^^^^ - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - -.. automodule:: otx.mpa.utils - :members: - :undoc-members: - -.. automodule:: otx.mpa.utils.config_utils - :members: - :undoc-members: - -.. automodule:: otx.mpa.utils.convert_keys - :members: - :undoc-members: - -.. automodule:: otx.mpa.utils.ext_loader - :members: - :undoc-members: - -.. automodule:: otx.mpa.utils.file - :members: - :undoc-members: - -.. automodule:: otx.mpa.utils.mo_wrapper - :members: - :undoc-members: \ No newline at end of file diff --git a/docs/source/guide/tutorials/advanced/self_sl.rst b/docs/source/guide/tutorials/advanced/self_sl.rst index 96de2beb42c..e474fe0c0bc 100644 --- a/docs/source/guide/tutorials/advanced/self_sl.rst +++ b/docs/source/guide/tutorials/advanced/self_sl.rst @@ -21,7 +21,7 @@ The process has been tested on the following configuration: Setup virtual environment ************************* -1. You can follow the installation process from a :doc:`quick start guide <../../../get_started/quick_start_guide/installation>` +1. You can follow the installation process from a :doc:`quick start guide <../../get_started/quick_start_guide/installation>` to create a universal virtual environment for OpenVINO™ Training Extensions. 2. Activate your virtual @@ -64,23 +64,23 @@ for **self-supervised learning** by running the following command: .. code-block:: - (otx) ...$ otx build --train-data-roots data/flower_photos --model MobileNet-V3-large-1x --train-type SELFSUPERVISED --work-dir otx-workspace-CLASSIFICATION-SELFSUPERVISED + (otx) ...$ otx build --train-data-roots data/flower_photos --model MobileNet-V3-large-1x --train-type Selfsupervised --work-dir otx-workspace-CLASSIFICATION-Selfsupervised - [*] Workspace Path: otx-workspace-CLASSIFICATION-SELFSUPERVISED + [*] Workspace Path: otx-workspace-CLASSIFICATION-Selfsupervised [*] Load Model Template ID: Custom_Image_Classification_MobileNet-V3-large-1x - [*] Load Model Name: MobileNet-V3-large-1x[*] - Updated: otx-workspace-CLASSIFICATION-SELFSUPERVISED/selfsl/model.py - [*] - Updated: otx-workspace-CLASSIFICATION-SELFSUPERVISED/selfsl/data_pipeline.py - [*] - Updated: otx-workspace-CLASSIFICATION-SELFSUPERVISED/deployment.py - [*] - Updated: otx-workspace-CLASSIFICATION-SELFSUPERVISED/hpo_config.yaml - [*] - Updated: otx-workspace-CLASSIFICATION-SELFSUPERVISED/model_hierarchical.py - [*] - Updated: otx-workspace-CLASSIFICATION-SELFSUPERVISED/model_multilabel.py - [*] Update data configuration file to: otx-workspace-CLASSIFICATION-SELFSUPERVISED/data.yaml + [*] Load Model Name: MobileNet-V3-large-1x[*] - Updated: otx-workspace-CLASSIFICATION-Selfsupervised/selfsl/model.py + [*] - Updated: otx-workspace-CLASSIFICATION-Selfsupervised/selfsl/data_pipeline.py + [*] - Updated: otx-workspace-CLASSIFICATION-Selfsupervised/deployment.py + [*] - Updated: otx-workspace-CLASSIFICATION-Selfsupervised/hpo_config.yaml + [*] - Updated: otx-workspace-CLASSIFICATION-Selfsupervised/model_hierarchical.py + [*] - Updated: otx-workspace-CLASSIFICATION-Selfsupervised/model_multilabel.py + [*] Update data configuration file to: otx-workspace-CLASSIFICATION-Selfsupervised/data.yaml .. note:: Three things must be considered to set the workspace for self-supervised learning: - 1. add ``--train-type SELFSUPERVISED`` in the command to get the training components for self-supervised learning, + 1. add ``--train-type Selfsupervised`` in the command to get the training components for self-supervised learning, 2. update the path set as ``train-data-roots``, 3. and add ``--work-dir`` to distinguish self-supervised learning workspace from supervised learning workspace. @@ -102,7 +102,7 @@ After the workspace creation, the workspace structure is as follows: │   ├── train │   └── val └── template.yaml - otx-workspace-CLASSIFICATION-SELFSUPERVISED + otx-workspace-CLASSIFICATION-Selfsupervised ├── configuration.yaml ├── data.yaml ├── deployment.py @@ -121,20 +121,20 @@ After the workspace creation, the workspace structure is as follows: For `VOC2012 dataset `_ used in :doc:`semantic segmentation tutorial <../base/how_to_train/semantic_segmentation>`, for example, the path ``data/VOCdevkit/VOC2012/JPEGImages`` must be set instead of ``data/VOCdevkit/VOC2012``. Please refer to :ref:`Explanation of Self-Supervised Learning for Semantic Segmentation `. - And don't forget to add ``--train-type SELFSUPERVISED``. + And don't forget to add ``--train-type Selfsupervised``. .. code-block:: (otx) ...$ otx build --train-data-roots data/VOCdevkit/VOC2012/JPEGImages \ --model Lite-HRNet-18-mod2 \ - --train-type SELFSUPERVISED + --train-type Selfsupervised 4. To start training we need to call ``otx train`` command in **self-supervised learning** workspace: .. code-block:: - (otx) ...$ cd otx-workspace-CLASSIFICATION-SELFSUPERVISED + (otx) ...$ cd otx-workspace-CLASSIFICATION-Selfsupervised (otx) ...$ otx train --data ../otx-workspace-CLASSIFICATION/data.yaml ... @@ -168,7 +168,7 @@ After pre-training progress, start fine-tuning by calling the below command with .. code-block:: (otx) ...$ cd ../otx-workspace-CLASSIFICATION - (otx) ...$ otx train --load-weights ../otx-workspace-CLASSIFICATION-SELFSUPERVISED/models/weights.pth + (otx) ...$ otx train --load-weights ../otx-workspace-CLASSIFICATION-Selfsupervised/models/weights.pth ... diff --git a/docs/source/guide/tutorials/advanced/semi_sl.rst b/docs/source/guide/tutorials/advanced/semi_sl.rst index cce334631e9..fa866675526 100644 --- a/docs/source/guide/tutorials/advanced/semi_sl.rst +++ b/docs/source/guide/tutorials/advanced/semi_sl.rst @@ -44,7 +44,7 @@ This tutorial explains how to train a model in semi-supervised learning mode and Setup virtual environment ************************* -1. You can follow the installation process from a :doc:`quick start guide <../../../get_started/quick_start_guide/installation>` +1. You can follow the installation process from a :doc:`quick start guide <../../get_started/quick_start_guide/installation>` to create a universal virtual environment for OpenVINO™ Training Extensions. 2. Activate your virtual @@ -73,7 +73,7 @@ Enable via ``otx build`` 1. To enable semi-supervsied learning via ``otx build``, we need to add arguments ``--unlabeled-data-roots`` and ``--train-type``. OpenVINO™ Training Extensions receives the root path where unlabeled images are by ``--unlabeled-data-roots``. -We should put the path where unlabeled data are contained. It also provides us ``--train-type`` to select the type of training scheme. All we have to do for that is specifying it as **SEMISUPERVISED**. +We should put the path where unlabeled data are contained. It also provides us ``--train-type`` to select the type of training scheme. All we have to do for that is specifying it as **Semisupervised**. .. note:: @@ -85,7 +85,7 @@ We should put the path where unlabeled data are contained. It also provides us ` .. code-block:: - (otx) ...$ otx build --train-data-roots data/flower_photos --unlabeled-data-roots tests/assets/imagenet_dataset --model MobileNet-V3-large-1x --train-type SEMISUPERVISED + (otx) ...$ otx build --train-data-roots data/flower_photos --unlabeled-data-roots tests/assets/imagenet_dataset --model MobileNet-V3-large-1x --train-type Semisupervised [*] Workspace Path: otx-workspace-CLASSIFICATION @@ -107,14 +107,14 @@ command in our workspace: (otx) ...$ otx train -In the train log, you can check that the train type is set to **SEMISUPERVISED** and related configurations are properly loaded as following: +In the train log, you can check that the train type is set to **Semisupervised** and related configurations are properly loaded as following: .. code-block:: ... 2023-02-22 06:21:54,492 | INFO : called _init_recipe() - 2023-02-22 06:21:54,492 | INFO : train type = SEMISUPERVISED - 2023-02-22 06:21:54,492 | INFO : train type = SEMISUPERVISED - loading training_extensions/otx/recipes/stages/classification/semisl.yaml + 2023-02-22 06:21:54,492 | INFO : train type = Semisupervised + 2023-02-22 06:21:54,492 | INFO : train type = Semisupervised - loading training_extensions/otx/recipes/stages/classification/semisl.yaml 2023-02-22 06:21:54,500 | INFO : Replacing runner from EpochRunnerWithCancel to EpochRunnerWithCancel. 2023-02-22 06:21:54,503 | INFO : initialized recipe = training_extensions/otx/recipes/stages/classification/semisl.yaml ... @@ -128,23 +128,23 @@ Enable via ``otx train`` *************************** 1. To enable semi-supervised learning directly via ``otx train``, we need to add arguments ``--unlabeled-data-roots`` and ``--algo_backend.train_type`` -which is one of template-specific parameters (details are provided in `quick start guide <../../get_started/quick_start_guide/cli_commands.html#training>`__.) +which is one of template-specific parameters (details are provided in `quick start guide <../../get_started/quick_start_guide/cli_commands.html#training>`__). .. code-block:: (otx) ...$ otx train otx/algorithms/classification/configs/mobilenet_v3_large_1_cls_incr/template.yaml \ --train-data-roots data/flower_photos \ --unlabeled-data-roots tests/assets/imagenet_dataset \ - params --algo_backend.train_type SEMISUPERVISED + params --algo_backend.train_type Semisupervised -In the train log, you can check that the train type is set to **SEMISUPERVISED** and related configurations are properly loaded as following: +In the train log, you can check that the train type is set to **Semisupervised** and related configurations are properly loaded as following: .. code-block:: ... 2023-02-22 06:21:54,492 | INFO : called _init_recipe() - 2023-02-22 06:21:54,492 | INFO : train type = SEMISUPERVISED - 2023-02-22 06:21:54,492 | INFO : train type = SEMISUPERVISED - loading training_extensions/otx/recipes/stages/classification/semisl.yaml + 2023-02-22 06:21:54,492 | INFO : train type = Semisupervised + 2023-02-22 06:21:54,492 | INFO : train type = Semisupervised - loading training_extensions/otx/recipes/stages/classification/semisl.yaml 2023-02-22 06:21:54,500 | INFO : Replacing runner from EpochRunnerWithCancel to EpochRunnerWithCancel. 2023-02-22 06:21:54,503 | INFO : initialized recipe = training_extensions/otx/recipes/stages/classification/semisl.yaml ... diff --git a/docs/source/guide/tutorials/base/demo.rst b/docs/source/guide/tutorials/base/demo.rst index 2ca856df0ae..735cc664515 100644 --- a/docs/source/guide/tutorials/base/demo.rst +++ b/docs/source/guide/tutorials/base/demo.rst @@ -8,7 +8,7 @@ It allows you to apply the model on the custom data or the online footage from a This tutorial uses an object detection model for example, however for other tasks the functionality remains the same - you just need to replace the input dataset with your own. -For visualization you use images from WGISD dataset from the :doc: `object detection tutorial `. +For visualization you use images from WGISD dataset from the :doc:`object detection tutorial `. 1. Activate the virtual environment created in the previous step. @@ -69,8 +69,8 @@ You can check a list of camera devices by running the command line below on Linu .. code-block:: - sudo apt-get install v4l-utils - v4l2-ctl --list-devices + (demo) ...$ sudo apt-get install v4l-utils + (demo) ...$ v4l2-ctl --list-devices The output will look like this: diff --git a/docs/source/guide/tutorials/base/explain.rst b/docs/source/guide/tutorials/base/explain.rst index dba54b63d14..a9367f19887 100644 --- a/docs/source/guide/tutorials/base/explain.rst +++ b/docs/source/guide/tutorials/base/explain.rst @@ -26,9 +26,28 @@ at the path specified by ``--save-explanation-to``. .. code-block:: - otx explain --explain-data-roots otx-workspace-DETECTION/splitted_dataset/val/ --save-explanation-to outputs/explanation --load-weights outputs/weights.pth + otx explain --explain-data-roots otx-workspace-DETECTION/splitted_dataset/val/ \ + --save-explanation-to outputs/explanation \ + --load-weights outputs/weights.pth -3. As a result we will get a folder with a pair of generated +3. To specify the algorithm of saliency map creation for classification, +we can define the ``--explain-algorithm`` parameter. + +- ``activationmap`` - for activation map classification algorithm +- ``eigencam`` - for Eigen-Cam classification algorithm +- ``classwisesaliencymap`` - for Recipro-CAM classification algorithm, this is a default method + +For detection task, we can choose between the following methods: + +- ``activationmap`` - for activation map detection algorithm +- ``classwisesaliencymap`` - for DetClassProbabilityMap algorithm (works for single-stage detectors only) + +.. note:: + + Learn more about Explainable AI and its algorithms in :doc:`XAI explanation section <../../explanation/additional_features/xai>` + + +4. As a result we will get a folder with a pair of generated images for each image in ``--explain-data-roots``: - saliency map - where red color means more attention of the model diff --git a/docs/source/guide/tutorials/base/how_to_train/action_classification.rst b/docs/source/guide/tutorials/base/how_to_train/action_classification.rst index f41f6051fb7..c81d5946b56 100644 --- a/docs/source/guide/tutorials/base/how_to_train/action_classification.rst +++ b/docs/source/guide/tutorials/base/how_to_train/action_classification.rst @@ -74,7 +74,6 @@ According to the `documentation `_ format using the following command: @@ -128,17 +127,18 @@ To see the list of supported templates, run the following command: .. note:: - OpenVINO™ Training Extensions is supporting only X3D model template now, other architecture will be supported in near future. + OpenVINO™ Training Extensions supports X3D and MoViNet template now, other architecture will be supported in future. .. code-block:: (otx) ...$ otx find --task action_classification - +-----------------------+----------------------------------+------+----------------------------------------------------------------+ - | TASK | ID | NAME | BASE PATH | - +-----------------------+----------------------------------+------+----------------------------------------------------------------+ - | ACTION_CLASSIFICATION | Custom_Action_Classification_X3D | X3D | otx/algorithms/action/configs/classification/x3d/template.yaml | - +-----------------------+----------------------------------+------+----------------------------------------------------------------+ + +-----------------------+--------------------------------------+---------+-----------------------------------------------------------------------+ + | TASK | ID | NAME | BASE PATH | + +-----------------------+--------------------------------------+---------+-----------------------------------------------------------------------+ + | ACTION_CLASSIFICATION | Custom_Action_Classification_X3D | X3D | ../otx/algorithms/action/configs/classification/x3d/template.yaml | + | ACTION_CLASSIFICATION | Custom_Action_Classification_MoViNet | MoViNet | ../otx/algorithms/action/configs/classification/movinet/template.yaml | + +-----------------------+--------------------------------------+---------+-----------------------------------------------------------------------+ All commands will be run on the X3D model. It's a light model, that achieves competitive accuracy while keeping the inference fast. @@ -254,7 +254,7 @@ Optimization ************* 1. You can further optimize the model with ``otx optimize``. -Currently, only POT is supported for action classsification. NNCF will be supported in near future. +Currently, quantization jobs that include POT is supported for X3D template. MoViNet will be supported in near future. Refer to :doc:`optimization explanation <../../../explanation/additional_features/models_optimization>` section for more details on model optimization. 2. Example command for optimizing @@ -275,4 +275,4 @@ Keep in mind that POT will take some time (generally less than NNCF optimization efficient model representation ready-to-use action classification model. The following tutorials provide further steps on how to :doc:`deploy <../deploy>` and use your model in the :doc:`demonstration mode <../demo>` and visualize results. -The examples are provided with an object detection model, but it is easy to apply them for action classification by substituting the object detection model with classification one. \ No newline at end of file +The examples are provided with an object detection model, but it is easy to apply them for action classification by substituting the object detection model with classification one. diff --git a/docs/source/guide/tutorials/base/how_to_train/action_detection.rst b/docs/source/guide/tutorials/base/how_to_train/action_detection.rst index 3340e012d11..f19349921b4 100644 --- a/docs/source/guide/tutorials/base/how_to_train/action_detection.rst +++ b/docs/source/guide/tutorials/base/how_to_train/action_detection.rst @@ -153,3 +153,74 @@ We will get a similar to this validation output after some validation time (abou .. note:: Currently we don't support export and optimize task in action detection. We will support these features very near future. + + +********* +Export +********* + +1. ``otx export`` exports a trained Pytorch `.pth` model to the OpenVINO™ Intermediate Representation (IR) format. +It allows running the model on the Intel hardware much more efficiently, especially on the CPU. Also, the resulting IR model is required to run POT optimization. IR model consists of two files: ``openvino.xml`` for weights and ``openvino.bin`` for architecture. + +2. Run the command line below to export the trained model +and save the exported model to the ``openvino_models`` folder. + +.. code-block:: + + (otx) ...$ otx export + + 2023-03-24 15:03:35,993 - mmdeploy - INFO - Export PyTorch model to ONNX: /tmp/OTX-task-ffw8llin/openvino.onnx. + 2023-03-24 15:03:44,450 - mmdeploy - INFO - Args for Model Optimizer: mo --input_model="/tmp/OTX-task-ffw8llin/openvino.onnx" --output_dir="/tmp/OTX-task-ffw8llin/" --output="bboxes,labels" --input="input" --input_shape="[1, 3, 32, 256, 256]" --mean_values="[123.675, 116.28, 103.53]" --scale_values="[58.395, 57.12, 57.375]" --source_layout=bctwh + 2023-03-24 15:03:46,707 - mmdeploy - INFO - [ INFO ] The model was converted to IR v11, the latest model format that corresponds to the source DL framework input/output format. While IR v11 is backwards compatible with OpenVINO Inference Engine API v1.0, please use API v2.0 (as of 2022.1) to take advantage of the latest improvements in IR v11. + Find more information about API v2.0 and IR v11 at https://docs.openvino.ai/latest/openvino_2_0_transition_guide.html + [ SUCCESS ] Generated IR version 11 model. + [ SUCCESS ] XML file: /tmp/OTX-task-ffw8llin/openvino.xml + [ SUCCESS ] BIN file: /tmp/OTX-task-ffw8llin/openvino.bin + +2023-03-24 15:03:46,707 - mmdeploy - INFO - Successfully exported OpenVINO model: /tmp/OTX-task-ffw8llin/openvino.xml +2023-03-24 15:03:46,756 - mmaction - INFO - Exporting completed + + +3. Check the accuracy of the IR model and the consistency between the exported model and the PyTorch model, +using ``otx eval`` and passing the IR model path to the ``--load-weights`` parameter. + +.. code-block:: + + (otx) ...$ otx eval --test-data-roots ../data/JHMDB_5%/test \ + --load-weights model-exported/openvino.xml \ + --save-performance model-exported/performance.json + + ... + + Performance(score: 0.0, dashboard: (3 metric groups)) + +.. note:: + + Unfortunately, openvino has trouble in export from ONNX file, which comes from torch 1.13. + You can get proper openvino IR when you downgrade torch version to 1.12.1 when exporting. + + +************* +Optimization +************* + +1. You can further optimize the model with ``otx optimize``. +Currently, only POT is supported for action detection. NNCF will be supported in near future. +Refer to :doc:`optimization explanation <../../../explanation/additional_features/models_optimization>` section for more details on model optimization. + +2. Example command for optimizing +OpenVINO™ model (.xml) with OpenVINO™ POT. + +.. code-block:: + + (otx) ...$ otx optimize --load-weights openvino_models/openvino.xml \ + --save-model-to pot_model + + ... + + Performance(score: 0.0, dashboard: (3 metric groups)) + +Keep in mind that POT will take some time (generally less than NNCF optimization) without logging to optimize the model. + +3. Now, you have fully trained, optimized and exported an +efficient model representation ready-to-use action detection model. diff --git a/docs/source/guide/tutorials/base/how_to_train/classification.rst b/docs/source/guide/tutorials/base/how_to_train/classification.rst index ff66d4b7f39..d645d9ec0ee 100644 --- a/docs/source/guide/tutorials/base/how_to_train/classification.rst +++ b/docs/source/guide/tutorials/base/how_to_train/classification.rst @@ -56,6 +56,7 @@ with the following command: cd .. | + .. image:: ../../../../../utils/images/flowers_example.jpg :width: 600 @@ -120,7 +121,7 @@ Let's prepare an OpenVINO™ Training Extensions classification workspace runnin (otx) ...$ cd ./otx-workspace-CLASSIFICATION -It will create **otx-workspace-CLASSIFICATION** with all necessery configs for MobileNet-V3-large-1x, prepared ``data.yaml`` to simplify CLI commands launch and splitted dataset named ``splitted_dataset``. +It will create **otx-workspace-CLASSIFICATION** with all necessary configs for MobileNet-V3-large-1x, prepared ``data.yaml`` to simplify CLI commands launch and splitted dataset named ``splitted_dataset``. 3. To start training you need to call ``otx train`` command in our workspace: diff --git a/docs/source/guide/tutorials/base/how_to_train/detection.rst b/docs/source/guide/tutorials/base/how_to_train/detection.rst index 1e6a82c693e..f55d1419af8 100644 --- a/docs/source/guide/tutorials/base/how_to_train/detection.rst +++ b/docs/source/guide/tutorials/base/how_to_train/detection.rst @@ -60,7 +60,7 @@ Dataset preparation .. code-block:: - cd data + mkdir data ; cd data git clone https://github.com/thsant/wgisd.git cd wgisd git checkout 6910edc5ae3aae8c20062941b1641821f0c30127 @@ -107,7 +107,7 @@ We can do that by running these commands: .. code-block:: # format images folder - mkdir data images + mv data images # format annotations folder mv coco_annotations annotations @@ -116,6 +116,8 @@ We can do that by running these commands: mv annotations/train_bbox_instances.json annotations/instances_train.json mv annotations/test_bbox_instances.json annotations/instances_val.json + cd ../.. + ********* Training ********* @@ -183,9 +185,9 @@ Let's prepare the object detection workspace running the following command: -.. note:: +.. warning:: - If you want to update your current workspace by running ``otx build`` with other parameters, it's better to delete the original workplace before that to prevent mistakes. + If you want to rebuild your current workspace by running ``otx build`` with other parameters, it's better to delete the original workplace before that to prevent mistakes. Check ``otx-workspace-DETECTION/data.yaml`` to ensure, which data subsets will be used for training and validation, and update it if necessary. diff --git a/docs/source/guide/tutorials/index.rst b/docs/source/guide/tutorials/index.rst index 7e679cbe38e..582efdd9193 100644 --- a/docs/source/guide/tutorials/index.rst +++ b/docs/source/guide/tutorials/index.rst @@ -6,6 +6,7 @@ This section reveals how to use ``CLI``, both base and advanced features. It provides the end-to-end solution from installation to model deployment and demo visualization on specific example for each of the supported tasks. .. toctree:: + :titlesonly: :maxdepth: 3 base/index diff --git a/docs/utils/images/xai_cls.jpg b/docs/utils/images/xai_cls.jpg new file mode 100644 index 0000000000000000000000000000000000000000..602d77b2eb2e8cd8418479c4a89d0dc787ddf3f1 GIT binary patch literal 251865 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�i?2a(Av2`KStj;jmXe|H#fUVdLtDOy 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 Mf&U=`)bX}|0Od{i7ytkO literal 0 HcmV?d00001 diff --git a/docs/utils/images/xai_det.jpg b/docs/utils/images/xai_det.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fabecf82f5773390c909ed1f377b749b343b08a2 GIT binary patch literal 171342 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