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