|
- # Copyright (c) OpenMMLab. All rights reserved.
- import numpy as np
-
-
- def bbox_overlaps(bboxes1,
- bboxes2,
- mode='iou',
- eps=1e-6,
- use_legacy_coordinate=False):
- """Calculate the ious between each bbox of bboxes1 and bboxes2.
-
- Args:
- bboxes1 (ndarray): Shape (n, 4)
- bboxes2 (ndarray): Shape (k, 4)
- mode (str): IOU (intersection over union) or IOF (intersection
- over foreground)
- use_legacy_coordinate (bool): Whether to use coordinate system in
- mmdet v1.x. which means width, height should be
- calculated as 'x2 - x1 + 1` and 'y2 - y1 + 1' respectively.
- Note when function is used in `VOCDataset`, it should be
- True to align with the official implementation
- `http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCdevkit_18-May-2011.tar`
- Default: False.
-
- Returns:
- ious (ndarray): Shape (n, k)
- """
-
- assert mode in ['iou', 'iof']
- if not use_legacy_coordinate:
- extra_length = 0.
- else:
- extra_length = 1.
- bboxes1 = bboxes1.astype(np.float32)
- bboxes2 = bboxes2.astype(np.float32)
- rows = bboxes1.shape[0]
- cols = bboxes2.shape[0]
- ious = np.zeros((rows, cols), dtype=np.float32)
- if rows * cols == 0:
- return ious
- exchange = False
- if bboxes1.shape[0] > bboxes2.shape[0]:
- bboxes1, bboxes2 = bboxes2, bboxes1
- ious = np.zeros((cols, rows), dtype=np.float32)
- exchange = True
- area1 = (bboxes1[:, 2] - bboxes1[:, 0] + extra_length) * (
- bboxes1[:, 3] - bboxes1[:, 1] + extra_length)
- area2 = (bboxes2[:, 2] - bboxes2[:, 0] + extra_length) * (
- bboxes2[:, 3] - bboxes2[:, 1] + extra_length)
- for i in range(bboxes1.shape[0]):
- x_start = np.maximum(bboxes1[i, 0], bboxes2[:, 0])
- y_start = np.maximum(bboxes1[i, 1], bboxes2[:, 1])
- x_end = np.minimum(bboxes1[i, 2], bboxes2[:, 2])
- y_end = np.minimum(bboxes1[i, 3], bboxes2[:, 3])
- overlap = np.maximum(x_end - x_start + extra_length, 0) * np.maximum(
- y_end - y_start + extra_length, 0)
- if mode == 'iou':
- union = area1[i] + area2 - overlap
- else:
- union = area1[i] if not exchange else area2
- union = np.maximum(union, eps)
- ious[i, :] = overlap / union
- if exchange:
- ious = ious.T
- return ious
|