Ejemplo n.º 1
0
 def setUp(self):
     boxes = np.array([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0],
                       [0.0, 0.0, 20.0, 20.0]],
                      dtype=float)
     masks = np.zeros([3, 3, 3], dtype=np.uint8)
     self.box_mask_list = np_box_mask_list.BoxMaskList(box_data=boxes,
                                                       mask_data=masks)
Ejemplo n.º 2
0
 def test_num_boxes(self):
     boxes = np.array([[0., 0., 100., 100.], [10., 30., 50., 70.]],
                      dtype=float)
     masks = np.zeros([2, 5, 5], dtype=np.uint8)
     box_mask_list = np_box_mask_list.BoxMaskList(box_data=boxes,
                                                  mask_data=masks)
     expected_num_boxes = 2
     self.assertEqual(box_mask_list.num_boxes(), expected_num_boxes)
Ejemplo n.º 3
0
 def test_get_field_with_existed_field(self):
     boxes = np.array([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0],
                       [0.0, 0.0, 20.0, 20.0]],
                      dtype=float)
     masks = np.zeros([3, 3, 3], dtype=np.uint8)
     box_mask_list = np_box_mask_list.BoxMaskList(box_data=boxes,
                                                  mask_data=masks)
     self.assertTrue(np.allclose(box_mask_list.get_field('boxes'), boxes))
     self.assertTrue(np.allclose(box_mask_list.get_field('masks'), masks))
Ejemplo n.º 4
0
 def test_has_field_with_nonexisted_field(self):
     boxes = np.array([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0],
                       [0.0, 0.0, 20.0, 20.0]],
                      dtype=float)
     box_mask_list = np_box_mask_list.BoxMaskList(box_data=boxes,
                                                  mask_data=np.zeros(
                                                      [3, 3, 3],
                                                      dtype=np.uint8))
     self.assertFalse(box_mask_list.has_field('scores'))
Ejemplo n.º 5
0
 def test_get_field_with_nonexited_field(self):
     boxes = np.array([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0],
                       [0.0, 0.0, 20.0, 20.0]],
                      dtype=float)
     masks = np.zeros([3, 3, 3], dtype=np.uint8)
     box_mask_list = np_box_mask_list.BoxMaskList(box_data=boxes,
                                                  mask_data=masks)
     with self.assertRaises(ValueError):
         box_mask_list.get_field('scores')
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
 def setUp(self):
     boxes1 = np.array([[4.0, 3.0, 7.0, 5.0], [5.0, 6.0, 10.0, 7.0]],
                       dtype=float)
     masks1_0 = np.array(
         [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 0, 0, 0, 0],
          [1, 1, 1, 1, 0, 0, 0, 0]],
         dtype=np.uint8)
     masks1_1 = np.array(
         [[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0, 0]],
         dtype=np.uint8)
     masks1 = np.stack([masks1_0, masks1_1])
     boxes2 = np.array([[3.0, 4.0, 6.0, 8.0], [14.0, 14.0, 15.0, 15.0],
                        [0.0, 0.0, 20.0, 20.0]],
                       dtype=float)
     masks2_0 = np.array(
         [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 0, 0, 0, 0],
          [1, 1, 1, 1, 0, 0, 0, 0]],
         dtype=np.uint8)
     masks2_1 = np.array(
         [[1, 1, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 0, 0, 0],
          [1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0, 0, 0, 0]],
         dtype=np.uint8)
     masks2_2 = np.array(
         [[1, 1, 1, 1, 1, 0, 0, 0], [1, 1, 1, 1, 1, 0, 0, 0],
          [1, 1, 1, 1, 1, 0, 0, 0], [1, 1, 1, 1, 1, 0, 0, 0],
          [1, 1, 1, 1, 1, 0, 0, 0]],
         dtype=np.uint8)
     masks2 = np.stack([masks2_0, masks2_1, masks2_2])
     self.box_mask_list1 = np_box_mask_list.BoxMaskList(box_data=boxes1,
                                                        mask_data=masks1)
     self.box_mask_list2 = np_box_mask_list.BoxMaskList(box_data=boxes2,
                                                        mask_data=masks2)
Ejemplo n.º 9
0
    def test_invalid_box_mask_data(self):
        with self.assertRaises(ValueError):
            np_box_mask_list.BoxMaskList(box_data=[0, 0, 1, 1],
                                         mask_data=np.zeros([1, 3, 3],
                                                            dtype=np.uint8))

        with self.assertRaises(ValueError):
            np_box_mask_list.BoxMaskList(box_data=np.array([[0, 0, 1, 1]],
                                                           dtype=int),
                                         mask_data=np.zeros([1, 3, 3],
                                                            dtype=np.uint8))

        with self.assertRaises(ValueError):
            np_box_mask_list.BoxMaskList(box_data=np.array([0, 1, 1, 3, 4],
                                                           dtype=float),
                                         mask_data=np.zeros([1, 3, 3],
                                                            dtype=np.uint8))

        with self.assertRaises(ValueError):
            np_box_mask_list.BoxMaskList(box_data=np.array(
                [[0, 1, 1, 3], [3, 1, 1, 5]], dtype=float),
                                         mask_data=np.zeros([2, 3, 3],
                                                            dtype=np.uint8))

        with self.assertRaises(ValueError):
            np_box_mask_list.BoxMaskList(box_data=np.array(
                [[0, 1, 1, 3], [1, 1, 1, 5]], dtype=float),
                                         mask_data=np.zeros([3, 5, 5],
                                                            dtype=np.uint8))

        with self.assertRaises(ValueError):
            np_box_mask_list.BoxMaskList(box_data=np.array(
                [[0, 1, 1, 3], [1, 1, 1, 5]], dtype=float),
                                         mask_data=np.zeros([2, 5],
                                                            dtype=np.uint8))

        with self.assertRaises(ValueError):
            np_box_mask_list.BoxMaskList(box_data=np.array(
                [[0, 1, 1, 3], [1, 1, 1, 5]], dtype=float),
                                         mask_data=np.zeros([2, 5, 5, 5],
                                                            dtype=np.uint8))

        with self.assertRaises(ValueError):
            np_box_mask_list.BoxMaskList(box_data=np.array(
                [[0, 1, 1, 3], [1, 1, 1, 5]], dtype=float),
                                         mask_data=np.zeros([2, 5, 5],
                                                            dtype=np.int32))
Ejemplo n.º 10
0
    def test_multiclass_nms(self):
        boxes = np.array(
            [[0.2, 0.4, 0.8, 0.8], [0.4, 0.2, 0.8, 0.8], [0.6, 0.0, 1.0, 1.0]],
            dtype=np.float32)
        mask0 = np.array([[0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 1, 1, 0],
                          [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]],
                         dtype=np.uint8)
        mask1 = np.array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0],
                          [0, 1, 1, 1, 0], [0, 0, 0, 0, 0]],
                         dtype=np.uint8)
        mask2 = np.array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0],
                          [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]],
                         dtype=np.uint8)
        masks = np.stack([mask0, mask1, mask2])
        box_mask_list = np_box_mask_list.BoxMaskList(box_data=boxes,
                                                     mask_data=masks)
        scores = np.array(
            [[-0.2, 0.1, 0.5, -0.4, 0.3], [0.7, -0.7, 0.6, 0.2, -0.9],
             [0.4, 0.34, -0.9, 0.2, 0.31]],
            dtype=np.float32)
        box_mask_list.add_field('scores', scores)
        box_mask_list_clean = np_box_mask_list_ops.multi_class_non_max_suppression(
            box_mask_list,
            score_thresh=0.25,
            iou_thresh=0.1,
            max_output_size=3)

        scores_clean = box_mask_list_clean.get_field('scores')
        classes_clean = box_mask_list_clean.get_field('classes')
        boxes = box_mask_list_clean.get()
        masks = box_mask_list_clean.get_masks()
        expected_scores = np.array([0.7, 0.6, 0.34, 0.31])
        expected_classes = np.array([0, 2, 1, 4])
        expected_boxes = np.array([[0.4, 0.2, 0.8, 0.8], [0.4, 0.2, 0.8, 0.8],
                                   [0.6, 0.0, 1.0, 1.0], [0.6, 0.0, 1.0, 1.0]],
                                  dtype=np.float32)
        self.assertAllClose(scores_clean, expected_scores)
        self.assertAllClose(classes_clean, expected_classes)
        self.assertAllClose(boxes, expected_boxes)
Ejemplo n.º 11
0
def box_list_to_box_mask_list(boxlist):
    """Converts a BoxList containing 'masks' into a BoxMaskList.

  Args:
    boxlist: An np_box_list.BoxList object.

  Returns:
    An np_box_mask_list.BoxMaskList object.

  Raises:
    ValueError: If boxlist does not contain `masks` as a field.
  """
    if not boxlist.has_field('masks'):
        raise ValueError('boxlist does not contain mask field.')
    box_mask_list = np_box_mask_list.BoxMaskList(
        box_data=boxlist.get(),
        mask_data=boxlist.get_field('masks'))
    extra_fields = boxlist.get_extra_fields()
    for key in extra_fields:
        if key != 'masks':
            box_mask_list.data[key] = boxlist.get_field(key)
    return box_mask_list
Ejemplo n.º 12
0
def multi_class_non_max_suppression(box_mask_list, score_thresh, iou_thresh,
                                    max_output_size):
    """Multi-class version of non maximum suppression.

  This op greedily selects a subset of detection bounding boxes, pruning
  away boxes that have high IOU (intersection over union) overlap (> thresh)
  with already selected boxes.  It operates independently for each class for
  which scores are provided (via the scores field of the input box_list),
  pruning boxes with score less than a provided threshold prior to
  applying NMS.

  Args:
    box_mask_list: np_box_mask_list.BoxMaskList holding N boxes.  Must contain a
      'scores' field representing detection scores.  This scores field is a
      tensor that can be 1 dimensional (in the case of a single class) or
      2-dimensional, in which case we assume that it takes the
      shape [num_boxes, num_classes]. We further assume that this rank is known
      statically and that scores.shape[1] is also known (i.e., the number of
      classes is fixed and known at graph construction time).
    score_thresh: scalar threshold for score (low scoring boxes are removed).
    iou_thresh: scalar threshold for IOU (boxes that that high IOU overlap
      with previously selected boxes are removed).
    max_output_size: maximum number of retained boxes per class.

  Returns:
    a box_mask_list holding M boxes with a rank-1 scores field representing
      corresponding scores for each box with scores sorted in decreasing order
      and a rank-1 classes field representing a class label for each box.
  Raises:
    ValueError: if iou_thresh is not in [0, 1] or if input box_mask_list does
      not have a valid scores field.
  """
    if not 0 <= iou_thresh <= 1.0:
        raise ValueError('thresh must be between 0 and 1')
    if not isinstance(box_mask_list, np_box_mask_list.BoxMaskList):
        raise ValueError('box_mask_list must be a box_mask_list')
    if not box_mask_list.has_field('scores'):
        raise ValueError('input box_mask_list must have \'scores\' field')
    scores = box_mask_list.get_field('scores')
    if len(scores.shape) == 1:
        scores = np.reshape(scores, [-1, 1])
    elif len(scores.shape) == 2:
        if scores.shape[1] is None:
            raise ValueError('scores field must have statically defined second '
                             'dimension')
    else:
        raise ValueError('scores field must be of rank 1 or 2')

    num_boxes = box_mask_list.num_boxes()
    num_scores = scores.shape[0]
    num_classes = scores.shape[1]

    if num_boxes != num_scores:
        raise ValueError('Incorrect scores field length: actual vs expected.')

    selected_boxes_list = []
    for class_idx in range(num_classes):
        box_mask_list_and_class_scores = np_box_mask_list.BoxMaskList(
            box_data=box_mask_list.get(),
            mask_data=box_mask_list.get_masks())
        class_scores = np.reshape(scores[0:num_scores, class_idx], [-1])
        box_mask_list_and_class_scores.add_field('scores', class_scores)
        box_mask_list_filt = filter_scores_greater_than(
            box_mask_list_and_class_scores, score_thresh)
        nms_result = non_max_suppression(
            box_mask_list_filt,
            max_output_size=max_output_size,
            iou_threshold=iou_thresh,
            score_threshold=score_thresh)
        nms_result.add_field(
            'classes',
            np.zeros_like(nms_result.get_field('scores')) + class_idx)
        selected_boxes_list.append(nms_result)
    selected_boxes = np_box_list_ops.concatenate(selected_boxes_list)
    sorted_boxes = np_box_list_ops.sort_by_field(selected_boxes, 'scores')
    return box_list_to_box_mask_list(boxlist=sorted_boxes)