Skip to content

Commit b030f38

Browse files
authored
Revert "[Feature] Full angle range (#1061)" (#1071)
This reverts commit 95123b9.
1 parent 95123b9 commit b030f38

File tree

6 files changed

+8
-150
lines changed

6 files changed

+8
-150
lines changed

mmrotate/core/bbox/coder/angle_coder.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,10 @@ class CSLCoder(BaseBBoxCoder):
2727
def __init__(self, angle_version, omega=1, window='gaussian', radius=6):
2828
super().__init__()
2929
self.angle_version = angle_version
30-
assert angle_version in ['oc', 'le90', 'le135', 'full360']
30+
assert angle_version in ['oc', 'le90', 'le135']
3131
assert window in ['gaussian', 'triangle', 'rect', 'pulse']
32-
self.angle_range = 90 if angle_version == 'oc' else \
33-
(360 if angle_version == 'full360' else 180)
34-
self.angle_offset_dict = {
35-
'oc': 0,
36-
'le90': 90,
37-
'le135': 45,
38-
'full360': 180
39-
}
32+
self.angle_range = 90 if angle_version == 'oc' else 180
33+
self.angle_offset_dict = {'oc': 0, 'le90': 90, 'le135': 45}
4034
self.angle_offset = self.angle_offset_dict[angle_version]
4135
self.omega = omega
4236
self.window = window

mmrotate/core/bbox/coder/delta_xywha_hbbox_coder.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def encode(self, bboxes, gt_bboxes):
6868
assert bboxes.size(0) == gt_bboxes.size(0)
6969
assert bboxes.size(-1) == 4
7070
assert gt_bboxes.size(-1) == 5
71-
if self.angle_range in ['oc', 'le135', 'le90', 'full360']:
71+
if self.angle_range in ['oc', 'le135', 'le90']:
7272
return bbox2delta(bboxes, gt_bboxes, self.means, self.stds,
7373
self.angle_range, self.norm_factor,
7474
self.edge_swap)
@@ -104,7 +104,7 @@ def decode(self,
104104
assert pred_bboxes.size(1) == bboxes.size(1)
105105
assert bboxes.size(-1) == 4
106106
assert pred_bboxes.size(-1) == 5
107-
if self.angle_range in ['oc', 'le135', 'le90', 'full360']:
107+
if self.angle_range in ['oc', 'le135', 'le90']:
108108
return delta2bbox(bboxes, pred_bboxes, self.means, self.stds,
109109
wh_ratio_clip, self.add_ctr_clamp,
110110
self.ctr_clamp, self.angle_range,

mmrotate/core/bbox/coder/delta_xywha_rbbox_coder.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def encode(self, bboxes, gt_bboxes):
6767
assert bboxes.size(0) == gt_bboxes.size(0)
6868
assert bboxes.size(-1) == 5
6969
assert gt_bboxes.size(-1) == 5
70-
if self.angle_range in ['oc', 'le135', 'le90', 'full360']:
70+
if self.angle_range in ['oc', 'le135', 'le90']:
7171
return bbox2delta(bboxes, gt_bboxes, self.means, self.stds,
7272
self.angle_range, self.norm_factor,
7373
self.edge_swap, self.proj_xy)
@@ -99,7 +99,7 @@ def decode(self,
9999
torch.Tensor: Decoded boxes.
100100
"""
101101
assert pred_bboxes.size(0) == bboxes.size(0)
102-
if self.angle_range in ['oc', 'le135', 'le90', 'full360']:
102+
if self.angle_range in ['oc', 'le135', 'le90']:
103103
return delta2bbox(bboxes, pred_bboxes, self.means, self.stds,
104104
max_shape, wh_ratio_clip, self.add_ctr_clamp,
105105
self.ctr_clamp, self.angle_range,

mmrotate/core/bbox/transforms.py

Lines changed: 0 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,6 @@ def poly2obb(polys, version='oc'):
108108
results = poly2obb_le135(polys)
109109
elif version == 'le90':
110110
results = poly2obb_le90(polys)
111-
elif version == 'full360':
112-
results = poly2obb_full360(polys)
113111
else:
114112
raise NotImplementedError
115113
return results
@@ -131,8 +129,6 @@ def poly2obb_np(polys, version='oc'):
131129
results = poly2obb_np_le135(polys)
132130
elif version == 'le90':
133131
results = poly2obb_np_le90(polys)
134-
elif version == 'full360':
135-
results = poly2obb_np_full360(polys)
136132
else:
137133
raise NotImplementedError
138134
return results
@@ -154,9 +150,6 @@ def obb2hbb(rbboxes, version='oc'):
154150
results = obb2hbb_le135(rbboxes)
155151
elif version == 'le90':
156152
results = obb2hbb_le90(rbboxes)
157-
elif version == 'full360':
158-
# NOTE: same as 90
159-
results = obb2hbb_le90(rbboxes)
160153
else:
161154
raise NotImplementedError
162155
return results
@@ -178,9 +171,6 @@ def obb2poly(rbboxes, version='oc'):
178171
results = obb2poly_le135(rbboxes)
179172
elif version == 'le90':
180173
results = obb2poly_le90(rbboxes)
181-
elif version == 'full360':
182-
# NOTE: same as 90
183-
results = obb2poly_le90(rbboxes)
184174
else:
185175
raise NotImplementedError
186176
return results
@@ -202,8 +192,6 @@ def obb2poly_np(rbboxes, version='oc'):
202192
results = obb2poly_np_le135(rbboxes)
203193
elif version == 'le90':
204194
results = obb2poly_np_le90(rbboxes)
205-
elif version == 'full360':
206-
results = obb2poly_np_full360(rbboxes)
207195
else:
208196
raise NotImplementedError
209197
return results
@@ -225,9 +213,6 @@ def obb2xyxy(rbboxes, version='oc'):
225213
results = obb2xyxy_le135(rbboxes)
226214
elif version == 'le90':
227215
results = obb2xyxy_le90(rbboxes)
228-
elif version == 'full360':
229-
# NOTE: same as 90
230-
results = obb2xyxy_le90(rbboxes)
231216
else:
232217
raise NotImplementedError
233218
return results
@@ -250,7 +235,6 @@ def hbb2obb(hbboxes, version='oc'):
250235
elif version == 'le90':
251236
results = hbb2obb_le90(hbboxes)
252237
else:
253-
# NOTE: not well defined for full360. Leave it unimplemented
254238
raise NotImplementedError
255239
return results
256240

@@ -314,31 +298,6 @@ def poly2obb_le135(polys):
314298
return torch.stack([x_ctr, y_ctr, width, height, angles], 1)
315299

316300

317-
def poly2obb_full360(polys):
318-
"""Convert polygons to oriented bounding boxes.
319-
320-
Args:
321-
polys (torch.Tensor): [x0,y0,x1,y1,x2,y2,x3,y3]
322-
323-
Returns:
324-
obbs (torch.Tensor): [x_ctr,y_ctr,w,h,angle]
325-
"""
326-
polys = torch.reshape(polys, [-1, 8])
327-
pt1, pt2, pt3, _ = polys[..., :8].chunk(4, 1)
328-
width = torch.sqrt(
329-
torch.pow(pt1[..., 0] - pt2[..., 0], 2) +
330-
torch.pow(pt1[..., 1] - pt2[..., 1], 2))
331-
height = torch.sqrt(
332-
torch.pow(pt2[..., 0] - pt3[..., 0], 2) +
333-
torch.pow(pt2[..., 1] - pt3[..., 1], 2))
334-
angles = torch.atan2((pt1[..., 1] - pt2[..., 1]),
335-
(pt1[..., 0] - pt2[..., 0]))
336-
angles = norm_angle(angles, 'full360')
337-
x_ctr = (pt1[..., 0] + pt3[..., 0]) / 2.0
338-
y_ctr = (pt1[..., 1] + pt3[..., 1]) / 2.0
339-
return torch.stack([x_ctr, y_ctr, width, height, angles], 1)
340-
341-
342301
def poly2obb_le90(polys):
343302
"""Convert polygons to oriented bounding boxes.
344303
@@ -459,33 +418,6 @@ def poly2obb_np_le90(poly):
459418
return x, y, w, h, a
460419

461420

462-
def poly2obb_np_full360(poly):
463-
"""Convert polygons to oriented bounding boxes. Assumes head points then
464-
tail points.
465-
466-
Args:
467-
polys (ndarray): [x0,y0,x1,y1,x2,y2,x3,y3]
468-
469-
Returns:
470-
obbs (ndarray): [x_ctr,y_ctr,w,h,angle]
471-
"""
472-
pt1, pt2, pt3, pt4 = np.array(poly).reshape((4, 2))
473-
x, y = (pt1 + pt2 + pt3 + pt4) / 4.0
474-
dx, dy = pt2 - pt1
475-
a = np.arctan2(dy, dx)
476-
w = np.linalg.norm(pt2 - pt1)
477-
h = np.linalg.norm(pt3 - pt2)
478-
if w < 2 or h < 2:
479-
return
480-
while not np.pi > a >= -np.pi:
481-
if a >= np.pi:
482-
a -= np.pi
483-
else:
484-
a += np.pi
485-
assert np.pi > a >= -np.pi
486-
return x, y, w, h, a
487-
488-
489421
def obb2poly_oc(rboxes):
490422
"""Convert oriented bounding boxes to polygons.
491423
@@ -702,26 +634,6 @@ def hbb2obb_le90(hbboxes):
702634
return obboxes
703635

704636

705-
def hbb2obb_full360(hbboxes):
706-
"""Convert horizontal bounding boxes to oriented bounding boxes.
707-
708-
Args:
709-
hbbs (torch.Tensor): [x_lt,y_lt,x_rb,y_rb]
710-
711-
Returns:
712-
obbs (torch.Tensor): [x_ctr,y_ctr,w,h,angle]
713-
"""
714-
x = (hbboxes[..., 0] + hbboxes[..., 2]) * 0.5
715-
y = (hbboxes[..., 1] + hbboxes[..., 3]) * 0.5
716-
w = hbboxes[..., 2] - hbboxes[..., 0]
717-
h = hbboxes[..., 3] - hbboxes[..., 1]
718-
theta = x.new_zeros(*x.shape)
719-
obboxes1 = torch.stack([x, y, w, h, theta], dim=-1)
720-
obboxes2 = torch.stack([x, y, h, w, theta - np.pi / 2], dim=-1)
721-
obboxes = torch.where((w >= h)[..., None], obboxes1, obboxes2)
722-
return obboxes
723-
724-
725637
def obb2xyxy_oc(rbboxes):
726638
"""Convert oriented bounding boxes to horizontal bounding boxes.
727639
@@ -871,31 +783,6 @@ def obb2poly_np_le90(obboxes):
871783
return polys
872784

873785

874-
def obb2poly_np_full360(obboxes):
875-
"""Convert oriented bounding boxes to polygons.
876-
877-
Args:
878-
obbs (ndarray): [x_ctr,y_ctr,w,h,angle,score]
879-
880-
Returns:
881-
polys (ndarray): [x0,y0,x1,y1,x2,y2,x3,y3,score]
882-
"""
883-
try:
884-
center, w, h, theta, score = np.split(obboxes, (2, 3, 4, 5), axis=-1)
885-
except: # noqa: E722
886-
results = np.stack([0., 0., 0., 0., 0., 0., 0., 0., 0.], axis=-1)
887-
return results.reshape(1, -1)
888-
Cos, Sin = np.cos(theta), np.sin(theta)
889-
vector1 = np.concatenate([w / 2 * Cos, w / 2 * Sin], axis=-1)
890-
vector2 = np.concatenate([-h / 2 * Sin, h / 2 * Cos], axis=-1)
891-
point1 = center - vector1 - vector2
892-
point2 = center + vector1 - vector2
893-
point3 = center + vector1 + vector2
894-
point4 = center - vector1 + vector2
895-
polys = np.concatenate([point1, point2, point3, point4, score], axis=-1)
896-
return polys
897-
898-
899786
def cal_line_length(point1, point2):
900787
"""Calculate the length of line.
901788
@@ -976,8 +863,6 @@ def norm_angle(angle, angle_range):
976863
return (angle + np.pi / 4) % np.pi - np.pi / 4
977864
elif angle_range == 'le90':
978865
return (angle + np.pi / 2) % np.pi - np.pi / 2
979-
elif angle_range == 'full360':
980-
return angle % (2 * np.pi) - np.pi
981866
else:
982867
print('Not yet implemented.')
983868

mmrotate/datasets/pipelines/transforms.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,8 @@ def bbox_flip(self, bboxes, img_shape, direction):
8080
flipped = bboxes.copy()
8181
if direction == 'horizontal':
8282
flipped[:, 0] = img_shape[1] - bboxes[:, 0] - 1
83-
flipped[:4] = flipped[[1, 0, 3, 2]].copy()
8483
elif direction == 'vertical':
8584
flipped[:, 1] = img_shape[0] - bboxes[:, 1] - 1
86-
flipped[:4] = flipped[[1, 0, 3, 2]].copy()
8785
elif direction == 'diagonal':
8886
flipped[:, 0] = img_shape[1] - bboxes[:, 0] - 1
8987
flipped[:, 1] = img_shape[0] - bboxes[:, 1] - 1
@@ -273,6 +271,7 @@ def __call__(self, results):
273271
def __repr__(self):
274272
repr_str = self.__class__.__name__
275273
repr_str += f'(rotate_ratio={self.rotate_ratio}, ' \
274+
f'base_angles={self.base_angles}, ' \
276275
f'angles_range={self.angles_range}, ' \
277276
f'auto_bound={self.auto_bound})'
278277
return repr_str

tests/test_utils/test_transformer.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,3 @@ def test_transforms():
2828
obboxes3 = rtf.hbb2obb(hbboxes, 'le90')
2929
assert not np.allclose(obboxes1.numpy(), obboxes2)
3030
assert np.allclose(obboxes2.numpy(), obboxes3)
31-
32-
# test full360
33-
# Check obb2poly and poly2obb is inverse function in full360 rotation
34-
for angle in np.linspace(-.9 * np.pi, .9 * np.pi, 4):
35-
# numpy version
36-
box_np = np.array((100, 100, 80, 50, angle), dtype=np.float32)
37-
pts_np = rtf.obb2poly_np(box_np[None], version='full360')[0]
38-
box2_np = rtf.poly2obb_np(pts_np, version='full360')
39-
np.testing.assert_almost_equal(box_np, box2_np, decimal=4)
40-
41-
# torch version
42-
box_torch = torch.tensor((100, 100, 80, 50, angle),
43-
dtype=torch.float32)
44-
pts_torch = rtf.obb2poly(box_torch[None], version='full360')[0]
45-
box2_torch = rtf.poly2obb(pts_torch, version='full360')[0]
46-
torch.norm(box_torch - box2_torch) < 1e-4
47-
48-
# compatibility between numpy and torch implementations
49-
torch.norm(box_torch - torch.from_numpy(box_np)) < 1e-4
50-
torch.norm(pts_torch - torch.from_numpy(pts_np)) < 1e-4

0 commit comments

Comments
 (0)