Backbone Replacement#
This tutorial describes an example of how to find an available backbone and how it can be replaced in OpenVINO™ Training Extensions.
The process has been tested on the following configuration.
Ubuntu 20.04
NVIDIA GeForce RTX 3090
Intel(R) Core(TM) i9-11900
CUDA Toolkit 11.1, python 3.9
Currently supported backbones#
The following libraries are currently available for backbone replacement.
Task |
mmdet |
mmseg |
torchvision |
pytorchcv |
omz.mmcls |
---|---|---|---|---|---|
Classification |
O |
O |
O |
O |
O |
Detection |
O |
O |
O |
O |
|
Segmentation |
O |
O |
O |
O |
|
Instance-Segmentation |
O |
O |
O |
O |
Setup virtual environment#
1. You can follow the installation process from a quick start guide to create a universal virtual environment for OpenVINO™ Training Extensions.
2. Activate your virtual environment:
.otx/bin/activate
# or by this line, if you created an environment, using tox
. venv/otx/bin/activate
Backbone replacement tutorial#
1. First, we need to configure the workspace for the backbone replacement:
Note
You can use the OpenVINO™ Training Extensions workspace to swap out backbones, train, set up configurations, and more.
Workspaces are created automatically on otx build
or otx train
.
(otx) ...$ otx build --task classification
[*] Workspace Path: otx-workspace-CLASSIFICATION
[*] Load Model Template ID: Custom_Image_Classification_EfficinetNet-B0
[*] Load Model Name: EfficientNet-B0
[*] - Updated: otx-workspace-CLASSIFICATION/model.py
[*] - Updated: otx-workspace-CLASSIFICATION/data_pipeline.py
[*] - Updated: otx-workspace-CLASSIFICATION/deployment.py
[*] - Updated: otx-workspace-CLASSIFICATION/hpo_config.yaml
[*] - Updated: otx-workspace-CLASSIFICATION/model_hierarchical.py
[*] - Updated: otx-workspace-CLASSIFICATION/model_multilabel.py
[*] - Updated: otx-workspace-CLASSIFICATION/compression_config.json
[*] Update data configuration file to: otx-workspace-CLASSIFICATION/data.yaml
(otx) ...$ cd otx-workspace-CLASSIFICATION
2. Next, we can find the backbone
we want to replace via otx find
:
Note
We can use otx find
to find templates and available backbones.
Each backbone may have a required argument. If the backbone has options for required arguments, otx build
provide the first option as default.
(otx) ...$ otx find --backbone mmdet
+-------+-------------------------+---------------+-------------------------------+
| Index | Backbone Type | Required-Args | Options |
+-------+-------------------------+---------------+-------------------------------+
| 1 | mmdet.RegNet | arch | regnetx_400mf, regnetx_800mf, |
| | | | regnetx_1.6gf, regnetx_3.2gf, |
| | | | regnetx_4.0gf, regnetx_6.4gf, |
| | | | regnetx_8.0gf, regnetx_12gf |
| 2 | mmdet.ResNet | depth | 18, 34, 50, 101, 152 |
| 3 | mmdet.ResNetV1d | depth | 18, 34, 50, 101, 152 |
| 4 | mmdet.ResNeXt | depth | 50, 101, 152 |
| 5 | mmdet.SSDVGG | input_size | 300, 512 |
| | | depth | 11, 16, 19 |
| 6 | mmdet.HRNet | extra | |
| 7 | mmdet.Res2Net | depth | 50, 101, 152 |
| 8 | mmdet.DetectoRS_ResNet | depth | 50, 101, 152 |
| 9 | mmdet.DetectoRS_ResNeXt | depth | 50, 101, 152 |
| 10 | mmdet.Darknet | | |
| 11 | mmdet.ResNeSt | depth | 50, 101, 152, 200 |
| 12 | mmdet.CSPDarknet | | |
+-------+-------------------------+---------------+-------------------------------+
3. We need to run the command below to replace the backbone:
In this example, we’ll replace the classification model using the default EfficientNet with mmdet.ResNet
.
You can use the Backbone Type
in the table output from otx find --backbone
to use a different backbone.
(otx) ...$ otx build --backbone mmdet.RegNet
[*] Backbone Config: mmdet.RegNet
[*] mmdet.RegNet requires the argument : ['arch']
[*] Please refer to /venv/lib/python3.9/site-packages/mmdet/models/backbones/regnet.py
[*] 'arch' can choose between: ['regnetx_400mf', 'regnetx_800mf', 'regnetx_1.6gf', 'regnetx_3.2gf', 'regnetx_4.0gf', 'regnetx_6.4gf', 'regnetx_8.0gf', 'regnetx_12gf']
[*] 'arch' default value: regnetx_400mf
[*] Save backbone configuration: otx-workspace-CLASSIFICATION/backbone.yaml
[*] Update model.py with backbone.yaml
Target Model: SAMImageClassifier
Target Backbone: mmdet.RegNet
Backbone config: {'arch': 'regnetx_400mf', 'avg_down': False, 'base_channels': 32, 'conv_cfg': None, 'dcn': None, 'deep_stem': False, 'dilations': (1, 1, 1, 1), 'frozen_stages': -1, 'in_channels': 3, 'init_cfg': None, 'norm_cfg': {'requires_grad': True, 'type': 'BN'}, 'norm_eval': True, 'out_indices': (0, 1, 2, 3), 'plugins': None, 'pretrained': None, 'stage_with_dcn': (False, False, False, False), 'stem_channels': 32, 'strides': (2, 2, 2, 2), 'style': 'pytorch', 'type': 'mmdet.RegNet', 'with_cp': False, 'zero_init_residual': True}
[*] Save model configuration: model.py
Then we get model.py
, which has been changed to mmdet.ResNet
.
Note
If you get a log like this, follow the steps below:
[!] mmseg.HRNet backbone has inputs that the user must enter.
[!] Edit backbone.yaml and run 'otx build --backbone backbone.yaml'.
Please modify the available configuration file directly (backbone.yaml
).
You can then update the model with the command below:
(otx) ...$ otx build --backbone backbone.yaml
4. After that, you can use any other OpenVINO™ Training Extensions command with the new model: quick start guide
You can use the backbones provided by mmdet
, mmseg
, torchvision
, and omz.mmcls
in the same way as above.
Warning
Depending on your backbone, your data may require multiple hyperparameter optimizations. Custom models, except for TEMPLATE, are not yet guaranteed to be accurate.