| | |
| | 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 |
| |
|