| import numpy as np | |
| def bbox_overlaps(boxes, query_boxes): | |
| """ | |
| Parameters | |
| ---------- | |
| boxes: (N, 4) ndarray of float | |
| query_boxes: (K, 4) ndarray of float | |
| Returns | |
| ------- | |
| overlaps: (N, K) ndarray of overlap between boxes and query_boxes | |
| """ | |
| N = boxes.shape[0] | |
| K = query_boxes.shape[0] | |
| overlaps = np.zeros((N, K), dtype=np.float32) | |
| box_area = ( | |
| (query_boxes[:, 2] - query_boxes[:, 0] + 1) * | |
| (query_boxes[:, 3] - query_boxes[:, 1] + 1) | |
| ) | |
| for n in range(N): | |
| iw = ( | |
| np.maximum(0, np.minimum(boxes[n, 2], query_boxes[:, 2]) - | |
| np.maximum(boxes[n, 0], query_boxes[:, 0]) + 1) | |
| ) | |
| ih = ( | |
| np.maximum(0, np.minimum(boxes[n, 3], query_boxes[:, 3]) - | |
| np.maximum(boxes[n, 1], query_boxes[:, 1]) + 1) | |
| ) | |
| ua = ( | |
| (boxes[n, 2] - boxes[n, 0] + 1) * | |
| (boxes[n, 3] - boxes[n, 1] + 1) + | |
| box_area - iw * ih | |
| ) | |
| overlaps[n, :] = np.where((iw > 0) & (ih > 0), iw * ih / ua, 0) | |
| return overlaps |