Skip to content

Commit

Permalink
Fix #615 bboxes with min_visibility are excluded (#616)
Browse files Browse the repository at this point in the history
* Fix #615 bboxes with min_visibility are excluded
Both cases min_visibility=0 and min_visibility=1 are now handled correctly

* Fix deepsource

* some refactoring

* even more refactoring

* tests

Co-authored-by: Mikhail Druzhinin <dipetm@gmail.com>
Co-authored-by: Mikhail Druzhinin <dipet@gmail.com>
  • Loading branch information
3 people committed Jul 18, 2022
1 parent 85c3c0b commit a8dc46e
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 19 deletions.
7 changes: 3 additions & 4 deletions albumentations/augmentations/dropout/channel_dropout.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import random
from typing import Union, Tuple, Any, Mapping
from typing import Any, Mapping, Tuple, Union

import numpy as np

from albumentations.core.transforms_interface import (
ImageOnlyTransform,
)
from albumentations.core.transforms_interface import ImageOnlyTransform

from .functional import channel_dropout

__all__ = ["ChannelDropout"]
Expand Down
7 changes: 3 additions & 4 deletions albumentations/augmentations/dropout/cutout.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import random
import warnings
from typing import Union, Any, Dict, Tuple
from typing import Any, Dict, Tuple, Union

import numpy as np

from albumentations.core.transforms_interface import (
ImageOnlyTransform,
)
from albumentations.core.transforms_interface import ImageOnlyTransform

from .functional import cutout

__all__ = ["Cutout"]
Expand Down
3 changes: 2 additions & 1 deletion albumentations/augmentations/dropout/functional.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import List, Tuple, Union, Iterable
from typing import Iterable, List, Tuple, Union

import numpy as np

from ..functional import preserve_shape

__all__ = ["cutout", "channel_dropout"]
Expand Down
4 changes: 2 additions & 2 deletions albumentations/augmentations/dropout/grid_dropout.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import random
from typing import Tuple, Iterable
from typing import Iterable, Tuple

import numpy as np

from . import functional as F
from ...core.transforms_interface import DualTransform
from . import functional as F

__all__ = ["GridDropout"]

Expand Down
13 changes: 6 additions & 7 deletions albumentations/core/bbox_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -458,13 +458,12 @@ def filter_bboxes(
transformed_box_area = calculate_bbox_area(bbox, rows, cols)
bbox, tail = tuple(np.clip(bbox[:4], 0, 1.0)), tuple(bbox[4:])
clipped_box_area = calculate_bbox_area(bbox, rows, cols)
if not transformed_box_area or clipped_box_area / transformed_box_area <= min_visibility:
continue
else:
bbox = tuple(np.clip(bbox[:4], 0, 1.0))
if calculate_bbox_area(bbox, rows, cols) <= min_area:
continue
resulting_boxes.append(bbox + tail)
if (
clipped_box_area != 0 # to ensure transformed_box_area!=0 and to handle min_area=0 or min_visibility=0
and clipped_box_area >= min_area
and clipped_box_area / transformed_box_area >= min_visibility
):
resulting_boxes.append(bbox + tail)
return resulting_boxes


Expand Down
17 changes: 16 additions & 1 deletion tests/test_bbox.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import numpy as np
import pytest

from albumentations import RandomCrop, RandomResizedCrop, RandomSizedCrop, Rotate
from albumentations import Crop, RandomCrop, RandomResizedCrop, RandomSizedCrop, Rotate
from albumentations.core.bbox_utils import (
calculate_bbox_area,
convert_bbox_from_albumentations,
Expand Down Expand Up @@ -267,3 +267,18 @@ def test_crop_boxes_replay_compose():
transformed2 = ReplayCompose.replay(transformed["replay"], **input_data)

np.testing.assert_almost_equal(transformed["bboxes"], transformed2["bboxes"])


@pytest.mark.parametrize(
["transforms", "bboxes", "result_bboxes", "min_area", "min_visibility"],
[
[[Crop(10, 10, 20, 20)], [[0, 0, 10, 10, 0]], [], 0, 0],
[[Crop(0, 0, 90, 90)], [[0, 0, 91, 91, 0], [0, 0, 90, 90, 0]], [[0, 0, 90, 90, 0]], 0, 1],
[[Crop(0, 0, 90, 90)], [[0, 0, 1, 10, 0], [0, 0, 1, 11, 0]], [[0, 0, 1, 10, 0], [0, 0, 1, 11, 0]], 10, 0],
],
)
def test_bbox_params_edges(transforms, bboxes, result_bboxes, min_area, min_visibility):
image = np.empty([100, 100, 3], dtype=np.uint8)
aug = Compose(transforms, bbox_params=BboxParams("pascal_voc", min_area=min_area, min_visibility=min_visibility))
res = aug(image=image, bboxes=bboxes)["bboxes"]
assert np.allclose(res, result_bboxes)

0 comments on commit a8dc46e

Please sign in to comment.