예제 #1
0
    def testIgnorePositiveExampleLossViaAlphaMultiplier(self):
        prediction_tensor = tf.constant(
            [[[_logit(0.55)], [_logit(0.52)], [_logit(0.50)], [_logit(0.48)],
              [_logit(0.45)]]], tf.float32)
        target_tensor = tf.constant([[[1], [1], [1], [0], [0]]], tf.float32)
        weights = tf.constant([[1, 1, 1, 1, 1]], tf.float32)
        focal_loss_op = losses.SigmoidFocalClassificationLoss(gamma=2.0,
                                                              alpha=0.0)
        sigmoid_loss_op = losses.WeightedSigmoidClassificationLoss()
        focal_loss = tf.reduce_sum(focal_loss_op(prediction_tensor,
                                                 target_tensor,
                                                 weights=weights),
                                   axis=2)
        sigmoid_loss = tf.reduce_sum(sigmoid_loss_op(prediction_tensor,
                                                     target_tensor,
                                                     weights=weights),
                                     axis=2)

        with self.test_session() as sess:
            sigmoid_loss, focal_loss = sess.run([sigmoid_loss, focal_loss])
            self.assertAllClose(focal_loss[0][:3], [0., 0., 0.])
            order_of_ratio = np.power(
                10,
                np.floor(np.log10(sigmoid_loss[0][3:] / focal_loss[0][3:])))
            self.assertAllClose(order_of_ratio, [1., 1.])
예제 #2
0
    def testEasyExamplesProduceSmallLossComparedToSigmoidXEntropy(self):
        prediction_tensor = tf.constant(
            [[[_logit(0.97)], [_logit(0.91)], [_logit(0.73)], [_logit(0.27)],
              [_logit(0.09)], [_logit(0.03)]]], tf.float32)
        target_tensor = tf.constant([[[1], [1], [1], [0], [0], [0]]],
                                    tf.float32)
        weights = tf.constant([[1, 1, 1, 1, 1, 1]], tf.float32)
        focal_loss_op = losses.SigmoidFocalClassificationLoss(gamma=2.0,
                                                              alpha=None)
        sigmoid_loss_op = losses.WeightedSigmoidClassificationLoss()
        focal_loss = tf.reduce_sum(focal_loss_op(prediction_tensor,
                                                 target_tensor,
                                                 weights=weights),
                                   axis=2)
        sigmoid_loss = tf.reduce_sum(sigmoid_loss_op(prediction_tensor,
                                                     target_tensor,
                                                     weights=weights),
                                     axis=2)

        with self.test_session() as sess:
            sigmoid_loss, focal_loss = sess.run([sigmoid_loss, focal_loss])
            order_of_ratio = np.power(
                10, np.floor(np.log10(sigmoid_loss / focal_loss)))
            self.assertAllClose(order_of_ratio,
                                [[1000, 100, 10, 10, 100, 1000]])
예제 #3
0
    def testReturnsCorrectLossWithClassIndices(self):
        prediction_tensor = tf.constant(
            [[[-100, 100, -100, 100], [100, -100, -100, -100],
              [100, 0, -100, 100], [-100, -100, 100, -100]],
             [[-100, 0, 100, 100], [-100, 100, -100, 100],
              [100, 100, 100, 100], [0, 0, -1, 100]]], tf.float32)
        target_tensor = tf.constant(
            [[[0, 1, 0, 0], [1, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 1]],
             [[0, 0, 1, 0], [0, 1, 0, 0], [1, 1, 1, 0], [1, 0, 0, 0]]],
            tf.float32)
        weights = tf.constant([[1, 1, 1, 1], [1, 1, 1, 0]], tf.float32)
        # Ignores the last class.
        class_indices = tf.constant([0, 1, 2], tf.int32)
        loss_op = losses.WeightedSigmoidClassificationLoss()
        loss = loss_op(prediction_tensor,
                       target_tensor,
                       weights=weights,
                       class_indices=class_indices)
        loss = tf.reduce_sum(loss, axis=2)

        exp_loss = np.matrix([[0, 0, -math.log(.5), 0],
                              [-math.log(.5), 0, 0, 0]])
        with self.test_session() as sess:
            loss_output = sess.run(loss)
            self.assertAllClose(loss_output, exp_loss)
예제 #4
0
    def testReturnsCorrectLoss(self):
        prediction_tensor = tf.constant(
            [[[-100, 100, -100], [100, -100, -100], [100, 0, -100],
              [-100, -100, 100]],
             [[-100, 0, 100], [-100, 100, -100], [100, 100, 100], [0, 0, -1]]],
            tf.float32)
        target_tensor = tf.constant(
            [[[0, 1, 0], [1, 0, 0], [1, 0, 0], [0, 0, 1]],
             [[0, 0, 1], [0, 1, 0], [1, 1, 1], [1, 0, 0]]], tf.float32)
        weights = tf.constant([[1, 1, 1, 1], [1, 1, 1, 0]], tf.float32)
        loss_op = losses.WeightedSigmoidClassificationLoss()
        loss = loss_op(prediction_tensor, target_tensor, weights=weights)
        loss = tf.reduce_sum(loss)

        exp_loss = -2 * math.log(.5)
        with self.test_session() as sess:
            loss_output = sess.run(loss)
            self.assertAllClose(loss_output, exp_loss)
예제 #5
0
    def testNonAnchorWiseOutputComparableToSigmoidXEntropy(self):
        prediction_tensor = tf.constant(
            [[[_logit(0.55)], [_logit(0.52)], [_logit(0.50)], [_logit(0.48)],
              [_logit(0.45)]]], tf.float32)
        target_tensor = tf.constant([[[1], [1], [1], [0], [0]]], tf.float32)
        weights = tf.constant([[1, 1, 1, 1, 1]], tf.float32)
        focal_loss_op = losses.SigmoidFocalClassificationLoss(gamma=2.0,
                                                              alpha=None)
        sigmoid_loss_op = losses.WeightedSigmoidClassificationLoss()
        focal_loss = tf.reduce_sum(
            focal_loss_op(prediction_tensor, target_tensor, weights=weights))
        sigmoid_loss = tf.reduce_sum(
            sigmoid_loss_op(prediction_tensor, target_tensor, weights=weights))

        with self.test_session() as sess:
            sigmoid_loss, focal_loss = sess.run([sigmoid_loss, focal_loss])
            order_of_ratio = np.power(
                10, np.floor(np.log10(sigmoid_loss / focal_loss)))
            self.assertAlmostEqual(order_of_ratio, 1.)
예제 #6
0
    def testSameAsSigmoidXEntropyWithNoAlphaAndZeroGamma(self):
        prediction_tensor = tf.constant(
            [[[-100, 100, -100], [100, -100, -100], [100, 0, -100],
              [-100, -100, 100]],
             [[-100, 0, 100], [-100, 100, -100], [100, 100, 100], [0, 0, -1]]],
            tf.float32)
        target_tensor = tf.constant(
            [[[0, 1, 0], [1, 0, 0], [1, 0, 0], [0, 0, 1]],
             [[0, 0, 1], [0, 1, 0], [1, 1, 1], [1, 0, 0]]], tf.float32)
        weights = tf.constant([[1, 1, 1, 1], [1, 1, 1, 0]], tf.float32)
        focal_loss_op = losses.SigmoidFocalClassificationLoss(alpha=None,
                                                              gamma=0.0)
        sigmoid_loss_op = losses.WeightedSigmoidClassificationLoss()
        focal_loss = focal_loss_op(prediction_tensor,
                                   target_tensor,
                                   weights=weights)
        sigmoid_loss = sigmoid_loss_op(prediction_tensor,
                                       target_tensor,
                                       weights=weights)

        with self.test_session() as sess:
            sigmoid_loss, focal_loss = sess.run([sigmoid_loss, focal_loss])
            self.assertAllClose(sigmoid_loss, focal_loss)
예제 #7
0
 def __init__(self):
     super(FakeDetectionModel, self).__init__(num_classes=NUMBER_OF_CLASSES)
     self._classification_loss = losses.WeightedSigmoidClassificationLoss()
     self._localization_loss = losses.WeightedSmoothL1LocalizationLoss()
예제 #8
0
  def _create_model(self,
                    apply_hard_mining=True,
                    normalize_loc_loss_by_codesize=False,
                    add_background_class=True,
                    random_example_sampling=False,
                    use_keras=False):
    is_training = False
    num_classes = 1
    mock_anchor_generator = MockAnchorGenerator2x2()
    if use_keras:
      mock_box_predictor = test_utils.MockKerasBoxPredictor(
          is_training, num_classes)
    else:
      mock_box_predictor = test_utils.MockBoxPredictor(
          is_training, num_classes)
    mock_box_coder = test_utils.MockBoxCoder()
    if use_keras:
      fake_feature_extractor = FakeSSDKerasFeatureExtractor()
    else:
      fake_feature_extractor = FakeSSDFeatureExtractor()
    mock_matcher = test_utils.MockMatcher()
    region_similarity_calculator = sim_calc.IouSimilarity()
    encode_background_as_zeros = False
    def image_resizer_fn(image):
      return [tf.identity(image), tf.shape(image)]

    classification_loss = losses.WeightedSigmoidClassificationLoss()
    localization_loss = losses.WeightedSmoothL1LocalizationLoss()
    non_max_suppression_fn = functools.partial(
        post_processing.batch_multiclass_non_max_suppression,
        score_thresh=-20.0,
        iou_thresh=1.0,
        max_size_per_class=5,
        max_total_size=5)
    classification_loss_weight = 1.0
    localization_loss_weight = 1.0
    negative_class_weight = 1.0
    normalize_loss_by_num_matches = False

    hard_example_miner = None
    if apply_hard_mining:
      # This hard example miner is expected to be a no-op.
      hard_example_miner = losses.HardExampleMiner(
          num_hard_examples=None,
          iou_threshold=1.0)

    random_example_sampler = None
    if random_example_sampling:
      random_example_sampler = sampler.BalancedPositiveNegativeSampler(
          positive_fraction=0.5)

    code_size = 4
    model = ssd_meta_arch.SSDMetaArch(
        is_training,
        mock_anchor_generator,
        mock_box_predictor,
        mock_box_coder,
        fake_feature_extractor,
        mock_matcher,
        region_similarity_calculator,
        encode_background_as_zeros,
        negative_class_weight,
        image_resizer_fn,
        non_max_suppression_fn,
        tf.identity,
        classification_loss,
        localization_loss,
        classification_loss_weight,
        localization_loss_weight,
        normalize_loss_by_num_matches,
        hard_example_miner,
        add_summaries=False,
        normalize_loc_loss_by_codesize=normalize_loc_loss_by_codesize,
        freeze_batchnorm=False,
        inplace_batchnorm_update=False,
        add_background_class=add_background_class,
        random_example_sampler=random_example_sampler)
    return model, num_classes, mock_anchor_generator.num_anchors(), code_size