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