def _create_application_with_layer_outputs( self, layer_names, batchnorm_training, conv_hyperparams=None, use_explicit_padding=False, alpha=1.0, min_depth=None, conv_defs=None): """Constructs Keras mobilenetv2 that extracts intermediate layer outputs.""" # Have to clear the Keras backend to ensure isolation in layer naming tf.keras.backend.clear_session() if not layer_names: layer_names = _layers_to_check full_model = mobilenet_v2.mobilenet_v2( batchnorm_training=batchnorm_training, conv_hyperparams=conv_hyperparams, weights=None, use_explicit_padding=use_explicit_padding, alpha=alpha, min_depth=min_depth, include_top=False, conv_defs=conv_defs) layer_outputs = [full_model.get_layer(name=layer).output for layer in layer_names] return tf.keras.Model( inputs=full_model.inputs, outputs=layer_outputs)
def build(self, input_shape): full_mobilenet_v2 = mobilenet_v2.mobilenet_v2( batchnorm_training=(self._is_training and not self._freeze_batchnorm), conv_hyperparams=(self._conv_hyperparams if self._override_base_feature_extractor_hyperparams else None), weights=None, use_explicit_padding=self._use_explicit_padding, alpha=self._depth_multiplier, min_depth=self._min_depth, include_top=False) conv2d_11_pointwise = full_mobilenet_v2.get_layer( name='block_13_expand_relu').output conv2d_13_pointwise = full_mobilenet_v2.get_layer( name='out_relu').output self.classification_backbone = tf.keras.Model( inputs=full_mobilenet_v2.inputs, outputs=[conv2d_11_pointwise, conv2d_13_pointwise]) self.feature_map_generator = ( feature_map_generators.KerasMultiResolutionFeatureMaps( feature_map_layout=self._feature_map_layout, depth_multiplier=self._depth_multiplier, min_depth=self._min_depth, insert_1x1_conv=True, is_training=self._is_training, conv_hyperparams=self._conv_hyperparams, freeze_batchnorm=self._freeze_batchnorm, name='FeatureMaps')) self.built = True
def build(self, input_shape): full_mobilenet_v2 = mobilenet_v2.mobilenet_v2( batchnorm_training=(self._is_training and not self._freeze_batchnorm), conv_hyperparams=(self._conv_hyperparams if self._override_base_feature_extractor_hyperparams else None), weights=None, use_explicit_padding=self._use_explicit_padding, alpha=self._depth_multiplier, min_depth=self._min_depth, include_top=False) conv2d_11_pointwise = full_mobilenet_v2.get_layer( name='block_13_expand_relu').output conv2d_13_pointwise = full_mobilenet_v2.get_layer(name='out_relu').output self.mobilenet_v2 = tf.keras.Model( inputs=full_mobilenet_v2.inputs, outputs=[conv2d_11_pointwise, conv2d_13_pointwise]) self.feature_map_generator = ( feature_map_generators.KerasMultiResolutionFeatureMaps( feature_map_layout=self._feature_map_layout, depth_multiplier=self._depth_multiplier, min_depth=self._min_depth, insert_1x1_conv=True, is_training=self._is_training, conv_hyperparams=self._conv_hyperparams, freeze_batchnorm=self._freeze_batchnorm, name='FeatureMaps')) self.built = True
def build(self, input_shape): full_mobilenet_v2 = mobilenet_v2.mobilenet_v2( batchnorm_training=(self._is_training and not self._freeze_batchnorm), conv_hyperparams=(self._conv_hyperparams if self._override_base_feature_extractor_hyperparams else None), weights=None, use_explicit_padding=self._use_explicit_padding, alpha=self._depth_multiplier, min_depth=self._min_depth, include_top=False) layer_names = [layer.name for layer in full_mobilenet_v2.layers] outputs = [] for layer_idx in [4, 7, 14]: add_name = 'block_{}_add'.format(layer_idx - 2) project_name = 'block_{}_project_BN'.format(layer_idx - 2) output_layer_name = add_name if add_name in layer_names else project_name outputs.append(full_mobilenet_v2.get_layer(output_layer_name).output) layer_19 = full_mobilenet_v2.get_layer(name='out_relu').output outputs.append(layer_19) self._mobilenet_v2 = tf.keras.Model( inputs=full_mobilenet_v2.inputs, outputs=outputs) # pylint:disable=g-long-lambda self._depth_fn = lambda d: max( int(d * self._depth_multiplier), self._min_depth) self._base_fpn_max_level = min(self._fpn_max_level, 5) self._num_levels = self._base_fpn_max_level + 1 - self._fpn_min_level self._fpn_features_generator = ( feature_map_generators.KerasFpnTopDownFeatureMaps( num_levels=self._num_levels, depth=self._depth_fn(self._additional_layer_depth), use_depthwise=self._use_depthwise, use_explicit_padding=self._use_explicit_padding, use_native_resize_op=self._use_native_resize_op, is_training=self._is_training, conv_hyperparams=self._conv_hyperparams, freeze_batchnorm=self._freeze_batchnorm, name='FeatureMaps')) # Construct coarse feature layers padding = 'VALID' if self._use_explicit_padding else 'SAME' kernel_size = 3 stride = 2 for i in range(self._base_fpn_max_level + 1, self._fpn_max_level + 1): coarse_feature_layers = [] if self._use_explicit_padding: def fixed_padding(features, kernel_size=kernel_size): return ops.fixed_padding(features, kernel_size) coarse_feature_layers.append(tf.keras.layers.Lambda( fixed_padding, name='fixed_padding')) layer_name = 'bottom_up_Conv2d_{}'.format( i - self._base_fpn_max_level + NUM_LAYERS) conv_block = feature_map_generators.create_conv_block( self._use_depthwise, kernel_size, padding, stride, layer_name, self._conv_hyperparams, self._is_training, self._freeze_batchnorm, self._depth_fn(self._additional_layer_depth)) coarse_feature_layers.extend(conv_block) self._coarse_feature_layers.append(coarse_feature_layers) self.built = True
def mobilenet_v2(channel_means, channel_stds, bgr_ordering): """The MobileNetV2 backbone for CenterNet.""" # We set 'is_training' to True for now. network = mobilenetv2.mobilenet_v2(True, include_top=False) return CenterNetMobileNetV2FeatureExtractor(network, channel_means=channel_means, channel_stds=channel_stds, bgr_ordering=bgr_ordering)
def mobilenet_v2_fpn(channel_means, channel_stds, bgr_ordering): """The MobileNetV2+FPN backbone for CenterNet.""" # Set to batchnorm_training to True for now. network = mobilenetv2.mobilenet_v2(batchnorm_training=True, include_top=False) return CenterNetMobileNetV2FPNFeatureExtractor(network, channel_means=channel_means, channel_stds=channel_stds, bgr_ordering=bgr_ordering, fpn_separable_conv=False)
def test_hyperparam_override(self): hyperparams = self._build_conv_hyperparams() model = mobilenet_v2.mobilenet_v2(batchnorm_training=True, conv_hyperparams=hyperparams, weights=None, use_explicit_padding=False, alpha=1.0, min_depth=32, include_top=False) hyperparams.params() bn_layer = model.get_layer(name='block_5_project_BN') self.assertAllClose(bn_layer.momentum, 0.2) self.assertAllClose(bn_layer.epsilon, 0.1)
def test_hyperparam_override(self): hyperparams = self._build_conv_hyperparams() model = mobilenet_v2.mobilenet_v2( batchnorm_training=True, conv_hyperparams=hyperparams, weights=None, use_explicit_padding=False, alpha=1.0, min_depth=32, include_top=False) hyperparams.params() bn_layer = model.get_layer(name='block_5_project_BN') self.assertAllClose(bn_layer.momentum, 0.2) self.assertAllClose(bn_layer.epsilon, 0.1)
def mobilenet_v2_fpn_sep_conv(channel_means, channel_stds, bgr_ordering): """Same as mobilenet_v2_fpn except with separable convolution in FPN.""" # Setting batchnorm_training to True, which will use the correct # BatchNormalization layer strategy based on the current Keras learning phase. # TODO(yuhuic): expriment with True vs. False to understand it's effect in # practice. network = mobilenetv2.mobilenet_v2(batchnorm_training=True, include_top=False) return CenterNetMobileNetV2FPNFeatureExtractor(network, channel_means=channel_means, channel_stds=channel_stds, bgr_ordering=bgr_ordering, fpn_separable_conv=True)
def test_center_net_mobilenet_v2_feature_extractor(self): net = mobilenet_v2.mobilenet_v2(True, include_top=False) model = center_net_mobilenet_v2_feature_extractor.CenterNetMobileNetV2FeatureExtractor( net) def graph_fn(): img = np.zeros((8, 224, 224, 3), dtype=np.float32) processed_img = model.preprocess(img) return model(processed_img) outputs = self.execute(graph_fn, []) self.assertEqual(outputs.shape, (8, 56, 56, 64))
def mobilenet_v2(channel_means, channel_stds, bgr_ordering, depth_multiplier=1.0, **kwargs): """The MobileNetV2 backbone for CenterNet.""" del kwargs # We set 'is_training' to True for now. network = mobilenetv2.mobilenet_v2( batchnorm_training=True, alpha=depth_multiplier, include_top=False, weights='imagenet' if depth_multiplier == 1.0 else None) return CenterNetMobileNetV2FeatureExtractor(network, channel_means=channel_means, channel_stds=channel_stds, bgr_ordering=bgr_ordering)
def mobilenet_v2_fpn(channel_means, channel_stds, bgr_ordering, use_separable_conv=False, depth_multiplier=1.0, **kwargs): """The MobileNetV2+FPN backbone for CenterNet.""" del kwargs # Set to batchnorm_training to True for now. network = mobilenetv2.mobilenet_v2( batchnorm_training=True, alpha=depth_multiplier, include_top=False, weights='imagenet' if depth_multiplier == 1.0 else None) return CenterNetMobileNetV2FPNFeatureExtractor( network, channel_means=channel_means, channel_stds=channel_stds, bgr_ordering=bgr_ordering, use_separable_conv=use_separable_conv)
def test_center_net_mobilenet_v2_fpn_feature_extractor(self): net = mobilenet_v2.mobilenet_v2(True, include_top=False) model = center_net_mobilenet_v2_fpn_feature_extractor.CenterNetMobileNetV2FPNFeatureExtractor( net) def graph_fn(): img = np.zeros((8, 224, 224, 3), dtype=np.float32) processed_img = model.preprocess(img) return model(processed_img) outputs = self.execute(graph_fn, []) self.assertEqual(outputs.shape, (8, 56, 56, 24)) # Pull out the FPN network. output = model.get_layer('model_1') for layer in output.layers: # All convolution layers should be normal 2D convolutions. if 'conv' in layer.name: self.assertIsInstance(layer, tf.keras.layers.Conv2D)
def _create_application_with_layer_outputs( self, layer_names, batchnorm_training, conv_hyperparams=None, use_explicit_padding=False, alpha=1.0, min_depth=None): """Constructs Keras mobilenetv2 that extracts intermediate layer outputs.""" if not layer_names: layer_names = _layers_to_check full_model = mobilenet_v2.mobilenet_v2( batchnorm_training=batchnorm_training, conv_hyperparams=conv_hyperparams, weights=None, use_explicit_padding=use_explicit_padding, alpha=alpha, min_depth=min_depth, include_top=False) layer_outputs = [full_model.get_layer(name=layer).output for layer in layer_names] return tf.keras.Model( inputs=full_model.inputs, outputs=layer_outputs)
def test_center_net_mobilenet_v2_fpn_feature_extractor_sep_conv(self): net = mobilenet_v2.mobilenet_v2(True, include_top=False) model = center_net_mobilenet_v2_fpn_feature_extractor.CenterNetMobileNetV2FPNFeatureExtractor( net, fpn_separable_conv=True) def graph_fn(): img = np.zeros((8, 224, 224, 3), dtype=np.float32) processed_img = model.preprocess(img) return model(processed_img) outputs = self.execute(graph_fn, []) self.assertEqual(outputs.shape, (8, 56, 56, 24)) # Pull out the FPN network. output = model.get_layer('model_1') for layer in output.layers: # Convolution layers with kernel size not equal to (1, 1) should be # separable 2D convolutions. if 'conv' in layer.name and layer.kernel_size != (1, 1): self.assertIsInstance(layer, tf.keras.layers.SeparableConv2D)