Exemple #1
0
    def test_resample_feature_adder_compile(self):
        config = hparams_config.get_efficientdet_config("efficientdet-d0")
        feat_sizes = utils.get_feat_sizes(config.image_size, config.max_level)
        tf2.random.set_seed(SEED)
        inputs = [
            tf2.keras.Input(shape=[512, 512, 3]),
            tf2.keras.Input(shape=[256, 256, 16]),
            tf2.keras.Input(shape=[128, 128, 24]),
            tf2.keras.Input(shape=[64, 64, 40]),
            tf2.keras.Input(shape=[32, 32, 112]),
            tf2.keras.Input(shape=[16, 16, 320])
        ]
        outputs = efficientdet_arch_keras.ResampleFeatureAdder(config)(inputs)
        model = tf2.keras.Model(inputs=inputs, outputs=outputs)

        examples = [[
            tf2.ones([1, 512, 512, 3]),
            tf2.ones([1, 256, 256, 16]),
            tf2.ones([1, 128, 128, 24]),
            tf2.ones([1, 64, 64, 40]),
            tf2.ones([1, 32, 32, 112]),
            tf2.ones([1, 16, 16, 320])
        ]]

        preds = model(examples)

        try:
            utils.verify_feats_size(preds,
                                    feat_sizes=feat_sizes,
                                    min_level=config.min_level,
                                    max_level=config.max_level,
                                    data_format=config.data_format)
        except ValueError as err:
            self.assertFalse(True, msg=repr(err))
        self.assertEqual(len(preds), 5, "P3-P7")
Exemple #2
0
def build_feature_network(features, config):
    """Build FPN input features.

    Args:
     features: input tensor.
     config: a dict-like config, including all parameters.

    Returns:
      A dict from levels to the feature maps processed after feature network.
    """
    feat_sizes = utils.get_feat_sizes(config.image_size, config.max_level)
    feats = []
    if config.min_level not in features.keys():
        raise ValueError(
            'features.keys ({}) should include min_level ({})'.format(
                features.keys(), config.min_level))

    # Build additional input features that are not from backbone.
    for level in range(config.min_level, config.max_level + 1):
        if level in features.keys():
            feats.append(features[level])
        else:
            h_id, w_id = (2,
                          3) if config.data_format == 'channels_first' else (1,
                                                                             2)
            # Adds a coarser level by downsampling the last feature map.
            feats.append(
                ResampleFeatureMap(
                    target_height=(feats[-1].shape[h_id] - 1) // 2 + 1,
                    target_width=(feats[-1].shape[w_id] - 1) // 2 + 1,
                    target_num_channels=config.fpn_num_filters,
                    apply_bn=config.apply_bn_for_resampling,
                    is_training=config.is_training_bn,
                    conv_after_downsample=config.conv_after_downsample,
                    use_native_resize_op=config.use_native_resize_op,
                    pooling_type=config.pooling_type,
                    strategy=config.strategy,
                    data_format=config.data_format,
                    name='resample_p{}'.format(level),
                )(feats[-1]))

    utils.verify_feats_size(feats,
                            feat_sizes=feat_sizes,
                            min_level=config.min_level,
                            max_level=config.max_level,
                            data_format=config.data_format)

    new_feats = FPNCells(feat_sizes, config)(feats)
    return new_feats
Exemple #3
0
  def call(self, feats, training):
    for cell in self.cells:
      cell_feats = cell(feats, training)
      min_level = self.config.min_level
      max_level = self.config.max_level

      feats = []
      for level in range(min_level, max_level + 1):
        for i, fnode in enumerate(reversed(self.fpn_config.nodes)):
          if fnode['feat_level'] == level:
            feats.append(cell_feats[-1 - i])
            break

      utils.verify_feats_size(feats, self.feat_sizes, min_level, max_level,
                              self.config.data_format)

    return feats
Exemple #4
0
    def call(self, feats):
        for cell in self.cells:
            cell_feats = cell(feats)
            min_level = self.config.min_level
            max_level = self.config.max_level

            new_feats = {}
            for l in range(min_level, max_level + 1):
                for i, fnode in enumerate(reversed(self.fpn_config.nodes)):
                    if fnode['feat_level'] == l:
                        new_feats[l] = cell_feats[-1 - i]
                        break

            feats = [
                new_feats[level] for level in range(min_level, max_level + 1)
            ]
            utils.verify_feats_size(feats, self.feat_sizes, min_level,
                                    max_level, self.config.data_format)

        return new_feats
def build_feature_network(feats, config):
    """Build FPN input features.

  Args:
   feats: A list of input tensors starting from min_level.
   config: a dict-like config, including all parameters.

  Returns:
    A dict from levels to the feature maps processed after feature network.
  """
    feat_sizes = utils.get_feat_sizes(config.image_size, config.max_level)
    if not feats:
        raise ValueError('FPN input features cannot be empty.')

    # Build additional input features that are not from backbone.
    while len(feats) < config.max_level - config.min_level + 1:
        level = len(feats) + config.min_level
        h_id, w_id = (2, 3) if config.data_format == 'channels_first' else (1,
                                                                            2)
        # Adds a coarser level by downsampling the last feature map.
        feats.append(
            ResampleFeatureMap(
                target_height=(feats[-1].shape[h_id] - 1) // 2 + 1,
                target_width=(feats[-1].shape[w_id] - 1) // 2 + 1,
                target_num_channels=config.fpn_num_filters,
                apply_bn=config.apply_bn_for_resampling,
                is_training=config.is_training_bn,
                conv_after_downsample=config.conv_after_downsample,
                strategy=config.strategy,
                data_format=config.data_format,
                name='resample_p{}'.format(level),
            )(feats[-1]))

    utils.verify_feats_size(feats,
                            feat_sizes=feat_sizes,
                            min_level=config.min_level,
                            max_level=config.max_level,
                            data_format=config.data_format)

    new_feats = FPNCells(feat_sizes, config)(feats)
    return new_feats
Exemple #6
0
def build_feature_network(features, config):
    """Build FPN input features.

  Args:
   features: input tensor.
   config: a dict-like config, including all parameters.

  Returns:
    A dict from levels to the feature maps processed after feature network.
  """
    feat_sizes = utils.get_feat_sizes(config.image_size, config.max_level)
    feats = []
    if config.min_level not in features.keys():
        raise ValueError(
            'features.keys ({}) should include min_level ({})'.format(
                features.keys(), config.min_level))

    # Build additional input features that are not from backbone.
    for level in range(config.min_level, config.max_level + 1):
        if level in features.keys():
            feats.append(features[level])
        else:
            h_id, w_id = (2,
                          3) if config.data_format == 'channels_first' else (1,
                                                                             2)
            # Adds a coarser level by downsampling the last feature map.
            feats.append(
                resample_feature_map(
                    feats[-1],
                    name='p%d' % level,
                    target_height=(feats[-1].shape[h_id] - 1) // 2 + 1,
                    target_width=(feats[-1].shape[w_id] - 1) // 2 + 1,
                    target_num_channels=config.fpn_num_filters,
                    apply_bn=config.apply_bn_for_resampling,
                    is_training=config.is_training_bn,
                    conv_after_downsample=config.conv_after_downsample,
                    strategy=config.strategy,
                    data_format=config.data_format))

    utils.verify_feats_size(feats,
                            feat_sizes=feat_sizes,
                            min_level=config.min_level,
                            max_level=config.max_level,
                            data_format=config.data_format)

    with tf.variable_scope('fpn_cells'):
        for rep in range(config.fpn_cell_repeats):
            with tf.variable_scope('cell_{}'.format(rep)):
                logging.info('building cell %d', rep)
                new_feats = build_bifpn_layer(feats, feat_sizes, config)

                feats = [
                    new_feats[level]
                    for level in range(config.min_level, config.max_level + 1)
                ]

                utils.verify_feats_size(feats,
                                        feat_sizes=feat_sizes,
                                        min_level=config.min_level,
                                        max_level=config.max_level,
                                        data_format=config.data_format)

    return new_feats