code: def bbox_overlaps(boxes, query_boxes):
      
      n_ = boxes.shape[0]
      k_ = query_boxes.shape[0]
      overlaps = np.zeros((n_, k_), dtype=np.float)
      for k in range(k_):
          query_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:
                      box_area = (boxes[n, 2] - boxes[n, 0] + 1) * (boxes[n, 3] - boxes[n, 1] + 1)
                      all_area = float(box_area + query_box_area - iw * ih)
                      overlaps[n, k] = iw * ih / all_area
      return overlaps
docs: determine overlaps between boxes and query_boxes
      :param boxes: n * 4 bounding boxes
      :param query_boxes: k * 4 bounding boxes
      :return: overlaps: n * k overlaps