From cbeaafd005a2bdc1415e9db3f1d583d52b257eeb Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Sun, 23 Jan 2022 16:33:50 +0530 Subject: [PATCH 01/12] replace assert with valueerror --- .../models/detection/backbone_utils.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/torchvision/models/detection/backbone_utils.py b/torchvision/models/detection/backbone_utils.py index 808c69dfe73..cf9072d9a5c 100644 --- a/torchvision/models/detection/backbone_utils.py +++ b/torchvision/models/detection/backbone_utils.py @@ -111,7 +111,8 @@ def _resnet_fpn_extractor( ) -> BackboneWithFPN: # select layers that wont be frozen - assert 0 <= trainable_layers <= 5 + if trainable_layers not in range(0, 6): + raise ValueError(f" trainable_layers expected to be in [0,5], got {trainable_layers}") layers_to_train = ["layer4", "layer3", "layer2", "layer1", "conv1"][:trainable_layers] if trainable_layers == 5: layers_to_train.append("bn1") @@ -124,7 +125,8 @@ def _resnet_fpn_extractor( if returned_layers is None: returned_layers = [1, 2, 3, 4] - assert min(returned_layers) > 0 and max(returned_layers) < 5 + if min(returned_layers) <= 0 or max(returned_layers) >= 5: + raise ValueError(f" `returned_layers` object should contain integers between [1,4], got {returned_layers} ") return_layers = {f"layer{k}": str(v) for v, k in enumerate(returned_layers)} in_channels_stage2 = backbone.inplanes // 8 @@ -152,7 +154,10 @@ def _validate_trainable_layers( # by default freeze first blocks if trainable_backbone_layers is None: trainable_backbone_layers = default_value - assert 0 <= trainable_backbone_layers <= max_value + if trainable_backbone_layers not in range(0, max_value + 1): + raise ValueError( + f"trainable_layers expected to be in between [0,{max_value}], got {trainable_backbone_layers} " + ) return trainable_backbone_layers @@ -183,7 +188,8 @@ def _mobilenet_extractor( num_stages = len(stage_indices) # find the index of the layer from which we wont freeze - assert 0 <= trainable_layers <= num_stages + if trainable_layers not in range(0, num_stages + 1): + raise ValueError(f"trainable_layers expected to be in between [0,{num_stages}], got {trainable_layers} ") freeze_before = len(backbone) if trainable_layers == 0 else stage_indices[num_stages - trainable_layers] for b in backbone[:freeze_before]: @@ -197,7 +203,10 @@ def _mobilenet_extractor( if returned_layers is None: returned_layers = [num_stages - 2, num_stages - 1] - assert min(returned_layers) >= 0 and max(returned_layers) < num_stages + if min(returned_layers) <= 0 or max(returned_layers) >= num_stages: + raise ValueError( + f" returned_layers object should contain integers between [1,{num_stages - 1}], got {returned_layers} " + ) return_layers = {f"{stage_indices[k]}": str(v) for v, k in enumerate(returned_layers)} in_channels_list = [backbone[stage_indices[i]].out_channels for i in returned_layers] From b8cfa28a3053a40c489eed5c8496fc0fe4703a30 Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Mon, 24 Jan 2022 10:23:36 +0530 Subject: [PATCH 02/12] minor edit --- torchvision/models/detection/backbone_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/models/detection/backbone_utils.py b/torchvision/models/detection/backbone_utils.py index cf9072d9a5c..2eedbf3e8da 100644 --- a/torchvision/models/detection/backbone_utils.py +++ b/torchvision/models/detection/backbone_utils.py @@ -177,7 +177,7 @@ def mobilenet_backbone( def _mobilenet_extractor( backbone: Union[mobilenet.MobileNetV2, mobilenet.MobileNetV3], fpn: bool, - trainable_layers, + trainable_layers: int, returned_layers: Optional[List[int]] = None, extra_blocks: Optional[ExtraFPNBlock] = None, ) -> nn.Module: From 830e0055937639d21484d3ff4e07bfe1e740d130 Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Mon, 24 Jan 2022 11:20:31 +0530 Subject: [PATCH 03/12] raise assert changed to raise valueerror in test --- test/test_models_detection_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_models_detection_utils.py b/test/test_models_detection_utils.py index 6551a1a759f..6fd33a8a48c 100644 --- a/test/test_models_detection_utils.py +++ b/test/test_models_detection_utils.py @@ -54,7 +54,7 @@ def test_validate_resnet_inputs_detection(self): ) assert ret == 3 # can't go beyond 5 - with pytest.raises(AssertionError): + with pytest.raises(ValueError): ret = backbone_utils._validate_trainable_layers( pretrained=True, trainable_backbone_layers=6, max_value=5, default_value=3 ) From 1a79a055903a609efd1c7223648db5825d32cded Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Mon, 24 Jan 2022 11:26:08 +0530 Subject: [PATCH 04/12] Update torchvision/models/detection/backbone_utils.py Co-authored-by: Aditya Oke <47158509+oke-aditya@users.noreply.github.com> --- torchvision/models/detection/backbone_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/models/detection/backbone_utils.py b/torchvision/models/detection/backbone_utils.py index 2eedbf3e8da..af47b2777c0 100644 --- a/torchvision/models/detection/backbone_utils.py +++ b/torchvision/models/detection/backbone_utils.py @@ -111,7 +111,7 @@ def _resnet_fpn_extractor( ) -> BackboneWithFPN: # select layers that wont be frozen - if trainable_layers not in range(0, 6): + if trainable_layers < 0 or trainable_layers > 5: raise ValueError(f" trainable_layers expected to be in [0,5], got {trainable_layers}") layers_to_train = ["layer4", "layer3", "layer2", "layer1", "conv1"][:trainable_layers] if trainable_layers == 5: From b8b22c8499387781bc4b37ca4e902f256a95b084 Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Mon, 24 Jan 2022 11:26:43 +0530 Subject: [PATCH 05/12] Update torchvision/models/detection/backbone_utils.py Co-authored-by: Aditya Oke <47158509+oke-aditya@users.noreply.github.com> --- torchvision/models/detection/backbone_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/models/detection/backbone_utils.py b/torchvision/models/detection/backbone_utils.py index af47b2777c0..b783f3bfb54 100644 --- a/torchvision/models/detection/backbone_utils.py +++ b/torchvision/models/detection/backbone_utils.py @@ -188,7 +188,7 @@ def _mobilenet_extractor( num_stages = len(stage_indices) # find the index of the layer from which we wont freeze - if trainable_layers not in range(0, num_stages + 1): + if trainable_layers < 0 or trainable_layers > num_stages: raise ValueError(f"trainable_layers expected to be in between [0,{num_stages}], got {trainable_layers} ") freeze_before = len(backbone) if trainable_layers == 0 else stage_indices[num_stages - trainable_layers] From 1bd39a9a6ac9bd9bed597aab768f57f9e0f1084a Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Mon, 24 Jan 2022 11:36:22 +0530 Subject: [PATCH 06/12] minor edits --- torchvision/models/detection/backbone_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/torchvision/models/detection/backbone_utils.py b/torchvision/models/detection/backbone_utils.py index b783f3bfb54..19e75843d3a 100644 --- a/torchvision/models/detection/backbone_utils.py +++ b/torchvision/models/detection/backbone_utils.py @@ -126,7 +126,7 @@ def _resnet_fpn_extractor( if returned_layers is None: returned_layers = [1, 2, 3, 4] if min(returned_layers) <= 0 or max(returned_layers) >= 5: - raise ValueError(f" `returned_layers` object should contain integers between [1,4], got {returned_layers} ") + raise ValueError(f"Each returned layer must be in the range [1,4]. Got {returned_layers}") return_layers = {f"layer{k}": str(v) for v, k in enumerate(returned_layers)} in_channels_stage2 = backbone.inplanes // 8 @@ -154,9 +154,9 @@ def _validate_trainable_layers( # by default freeze first blocks if trainable_backbone_layers is None: trainable_backbone_layers = default_value - if trainable_backbone_layers not in range(0, max_value + 1): + if trainable_backbone_layers < 0 or trainable_backbone_layers > max_value: raise ValueError( - f"trainable_layers expected to be in between [0,{max_value}], got {trainable_backbone_layers} " + f"trainable_backbone_layers expected to be in between [0,{max_value}], got {trainable_backbone_layers} " ) return trainable_backbone_layers From 6ff20cc58b9ec98b6cbacd0b08ef83940ce65ab7 Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Mon, 24 Jan 2022 12:32:26 +0530 Subject: [PATCH 07/12] minor edits --- torchvision/models/detection/backbone_utils.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/torchvision/models/detection/backbone_utils.py b/torchvision/models/detection/backbone_utils.py index 19e75843d3a..27e0c28766b 100644 --- a/torchvision/models/detection/backbone_utils.py +++ b/torchvision/models/detection/backbone_utils.py @@ -154,10 +154,10 @@ def _validate_trainable_layers( # by default freeze first blocks if trainable_backbone_layers is None: trainable_backbone_layers = default_value - if trainable_backbone_layers < 0 or trainable_backbone_layers > max_value: - raise ValueError( - f"trainable_backbone_layers expected to be in between [0,{max_value}], got {trainable_backbone_layers} " - ) + if trainable_backbone_layers < 0 or trainable_backbone_layers > max_value: + raise ValueError( + f"trainable_backbone_layers expected to be in between [0,{max_value}], got {trainable_backbone_layers} " + ) return trainable_backbone_layers @@ -203,10 +203,10 @@ def _mobilenet_extractor( if returned_layers is None: returned_layers = [num_stages - 2, num_stages - 1] - if min(returned_layers) <= 0 or max(returned_layers) >= num_stages: - raise ValueError( - f" returned_layers object should contain integers between [1,{num_stages - 1}], got {returned_layers} " - ) + if min(returned_layers) <= 0 or max(returned_layers) >= num_stages: + raise ValueError( + f" returned_layers object should contain integers between [1,{num_stages - 1}], got {returned_layers} " + ) return_layers = {f"{stage_indices[k]}": str(v) for v, k in enumerate(returned_layers)} in_channels_list = [backbone[stage_indices[i]].out_channels for i in returned_layers] From 1431ac388981e370a49d65381317c5a84daa6952 Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Mon, 24 Jan 2022 14:49:18 +0530 Subject: [PATCH 08/12] added one test --- test/test_backbone_utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/test_backbone_utils.py b/test/test_backbone_utils.py index 4a375b0036a..5a5a5c620e0 100644 --- a/test/test_backbone_utils.py +++ b/test/test_backbone_utils.py @@ -23,6 +23,9 @@ def test_resnet_fpn_backbone(backbone_name): y = resnet_fpn_backbone(backbone_name=backbone_name, pretrained=False)(x) assert list(y.keys()) == ["0", "1", "2", "3", "pool"] + with pytest.raises(ValueError): + y = resnet_fpn_backbone(backbone_name=backbone_name, pretrained=False, trainable_layers=6) + # Needed by TestFxFeatureExtraction.test_leaf_module_and_function def leaf_function(x): From ebc36896bfa2baddfdf40d7fea58677eb16be1b4 Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Mon, 24 Jan 2022 14:58:57 +0530 Subject: [PATCH 09/12] added another test --- test/test_backbone_utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_backbone_utils.py b/test/test_backbone_utils.py index 5a5a5c620e0..2c300855108 100644 --- a/test/test_backbone_utils.py +++ b/test/test_backbone_utils.py @@ -25,6 +25,8 @@ def test_resnet_fpn_backbone(backbone_name): with pytest.raises(ValueError): y = resnet_fpn_backbone(backbone_name=backbone_name, pretrained=False, trainable_layers=6) + with pytest.raises(ValueError): + y = resnet_fpn_backbone(backbone_name, False, returned_layers=[0, 1, 2, 3]) # Needed by TestFxFeatureExtraction.test_leaf_module_and_function From 93c796d7c7a90883ce5fdadc761da13c4620ad9b Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Mon, 24 Jan 2022 15:02:38 +0530 Subject: [PATCH 10/12] added another test --- test/test_backbone_utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_backbone_utils.py b/test/test_backbone_utils.py index 2c300855108..38d40cb14a4 100644 --- a/test/test_backbone_utils.py +++ b/test/test_backbone_utils.py @@ -27,6 +27,8 @@ def test_resnet_fpn_backbone(backbone_name): y = resnet_fpn_backbone(backbone_name=backbone_name, pretrained=False, trainable_layers=6) with pytest.raises(ValueError): y = resnet_fpn_backbone(backbone_name, False, returned_layers=[0, 1, 2, 3]) + with pytest.raises(ValueError): + y = resnet_fpn_backbone(backbone_name, False, returned_layers=[2, 3, 4, 5]) # Needed by TestFxFeatureExtraction.test_leaf_module_and_function From 0275146c790539df36d8de66b77218957e768736 Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Tue, 25 Jan 2022 14:32:57 +0530 Subject: [PATCH 11/12] messages added and conflict solved --- test/test_backbone_utils.py | 21 +++++++++++++++------ test/test_models_detection_utils.py | 5 ++--- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/test/test_backbone_utils.py b/test/test_backbone_utils.py index 38d40cb14a4..2289dd509a7 100644 --- a/test/test_backbone_utils.py +++ b/test/test_backbone_utils.py @@ -7,9 +7,8 @@ from common_utils import set_rng_seed from torchvision import models from torchvision.models._utils import IntermediateLayerGetter -from torchvision.models.detection.backbone_utils import resnet_fpn_backbone -from torchvision.models.feature_extraction import create_feature_extractor -from torchvision.models.feature_extraction import get_graph_node_names +from torchvision.models.detection.backbone_utils import mobilenet_backbone, resnet_fpn_backbone +from torchvision.models.feature_extraction import create_feature_extractor, get_graph_node_names def get_available_models(): @@ -23,12 +22,22 @@ def test_resnet_fpn_backbone(backbone_name): y = resnet_fpn_backbone(backbone_name=backbone_name, pretrained=False)(x) assert list(y.keys()) == ["0", "1", "2", "3", "pool"] + with pytest.raises(ValueError, " trainable_layers expected to be in [0,5], got 6"): + resnet_fpn_backbone(backbone_name=backbone_name, pretrained=False, trainable_layers=6) + with pytest.raises(ValueError, "Each returned layer must be in the range [1,4]. Got 0"): + resnet_fpn_backbone(backbone_name, False, returned_layers=[0, 1, 2, 3]) + with pytest.raises(ValueError, "Each returned layer must be in the range [1,4]. Got 6"): + resnet_fpn_backbone(backbone_name, False, returned_layers=[2, 3, 4, 5]) + + +@pytest.mark.parametrize("backbone_name", ("mobilenet_v2", "mobilenet_v3_large", "mobilenet_v3_small")) +def test_mobilenet_backbone(backbone_name): with pytest.raises(ValueError): - y = resnet_fpn_backbone(backbone_name=backbone_name, pretrained=False, trainable_layers=6) + mobilenet_backbone(backbone_name=backbone_name, pretrained=False, fpn=False, trainable_layers=-1) with pytest.raises(ValueError): - y = resnet_fpn_backbone(backbone_name, False, returned_layers=[0, 1, 2, 3]) + mobilenet_backbone(backbone_name, False, fpn=True, returned_layers=[-1, 0, 1, 2]) with pytest.raises(ValueError): - y = resnet_fpn_backbone(backbone_name, False, returned_layers=[2, 3, 4, 5]) + mobilenet_backbone(backbone_name, False, fpn=True, returned_layers=[3, 4, 5, 6]) # Needed by TestFxFeatureExtraction.test_leaf_module_and_function diff --git a/test/test_models_detection_utils.py b/test/test_models_detection_utils.py index 6fd33a8a48c..33e7b6c504c 100644 --- a/test/test_models_detection_utils.py +++ b/test/test_models_detection_utils.py @@ -3,8 +3,7 @@ import pytest import torch from common_utils import assert_equal -from torchvision.models.detection import _utils -from torchvision.models.detection import backbone_utils +from torchvision.models.detection import _utils, backbone_utils from torchvision.models.detection.transform import GeneralizedRCNNTransform @@ -54,7 +53,7 @@ def test_validate_resnet_inputs_detection(self): ) assert ret == 3 # can't go beyond 5 - with pytest.raises(ValueError): + with pytest.raises(ValueError, "trainable_backbone_layers expected to be in between [0,5], got 6 "): ret = backbone_utils._validate_trainable_layers( pretrained=True, trainable_backbone_layers=6, max_value=5, default_value=3 ) From 7c2d42e023f7b25263f8a1ad236bbec20586c7d3 Mon Sep 17 00:00:00 2001 From: Abhijit Deo <72816663+abhi-glitchhg@users.noreply.github.com> Date: Tue, 25 Jan 2022 14:56:00 +0530 Subject: [PATCH 12/12] minor error --- test/test_backbone_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_backbone_utils.py b/test/test_backbone_utils.py index 2289dd509a7..a71c1f93192 100644 --- a/test/test_backbone_utils.py +++ b/test/test_backbone_utils.py @@ -26,7 +26,7 @@ def test_resnet_fpn_backbone(backbone_name): resnet_fpn_backbone(backbone_name=backbone_name, pretrained=False, trainable_layers=6) with pytest.raises(ValueError, "Each returned layer must be in the range [1,4]. Got 0"): resnet_fpn_backbone(backbone_name, False, returned_layers=[0, 1, 2, 3]) - with pytest.raises(ValueError, "Each returned layer must be in the range [1,4]. Got 6"): + with pytest.raises(ValueError, "Each returned layer must be in the range [1,4]. Got 5"): resnet_fpn_backbone(backbone_name, False, returned_layers=[2, 3, 4, 5])