def test_with_no_scores_field(self): box_mask_list = np_box_mask_list.BoxMaskList( box_data=self.boxes1, mask_data=self.masks1) max_output_size = 3 iou_threshold = 0.5 with self.assertRaises(ValueError): np_box_mask_list_ops.non_max_suppression( box_mask_list, max_output_size, iou_threshold)
def _get_overlaps_and_scores_mask_mode(self, detected_boxes, detected_scores, detected_masks, groundtruth_boxes, groundtruth_masks, groundtruth_is_group_of_list): """Computes overlaps and scores between detected and groudntruth masks. Args: detected_boxes: A numpy array of shape [N, 4] representing detected box coordinates detected_scores: A 1-d numpy array of length N representing classification score detected_masks: A uint8 numpy array of shape [N, height, width]. If not None, the scores will be computed based on masks. groundtruth_boxes: A numpy array of shape [M, 4] representing ground truth box coordinates groundtruth_masks: A uint8 numpy array of shape [M, height, width]. groundtruth_is_group_of_list: A boolean numpy array of length M denoting whether a ground truth box has group-of tag. If a groundtruth box is group-of box, every detection matching this box is ignored. Returns: iou: A float numpy array of size [num_detected_boxes, num_gt_boxes]. If gt_non_group_of_boxlist.num_boxes() == 0 it will be None. ioa: A float numpy array of size [num_detected_boxes, num_gt_boxes]. If gt_group_of_boxlist.num_boxes() == 0 it will be None. scores: The score of the detected boxlist. num_boxes: Number of non-maximum suppressed detected boxes. """ #print('len(detected_boxes)',len(detected_boxes)) detected_boxlist = np_box_mask_list.BoxMaskList( box_data=detected_boxes, mask_data=detected_masks) detected_boxlist.add_field('scores', detected_scores) #print('detected_boxlist.num_boxes()',detected_boxlist.num_boxes()) detected_boxlist = np_box_mask_list_ops.non_max_suppression( detected_boxlist, self.nms_max_output_boxes, self.nms_iou_threshold) #print('sfter nms',detected_boxlist.num_boxes()) gt_non_group_of_boxlist = np_box_mask_list.BoxMaskList( box_data=groundtruth_boxes[~groundtruth_is_group_of_list], mask_data=groundtruth_masks[~groundtruth_is_group_of_list]) gt_group_of_boxlist = np_box_mask_list.BoxMaskList( box_data=groundtruth_boxes[groundtruth_is_group_of_list], mask_data=groundtruth_masks[groundtruth_is_group_of_list]) iou = np_box_mask_list_ops.iou(detected_boxlist, gt_non_group_of_boxlist) ioa = np.transpose( np_box_mask_list_ops.ioa(gt_group_of_boxlist, detected_boxlist)) scores = detected_boxlist.get_field('scores') num_boxes = detected_boxlist.num_boxes() return iou, ioa, scores, num_boxes
def test_nms_disabled_max_output_size_equals_one(self): box_mask_list = np_box_mask_list.BoxMaskList(box_data=self.boxes2, mask_data=self.masks2) box_mask_list.add_field('scores', np.array([.9, .75, .6], dtype=float)) max_output_size = 1 iou_threshold = 1. # No NMS expected_boxes = np.array([[3.0, 4.0, 6.0, 8.0]], dtype=float) expected_masks = np.array([[[0, 1, 0], [1, 1, 1], [0, 0, 0]]], dtype=np.uint8) nms_box_mask_list = np_box_mask_list_ops.non_max_suppression( box_mask_list, max_output_size, iou_threshold) self.assertAllClose(nms_box_mask_list.get(), expected_boxes) self.assertAllClose(nms_box_mask_list.get_masks(), expected_masks)
def test_nms_disabled_max_output_size_equals_one(self): box_mask_list = np_box_mask_list.BoxMaskList( box_data=self.boxes2, mask_data=self.masks2) box_mask_list.add_field('scores', np.array([.9, .75, .6], dtype=float)) max_output_size = 1 iou_threshold = 1. # No NMS expected_boxes = np.array([[3.0, 4.0, 6.0, 8.0]], dtype=float) expected_masks = np.array( [[[0, 1, 0], [1, 1, 1], [0, 0, 0]]], dtype=np.uint8) nms_box_mask_list = np_box_mask_list_ops.non_max_suppression( box_mask_list, max_output_size, iou_threshold) self.assertAllClose(nms_box_mask_list.get(), expected_boxes) self.assertAllClose(nms_box_mask_list.get_masks(), expected_masks)
def _get_overlaps_and_scores_mask_mode( self, detected_boxes, detected_scores, detected_masks, groundtruth_boxes, groundtruth_masks, groundtruth_is_group_of_list): """Computes overlaps and scores between detected and groudntruth masks. Args: detected_boxes: A numpy array of shape [N, 4] representing detected box coordinates detected_scores: A 1-d numpy array of length N representing classification score detected_masks: A uint8 numpy array of shape [N, height, width]. If not None, the scores will be computed based on masks. groundtruth_boxes: A numpy array of shape [M, 4] representing ground truth box coordinates groundtruth_masks: A uint8 numpy array of shape [M, height, width]. groundtruth_is_group_of_list: A boolean numpy array of length M denoting whether a ground truth box has group-of tag. If a groundtruth box is group-of box, every detection matching this box is ignored. Returns: iou: A float numpy array of size [num_detected_boxes, num_gt_boxes]. If gt_non_group_of_boxlist.num_boxes() == 0 it will be None. ioa: A float numpy array of size [num_detected_boxes, num_gt_boxes]. If gt_group_of_boxlist.num_boxes() == 0 it will be None. scores: The score of the detected boxlist. num_boxes: Number of non-maximum suppressed detected boxes. """ detected_boxlist = np_box_mask_list.BoxMaskList( box_data=detected_boxes, mask_data=detected_masks) detected_boxlist.add_field('scores', detected_scores) detected_boxlist = np_box_mask_list_ops.non_max_suppression( detected_boxlist, self.nms_max_output_boxes, self.nms_iou_threshold) gt_non_group_of_boxlist = np_box_mask_list.BoxMaskList( box_data=groundtruth_boxes[~groundtruth_is_group_of_list], mask_data=groundtruth_masks[~groundtruth_is_group_of_list]) gt_group_of_boxlist = np_box_mask_list.BoxMaskList( box_data=groundtruth_boxes[groundtruth_is_group_of_list], mask_data=groundtruth_masks[groundtruth_is_group_of_list]) iou = np_box_mask_list_ops.iou(detected_boxlist, gt_non_group_of_boxlist) ioa = np.transpose( np_box_mask_list_ops.ioa(gt_group_of_boxlist, detected_boxlist)) scores = detected_boxlist.get_field('scores') num_boxes = detected_boxlist.num_boxes() return iou, ioa, scores, num_boxes