From 31fadbee7d1a65cd73ae43dfd4ac6e97e7ca7b01 Mon Sep 17 00:00:00 2001 From: Joao Gomes Date: Fri, 29 Oct 2021 10:32:46 +0100 Subject: [PATCH 1/5] Adding multiweight support for shufflenetv2 prototype models --- torchvision/prototype/models/__init__.py | 1 + torchvision/prototype/models/shufflenetv2.py | 121 +++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 torchvision/prototype/models/shufflenetv2.py diff --git a/torchvision/prototype/models/__init__.py b/torchvision/prototype/models/__init__.py index a187af7f090..399280eaff7 100644 --- a/torchvision/prototype/models/__init__.py +++ b/torchvision/prototype/models/__init__.py @@ -5,6 +5,7 @@ from .efficientnet import * from .mobilenetv3 import * from .mnasnet import * +from .shufflenetv2 import * from . import detection from . import quantization from . import segmentation diff --git a/torchvision/prototype/models/shufflenetv2.py b/torchvision/prototype/models/shufflenetv2.py new file mode 100644 index 00000000000..d6d02873051 --- /dev/null +++ b/torchvision/prototype/models/shufflenetv2.py @@ -0,0 +1,121 @@ +import warnings +from functools import partial +from typing import Any, Optional + +from torchvision.transforms.functional import InterpolationMode + +from ...models.shufflenetv2 import ShuffleNetV2 +from ..transforms.presets import ImageNetEval +from ._api import Weights, WeightEntry +from ._meta import _IMAGENET_CATEGORIES + + +__all__ = [ + "ShuffleNetV2", + "ShuffleNetV2_x0_5Weights", + "ShuffleNetV2_x1_0Weights", + "ShuffleNetV2_x1_5Weights", + "ShuffleNetV2_x2_0Weights", + "shufflenet_v2_x0_5", + "shufflenet_v2_x1_0", + "shufflenet_v2_x1_5", + "shufflenet_v2_x2_0", +] + + +def _shufflenetv2( + weights: Optional[Weights], + progress: bool, + *args: Any, + **kwargs: Any, +) -> ShuffleNetV2: + if weights is not None: + kwargs["num_classes"] = len(weights.meta["categories"]) + + model = ShuffleNetV2(*args, **kwargs) + + if weights is not None: + model.load_state_dict(weights.state_dict(progress=progress)) + + return model + + +_common_meta = {"size": (224, 224), "categories": _IMAGENET_CATEGORIES, "interpolation": InterpolationMode.BILINEAR} + + +class ShuffleNetV2_x0_5Weights(Weights): + ImageNet1K_RefV1 = WeightEntry( + url="https://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pth", + transforms=partial(ImageNetEval, crop_size=224), + meta={ + **_common_meta, + "recipe": "", + "acc@1": 69.362, + "acc@5": 88.316, + }, + ) + + +class ShuffleNetV2_x1_0Weights(Weights): + ImageNet1K_RefV1 = WeightEntry( + url="https://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pth", + transforms=partial(ImageNetEval, crop_size=224), + meta={ + **_common_meta, + "recipe": "", + "acc@1": 60.552, + "acc@5": 81.746, + }, + ) + + +class ShuffleNetV2_x1_5Weights(Weights): + pass + + +class ShuffleNetV2_x2_0Weights(Weights): + pass + + +def shufflenet_v2_x0_5( + weights: Optional[ShuffleNetV2_x0_5Weights] = None, progress: bool = True, **kwargs: Any +) -> ShuffleNetV2: + if "pretrained" in kwargs: + warnings.warn("The argument pretrained is deprecated, please use weights instead.") + weights = ShuffleNetV2_x0_5Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None + weights = ShuffleNetV2_x0_5Weights.verify(weights) + + return _shufflenetv2(weights, progress, [4, 8, 4], [24, 48, 96, 192, 1024], **kwargs) + + +def shufflenet_v2_x1_0( + weights: Optional[ShuffleNetV2_x1_0Weights] = None, progress: bool = True, **kwargs: Any +) -> ShuffleNetV2: + if "pretrained" in kwargs: + warnings.warn("The argument pretrained is deprecated, please use weights instead.") + weights = ShuffleNetV2_x1_0Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None + weights = ShuffleNetV2_x1_0Weights.verify(weights) + + return _shufflenetv2(weights, progress, [4, 8, 4], [24, 116, 232, 464, 1024], **kwargs) + + +def shufflenet_v2_x1_5( + weights: Optional[ShuffleNetV2_x1_5Weights] = None, progress: bool = True, **kwargs: Any +) -> ShuffleNetV2: + if "pretrained" in kwargs: + warnings.warn("The argument pretrained is deprecated, please use weights instead.") + weights = ShuffleNetV2_x1_5Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None + weights = ShuffleNetV2_x1_5Weights.verify(weights) + + return _shufflenetv2(weights, progress, [4, 8, 4], [24, 176, 352, 704, 1024], **kwargs) + + +def shufflenet_v2_x2_0( + weights: Optional[ShuffleNetV2_x2_0Weights] = None, progress: bool = True, **kwargs: Any +) -> ShuffleNetV2: + if "pretrained" in kwargs: + warnings.warn("The argument pretrained is deprecated, please use weights instead.") + weights = ShuffleNetV2_x2_0Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None + weights = ShuffleNetV2_x2_0Weights.verify(weights) + + return _shufflenetv2(weights, progress, [4, 8, 4], [24, 244, 488, 976, 2048], **kwargs) From 1e578b7fe05ff5a18201df8a36b552a18fabcd08 Mon Sep 17 00:00:00 2001 From: Joao Gomes Date: Fri, 29 Oct 2021 10:42:31 +0100 Subject: [PATCH 2/5] Revert "Adding multiweight support for shufflenetv2 prototype models" This reverts commit 31fadbee7d1a65cd73ae43dfd4ac6e97e7ca7b01. --- torchvision/prototype/models/__init__.py | 1 - torchvision/prototype/models/shufflenetv2.py | 121 ------------------- 2 files changed, 122 deletions(-) delete mode 100644 torchvision/prototype/models/shufflenetv2.py diff --git a/torchvision/prototype/models/__init__.py b/torchvision/prototype/models/__init__.py index 399280eaff7..a187af7f090 100644 --- a/torchvision/prototype/models/__init__.py +++ b/torchvision/prototype/models/__init__.py @@ -5,7 +5,6 @@ from .efficientnet import * from .mobilenetv3 import * from .mnasnet import * -from .shufflenetv2 import * from . import detection from . import quantization from . import segmentation diff --git a/torchvision/prototype/models/shufflenetv2.py b/torchvision/prototype/models/shufflenetv2.py deleted file mode 100644 index d6d02873051..00000000000 --- a/torchvision/prototype/models/shufflenetv2.py +++ /dev/null @@ -1,121 +0,0 @@ -import warnings -from functools import partial -from typing import Any, Optional - -from torchvision.transforms.functional import InterpolationMode - -from ...models.shufflenetv2 import ShuffleNetV2 -from ..transforms.presets import ImageNetEval -from ._api import Weights, WeightEntry -from ._meta import _IMAGENET_CATEGORIES - - -__all__ = [ - "ShuffleNetV2", - "ShuffleNetV2_x0_5Weights", - "ShuffleNetV2_x1_0Weights", - "ShuffleNetV2_x1_5Weights", - "ShuffleNetV2_x2_0Weights", - "shufflenet_v2_x0_5", - "shufflenet_v2_x1_0", - "shufflenet_v2_x1_5", - "shufflenet_v2_x2_0", -] - - -def _shufflenetv2( - weights: Optional[Weights], - progress: bool, - *args: Any, - **kwargs: Any, -) -> ShuffleNetV2: - if weights is not None: - kwargs["num_classes"] = len(weights.meta["categories"]) - - model = ShuffleNetV2(*args, **kwargs) - - if weights is not None: - model.load_state_dict(weights.state_dict(progress=progress)) - - return model - - -_common_meta = {"size": (224, 224), "categories": _IMAGENET_CATEGORIES, "interpolation": InterpolationMode.BILINEAR} - - -class ShuffleNetV2_x0_5Weights(Weights): - ImageNet1K_RefV1 = WeightEntry( - url="https://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pth", - transforms=partial(ImageNetEval, crop_size=224), - meta={ - **_common_meta, - "recipe": "", - "acc@1": 69.362, - "acc@5": 88.316, - }, - ) - - -class ShuffleNetV2_x1_0Weights(Weights): - ImageNet1K_RefV1 = WeightEntry( - url="https://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pth", - transforms=partial(ImageNetEval, crop_size=224), - meta={ - **_common_meta, - "recipe": "", - "acc@1": 60.552, - "acc@5": 81.746, - }, - ) - - -class ShuffleNetV2_x1_5Weights(Weights): - pass - - -class ShuffleNetV2_x2_0Weights(Weights): - pass - - -def shufflenet_v2_x0_5( - weights: Optional[ShuffleNetV2_x0_5Weights] = None, progress: bool = True, **kwargs: Any -) -> ShuffleNetV2: - if "pretrained" in kwargs: - warnings.warn("The argument pretrained is deprecated, please use weights instead.") - weights = ShuffleNetV2_x0_5Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None - weights = ShuffleNetV2_x0_5Weights.verify(weights) - - return _shufflenetv2(weights, progress, [4, 8, 4], [24, 48, 96, 192, 1024], **kwargs) - - -def shufflenet_v2_x1_0( - weights: Optional[ShuffleNetV2_x1_0Weights] = None, progress: bool = True, **kwargs: Any -) -> ShuffleNetV2: - if "pretrained" in kwargs: - warnings.warn("The argument pretrained is deprecated, please use weights instead.") - weights = ShuffleNetV2_x1_0Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None - weights = ShuffleNetV2_x1_0Weights.verify(weights) - - return _shufflenetv2(weights, progress, [4, 8, 4], [24, 116, 232, 464, 1024], **kwargs) - - -def shufflenet_v2_x1_5( - weights: Optional[ShuffleNetV2_x1_5Weights] = None, progress: bool = True, **kwargs: Any -) -> ShuffleNetV2: - if "pretrained" in kwargs: - warnings.warn("The argument pretrained is deprecated, please use weights instead.") - weights = ShuffleNetV2_x1_5Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None - weights = ShuffleNetV2_x1_5Weights.verify(weights) - - return _shufflenetv2(weights, progress, [4, 8, 4], [24, 176, 352, 704, 1024], **kwargs) - - -def shufflenet_v2_x2_0( - weights: Optional[ShuffleNetV2_x2_0Weights] = None, progress: bool = True, **kwargs: Any -) -> ShuffleNetV2: - if "pretrained" in kwargs: - warnings.warn("The argument pretrained is deprecated, please use weights instead.") - weights = ShuffleNetV2_x2_0Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None - weights = ShuffleNetV2_x2_0Weights.verify(weights) - - return _shufflenetv2(weights, progress, [4, 8, 4], [24, 244, 488, 976, 2048], **kwargs) From 4e3d900f796c1e3e667312087e77956ca4a4c017 Mon Sep 17 00:00:00 2001 From: Joao Gomes Date: Fri, 29 Oct 2021 10:59:31 +0100 Subject: [PATCH 3/5] Adding multiweight support for shufflenetv2 prototype models --- torchvision/prototype/models/__init__.py | 1 + torchvision/prototype/models/shufflenetv2.py | 121 +++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 torchvision/prototype/models/shufflenetv2.py diff --git a/torchvision/prototype/models/__init__.py b/torchvision/prototype/models/__init__.py index 264d787d40e..69fe4310606 100644 --- a/torchvision/prototype/models/__init__.py +++ b/torchvision/prototype/models/__init__.py @@ -7,6 +7,7 @@ from .mobilenetv2 import * from .mnasnet import * from .regnet import * +from .shufflenetv2 import * from . import detection from . import quantization from . import segmentation diff --git a/torchvision/prototype/models/shufflenetv2.py b/torchvision/prototype/models/shufflenetv2.py new file mode 100644 index 00000000000..d6d02873051 --- /dev/null +++ b/torchvision/prototype/models/shufflenetv2.py @@ -0,0 +1,121 @@ +import warnings +from functools import partial +from typing import Any, Optional + +from torchvision.transforms.functional import InterpolationMode + +from ...models.shufflenetv2 import ShuffleNetV2 +from ..transforms.presets import ImageNetEval +from ._api import Weights, WeightEntry +from ._meta import _IMAGENET_CATEGORIES + + +__all__ = [ + "ShuffleNetV2", + "ShuffleNetV2_x0_5Weights", + "ShuffleNetV2_x1_0Weights", + "ShuffleNetV2_x1_5Weights", + "ShuffleNetV2_x2_0Weights", + "shufflenet_v2_x0_5", + "shufflenet_v2_x1_0", + "shufflenet_v2_x1_5", + "shufflenet_v2_x2_0", +] + + +def _shufflenetv2( + weights: Optional[Weights], + progress: bool, + *args: Any, + **kwargs: Any, +) -> ShuffleNetV2: + if weights is not None: + kwargs["num_classes"] = len(weights.meta["categories"]) + + model = ShuffleNetV2(*args, **kwargs) + + if weights is not None: + model.load_state_dict(weights.state_dict(progress=progress)) + + return model + + +_common_meta = {"size": (224, 224), "categories": _IMAGENET_CATEGORIES, "interpolation": InterpolationMode.BILINEAR} + + +class ShuffleNetV2_x0_5Weights(Weights): + ImageNet1K_RefV1 = WeightEntry( + url="https://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pth", + transforms=partial(ImageNetEval, crop_size=224), + meta={ + **_common_meta, + "recipe": "", + "acc@1": 69.362, + "acc@5": 88.316, + }, + ) + + +class ShuffleNetV2_x1_0Weights(Weights): + ImageNet1K_RefV1 = WeightEntry( + url="https://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pth", + transforms=partial(ImageNetEval, crop_size=224), + meta={ + **_common_meta, + "recipe": "", + "acc@1": 60.552, + "acc@5": 81.746, + }, + ) + + +class ShuffleNetV2_x1_5Weights(Weights): + pass + + +class ShuffleNetV2_x2_0Weights(Weights): + pass + + +def shufflenet_v2_x0_5( + weights: Optional[ShuffleNetV2_x0_5Weights] = None, progress: bool = True, **kwargs: Any +) -> ShuffleNetV2: + if "pretrained" in kwargs: + warnings.warn("The argument pretrained is deprecated, please use weights instead.") + weights = ShuffleNetV2_x0_5Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None + weights = ShuffleNetV2_x0_5Weights.verify(weights) + + return _shufflenetv2(weights, progress, [4, 8, 4], [24, 48, 96, 192, 1024], **kwargs) + + +def shufflenet_v2_x1_0( + weights: Optional[ShuffleNetV2_x1_0Weights] = None, progress: bool = True, **kwargs: Any +) -> ShuffleNetV2: + if "pretrained" in kwargs: + warnings.warn("The argument pretrained is deprecated, please use weights instead.") + weights = ShuffleNetV2_x1_0Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None + weights = ShuffleNetV2_x1_0Weights.verify(weights) + + return _shufflenetv2(weights, progress, [4, 8, 4], [24, 116, 232, 464, 1024], **kwargs) + + +def shufflenet_v2_x1_5( + weights: Optional[ShuffleNetV2_x1_5Weights] = None, progress: bool = True, **kwargs: Any +) -> ShuffleNetV2: + if "pretrained" in kwargs: + warnings.warn("The argument pretrained is deprecated, please use weights instead.") + weights = ShuffleNetV2_x1_5Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None + weights = ShuffleNetV2_x1_5Weights.verify(weights) + + return _shufflenetv2(weights, progress, [4, 8, 4], [24, 176, 352, 704, 1024], **kwargs) + + +def shufflenet_v2_x2_0( + weights: Optional[ShuffleNetV2_x2_0Weights] = None, progress: bool = True, **kwargs: Any +) -> ShuffleNetV2: + if "pretrained" in kwargs: + warnings.warn("The argument pretrained is deprecated, please use weights instead.") + weights = ShuffleNetV2_x2_0Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None + weights = ShuffleNetV2_x2_0Weights.verify(weights) + + return _shufflenetv2(weights, progress, [4, 8, 4], [24, 244, 488, 976, 2048], **kwargs) From 615b612933c1dea2da471ac5678bd4ec97e5255f Mon Sep 17 00:00:00 2001 From: Joao Gomes Date: Fri, 29 Oct 2021 11:14:45 +0100 Subject: [PATCH 4/5] Revert "Adding multiweight support for shufflenetv2 prototype models" This reverts commit 4e3d900f796c1e3e667312087e77956ca4a4c017. --- torchvision/prototype/models/__init__.py | 1 - torchvision/prototype/models/shufflenetv2.py | 121 ------------------- 2 files changed, 122 deletions(-) delete mode 100644 torchvision/prototype/models/shufflenetv2.py diff --git a/torchvision/prototype/models/__init__.py b/torchvision/prototype/models/__init__.py index 69fe4310606..264d787d40e 100644 --- a/torchvision/prototype/models/__init__.py +++ b/torchvision/prototype/models/__init__.py @@ -7,7 +7,6 @@ from .mobilenetv2 import * from .mnasnet import * from .regnet import * -from .shufflenetv2 import * from . import detection from . import quantization from . import segmentation diff --git a/torchvision/prototype/models/shufflenetv2.py b/torchvision/prototype/models/shufflenetv2.py deleted file mode 100644 index d6d02873051..00000000000 --- a/torchvision/prototype/models/shufflenetv2.py +++ /dev/null @@ -1,121 +0,0 @@ -import warnings -from functools import partial -from typing import Any, Optional - -from torchvision.transforms.functional import InterpolationMode - -from ...models.shufflenetv2 import ShuffleNetV2 -from ..transforms.presets import ImageNetEval -from ._api import Weights, WeightEntry -from ._meta import _IMAGENET_CATEGORIES - - -__all__ = [ - "ShuffleNetV2", - "ShuffleNetV2_x0_5Weights", - "ShuffleNetV2_x1_0Weights", - "ShuffleNetV2_x1_5Weights", - "ShuffleNetV2_x2_0Weights", - "shufflenet_v2_x0_5", - "shufflenet_v2_x1_0", - "shufflenet_v2_x1_5", - "shufflenet_v2_x2_0", -] - - -def _shufflenetv2( - weights: Optional[Weights], - progress: bool, - *args: Any, - **kwargs: Any, -) -> ShuffleNetV2: - if weights is not None: - kwargs["num_classes"] = len(weights.meta["categories"]) - - model = ShuffleNetV2(*args, **kwargs) - - if weights is not None: - model.load_state_dict(weights.state_dict(progress=progress)) - - return model - - -_common_meta = {"size": (224, 224), "categories": _IMAGENET_CATEGORIES, "interpolation": InterpolationMode.BILINEAR} - - -class ShuffleNetV2_x0_5Weights(Weights): - ImageNet1K_RefV1 = WeightEntry( - url="https://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pth", - transforms=partial(ImageNetEval, crop_size=224), - meta={ - **_common_meta, - "recipe": "", - "acc@1": 69.362, - "acc@5": 88.316, - }, - ) - - -class ShuffleNetV2_x1_0Weights(Weights): - ImageNet1K_RefV1 = WeightEntry( - url="https://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pth", - transforms=partial(ImageNetEval, crop_size=224), - meta={ - **_common_meta, - "recipe": "", - "acc@1": 60.552, - "acc@5": 81.746, - }, - ) - - -class ShuffleNetV2_x1_5Weights(Weights): - pass - - -class ShuffleNetV2_x2_0Weights(Weights): - pass - - -def shufflenet_v2_x0_5( - weights: Optional[ShuffleNetV2_x0_5Weights] = None, progress: bool = True, **kwargs: Any -) -> ShuffleNetV2: - if "pretrained" in kwargs: - warnings.warn("The argument pretrained is deprecated, please use weights instead.") - weights = ShuffleNetV2_x0_5Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None - weights = ShuffleNetV2_x0_5Weights.verify(weights) - - return _shufflenetv2(weights, progress, [4, 8, 4], [24, 48, 96, 192, 1024], **kwargs) - - -def shufflenet_v2_x1_0( - weights: Optional[ShuffleNetV2_x1_0Weights] = None, progress: bool = True, **kwargs: Any -) -> ShuffleNetV2: - if "pretrained" in kwargs: - warnings.warn("The argument pretrained is deprecated, please use weights instead.") - weights = ShuffleNetV2_x1_0Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None - weights = ShuffleNetV2_x1_0Weights.verify(weights) - - return _shufflenetv2(weights, progress, [4, 8, 4], [24, 116, 232, 464, 1024], **kwargs) - - -def shufflenet_v2_x1_5( - weights: Optional[ShuffleNetV2_x1_5Weights] = None, progress: bool = True, **kwargs: Any -) -> ShuffleNetV2: - if "pretrained" in kwargs: - warnings.warn("The argument pretrained is deprecated, please use weights instead.") - weights = ShuffleNetV2_x1_5Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None - weights = ShuffleNetV2_x1_5Weights.verify(weights) - - return _shufflenetv2(weights, progress, [4, 8, 4], [24, 176, 352, 704, 1024], **kwargs) - - -def shufflenet_v2_x2_0( - weights: Optional[ShuffleNetV2_x2_0Weights] = None, progress: bool = True, **kwargs: Any -) -> ShuffleNetV2: - if "pretrained" in kwargs: - warnings.warn("The argument pretrained is deprecated, please use weights instead.") - weights = ShuffleNetV2_x2_0Weights.ImageNet1K_RefV1 if kwargs.pop("pretrained") else None - weights = ShuffleNetV2_x2_0Weights.verify(weights) - - return _shufflenetv2(weights, progress, [4, 8, 4], [24, 244, 488, 976, 2048], **kwargs) From f18f86feda38594f9ee0104c78c00e06844001c7 Mon Sep 17 00:00:00 2001 From: Joao Gomes Date: Mon, 24 Jan 2022 16:03:21 +0000 Subject: [PATCH 5/5] Remove module vs method name clash --- torchvision/ops/__init__.py | 2 +- torchvision/ops/{generalized_box_iou_loss.py => giou_loss.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename torchvision/ops/{generalized_box_iou_loss.py => giou_loss.py} (100%) diff --git a/torchvision/ops/__init__.py b/torchvision/ops/__init__.py index 33a48995869..8ba10080c1f 100644 --- a/torchvision/ops/__init__.py +++ b/torchvision/ops/__init__.py @@ -13,7 +13,7 @@ from .deform_conv import deform_conv2d, DeformConv2d from .feature_pyramid_network import FeaturePyramidNetwork from .focal_loss import sigmoid_focal_loss -from .generalized_box_iou_loss import generalized_box_iou_loss +from .giou_loss import generalized_box_iou_loss from .misc import FrozenBatchNorm2d, ConvNormActivation, SqueezeExcitation from .poolers import MultiScaleRoIAlign from .ps_roi_align import ps_roi_align, PSRoIAlign diff --git a/torchvision/ops/generalized_box_iou_loss.py b/torchvision/ops/giou_loss.py similarity index 100% rename from torchvision/ops/generalized_box_iou_loss.py rename to torchvision/ops/giou_loss.py