File size: 1,142 Bytes
6d5cf07
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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.float)
    
    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