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)
Example #6
0
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)
Example #8
0
 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)
Example #9
0
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)
Example #10
0
    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))
Example #11
0
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)
Example #14
0
 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)