Beispiel #1
0
 def test_unequal_static_shape_along_first_dim_raises_exception(self):
     shape_a = tf.constant(np.zeros([4, 2, 2, 1]))
     shape_b = tf.constant(np.zeros([6, 2, 3, 1]))
     with self.assertRaisesRegex(ValueError, 'Unequal first dimension'):
         shape_utils.assert_shape_equal_along_first_dimension(
             shape_utils.combined_static_and_dynamic_shape(shape_a),
             shape_utils.combined_static_and_dynamic_shape(shape_b))
Beispiel #2
0
 def graph_fn():
   shape_a = tf.constant(np.zeros([4, 2, 2, 1]))
   shape_b = tf.constant(np.zeros([4, 7, 2]))
   shape_utils.assert_shape_equal_along_first_dimension(
       shape_utils.combined_static_and_dynamic_shape(shape_a),
       shape_utils.combined_static_and_dynamic_shape(shape_b))
   return tf.constant(0)
Beispiel #3
0
 def test_unequal_static_shape_along_first_dim_raises_exception(self):
   shape_a = tf.constant(np.zeros([4, 2, 2, 1]))
   shape_b = tf.constant(np.zeros([6, 2, 3, 1]))
   with self.assertRaisesRegexp(
       ValueError, 'Unequal first dimension'):
     shape_utils.assert_shape_equal_along_first_dimension(
         shape_utils.combined_static_and_dynamic_shape(shape_a),
         shape_utils.combined_static_and_dynamic_shape(shape_b))
 def test_equal_static_shape_along_first_dim_succeeds(self):
   shape_a = tf.constant(np.zeros([4, 2, 2, 1]))
   shape_b = tf.constant(np.zeros([4, 7, 2]))
   with self.test_session() as sess:
     op = shape_utils.assert_shape_equal_along_first_dimension(
         shape_utils.combined_static_and_dynamic_shape(shape_a),
         shape_utils.combined_static_and_dynamic_shape(shape_b))
     sess.run(op)
 def test_equal_dynamic_shape_along_first_dim_succeeds(self):
   tensor_a = tf.placeholder(tf.float32, shape=[None, None, None, 3])
   tensor_b = tf.placeholder(tf.float32, shape=[None])
   op = shape_utils.assert_shape_equal_along_first_dimension(
       shape_utils.combined_static_and_dynamic_shape(tensor_a),
       shape_utils.combined_static_and_dynamic_shape(tensor_b))
   with self.test_session() as sess:
     sess.run(op, feed_dict={tensor_a: np.zeros([5, 2, 2, 3]),
                             tensor_b: np.zeros([5])})
 def test_unequal_dynamic_shape_along_first_dim_raises_tf_assert(self):
   tensor_a = tf.placeholder(tf.float32, shape=[None, None, None, 3])
   tensor_b = tf.placeholder(tf.float32, shape=[None, None, 3])
   op = shape_utils.assert_shape_equal_along_first_dimension(
       shape_utils.combined_static_and_dynamic_shape(tensor_a),
       shape_utils.combined_static_and_dynamic_shape(tensor_b))
   with self.test_session() as sess:
     with self.assertRaises(tf.errors.InvalidArgumentError):
       sess.run(op, feed_dict={tensor_a: np.zeros([1, 2, 2, 3]),
                               tensor_b: np.zeros([2, 4, 3])})
def merge_boxes_with_multiple_labels(boxes,
                                     classes,
                                     confidences,
                                     num_classes,
                                     quantization_bins=10000):
    """Merges boxes with same coordinates and returns K-hot encoded classes.

  Args:
    boxes: A tf.float32 tensor with shape [N, 4] holding N boxes. Only
      normalized coordinates are allowed.
    classes: A tf.int32 tensor with shape [N] holding class indices.
      The class index starts at 0.
    confidences: A tf.float32 tensor with shape [N] holding class confidences.
    num_classes: total number of classes to use for K-hot encoding.
    quantization_bins: the number of bins used to quantize the box coordinate.

  Returns:
    merged_boxes: A tf.float32 tensor with shape [N', 4] holding boxes,
      where N' <= N.
    class_encodings: A tf.int32 tensor with shape [N', num_classes] holding
      K-hot encodings for the merged boxes.
    confidence_encodings: A tf.float32 tensor with shape [N', num_classes]
      holding encodings of confidences for the merged boxes.
    merged_box_indices: A tf.int32 tensor with shape [N'] holding original
      indices of the boxes.
  """
    boxes_shape = tf.shape(boxes)
    classes_shape = tf.shape(classes)
    confidences_shape = tf.shape(confidences)
    box_class_shape_assert = shape_utils.assert_shape_equal_along_first_dimension(
        boxes_shape, classes_shape)
    box_confidence_shape_assert = (
        shape_utils.assert_shape_equal_along_first_dimension(
            boxes_shape, confidences_shape))
    box_dimension_assert = tf.assert_equal(boxes_shape[1], 4)
    box_normalized_assert = shape_utils.assert_box_normalized(boxes)

    with tf.control_dependencies([
            box_class_shape_assert, box_confidence_shape_assert,
            box_dimension_assert, box_normalized_assert
    ]):
        quantized_boxes = tf.to_int64(boxes * (quantization_bins - 1))
        ymin, xmin, ymax, xmax = tf.unstack(quantized_boxes, axis=1)
        hashcodes = (
            ymin + xmin * quantization_bins +
            ymax * quantization_bins * quantization_bins +
            xmax * quantization_bins * quantization_bins * quantization_bins)
        unique_hashcodes, unique_indices = tf.unique(hashcodes)
        num_boxes = tf.shape(boxes)[0]
        num_unique_boxes = tf.shape(unique_hashcodes)[0]
        merged_box_indices = tf.unsorted_segment_min(tf.range(num_boxes),
                                                     unique_indices,
                                                     num_unique_boxes)
        merged_boxes = tf.gather(boxes, merged_box_indices)

        def map_box_encodings(i):
            """Produces box K-hot and score encodings for each class index."""
            box_mask = tf.equal(unique_indices,
                                i * tf.ones(num_boxes, dtype=tf.int32))
            box_mask = tf.reshape(box_mask, [-1])
            box_indices = tf.boolean_mask(classes, box_mask)
            box_confidences = tf.boolean_mask(confidences, box_mask)
            box_class_encodings = tf.sparse_to_dense(box_indices,
                                                     [num_classes],
                                                     1,
                                                     validate_indices=False)
            box_confidence_encodings = tf.sparse_to_dense(
                box_indices, [num_classes],
                box_confidences,
                validate_indices=False)
            return box_class_encodings, box_confidence_encodings

        class_encodings, confidence_encodings = tf.map_fn(
            map_box_encodings,
            tf.range(num_unique_boxes),
            back_prop=False,
            dtype=(tf.int32, tf.float32))

        merged_boxes = tf.reshape(merged_boxes, [-1, 4])
        class_encodings = tf.reshape(class_encodings, [-1, num_classes])
        confidence_encodings = tf.reshape(confidence_encodings,
                                          [-1, num_classes])
        merged_box_indices = tf.reshape(merged_box_indices, [-1])
        return (merged_boxes, class_encodings, confidence_encodings,
                merged_box_indices)
Beispiel #8
0
def merge_boxes_with_multiple_labels(boxes,
                                     classes,
                                     confidences,
                                     num_classes,
                                     quantization_bins=10000):
  """Merges boxes with same coordinates and returns K-hot encoded classes.

  Args:
    boxes: A tf.float32 tensor with shape [N, 4] holding N boxes. Only
      normalized coordinates are allowed.
    classes: A tf.int32 tensor with shape [N] holding class indices.
      The class index starts at 0.
    confidences: A tf.float32 tensor with shape [N] holding class confidences.
    num_classes: total number of classes to use for K-hot encoding.
    quantization_bins: the number of bins used to quantize the box coordinate.

  Returns:
    merged_boxes: A tf.float32 tensor with shape [N', 4] holding boxes,
      where N' <= N.
    class_encodings: A tf.int32 tensor with shape [N', num_classes] holding
      K-hot encodings for the merged boxes.
    confidence_encodings: A tf.float32 tensor with shape [N', num_classes]
      holding encodings of confidences for the merged boxes.
    merged_box_indices: A tf.int32 tensor with shape [N'] holding original
      indices of the boxes.
  """
  boxes_shape = tf.shape(boxes)
  classes_shape = tf.shape(classes)
  confidences_shape = tf.shape(confidences)
  box_class_shape_assert = shape_utils.assert_shape_equal_along_first_dimension(
      boxes_shape, classes_shape)
  box_confidence_shape_assert = (
      shape_utils.assert_shape_equal_along_first_dimension(
          boxes_shape, confidences_shape))
  box_dimension_assert = tf.assert_equal(boxes_shape[1], 4)
  box_normalized_assert = shape_utils.assert_box_normalized(boxes)

  with tf.control_dependencies(
      [box_class_shape_assert, box_confidence_shape_assert,
       box_dimension_assert, box_normalized_assert]):
    quantized_boxes = tf.to_int64(boxes * (quantization_bins - 1))
    ymin, xmin, ymax, xmax = tf.unstack(quantized_boxes, axis=1)
    hashcodes = (
        ymin +
        xmin * quantization_bins +
        ymax * quantization_bins * quantization_bins +
        xmax * quantization_bins * quantization_bins * quantization_bins)
    unique_hashcodes, unique_indices = tf.unique(hashcodes)
    num_boxes = tf.shape(boxes)[0]
    num_unique_boxes = tf.shape(unique_hashcodes)[0]
    merged_box_indices = tf.unsorted_segment_min(
        tf.range(num_boxes), unique_indices, num_unique_boxes)
    merged_boxes = tf.gather(boxes, merged_box_indices)

    def map_box_encodings(i):
      """Produces box K-hot and score encodings for each class index."""
      box_mask = tf.equal(
          unique_indices, i * tf.ones(num_boxes, dtype=tf.int32))
      box_mask = tf.reshape(box_mask, [-1])
      box_indices = tf.boolean_mask(classes, box_mask)
      box_confidences = tf.boolean_mask(confidences, box_mask)
      box_class_encodings = tf.sparse_to_dense(
          box_indices, [num_classes], 1, validate_indices=False)
      box_confidence_encodings = tf.sparse_to_dense(
          box_indices, [num_classes], box_confidences, validate_indices=False)
      return box_class_encodings, box_confidence_encodings

    class_encodings, confidence_encodings = tf.map_fn(
        map_box_encodings,
        tf.range(num_unique_boxes),
        back_prop=False,
        dtype=(tf.int32, tf.float32))

    merged_boxes = tf.reshape(merged_boxes, [-1, 4])
    class_encodings = tf.reshape(class_encodings, [-1, num_classes])
    confidence_encodings = tf.reshape(confidence_encodings, [-1, num_classes])
    merged_box_indices = tf.reshape(merged_box_indices, [-1])
    return (merged_boxes, class_encodings, confidence_encodings,
            merged_box_indices)
Beispiel #9
0
 def graph_fn(tensor_a, tensor_b):
   shape_utils.assert_shape_equal_along_first_dimension(
       shape_utils.combined_static_and_dynamic_shape(tensor_a),
       shape_utils.combined_static_and_dynamic_shape(tensor_b))
   return tf.constant(0)