예제 #1
0
def _build_localization_loss(loss_config):
    """Builds a localization loss based on the loss config.

    Args:
    loss_config: A yaml.LocalizationLoss object.

    Returns:
    Loss based on the config.

    Raises:
    ValueError: On invalid loss_config.
    """

    if 'weighted_l2' in loss_config:
        config = loss_config.weighted_l2
        if len(config.code_weight) == 0:
            code_weight = None
        else:
            code_weight = config.code_weight
        return losses.WeightedL2LocalizationLoss(code_weight)

    if 'weighted_smooth_l1' in loss_config:
        config = loss_config.weighted_smooth_l1
        if len(config.code_weight) == 0:
            code_weight = None
        else:
            code_weight = config.code_weight
        return losses.WeightedSmoothL1LocalizationLoss(config.sigma,
                                                       code_weight)
    else:
        raise ValueError('Empty loss config.')
def _build_localization_loss(loss_config):
  """Builds a localization loss based on the loss config.

  Args:
    loss_config: A losses_pb2.LocalizationLoss object.

  Returns:
    Loss based on the config.

  Raises:
    ValueError: On invalid loss_config.
  """
  if not isinstance(loss_config, losses_pb2.LocalizationLoss):
    raise ValueError('loss_config not of type losses_pb2.LocalizationLoss.')

  loss_type = loss_config.WhichOneof('localization_loss')

  if loss_type == 'weighted_l2':
    return losses.WeightedL2LocalizationLoss()

  if loss_type == 'weighted_smooth_l1':
    return losses.WeightedSmoothL1LocalizationLoss(
        loss_config.weighted_smooth_l1.delta)

  if loss_type == 'weighted_iou':
    return losses.WeightedIOULocalizationLoss()

  raise ValueError('Empty loss config.')
예제 #3
0
    def _create_model(self, apply_hard_mining=True):
        is_training = False
        num_classes = 1
        mock_anchor_generator = MockAnchorGenerator2x2()
        mock_box_predictor = test_utils.MockBoxPredictor(
            is_training, num_classes)
        mock_box_coder = test_utils.MockBoxCoder()
        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
        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)

        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,
                                          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)
        return model, num_classes, mock_anchor_generator.num_anchors(
        ), code_size
    def setUp(self):
        """Set up mock RSSD model.

        Here we set up a simple mock RSSD model that will always predict 4
        detections that happen to always be exactly the anchors that are set up
        in the above MockAnchorGenerator.  Because we let max_detections=5,
        we will also always end up with an extra padded row in the detection
        results.
        """
        is_training = False
        self._num_classes = 1
        mock_anchor_generator = MockAnchorGenerator2x2()
        mock_rbox_predictor = test_utils.MockRBoxPredictor(
            is_training, self._num_classes)
        mock_rbox_coder = test_utils.MockRBoxCoder()
        fake_feature_extractor = FakeSSDFeatureExtractor()
        mock_matcher = test_utils.MockMatcher()
        region_similarity_calculator = sim_calc.IouSimilarity()

        def image_resizer_fn(image):
            return tf.identity(image)

        classification_loss = losses.WeightedSigmoidClassificationLoss(
            anchorwise_output=True)
        localization_loss = losses.WeightedSmoothL1LocalizationLoss(
            anchorwise_output=True)
        non_max_suppression_fn = functools.partial(
            post_processing_rbox.batch_multiclass_non_max_suppression_rbox,
            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
        normalize_loss_by_num_matches = False

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

        self._num_anchors = 4
        self._code_size = 5
        self._model = rssd_meta_arch.RSSDMetaArch(
            is_training, mock_anchor_generator, mock_rbox_predictor,
            mock_rbox_coder, fake_feature_extractor, mock_matcher,
            region_similarity_calculator, 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)
예제 #5
0
    def testReturnsCorrectLoss(self):
        batch_size = 2
        num_anchors = 3
        code_size = 4
        prediction_tensor = tf.constant(
            [[[2.5, 0, .4, 0], [0, 0, 0, 0], [0, 2.5, 0, .4]],
             [[3.5, 0, 0, 0], [0, .4, 0, .9], [0, 0, 1.5, 0]]], tf.float32)
        target_tensor = tf.zeros([batch_size, num_anchors, code_size])
        weights = tf.constant([[2, 1, 1], [0, 3, 0]], tf.float32)
        loss_op = losses.WeightedSmoothL1LocalizationLoss()
        loss = loss_op(prediction_tensor, target_tensor, weights=weights)

        exp_loss = 7.695
        with self.test_session() as sess:
            loss_output = sess.run(loss)
            self.assertAllClose(loss_output, exp_loss)
예제 #6
0
def _build_localization_loss(loss_config):
    """Builds a localization loss based on the loss config.

  Args:
    loss_config: A losses_pb2.LocalizationLoss object.

  Returns:
    Loss based on the config.

  Raises:
    ValueError: On invalid loss_config.
  """
    if not isinstance(loss_config, losses_pb2.LocalizationLoss):
        raise ValueError(
            'loss_config not of type losses_pb2.LocalizationLoss.')

    loss_type = loss_config.WhichOneof('localization_loss')

    if loss_type == 'weighted_l2':
        config = loss_config.weighted_l2
        if len(config.code_weight) == 0:
            code_weight = None
        else:
            code_weight = config.code_weight
        return losses.WeightedL2LocalizationLoss(code_weight)

    if loss_type == 'weighted_smooth_l1':
        config = loss_config.weighted_smooth_l1
        if len(config.code_weight) == 0:
            code_weight = None
        else:
            code_weight = config.code_weight
        return losses.WeightedSmoothL1LocalizationLoss(config.sigma,
                                                       code_weight)

    raise ValueError('Empty loss config.')
예제 #7
0
 def __init__(self):
     super(FakeDetectionModel, self).__init__(num_classes=NUMBER_OF_CLASSES)
     self._classification_loss = losses.WeightedSigmoidClassificationLoss(
         anchorwise_output=True)
     self._localization_loss = losses.WeightedSmoothL1LocalizationLoss(
         anchorwise_output=True)