From 2e96b03de0e0b3a8ddb5010df1df9f5e3197238b Mon Sep 17 00:00:00 2001 From: Jirka Date: Mon, 6 Dec 2021 12:15:05 +0100 Subject: [PATCH 1/6] rename IoU -> Jaccard Index --- docs/source/references/functional.rst | 6 +- docs/source/references/modules.rst | 6 +- .../{test_iou.py => test_jaccard.py} | 70 +++++++++---------- torchmetrics/__init__.py | 4 +- torchmetrics/classification/__init__.py | 2 +- .../classification/{iou.py => jaccard.py} | 10 +-- torchmetrics/functional/__init__.py | 4 +- .../functional/classification/__init__.py | 2 +- .../classification/{iou.py => jaccard.py} | 10 +-- 9 files changed, 57 insertions(+), 57 deletions(-) rename tests/classification/{test_iou.py => test_jaccard.py} (77%) rename torchmetrics/classification/{iou.py => jaccard.py} (92%) rename torchmetrics/functional/classification/{iou.py => jaccard.py} (95%) diff --git a/docs/source/references/functional.rst b/docs/source/references/functional.rst index 6e86998675a..d8b52a3107b 100644 --- a/docs/source/references/functional.rst +++ b/docs/source/references/functional.rst @@ -144,10 +144,10 @@ hinge [func] .. autofunction:: torchmetrics.functional.hinge :noindex: -iou [func] -~~~~~~~~~~ +jaccard_index [func] +~~~~~~~~~~~~~~~~~~~~ -.. autofunction:: torchmetrics.functional.iou +.. autofunction:: torchmetrics.functional.jaccard_index :noindex: kl_divergence [func] diff --git a/docs/source/references/modules.rst b/docs/source/references/modules.rst index 8ac7065d90f..3df0cfd5946 100644 --- a/docs/source/references/modules.rst +++ b/docs/source/references/modules.rst @@ -302,10 +302,10 @@ Hinge .. autoclass:: torchmetrics.Hinge :noindex: -IoU -~~~ +JaccardIndex +~~~~~~~~~~~~ -.. autoclass:: torchmetrics.IoU +.. autoclass:: torchmetrics.JaccardIndex :noindex: KLDivergence diff --git a/tests/classification/test_iou.py b/tests/classification/test_jaccard.py similarity index 77% rename from tests/classification/test_iou.py rename to tests/classification/test_jaccard.py index 2a83ae034a4..3b6260d0b92 100644 --- a/tests/classification/test_iou.py +++ b/tests/classification/test_jaccard.py @@ -27,60 +27,60 @@ from tests.classification.inputs import _input_multilabel as _input_mlb from tests.classification.inputs import _input_multilabel_prob as _input_mlb_prob from tests.helpers.testers import NUM_CLASSES, THRESHOLD, MetricTester -from torchmetrics.classification.iou import IoU -from torchmetrics.functional import iou +from torchmetrics.classification.jaccard import JaccardIndex +from torchmetrics.functional import jaccard_index -def _sk_iou_binary_prob(preds, target, average=None): +def _sk_jaccard_binary_prob(preds, target, average=None): sk_preds = (preds.view(-1).numpy() >= THRESHOLD).astype(np.uint8) sk_target = target.view(-1).numpy() return sk_jaccard_score(y_true=sk_target, y_pred=sk_preds, average=average) -def _sk_iou_binary(preds, target, average=None): +def _sk_jaccard_binary(preds, target, average=None): sk_preds = preds.view(-1).numpy() sk_target = target.view(-1).numpy() return sk_jaccard_score(y_true=sk_target, y_pred=sk_preds, average=average) -def _sk_iou_multilabel_prob(preds, target, average=None): +def _sk_jaccard_multilabel_prob(preds, target, average=None): sk_preds = (preds.view(-1).numpy() >= THRESHOLD).astype(np.uint8) sk_target = target.view(-1).numpy() return sk_jaccard_score(y_true=sk_target, y_pred=sk_preds, average=average) -def _sk_iou_multilabel(preds, target, average=None): +def _sk_jaccard_multilabel(preds, target, average=None): sk_preds = preds.view(-1).numpy() sk_target = target.view(-1).numpy() return sk_jaccard_score(y_true=sk_target, y_pred=sk_preds, average=average) -def _sk_iou_multiclass_prob(preds, target, average=None): +def _sk_jaccard_multiclass_prob(preds, target, average=None): sk_preds = torch.argmax(preds, dim=len(preds.shape) - 1).view(-1).numpy() sk_target = target.view(-1).numpy() return sk_jaccard_score(y_true=sk_target, y_pred=sk_preds, average=average) -def _sk_iou_multiclass(preds, target, average=None): +def _sk_jaccard_multiclass(preds, target, average=None): sk_preds = preds.view(-1).numpy() sk_target = target.view(-1).numpy() return sk_jaccard_score(y_true=sk_target, y_pred=sk_preds, average=average) -def _sk_iou_multidim_multiclass_prob(preds, target, average=None): +def _sk_jaccard_multidim_multiclass_prob(preds, target, average=None): sk_preds = torch.argmax(preds, dim=len(preds.shape) - 2).view(-1).numpy() sk_target = target.view(-1).numpy() return sk_jaccard_score(y_true=sk_target, y_pred=sk_preds, average=average) -def _sk_iou_multidim_multiclass(preds, target, average=None): +def _sk_jaccard_multidim_multiclass(preds, target, average=None): sk_preds = preds.view(-1).numpy() sk_target = target.view(-1).numpy() @@ -91,47 +91,47 @@ def _sk_iou_multidim_multiclass(preds, target, average=None): @pytest.mark.parametrize( "preds, target, sk_metric, num_classes", [ - (_input_binary_prob.preds, _input_binary_prob.target, _sk_iou_binary_prob, 2), - (_input_binary.preds, _input_binary.target, _sk_iou_binary, 2), - (_input_mlb_prob.preds, _input_mlb_prob.target, _sk_iou_multilabel_prob, 2), - (_input_mlb.preds, _input_mlb.target, _sk_iou_multilabel, 2), - (_input_mcls_prob.preds, _input_mcls_prob.target, _sk_iou_multiclass_prob, NUM_CLASSES), - (_input_mcls.preds, _input_mcls.target, _sk_iou_multiclass, NUM_CLASSES), - (_input_mdmc_prob.preds, _input_mdmc_prob.target, _sk_iou_multidim_multiclass_prob, NUM_CLASSES), - (_input_mdmc.preds, _input_mdmc.target, _sk_iou_multidim_multiclass, NUM_CLASSES), + (_input_binary_prob.preds, _input_binary_prob.target, _sk_jaccard_binary_prob, 2), + (_input_binary.preds, _input_binary.target, _sk_jaccard_binary, 2), + (_input_mlb_prob.preds, _input_mlb_prob.target, _sk_jaccard_multilabel_prob, 2), + (_input_mlb.preds, _input_mlb.target, _sk_jaccard_multilabel, 2), + (_input_mcls_prob.preds, _input_mcls_prob.target, _sk_jaccard_multiclass_prob, NUM_CLASSES), + (_input_mcls.preds, _input_mcls.target, _sk_jaccard_multiclass, NUM_CLASSES), + (_input_mdmc_prob.preds, _input_mdmc_prob.target, _sk_jaccard_multidim_multiclass_prob, NUM_CLASSES), + (_input_mdmc.preds, _input_mdmc.target, _sk_jaccard_multidim_multiclass, NUM_CLASSES), ], ) -class TestIoU(MetricTester): +class TestJaccardIndex(MetricTester): @pytest.mark.parametrize("ddp", [True, False]) @pytest.mark.parametrize("dist_sync_on_step", [True, False]) - def test_iou(self, reduction, preds, target, sk_metric, num_classes, ddp, dist_sync_on_step): + def test_jaccard(self, reduction, preds, target, sk_metric, num_classes, ddp, dist_sync_on_step): average = "macro" if reduction == "elementwise_mean" else None # convert tags self.run_class_metric_test( ddp=ddp, preds=preds, target=target, - metric_class=IoU, + metric_class=JaccardIndex, sk_metric=partial(sk_metric, average=average), dist_sync_on_step=dist_sync_on_step, metric_args={"num_classes": num_classes, "threshold": THRESHOLD, "reduction": reduction}, ) - def test_iou_functional(self, reduction, preds, target, sk_metric, num_classes): + def test_jaccard_functional(self, reduction, preds, target, sk_metric, num_classes): average = "macro" if reduction == "elementwise_mean" else None # convert tags self.run_functional_metric_test( preds, target, - metric_functional=iou, + metric_functional=jaccard_index, sk_metric=partial(sk_metric, average=average), metric_args={"num_classes": num_classes, "threshold": THRESHOLD, "reduction": reduction}, ) - def test_iou_differentiability(self, reduction, preds, target, sk_metric, num_classes): + def test_jaccard_differentiability(self, reduction, preds, target, sk_metric, num_classes): self.run_differentiability_test( preds=preds, target=target, - metric_module=IoU, - metric_functional=iou, + metric_module=JaccardIndex, + metric_functional=jaccard_index, metric_args={"num_classes": num_classes, "threshold": THRESHOLD, "reduction": reduction}, ) @@ -147,18 +147,18 @@ def test_iou_differentiability(self, reduction, preds, target, sk_metric, num_cl (True, "none", 0, Tensor([2 / 3, 1 / 2])), ], ) -def test_iou(half_ones, reduction, ignore_index, expected): +def test_jaccard(half_ones, reduction, ignore_index, expected): preds = (torch.arange(120) % 3).view(-1, 1) target = (torch.arange(120) % 3).view(-1, 1) if half_ones: preds[:60] = 1 - iou_val = iou( + jaccard_val = jaccard_index( preds=preds, target=target, ignore_index=ignore_index, reduction=reduction, ) - assert torch.allclose(iou_val, expected, atol=1e-9) + assert torch.allclose(jaccard_val, expected, atol=1e-9) # test `absent_score` @@ -194,8 +194,8 @@ def test_iou(half_ones, reduction, ignore_index, expected): ([0, 2], [0, 2], 0, 1.0, 3, [1.0, 1.0]), ], ) -def test_iou_absent_score(pred, target, ignore_index, absent_score, num_classes, expected): - iou_val = iou( +def test_jaccard_absent_score(pred, target, ignore_index, absent_score, num_classes, expected): + jaccard_val = jaccard_index( preds=tensor(pred), target=tensor(target), ignore_index=ignore_index, @@ -203,7 +203,7 @@ def test_iou_absent_score(pred, target, ignore_index, absent_score, num_classes, num_classes=num_classes, reduction="none", ) - assert torch.allclose(iou_val, tensor(expected).to(iou_val)) + assert torch.allclose(jaccard_val, tensor(expected).to(jaccard_val)) # example data taken from @@ -224,12 +224,12 @@ def test_iou_absent_score(pred, target, ignore_index, absent_score, num_classes, ([0, 1, 1, 2, 2], [0, 1, 2, 2, 2], 0, 3, "sum", [7 / 6]), ], ) -def test_iou_ignore_index(pred, target, ignore_index, num_classes, reduction, expected): - iou_val = iou( +def test_jaccard_ignore_index(pred, target, ignore_index, num_classes, reduction, expected): + jaccard_val = jaccard_index( preds=tensor(pred), target=tensor(target), ignore_index=ignore_index, num_classes=num_classes, reduction=reduction, ) - assert torch.allclose(iou_val, tensor(expected).to(iou_val)) + assert torch.allclose(jaccard_val, tensor(expected).to(jaccard_val)) diff --git a/torchmetrics/__init__.py b/torchmetrics/__init__.py index 7d3d5e28d23..9adc5683136 100644 --- a/torchmetrics/__init__.py +++ b/torchmetrics/__init__.py @@ -30,7 +30,7 @@ FBeta, HammingDistance, Hinge, - IoU, + JaccardIndex, KLDivergence, MatthewsCorrcoef, Precision, @@ -106,7 +106,7 @@ "FID", "HammingDistance", "Hinge", - "IoU", + "JaccardIndex", "IS", "KID", "KLDivergence", diff --git a/torchmetrics/classification/__init__.py b/torchmetrics/classification/__init__.py index 0ed2d3d8d8b..ac4fec19f5e 100644 --- a/torchmetrics/classification/__init__.py +++ b/torchmetrics/classification/__init__.py @@ -24,7 +24,7 @@ from torchmetrics.classification.f_beta import F1, FBeta # noqa: F401 from torchmetrics.classification.hamming_distance import HammingDistance # noqa: F401 from torchmetrics.classification.hinge import Hinge # noqa: F401 -from torchmetrics.classification.iou import IoU # noqa: F401 +from torchmetrics.classification.jaccard import JaccardIndex # noqa: F401 from torchmetrics.classification.kl_divergence import KLDivergence # noqa: F401 from torchmetrics.classification.matthews_corrcoef import MatthewsCorrcoef # noqa: F401 from torchmetrics.classification.precision_recall import Precision, Recall # noqa: F401 diff --git a/torchmetrics/classification/iou.py b/torchmetrics/classification/jaccard.py similarity index 92% rename from torchmetrics/classification/iou.py rename to torchmetrics/classification/jaccard.py index 789d57e8523..92b2b6f7c75 100644 --- a/torchmetrics/classification/iou.py +++ b/torchmetrics/classification/jaccard.py @@ -17,10 +17,10 @@ from torch import Tensor from torchmetrics.classification.confusion_matrix import ConfusionMatrix -from torchmetrics.functional.classification.iou import _iou_from_confmat +from torchmetrics.functional.classification.jaccard import _jaccard_from_confmat -class IoU(ConfusionMatrix): +class JaccardIndex(ConfusionMatrix): r""" Computes Intersection over union, or `Jaccard index`_: @@ -68,11 +68,11 @@ class IoU(ConfusionMatrix): Specify the process group on which synchronization is called. default: None (which selects the entire world) Example: - >>> from torchmetrics import IoU + >>> from torchmetrics import JaccardIndex >>> target = torch.randint(0, 2, (10, 25, 25)) >>> pred = torch.tensor(target) >>> pred[2:5, 7:13, 9:15] = 1 - pred[2:5, 7:13, 9:15] - >>> iou = IoU(num_classes=2) + >>> iou = JaccardIndex(num_classes=2) >>> iou(pred, target) tensor(0.9660) @@ -105,4 +105,4 @@ def __init__( def compute(self) -> Tensor: """Computes intersection over union (IoU)""" - return _iou_from_confmat(self.confmat, self.num_classes, self.ignore_index, self.absent_score, self.reduction) + return _jaccard_from_confmat(self.confmat, self.num_classes, self.ignore_index, self.absent_score, self.reduction) diff --git a/torchmetrics/functional/__init__.py b/torchmetrics/functional/__init__.py index f9f1a0475cb..3075f49e0db 100644 --- a/torchmetrics/functional/__init__.py +++ b/torchmetrics/functional/__init__.py @@ -29,7 +29,7 @@ from torchmetrics.functional.classification.f_beta import f1, fbeta from torchmetrics.functional.classification.hamming_distance import hamming_distance from torchmetrics.functional.classification.hinge import hinge -from torchmetrics.functional.classification.iou import iou +from torchmetrics.functional.classification.jaccard import jaccard_index from torchmetrics.functional.classification.kl_divergence import kl_divergence from torchmetrics.functional.classification.matthews_corrcoef import matthews_corrcoef from torchmetrics.functional.classification.precision_recall import precision, precision_recall, recall @@ -97,7 +97,7 @@ "hamming_distance", "hinge", "image_gradients", - "iou", + "jaccard_index", "kl_divergence", "matthews_corrcoef", "mean_absolute_error", diff --git a/torchmetrics/functional/classification/__init__.py b/torchmetrics/functional/classification/__init__.py index 3731a3dd26c..f65507f5862 100644 --- a/torchmetrics/functional/classification/__init__.py +++ b/torchmetrics/functional/classification/__init__.py @@ -22,7 +22,7 @@ from torchmetrics.functional.classification.f_beta import f1, fbeta # noqa: F401 from torchmetrics.functional.classification.hamming_distance import hamming_distance # noqa: F401 from torchmetrics.functional.classification.hinge import hinge # noqa: F401 -from torchmetrics.functional.classification.iou import iou # noqa: F401 +from torchmetrics.functional.classification.jaccard import jaccard_index # noqa: F401 from torchmetrics.functional.classification.kl_divergence import kl_divergence # noqa: F401 from torchmetrics.functional.classification.matthews_corrcoef import matthews_corrcoef # noqa: F401 from torchmetrics.functional.classification.precision_recall import precision, precision_recall, recall # noqa: F401 diff --git a/torchmetrics/functional/classification/iou.py b/torchmetrics/functional/classification/jaccard.py similarity index 95% rename from torchmetrics/functional/classification/iou.py rename to torchmetrics/functional/classification/jaccard.py index f89650320b5..c5cc3ab6999 100644 --- a/torchmetrics/functional/classification/iou.py +++ b/torchmetrics/functional/classification/jaccard.py @@ -21,7 +21,7 @@ from torchmetrics.utilities.distributed import reduce -def _iou_from_confmat( +def _jaccard_from_confmat( confmat: Tensor, num_classes: int, ignore_index: Optional[int] = None, @@ -66,7 +66,7 @@ def _iou_from_confmat( return reduce(scores, reduction=reduction) -def iou( +def jaccard_index( preds: Tensor, target: Tensor, ignore_index: Optional[int] = None, @@ -120,14 +120,14 @@ def iou( 'elementwise_mean', or number of classes if reduction is 'none' Example: - >>> from torchmetrics.functional import iou + >>> from torchmetrics.functional import jaccard_index >>> target = torch.randint(0, 2, (10, 25, 25)) >>> pred = torch.tensor(target) >>> pred[2:5, 7:13, 9:15] = 1 - pred[2:5, 7:13, 9:15] - >>> iou(pred, target) + >>> jaccard_index(pred, target) tensor(0.9660) """ num_classes = get_num_classes(preds=preds, target=target, num_classes=num_classes) confmat = _confusion_matrix_update(preds, target, num_classes, threshold) - return _iou_from_confmat(confmat, num_classes, ignore_index, absent_score, reduction) + return _jaccard_from_confmat(confmat, num_classes, ignore_index, absent_score, reduction) From a0f725d0d7d33f5f8689042d1f1aa5b80b87642d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Dec 2021 11:16:54 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- torchmetrics/classification/jaccard.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/torchmetrics/classification/jaccard.py b/torchmetrics/classification/jaccard.py index 92b2b6f7c75..1ca7dc15999 100644 --- a/torchmetrics/classification/jaccard.py +++ b/torchmetrics/classification/jaccard.py @@ -105,4 +105,6 @@ def __init__( def compute(self) -> Tensor: """Computes intersection over union (IoU)""" - return _jaccard_from_confmat(self.confmat, self.num_classes, self.ignore_index, self.absent_score, self.reduction) + return _jaccard_from_confmat( + self.confmat, self.num_classes, self.ignore_index, self.absent_score, self.reduction + ) From f2834adfbe80587866df5f612fe544ed6e285612 Mon Sep 17 00:00:00 2001 From: Jirka Date: Mon, 6 Dec 2021 12:47:15 +0100 Subject: [PATCH 3/6] deprecate --- CHANGELOG.md | 2 + torchmetrics/__init__.py | 3 +- torchmetrics/classification/__init__.py | 1 + torchmetrics/classification/iou.py | 61 +++++++++++++++++++ torchmetrics/classification/jaccard.py | 4 +- torchmetrics/functional/__init__.py | 1 + torchmetrics/functional/classification/iou.py | 51 ++++++++++++++++ 7 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 torchmetrics/classification/iou.py create mode 100644 torchmetrics/functional/classification/iou.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ee4adff3cfe..2ecbc2e0e61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated +- Renamed IoU -> Jaccard Index ([#662](https://github.com/PyTorchLightning/metrics/pull/662)) + ### Removed diff --git a/torchmetrics/__init__.py b/torchmetrics/__init__.py index 9adc5683136..73a75d8c70b 100644 --- a/torchmetrics/__init__.py +++ b/torchmetrics/__init__.py @@ -14,7 +14,7 @@ from torchmetrics import functional # noqa: E402 from torchmetrics.aggregation import CatMetric, MaxMetric, MeanMetric, MinMetric, SumMetric # noqa: E402 from torchmetrics.audio import PESQ, PIT, SDR, SI_SDR, SI_SNR, SNR, STOI # noqa: E402 -from torchmetrics.classification import ( # noqa: E402 +from torchmetrics.classification import ( # noqa: E402, F401 AUC, AUROC, F1, @@ -30,6 +30,7 @@ FBeta, HammingDistance, Hinge, + IoU, JaccardIndex, KLDivergence, MatthewsCorrcoef, diff --git a/torchmetrics/classification/__init__.py b/torchmetrics/classification/__init__.py index ac4fec19f5e..f76fd097571 100644 --- a/torchmetrics/classification/__init__.py +++ b/torchmetrics/classification/__init__.py @@ -24,6 +24,7 @@ from torchmetrics.classification.f_beta import F1, FBeta # noqa: F401 from torchmetrics.classification.hamming_distance import HammingDistance # noqa: F401 from torchmetrics.classification.hinge import Hinge # noqa: F401 +from torchmetrics.classification.iou import IoU # noqa: F401 from torchmetrics.classification.jaccard import JaccardIndex # noqa: F401 from torchmetrics.classification.kl_divergence import KLDivergence # noqa: F401 from torchmetrics.classification.matthews_corrcoef import MatthewsCorrcoef # noqa: F401 diff --git a/torchmetrics/classification/iou.py b/torchmetrics/classification/iou.py new file mode 100644 index 00000000000..28ee4733a5a --- /dev/null +++ b/torchmetrics/classification/iou.py @@ -0,0 +1,61 @@ +# Copyright The PyTorch Lightning team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Any, Optional +from warnings import warn + +import torch + +from torchmetrics import JaccardIndex + + +class IoU(JaccardIndex): + r""" + Computes Intersection over union, or `Jaccard index`_: + + .. deprecated:: v0.7 + Use :class:`torchmetrics.JaccardIndex`. Will be removed in v0.8. + + Example: + >>> from torchmetrics import IoU + >>> target = torch.randint(0, 2, (10, 25, 25)) + >>> pred = torch.tensor(target) + >>> pred[2:5, 7:13, 9:15] = 1 - pred[2:5, 7:13, 9:15] + >>> iou = IoU(num_classes=2) + >>> iou(pred, target) + tensor(0.9660) + + """ + + def __init__( + self, + num_classes: int, + ignore_index: Optional[int] = None, + absent_score: float = 0.0, + threshold: float = 0.5, + reduction: str = "elementwise_mean", + compute_on_step: bool = True, + dist_sync_on_step: bool = False, + process_group: Optional[Any] = None, + ) -> None: + warn("`IoU` was renamed to `JaccardIndex` in v0.7 and it will be removed in v0.8", DeprecationWarning) + super().__init__( + num_classes=num_classes, + ignore_index=ignore_index, + absent_score=absent_score, + threshold=threshold, + reduction=reduction, + compute_on_step=compute_on_step, + dist_sync_on_step=dist_sync_on_step, + process_group=process_group, + ) diff --git a/torchmetrics/classification/jaccard.py b/torchmetrics/classification/jaccard.py index 1ca7dc15999..3535f98d4bc 100644 --- a/torchmetrics/classification/jaccard.py +++ b/torchmetrics/classification/jaccard.py @@ -72,8 +72,8 @@ class JaccardIndex(ConfusionMatrix): >>> target = torch.randint(0, 2, (10, 25, 25)) >>> pred = torch.tensor(target) >>> pred[2:5, 7:13, 9:15] = 1 - pred[2:5, 7:13, 9:15] - >>> iou = JaccardIndex(num_classes=2) - >>> iou(pred, target) + >>> jaccard = JaccardIndex(num_classes=2) + >>> jaccard(pred, target) tensor(0.9660) """ diff --git a/torchmetrics/functional/__init__.py b/torchmetrics/functional/__init__.py index 3075f49e0db..6fc6dcb225c 100644 --- a/torchmetrics/functional/__init__.py +++ b/torchmetrics/functional/__init__.py @@ -29,6 +29,7 @@ from torchmetrics.functional.classification.f_beta import f1, fbeta from torchmetrics.functional.classification.hamming_distance import hamming_distance from torchmetrics.functional.classification.hinge import hinge +from torchmetrics.functional.classification.iou import iou # noqa: F401 from torchmetrics.functional.classification.jaccard import jaccard_index from torchmetrics.functional.classification.kl_divergence import kl_divergence from torchmetrics.functional.classification.matthews_corrcoef import matthews_corrcoef diff --git a/torchmetrics/functional/classification/iou.py b/torchmetrics/functional/classification/iou.py new file mode 100644 index 00000000000..0c52554ce3e --- /dev/null +++ b/torchmetrics/functional/classification/iou.py @@ -0,0 +1,51 @@ +# Copyright The PyTorch Lightning team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Optional +from warnings import warn + +import torch +from torch import Tensor + +from torchmetrics.functional import jaccard_index + + +def iou( + preds: Tensor, + target: Tensor, + ignore_index: Optional[int] = None, + absent_score: float = 0.0, + threshold: float = 0.5, + num_classes: Optional[int] = None, + reduction: str = "elementwise_mean", +) -> Tensor: + r""" + Computes `Jaccard index`_ + + .. deprecated:: v0.7 + Use :func:`torchmetrics.functional.jaccard_index`. Will be removed in v0.8. + + Example: + >>> from torchmetrics.functional import iou + >>> target = torch.randint(0, 2, (10, 25, 25)) + >>> pred = torch.tensor(target) + >>> pred[2:5, 7:13, 9:15] = 1 - pred[2:5, 7:13, 9:15] + >>> iou(pred, target) + tensor(0.9660) + """ + warn( + "Function `iou` is renamed in v0.7 and will be removed in v0.8." + " Use `functional.functional.jaccard_index` instead.", + DeprecationWarning, + ) + return jaccard_index(preds, target, ignore_index, absent_score, threshold, num_classes, reduction) From f48c26645a604366c0c9a389b964a556b9a2cae0 Mon Sep 17 00:00:00 2001 From: Jirka Date: Mon, 6 Dec 2021 14:28:12 +0100 Subject: [PATCH 4/6] imports --- torchmetrics/classification/iou.py | 2 +- torchmetrics/functional/classification/iou.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/torchmetrics/classification/iou.py b/torchmetrics/classification/iou.py index 28ee4733a5a..f89e96ad0c5 100644 --- a/torchmetrics/classification/iou.py +++ b/torchmetrics/classification/iou.py @@ -16,7 +16,7 @@ import torch -from torchmetrics import JaccardIndex +from torchmetrics.classification.jaccard import JaccardIndex class IoU(JaccardIndex): diff --git a/torchmetrics/functional/classification/iou.py b/torchmetrics/functional/classification/iou.py index 0c52554ce3e..b78952ad00b 100644 --- a/torchmetrics/functional/classification/iou.py +++ b/torchmetrics/functional/classification/iou.py @@ -17,7 +17,7 @@ import torch from torch import Tensor -from torchmetrics.functional import jaccard_index +from torchmetrics.functional.classification.jaccard import jaccard_index def iou( From 60a6bcb962de94be86572e0629b55997f238f9f5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Dec 2021 16:06:44 +0000 Subject: [PATCH 5/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- torchmetrics/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/torchmetrics/__init__.py b/torchmetrics/__init__.py index 8db70ea9908..c198ccb8b55 100644 --- a/torchmetrics/__init__.py +++ b/torchmetrics/__init__.py @@ -2,7 +2,7 @@ import logging as __logging import os -from torchmetrics.__about__ import * # noqa: F401, F403 +from torchmetrics.__about__ import * # noqa: F403 _logger = __logging.getLogger("torchmetrics") _logger.addHandler(__logging.StreamHandler()) @@ -14,7 +14,7 @@ from torchmetrics import functional # noqa: E402 from torchmetrics.aggregation import CatMetric, MaxMetric, MeanMetric, MinMetric, SumMetric # noqa: E402 from torchmetrics.audio import PIT, SDR, SI_SDR, SI_SNR, SNR # noqa: E402 -from torchmetrics.classification import ( # noqa: E402, F401 +from torchmetrics.classification import ( # noqa: E402 AUC, AUROC, F1, From b64689bd70c46270d897b489496c39630ff004af Mon Sep 17 00:00:00 2001 From: Jirka Date: Mon, 6 Dec 2021 17:18:06 +0100 Subject: [PATCH 6/6] fix --- torchmetrics/__init__.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/torchmetrics/__init__.py b/torchmetrics/__init__.py index c198ccb8b55..f6018e39037 100644 --- a/torchmetrics/__init__.py +++ b/torchmetrics/__init__.py @@ -2,7 +2,7 @@ import logging as __logging import os -from torchmetrics.__about__ import * # noqa: F403 +from torchmetrics.__about__ import * # noqa: F401, F403 _logger = __logging.getLogger("torchmetrics") _logger.addHandler(__logging.StreamHandler()) @@ -14,7 +14,7 @@ from torchmetrics import functional # noqa: E402 from torchmetrics.aggregation import CatMetric, MaxMetric, MeanMetric, MinMetric, SumMetric # noqa: E402 from torchmetrics.audio import PIT, SDR, SI_SDR, SI_SNR, SNR # noqa: E402 -from torchmetrics.classification import ( # noqa: E402 +from torchmetrics.classification import ( # noqa: E402, F401 AUC, AUROC, F1, @@ -103,9 +103,6 @@ "HammingDistance", "Hinge", "JaccardIndex", - "IoU", - "IS", - "KID", "KLDivergence", "MatthewsCorrcoef", "MaxMetric",