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.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))
Beispiel #2
0
 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)
Beispiel #3
0
 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])
                  })
Beispiel #4
0
 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])
                      })
Beispiel #5
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)