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")
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
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
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
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