10def bbox_overlaps(bboxes1, bboxes2, mode='iou', is_aligned=False, eps=1e-6):
12 assert mode
in [
'iou',
'iof',
'giou'], f
'Unsupported mode {mode}'
14 assert (bboxes1.size(-1) == 4
or bboxes1.size(0) == 0)
15 assert (bboxes2.size(-1) == 4
or bboxes2.size(0) == 0)
19 assert bboxes1.shape[:-2] == bboxes2.shape[:-2]
20 batch_shape = bboxes1.shape[:-2]
22 rows = bboxes1.size(-2)
23 cols = bboxes2.size(-2)
29 return bboxes1.new(batch_shape + (rows, ))
31 return bboxes1.new(batch_shape + (rows, cols))
33 area1 = (bboxes1[..., 2] - bboxes1[..., 0]) * (
34 bboxes1[..., 3] - bboxes1[..., 1])
35 area2 = (bboxes2[..., 2] - bboxes2[..., 0]) * (
36 bboxes2[..., 3] - bboxes2[..., 1])
39 lt = torch.max(bboxes1[..., :2], bboxes2[..., :2])
40 rb = torch.min(bboxes1[..., 2:], bboxes2[..., 2:])
43 overlap = wh[..., 0] * wh[..., 1]
45 if mode
in [
'iou',
'giou']:
46 union = area1 + area2 - overlap
50 enclosed_lt = torch.min(bboxes1[..., :2], bboxes2[..., :2])
51 enclosed_rb = torch.max(bboxes1[..., 2:], bboxes2[..., 2:])
53 lt = torch.max(bboxes1[..., :,
None, :2],
54 bboxes2[...,
None, :, :2])
55 rb = torch.min(bboxes1[..., :,
None, 2:],
56 bboxes2[...,
None, :, 2:])
59 overlap = wh[..., 0] * wh[..., 1]
61 if mode
in [
'iou',
'giou']:
62 union = area1[...,
None] + area2[...,
None, :] - overlap
64 union = area1[...,
None]
66 enclosed_lt = torch.min(bboxes1[..., :,
None, :2],
67 bboxes2[...,
None, :, :2])
68 enclosed_rb = torch.max(bboxes1[..., :,
None, 2:],
69 bboxes2[...,
None, :, 2:])
71 eps = union.new_tensor([eps])
72 union = torch.max(union, eps)
73 ious = overlap / union
74 if mode
in [
'iou',
'iof']:
77 enclose_wh =
fp16_clamp(enclosed_rb - enclosed_lt, min=0)
78 enclose_area = enclose_wh[..., 0] * enclose_wh[..., 1]
79 enclose_area = torch.max(enclose_area, eps)
80 gious = ious - (enclose_area - union) / enclose_area