def test_different_iou_threshold(self):
        boxes = np.array([[0, 0, 20, 100], [0, 0, 20, 80],
                          [200, 200, 210, 300], [200, 200, 210, 250]],
                         dtype=float)
        boxlist = np_box_list.BoxList(boxes)
        boxlist.add_field('scores', np.array([0.9, 0.8, 0.7, 0.6]))
        max_output_size = 4

        iou_threshold = .4
        expected_boxes = np.array([
            [0, 0, 20, 100],
            [200, 200, 210, 300],
        ],
                                  dtype=float)
        nms_boxlist = np_box_list_ops.non_max_suppression(
            boxlist, max_output_size, iou_threshold)
        self.assertAllClose(nms_boxlist.get(), expected_boxes)

        iou_threshold = .5
        expected_boxes = np.array(
            [[0, 0, 20, 100], [200, 200, 210, 300], [200, 200, 210, 250]],
            dtype=float)
        nms_boxlist = np_box_list_ops.non_max_suppression(
            boxlist, max_output_size, iou_threshold)
        self.assertAllClose(nms_boxlist.get(), expected_boxes)

        iou_threshold = .8
        expected_boxes = np.array([[0, 0, 20, 100], [0, 0, 20, 80],
                                   [200, 200, 210, 300], [200, 200, 210, 250]],
                                  dtype=float)
        nms_boxlist = np_box_list_ops.non_max_suppression(
            boxlist, max_output_size, iou_threshold)
        self.assertAllClose(nms_boxlist.get(), expected_boxes)
    def test_with_no_scores_field(self):
        boxlist = np_box_list.BoxList(self._boxes)
        max_output_size = 3
        iou_threshold = 0.5

        with self.assertRaises(ValueError):
            np_box_list_ops.non_max_suppression(boxlist, max_output_size,
                                                iou_threshold)
Пример #3
0
    def _compute_tp_fp_for_single_class(self, detected_boxes, detected_scores,
                                        groundtruth_boxes,
                                        groundtruth_is_difficult_list):
        """Labels boxes detected with the same class from the same image as tp/fp.

        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
          groundtruth_boxes: A numpy array of shape [M, 4] representing ground truth
              box coordinates
          groundtruth_is_difficult_list: A boolean numpy array of length M denoting
              whether a ground truth box is a difficult instance or not

        Returns:
          scores: A numpy array representing the detection scores
          tp_fp_labels: a boolean numpy array indicating whether a detection is a
          true positive.

        """
        if groundtruth_boxes.size == 0:
            is_gt_box_detected = np.array([], dtype=bool)
        else:
            is_gt_box_detected = np.zeros(groundtruth_boxes.shape[0],
                                          dtype=bool)

        if detected_boxes.size == 0:
            return np.array([], dtype=float), np.array(
                [], dtype=bool), is_gt_box_detected
        detected_boxlist = np_box_list.BoxList(detected_boxes)
        detected_boxlist.add_field('scores', detected_scores)
        detected_boxlist = np_box_list_ops.non_max_suppression(
            detected_boxlist, self.nms_max_output_boxes,
            self.nms_iou_threshold)

        scores = detected_boxlist.get_field('scores')

        if groundtruth_boxes.size == 0:
            return scores, np.zeros(detected_boxlist.num_boxes(),
                                    dtype=bool), is_gt_box_detected
        gt_boxlist = np_box_list.BoxList(groundtruth_boxes)

        iou = np_box_list_ops.iou(detected_boxlist, gt_boxlist)
        max_overlap_gt_ids = np.argmax(iou, axis=1)
        tp_fp_labels = np.zeros(detected_boxlist.num_boxes(), dtype=bool)
        is_matched_to_difficult_box = np.zeros(detected_boxlist.num_boxes(),
                                               dtype=bool)
        for i in range(detected_boxlist.num_boxes()):
            gt_id = max_overlap_gt_ids[i]
            if iou[i, gt_id] >= self.matching_iou_threshold:
                if not groundtruth_is_difficult_list[gt_id]:
                    if not is_gt_box_detected[gt_id]:
                        tp_fp_labels[i] = True
                        is_gt_box_detected[gt_id] = True
                else:
                    is_matched_to_difficult_box[i] = True
        return scores[~is_matched_to_difficult_box], tp_fp_labels[
            ~is_matched_to_difficult_box], is_gt_box_detected
 def test_select_from_ten_indentical_boxes(self):
     boxes = np.array(10 * [[0, 0, 1, 1]], dtype=float)
     boxlist = np_box_list.BoxList(boxes)
     boxlist.add_field('scores', np.array(10 * [0.8]))
     iou_threshold = .5
     max_output_size = 3
     expected_boxes = np.array([[0, 0, 1, 1]], dtype=float)
     nms_boxlist = np_box_list_ops.non_max_suppression(
         boxlist, max_output_size, iou_threshold)
     self.assertAllClose(nms_boxlist.get(), expected_boxes)
    def test_select_at_most_two_from_three_clusters(self):
        boxlist = np_box_list.BoxList(self._boxes)
        boxlist.add_field('scores',
                          np.array([.9, .75, .6, .95, .5, .3], dtype=float))
        max_output_size = 2
        iou_threshold = 0.5

        expected_boxes = np.array([[0, 10, 1, 11], [0, 0, 1, 1]], dtype=float)
        nms_boxlist = np_box_list_ops.non_max_suppression(
            boxlist, max_output_size, iou_threshold)
        self.assertAllClose(nms_boxlist.get(), expected_boxes)
    def test_nms_disabled_max_output_size_equals_three(self):
        boxlist = np_box_list.BoxList(self._boxes)
        boxlist.add_field('scores',
                          np.array([.9, .75, .6, .95, .2, .3], dtype=float))
        max_output_size = 3
        iou_threshold = 1.  # No NMS

        expected_boxes = np.array(
            [[0, 10, 1, 11], [0, 0, 1, 1], [0, 0.1, 1, 1.1]], dtype=float)
        nms_boxlist = np_box_list_ops.non_max_suppression(
            boxlist, max_output_size, iou_threshold)
        self.assertAllClose(nms_boxlist.get(), expected_boxes)
    def _get_overlaps_and_scores_box_mode(self, detected_boxes,
                                          detected_scores, groundtruth_boxes,
                                          groundtruth_is_group_of_list):
        """Computes overlaps and scores between detected and groudntruth boxes.

    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
      groundtruth_boxes: A numpy array of shape [M, 4] representing ground truth
          box coordinates
      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_list.BoxList(detected_boxes)
        detected_boxlist.add_field('scores', detected_scores)
        detected_boxlist = np_box_list_ops.non_max_suppression(
            detected_boxlist, self.nms_max_output_boxes,
            self.nms_iou_threshold)
        gt_non_group_of_boxlist = np_box_list.BoxList(
            groundtruth_boxes[~groundtruth_is_group_of_list])
        gt_group_of_boxlist = np_box_list.BoxList(
            groundtruth_boxes[groundtruth_is_group_of_list])
        iou = np_box_list_ops.iou(detected_boxlist, gt_non_group_of_boxlist)
        ioa = np.transpose(
            np_box_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