| |
| |
| |
| |
| |
| |
|
|
| cimport cython |
| import numpy as np |
| cimport numpy as np |
|
|
| DTYPE = np.float64 |
| ctypedef np.float_t DTYPE_t |
|
|
| def bbox_overlaps( |
| np.ndarray[DTYPE_t, ndim=2] boxes, |
| np.ndarray[DTYPE_t, ndim=2] 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 |
| """ |
| cdef unsigned int N = boxes.shape[0] |
| cdef unsigned int K = query_boxes.shape[0] |
| cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) |
| cdef DTYPE_t iw, ih, box_area |
| cdef DTYPE_t ua |
| cdef unsigned int k, n |
| for k in range(K): |
| box_area = ( |
| (query_boxes[k, 2] - query_boxes[k, 0] + 1) * |
| (query_boxes[k, 3] - query_boxes[k, 1] + 1) |
| ) |
| for n in range(N): |
| iw = ( |
| min(boxes[n, 2], query_boxes[k, 2]) - |
| max(boxes[n, 0], query_boxes[k, 0]) + 1 |
| ) |
| if iw > 0: |
| ih = ( |
| min(boxes[n, 3], query_boxes[k, 3]) - |
| max(boxes[n, 1], query_boxes[k, 1]) + 1 |
| ) |
| if ih > 0: |
| ua = float( |
| (boxes[n, 2] - boxes[n, 0] + 1) * |
| (boxes[n, 3] - boxes[n, 1] + 1) + |
| box_area - iw * ih |
| ) |
| overlaps[n, k] = iw * ih / ua |
| return overlaps |