Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
MMCV
Commits
5867a97a
Commit
5867a97a
authored
May 24, 2022
by
YuanLiuuuuuu
Committed by
zhouzaida
Jul 19, 2022
Browse files
[Fix]: Fix random resize
parent
eb3bd34c
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
51 additions
and
28 deletions
+51
-28
mmcv/transforms/processing.py
mmcv/transforms/processing.py
+47
-24
tests/test_transforms/test_transforms_processing.py
tests/test_transforms/test_transforms_processing.py
+4
-4
No files found.
mmcv/transforms/processing.py
View file @
5867a97a
...
...
@@ -1197,17 +1197,34 @@ class RandomResize(BaseTransform):
How to choose the target scale to resize the image will follow the rules
below:
- if ``scale`` is a list of tuple, the first value of the target scale is
sampled from [``scale[0][0]``, ``scale[1][0]``] uniformally and the
second value of the target scale is sampled from
[``scale[0][1]``, ``scale[1][1]``] uniformally. Following the resize
order of weight and height in cv2, scale[i][0] is for width, and
scale[i][1] is for height.
- if ``scale`` is a tuple, the first and second values of the target scale
is equal to the first and second values of ``scale`` multiplied by a
value sampled from [``ratio_range[0]``, ``ratio_range[1]``] uniformally.
Following the resize order of weight and height in cv2, ratio_range[0] is
for width, and ratio_range[1] is for height.
- if ``scale`` is a sequence of tuple
.. math::
target
\\
_scale[0]
\\
sim Uniform([scale[0][0], scale[1][0]])
.. math::
target
\\
_scale[1]
\\
sim Uniform([scale[0][1], scale[1][1]])
Following the resize order of weight and height in cv2, ``scale[i][0]``
is for width, and ``scale[i][1]`` is for height.
- if ``scale`` is a tuple
.. math::
target
\\
_scale[0]
\\
sim Uniform([ratio
\\
_range[0], ratio
\\
_range[1]])
* scale[0]
.. math::
target
\\
_scale[0]
\\
sim Uniform([ratio
\\
_range[0], ratio
\\
_range[1]])
* scale[1]
Following the resize order of weight and height in cv2, ``ratio_range[0]``
is for width, and ``ratio_range[1]`` is for height.
- if ``keep_ratio`` is True, the minimum value of ``target_scale`` will be
used to set the shorter side and the maximum value will be used to
set the longer side.
- if ``keep_ratio`` is False, the value of ``target_scale`` will be used to
reisze the width and height accordingly.
Required Keys:
...
...
@@ -1231,7 +1248,7 @@ class RandomResize(BaseTransform):
- keep_ratio
Args:
scale (tuple or
list
[tuple]): Images scales for resizing.
scale (tuple or
Sequence
[tuple]): Images scales for resizing.
Defaults to None.
ratio_range (tuple[float], optional): (min_ratio, max_ratio).
Defaults to None.
...
...
@@ -1242,7 +1259,7 @@ class RandomResize(BaseTransform):
def
__init__
(
self
,
scale
:
Union
[
Tuple
[
int
,
int
],
List
[
Tuple
[
int
,
int
]]],
scale
:
Union
[
Tuple
[
int
,
int
],
Sequence
[
Tuple
[
int
,
int
]]],
ratio_range
:
Tuple
[
float
,
float
]
=
None
,
resize_cfg
:
dict
=
dict
(
type
=
'Resize'
,
...
...
@@ -1268,16 +1285,17 @@ class RandomResize(BaseTransform):
scales (list[tuple]): Images scale range for sampling.
There must be two tuples in scales, which specify the lower
and upper bound of image scales.
Returns:
tuple: The targeted scale of the image to be resized.
"""
assert
mmcv
.
is_list_of
(
scales
,
tuple
)
and
len
(
scales
)
==
2
scale_
long
=
[
max
(
s
)
for
s
in
scales
]
scale_
short
=
[
min
(
s
)
for
s
in
scales
]
long_
edge
=
np
.
random
.
randint
(
min
(
scale_
long
),
max
(
scale_
long
)
+
1
)
short_
edge
=
np
.
random
.
randint
(
min
(
scale_
short
),
max
(
scale_
short
)
+
1
)
scale
=
(
long_edge
,
short_
edge
)
scale_
0
=
[
scales
[
0
][
0
],
scales
[
1
][
0
]
]
scale_
1
=
[
scales
[
0
][
1
],
scales
[
1
][
1
]
]
edge
_0
=
np
.
random
.
randint
(
min
(
scale_
0
),
max
(
scale_
0
)
+
1
)
edge
_1
=
np
.
random
.
randint
(
min
(
scale_
1
),
max
(
scale_
1
)
+
1
)
scale
=
(
edge_0
,
edge
_1
)
return
scale
@
staticmethod
...
...
@@ -1288,10 +1306,12 @@ class RandomResize(BaseTransform):
A ratio will be randomly sampled from the range specified by
``ratio_range``. Then it would be multiplied with ``scale`` to
generate sampled scale.
Args:
scale (tuple): Images scale base to multiply with ratio.
ratio_range (tuple[float]): The minimum and maximum ratio to scale
the ``scale``.
Returns:
tuple: The targeted scale of the image to be resized.
"""
...
...
@@ -1312,14 +1332,16 @@ class RandomResize(BaseTransform):
tuple: The targeted scale of the image to be resized.
"""
if
isinstance
(
self
.
scale
,
tuple
):
if
mmcv
.
is_tuple_of
(
self
.
scale
,
int
):
assert
self
.
ratio_range
is
not
None
and
len
(
self
.
ratio_range
)
==
2
scale
=
self
.
_random_sample_ratio
(
self
.
scale
,
self
.
ratio_range
)
elif
mmcv
.
is_list_of
(
self
.
scale
,
tuple
):
scale
=
self
.
_random_sample
(
self
.
scale
)
scale
=
self
.
_random_sample_ratio
(
self
.
scale
,
# type: ignore
self
.
ratio_range
)
elif
mmcv
.
is_seq_of
(
self
.
scale
,
tuple
):
scale
=
self
.
_random_sample
(
self
.
scale
)
# type: ignore
else
:
raise
NotImplementedError
(
f
"
Do not support sampling function
\
for
'
{
self
.
scale
}
'
"
)
raise
NotImplementedError
(
'
Do not support sampling function
'
f
'
for
"
{
self
.
scale
}
"
'
)
return
scale
...
...
@@ -1329,6 +1351,7 @@ class RandomResize(BaseTransform):
Args:
results (dict): Result dict from loading pipeline.
Returns:
dict: Resized results, ``img``, ``gt_bboxes``, ``gt_semantic_seg``,
``gt_keypoints``, ``scale``, ``scale_factor``, ``img_shape``, and
...
...
tests/test_transforms/test_transforms_processing.py
View file @
5867a97a
...
...
@@ -886,10 +886,10 @@ class TestRandomResize:
resize_cfg
=
dict
(
type
=
'Resize'
,
keep_ratio
=
True
))
results_update
=
TRANSFORMS
.
transform
(
copy
.
deepcopy
(
results
))
assert
results_update
[
'scale'
][
0
]
>=
224
and
results_update
[
'scale'
][
0
]
<=
448
assert
results_update
[
'scale'
][
1
]
>=
112
and
results_update
[
'scale'
][
1
]
<=
224
assert
results_update
[
'scale'
][
1
]
>=
224
and
results_update
[
'scale'
][
1
]
<=
448
assert
results_update
[
'scale'
][
0
]
>=
112
and
results_update
[
'scale'
][
0
]
<=
224
# the type of scale is invalid in init
with
pytest
.
raises
(
NotImplementedError
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment