--- /dev/null
+# --------------------------------------------------------
+# Fast R-CNN
+# Copyright (c) 2015 Microsoft
+# Licensed under The MIT License [see LICENSE for details]
+# Written by Sergey Karayev
+# --------------------------------------------------------
+
+cimport cython
+import numpy as np
+cimport numpy as np
+
+DTYPE = np.float
+ctypedef np.float_t DTYPE_t
+
+def bbox_overlaps_float(
+ 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]) *
+ (query_boxes[k, 3] - query_boxes[k, 1])
+ )
+ for n in range(N):
+ iw = (
+ min(boxes[n, 2], query_boxes[k, 2]) -
+ max(boxes[n, 0], query_boxes[k, 0])
+ )
+ if iw > 0:
+ ih = (
+ min(boxes[n, 3], query_boxes[k, 3]) -
+ max(boxes[n, 1], query_boxes[k, 1])
+ )
+ if ih > 0:
+ ua = float(
+ (boxes[n, 2] - boxes[n, 0]) *
+ (boxes[n, 3] - boxes[n, 1]) +
+ box_area - iw * ih
+ )
+ # if query_boxes[k, 4] == -1:
+ # ua = float((boxes[n, 2] - boxes[n, 0])
+ # *(boxes[n, 3] - boxes[n, 1]))
+ # else:
+ # ua = float(
+ # (boxes[n, 2] - boxes[n, 0]) *
+ # (boxes[n, 3] - boxes[n, 1]) +
+ # box_area - iw * ih
+ # )
+ overlaps[n, k] = iw * ih / ua
+ return overlaps
+
+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
+
+def bbox_overlaps_self(
+ 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(box_area)
+ overlaps[n, k] = iw * ih / ua
+ return overlaps
+
+
+def bbox_overlaps_ignore(
+ 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:
+ if query_boxes[k, 4] == -1:
+ ua = float((boxes[n, 2] - boxes[n, 0] + 1)
+ *(boxes[n, 3] - boxes[n, 1] + 1))
+ else:
+ 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
+
+
+def get_assignment_overlaps(
+ np.ndarray[DTYPE_t, ndim=2] boxes,
+ np.ndarray[DTYPE_t, ndim=2] query_boxes,
+ DTYPE_t FG_THRESH):
+ """ Used for proposal_target_layer_ignore
+ 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[long, ndim=1] gt_assignment = np.zeros((N,), dtype=np.int)
+ cdef np.ndarray[DTYPE_t, ndim=1] max_overlaps = np.zeros((N,), 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:
+ if query_boxes[k, 4] == -1:
+ ua = float((boxes[n, 2] - boxes[n, 0] + 1)
+ *(boxes[n, 3] - boxes[n, 1] + 1))
+ overlap = iw * ih / ua
+ if overlap > max_overlaps[n]:
+ if query_boxes[gt_assignment[n], 4] == -1 or max_overlaps[n] < FG_THRESH:
+ max_overlaps[n] = overlap
+ gt_assignment[n] = k
+ else:
+ ua = float(
+ (boxes[n, 2] - boxes[n, 0] + 1) *
+ (boxes[n, 3] - boxes[n, 1] + 1) +
+ box_area - iw * ih
+ )
+ overlap = iw * ih / ua
+ if overlap > max_overlaps[n]:
+ max_overlaps[n] = overlap
+ gt_assignment[n] = k
+ #overlaps[n, k] = overlap
+ return gt_assignment, max_overlaps