def calculate_multiple_iou(box_a, box_b): """ Args: box_a: numpy.ndarray(dtype=np.int, shape=(num_a, 4)) x0y0x1y1 convention. box_b: numpy.ndarray(dtype=np.int, shape=(num_b, 4)) x0y0x1y1 convention. Returns: ious: numpy.ndarray(dtype=np.int, shape(num_a, num_b)) """ num_a = box_a.shape[0] num_b = box_b.shape[0] check_box_convention(box_a, 'x0y0x1y1') check_box_convention(box_b, 'x0y0x1y1') # num_a x 4 -> num_a x num_b x 4 box_a = np.tile(box_a, num_b) box_a = np.expand_dims(box_a, axis=1).reshape((num_a, num_b, -1)) # num_b x 4 -> num_b x num_a x 4 box_b = np.tile(box_b, num_a) box_b = np.expand_dims(box_b, axis=1).reshape((num_b, num_a, -1)) # num_b x num_a x 4 -> num_a x num_b x 4 box_b = np.transpose(box_b, (1, 0, 2)) # num_a x num_b min_x = np.maximum(box_a[:, :, 0], box_b[:, :, 0]) min_y = np.maximum(box_a[:, :, 1], box_b[:, :, 1]) max_x = np.minimum(box_a[:, :, 2], box_b[:, :, 2]) max_y = np.minimum(box_a[:, :, 3], box_b[:, :, 3]) # num_a x num_b area_intersect = (np.maximum(0, max_x - min_x + 1) * np.maximum(0, max_y - min_y + 1)) area_a = ((box_a[:, :, 2] - box_a[:, :, 0] + 1) * (box_a[:, :, 3] - box_a[:, :, 1] + 1)) area_b = ((box_b[:, :, 2] - box_b[:, :, 0] + 1) * (box_b[:, :, 3] - box_b[:, :, 1] + 1)) denominator = area_a + area_b - area_intersect degenerate_indices = np.where(denominator <= 0) denominator[degenerate_indices] = 1 ious = area_intersect / denominator ious[degenerate_indices] = 0 return ious
def resize_bbox(box, image_size, resize_size): """ Args: box: iterable (ints) of length 4 (x0, y0, x1, y1) image_size: iterable (ints) of length 2 (width, height) resize_size: iterable (ints) of length 2 (width, height) Returns: new_box: iterable (ints) of length 4 (x0, y0, x1, y1) """ check_box_convention(np.array(box), 'x0y0x1y1') box_x0, box_y0, box_x1, box_y1 = map(float, box) image_w, image_h = map(float, image_size) new_image_w, new_image_h = map(float, resize_size) newbox_x0 = box_x0 * new_image_w / image_w newbox_y0 = box_y0 * new_image_h / image_h newbox_x1 = box_x1 * new_image_w / image_w newbox_y1 = box_y1 * new_image_h / image_h return int(newbox_x0), int(newbox_y0), int(newbox_x1), int(newbox_y1)