From 6da86c71268bcb09e0946b4b7796ce38d5c4f1d8 Mon Sep 17 00:00:00 2001 From: erenzhou <592267829@qq.com> Date: Thu, 3 Mar 2022 10:19:08 +0800 Subject: [PATCH 1/5] add unit test --- tests/test_utils/test_overlaps.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/test_utils/test_overlaps.py diff --git a/tests/test_utils/test_overlaps.py b/tests/test_utils/test_overlaps.py new file mode 100644 index 000000000..90ee881a9 --- /dev/null +++ b/tests/test_utils/test_overlaps.py @@ -0,0 +1,27 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmrotate.core.bbox import rbbox_overlaps + +predict = [[903.34, 1034.4, 1.81e-7, 1e-7, -0.312]] +gt = [[2.1525e+02, 7.5750e+01, 3.3204e+01, 1.2649e+01, 3.2175e-01], + [3.0013e+02, 7.7144e+02, 4.9222e+02, 3.1368e+02, -1.3978e+00], + [8.4887e+02, 6.9989e+02, 4.6854e+02, 3.0743e+02, -1.4008e+00], + [8.5250e+02, 7.0250e+02, 7.6181e+02, 3.8200e+02, -1.3984e+00]] +expect_ious = [[0., 0., 0., 0.]] + +predict_tensor = torch.tensor(predict, device='cuda') +gt_tensor = torch.tensor(gt, device='cuda') +expect_ious_tensor = torch.tensor(expect_ious, device='cuda') +print(ious) +torch.allclose(ious, expected_iou, atol=1e-3) + +# @pytest.mark.skipif( +# not torch.cuda.is_available(), reason='requires CUDA support') +# def test_box_iou_rotated_cuda(self): +# predict_tensor = torch.tensor(predict, device='cuda') +# gt_tensor = torch.tensor(gt, device='cuda') +# expect_ious_tensor = torch.tensor(expect_ious, device='cuda') +# ious = rbbox_overlaps(predict_tensor, gt_tensor) +# torch.allclose(ious, expected_iou, atol=1e-3) From 7d5d3306437e6257fbb78529dfe81dc242a8f329 Mon Sep 17 00:00:00 2001 From: erenzhou <592267829@qq.com> Date: Thu, 3 Mar 2022 11:43:44 +0800 Subject: [PATCH 2/5] fix bug --- .../rotate_iou2d_calculator.py | 11 +++++- tests/test_utils/test_overlaps.py | 35 +++++++++++-------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py b/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py index 7e40e41ab..533addd52 100644 --- a/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py +++ b/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py @@ -1,6 +1,6 @@ # Copyright (c) OpenMMLab. All rights reserved. from mmcv.ops import box_iou_rotated - +import torch from .builder import ROTATED_IOU_CALCULATORS @@ -35,6 +35,7 @@ def __call__(self, """ assert bboxes1.size(-1) in [0, 5, 6] assert bboxes2.size(-1) in [0, 5, 6] + if bboxes2.size(-1) == 6: bboxes2 = bboxes2[..., :5] if bboxes1.size(-1) == 6: @@ -69,6 +70,14 @@ def rbbox_overlaps(bboxes1, bboxes2, mode='iou', is_aligned=False): assert (bboxes1.size(-1) == 5 or bboxes1.size(0) == 0) assert (bboxes2.size(-1) == 5 or bboxes2.size(0) == 0) + # resolve `rbbox_overlaps` abnormal when input rbbox is too small. + bboxes1_replace = bboxes1.new_ones((bboxes1.size(0), 2)) * 1e-3 + bboxes2_replace = bboxes2.new_ones((bboxes2.size(0), 2)) * 1e-3 + bboxes1[:, 2:4] = torch.where(bboxes1[:, 2:4] < 1e-3, bboxes1_replace, + bboxes1[:, 2:4]) + bboxes2[:, 2:4] = torch.where(bboxes2[:, 2:4] < 1e-3, bboxes2_replace, + bboxes2[:, 2:4]) + rows = bboxes1.size(0) cols = bboxes2.size(0) if is_aligned: diff --git a/tests/test_utils/test_overlaps.py b/tests/test_utils/test_overlaps.py index 90ee881a9..15d169a93 100644 --- a/tests/test_utils/test_overlaps.py +++ b/tests/test_utils/test_overlaps.py @@ -4,24 +4,29 @@ from mmrotate.core.bbox import rbbox_overlaps -predict = [[903.34, 1034.4, 1.81e-7, 1e-7, -0.312]] +predict = [[903.34, 1034.4, 1.81e-7, 1e-7, -0.312], + [903.34, 1034.4, 1e-7, 1e-3, -0.312], + [903.34, 1034.4, 1.81e7, 1e7, -0.312]] gt = [[2.1525e+02, 7.5750e+01, 3.3204e+01, 1.2649e+01, 3.2175e-01], [3.0013e+02, 7.7144e+02, 4.9222e+02, 3.1368e+02, -1.3978e+00], [8.4887e+02, 6.9989e+02, 4.6854e+02, 3.0743e+02, -1.4008e+00], [8.5250e+02, 7.0250e+02, 7.6181e+02, 3.8200e+02, -1.3984e+00]] -expect_ious = [[0., 0., 0., 0.]] +expect_ious = [[0., 0., 0., 0.], + [0., 0., 0., 0.], + [0., 0., 0., 0.]] -predict_tensor = torch.tensor(predict, device='cuda') -gt_tensor = torch.tensor(gt, device='cuda') -expect_ious_tensor = torch.tensor(expect_ious, device='cuda') -print(ious) -torch.allclose(ious, expected_iou, atol=1e-3) +def test_rbbox_overlaps_cpu(): + predict_tensor = torch.tensor(predict) + gt_tensor = torch.tensor(gt) + expect_ious_tensor = torch.tensor(expect_ious) + ious = rbbox_overlaps(predict_tensor, gt_tensor) + torch.allclose(ious, expect_ious_tensor, atol=1e-3) -# @pytest.mark.skipif( -# not torch.cuda.is_available(), reason='requires CUDA support') -# def test_box_iou_rotated_cuda(self): -# predict_tensor = torch.tensor(predict, device='cuda') -# gt_tensor = torch.tensor(gt, device='cuda') -# expect_ious_tensor = torch.tensor(expect_ious, device='cuda') -# ious = rbbox_overlaps(predict_tensor, gt_tensor) -# torch.allclose(ious, expected_iou, atol=1e-3) +@pytest.mark.skipif( + not torch.cuda.is_available(), reason='requires CUDA support') +def test_rbbox_overlaps_cuda(): + predict_tensor = torch.tensor(predict, device='cuda') + gt_tensor = torch.tensor(gt, device='cuda') + expect_ious_tensor = torch.tensor(expect_ious, device='cuda') + ious = rbbox_overlaps(predict_tensor, gt_tensor) + torch.allclose(ious, expect_ious_tensor, atol=1e-3) From bf3e81885bd8b390d0944bdbba74cd4d29f3a727 Mon Sep 17 00:00:00 2001 From: erenzhou <592267829@qq.com> Date: Thu, 3 Mar 2022 11:46:47 +0800 Subject: [PATCH 3/5] fix lint --- .../core/bbox/iou_calculators/rotate_iou2d_calculator.py | 3 ++- tests/test_utils/test_overlaps.py | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py b/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py index 533addd52..0c6564b6c 100644 --- a/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py +++ b/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py @@ -1,6 +1,7 @@ # Copyright (c) OpenMMLab. All rights reserved. -from mmcv.ops import box_iou_rotated import torch +from mmcv.ops import box_iou_rotated + from .builder import ROTATED_IOU_CALCULATORS diff --git a/tests/test_utils/test_overlaps.py b/tests/test_utils/test_overlaps.py index 15d169a93..9d6586438 100644 --- a/tests/test_utils/test_overlaps.py +++ b/tests/test_utils/test_overlaps.py @@ -11,9 +11,8 @@ [3.0013e+02, 7.7144e+02, 4.9222e+02, 3.1368e+02, -1.3978e+00], [8.4887e+02, 6.9989e+02, 4.6854e+02, 3.0743e+02, -1.4008e+00], [8.5250e+02, 7.0250e+02, 7.6181e+02, 3.8200e+02, -1.3984e+00]] -expect_ious = [[0., 0., 0., 0.], - [0., 0., 0., 0.], - [0., 0., 0., 0.]] +expect_ious = [[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]] + def test_rbbox_overlaps_cpu(): predict_tensor = torch.tensor(predict) @@ -22,6 +21,7 @@ def test_rbbox_overlaps_cpu(): ious = rbbox_overlaps(predict_tensor, gt_tensor) torch.allclose(ious, expect_ious_tensor, atol=1e-3) + @pytest.mark.skipif( not torch.cuda.is_available(), reason='requires CUDA support') def test_rbbox_overlaps_cuda(): From 02113372de1f8d0d3eec4897ea6b1d5f34dfda1f Mon Sep 17 00:00:00 2001 From: erenzhou <592267829@qq.com> Date: Sat, 5 Mar 2022 10:25:58 +0800 Subject: [PATCH 4/5] Update rotate_iou2d_calculator.py --- .../core/bbox/iou_calculators/rotate_iou2d_calculator.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py b/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py index 0c6564b6c..974bd93b3 100644 --- a/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py +++ b/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py @@ -1,5 +1,4 @@ # Copyright (c) OpenMMLab. All rights reserved. -import torch from mmcv.ops import box_iou_rotated from .builder import ROTATED_IOU_CALCULATORS @@ -72,12 +71,8 @@ def rbbox_overlaps(bboxes1, bboxes2, mode='iou', is_aligned=False): assert (bboxes2.size(-1) == 5 or bboxes2.size(0) == 0) # resolve `rbbox_overlaps` abnormal when input rbbox is too small. - bboxes1_replace = bboxes1.new_ones((bboxes1.size(0), 2)) * 1e-3 - bboxes2_replace = bboxes2.new_ones((bboxes2.size(0), 2)) * 1e-3 - bboxes1[:, 2:4] = torch.where(bboxes1[:, 2:4] < 1e-3, bboxes1_replace, - bboxes1[:, 2:4]) - bboxes2[:, 2:4] = torch.where(bboxes2[:, 2:4] < 1e-3, bboxes2_replace, - bboxes2[:, 2:4]) + bboxes1 = bboxes1.clamp(min=1e-3) + bboxes2 = bboxes2.clamp(min=1e-3) rows = bboxes1.size(0) cols = bboxes2.size(0) From 2abe12e92fda87f2132a1d1c970530cf97132079 Mon Sep 17 00:00:00 2001 From: erenzhou <592267829@qq.com> Date: Tue, 8 Mar 2022 14:34:24 +0800 Subject: [PATCH 5/5] Update rotate_iou2d_calculator.py --- mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py b/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py index 974bd93b3..3c84c6e14 100644 --- a/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py +++ b/mmrotate/core/bbox/iou_calculators/rotate_iou2d_calculator.py @@ -71,8 +71,8 @@ def rbbox_overlaps(bboxes1, bboxes2, mode='iou', is_aligned=False): assert (bboxes2.size(-1) == 5 or bboxes2.size(0) == 0) # resolve `rbbox_overlaps` abnormal when input rbbox is too small. - bboxes1 = bboxes1.clamp(min=1e-3) - bboxes2 = bboxes2.clamp(min=1e-3) + bboxes1[2:4].clamp_(min=1e-3) + bboxes2[2:4].clamp_(min=1e-3) rows = bboxes1.size(0) cols = bboxes2.size(0)