예제 #1
0
 def test_prediction_size_depthwise_false(self):
   conv_hyperparams = self._build_conv_hyperparams()
   class_prediction_head = keras_class_head.ConvolutionalClassHead(
       is_training=True,
       num_class_slots=20,
       use_dropout=True,
       dropout_keep_prob=0.5,
       kernel_size=3,
       conv_hyperparams=conv_hyperparams,
       freeze_batchnorm=False,
       num_predictions_per_location=1,
       use_depthwise=False)
   image_feature = tf.random_uniform(
       [64, 17, 19, 1024], minval=-10.0, maxval=10.0, dtype=tf.float32)
   class_predictions = class_prediction_head(image_feature,)
   self.assertAllEqual([64, 323, 20],
                       class_predictions.get_shape().as_list())
예제 #2
0
def build_convolutional_keras_box_predictor(is_training,
                                            num_classes,
                                            conv_hyperparams,
                                            freeze_batchnorm,
                                            inplace_batchnorm_update,
                                            num_predictions_per_location_list,
                                            min_depth,
                                            max_depth,
                                            num_layers_before_predictor,
                                            use_dropout,
                                            dropout_keep_prob,
                                            kernel_size,
                                            box_code_size,
                                            add_background_class=True,
                                            class_prediction_bias_init=0.0,
                                            use_depthwise=False,
                                            name='BoxPredictor'):
    """Builds the Keras ConvolutionalBoxPredictor from the arguments.

  Args:
    is_training: Indicates whether the BoxPredictor is in training mode.
    num_classes: number of classes.  Note that num_classes *does not*
      include the background category, so if groundtruth labels take values
      in {0, 1, .., K-1}, num_classes=K (and not K+1, even though the
      assigned classification targets can range from {0,... K}).
    conv_hyperparams: A `hyperparams_builder.KerasLayerHyperparams` object
      containing hyperparameters for convolution ops.
    freeze_batchnorm: Whether to freeze batch norm parameters during
      training or not. When training with a small batch size (e.g. 1), it is
      desirable to freeze batch norm update and use pretrained batch norm
      params.
    inplace_batchnorm_update: Whether to update batch norm moving average
      values inplace. When this is false train op must add a control
      dependency on tf.graphkeys.UPDATE_OPS collection in order to update
      batch norm statistics.
    num_predictions_per_location_list: A list of integers representing the
      number of box predictions to be made per spatial location for each
      feature map.
    min_depth: Minimum feature depth prior to predicting box encodings
      and class predictions.
    max_depth: Maximum feature depth prior to predicting box encodings
      and class predictions. If max_depth is set to 0, no additional
      feature map will be inserted before location and class predictions.
    num_layers_before_predictor: Number of the additional conv layers before
      the predictor.
    use_dropout: Option to use dropout or not.  Note that a single dropout
      op is applied here prior to both box and class predictions, which stands
      in contrast to the ConvolutionalBoxPredictor below.
    dropout_keep_prob: Keep probability for dropout.
      This is only used if use_dropout is True.
    kernel_size: Size of final convolution kernel.  If the
      spatial resolution of the feature map is smaller than the kernel size,
      then the kernel size is automatically set to be
      min(feature_width, feature_height).
    box_code_size: Size of encoding for each box.
    add_background_class: Whether to add an implicit background class.
    class_prediction_bias_init: constant value to initialize bias of the last
      conv2d layer before class prediction.
    use_depthwise: Whether to use depthwise convolutions for prediction
      steps. Default is False.
    name: A string name scope to assign to the box predictor. If `None`, Keras
      will auto-generate one from the class name.

  Returns:
    A Keras ConvolutionalBoxPredictor class.
  """
    box_prediction_heads = []
    class_prediction_heads = []
    other_heads = {}

    for stack_index, num_predictions_per_location in enumerate(
            num_predictions_per_location_list):
        box_prediction_heads.append(
            keras_box_head.ConvolutionalBoxHead(
                is_training=is_training,
                box_code_size=box_code_size,
                kernel_size=kernel_size,
                conv_hyperparams=conv_hyperparams,
                freeze_batchnorm=freeze_batchnorm,
                num_predictions_per_location=num_predictions_per_location,
                use_depthwise=use_depthwise,
                name='ConvolutionalBoxHead_%d' % stack_index))
        class_prediction_heads.append(
            keras_class_head.ConvolutionalClassHead(
                is_training=is_training,
                num_class_slots=(num_classes +
                                 1 if add_background_class else num_classes),
                use_dropout=use_dropout,
                dropout_keep_prob=dropout_keep_prob,
                kernel_size=kernel_size,
                conv_hyperparams=conv_hyperparams,
                freeze_batchnorm=freeze_batchnorm,
                num_predictions_per_location=num_predictions_per_location,
                class_prediction_bias_init=class_prediction_bias_init,
                use_depthwise=use_depthwise,
                name='ConvolutionalClassHead_%d' % stack_index))

    return convolutional_keras_box_predictor.ConvolutionalBoxPredictor(
        is_training=is_training,
        num_classes=num_classes,
        box_prediction_heads=box_prediction_heads,
        class_prediction_heads=class_prediction_heads,
        other_heads=other_heads,
        conv_hyperparams=conv_hyperparams,
        num_layers_before_predictor=num_layers_before_predictor,
        min_depth=min_depth,
        max_depth=max_depth,
        freeze_batchnorm=freeze_batchnorm,
        inplace_batchnorm_update=inplace_batchnorm_update,
        name=name)
예제 #3
0
def build_convolutional_keras_box_predictor(is_training,
                                            num_classes,
                                            conv_hyperparams,
                                            freeze_batchnorm,
                                            inplace_batchnorm_update,
                                            num_predictions_per_location_list,
                                            min_depth,
                                            max_depth,
                                            num_layers_before_predictor,
                                            use_dropout,
                                            dropout_keep_prob,
                                            kernel_size,
                                            box_code_size,
                                            class_prediction_bias_init=0.0,
                                            use_depthwise=False,
                                            mask_head_config=None,
                                            name='BoxPredictor'):
    """Builds the ConvolutionalBoxPredictor from the arguments.

  Args:
    is_training: Indicates whether the BoxPredictor is in training mode.
    num_classes: Number of classes.
    conv_hyperparams: A `hyperparams_builder.KerasLayerHyperparams` object
      containing hyperparameters for convolution ops.
    freeze_batchnorm: Whether to freeze batch norm parameters during
      training or not. When training with a small batch size (e.g. 1), it is
      desirable to freeze batch norm update and use pretrained batch norm
      params.
    inplace_batchnorm_update: Whether to update batch norm moving average
      values inplace. When this is false train op must add a control
      dependency on tf.graphkeys.UPDATE_OPS collection in order to update
      batch norm statistics.
    num_predictions_per_location_list: A list of integers representing the
      number of box predictions to be made per spatial location for each
      feature map.
    min_depth: Minimum feature depth prior to predicting box encodings
      and class predictions.
    max_depth: Maximum feature depth prior to predicting box encodings
      and class predictions. If max_depth is set to 0, no additional
      feature map will be inserted before location and class predictions.
    num_layers_before_predictor: Number of the additional conv layers before
      the predictor.
    use_dropout: Option to use dropout or not.  Note that a single dropout
      op is applied here prior to both box and class predictions, which stands
      in contrast to the ConvolutionalBoxPredictor below.
    dropout_keep_prob: Keep probability for dropout.
      This is only used if use_dropout is True.
    kernel_size: Size of final convolution kernel.  If the
      spatial resolution of the feature map is smaller than the kernel size,
      then the kernel size is automatically set to be
      min(feature_width, feature_height).
    box_code_size: Size of encoding for each box.
    class_prediction_bias_init: constant value to initialize bias of the last
      conv2d layer before class prediction.
    use_depthwise: Whether to use depthwise convolutions for prediction
      steps. Default is False.
    mask_head_config: An optional MaskHead object containing configs for mask
      head construction.
    name: A string name scope to assign to the box predictor. If `None`, Keras
      will auto-generate one from the class name.

  Returns:
    A ConvolutionalBoxPredictor class.
  """
    box_prediction_heads = []
    class_prediction_heads = []
    mask_prediction_heads = []
    other_heads = {}
    if mask_head_config is not None:
        other_heads[convolutional_box_predictor.MASK_PREDICTIONS] = \
          mask_prediction_heads

    for stack_index, num_predictions_per_location in enumerate(
            num_predictions_per_location_list):
        box_prediction_heads.append(
            keras_box_head.ConvolutionalBoxHead(
                is_training=is_training,
                box_code_size=box_code_size,
                kernel_size=kernel_size,
                conv_hyperparams=conv_hyperparams,
                freeze_batchnorm=freeze_batchnorm,
                num_predictions_per_location=num_predictions_per_location,
                use_depthwise=use_depthwise,
                name='ConvolutionalBoxHead_%d' % stack_index))
        class_prediction_heads.append(
            keras_class_head.ConvolutionalClassHead(
                is_training=is_training,
                num_classes=num_classes,
                use_dropout=use_dropout,
                dropout_keep_prob=dropout_keep_prob,
                kernel_size=kernel_size,
                conv_hyperparams=conv_hyperparams,
                freeze_batchnorm=freeze_batchnorm,
                num_predictions_per_location=num_predictions_per_location,
                class_prediction_bias_init=class_prediction_bias_init,
                use_depthwise=use_depthwise,
                name='ConvolutionalClassHead_%d' % stack_index))
        if mask_head_config is not None:
            if not mask_head_config.masks_are_class_agnostic:
                logging.warning(
                    'Note that class specific mask prediction for SSD '
                    'models is memory consuming.')
            mask_prediction_heads.append(
                keras_mask_head.ConvolutionalMaskHead(
                    is_training=is_training,
                    num_classes=num_classes,
                    use_dropout=use_dropout,
                    dropout_keep_prob=dropout_keep_prob,
                    kernel_size=kernel_size,
                    conv_hyperparams=conv_hyperparams,
                    freeze_batchnorm=freeze_batchnorm,
                    num_predictions_per_location=num_predictions_per_location,
                    use_depthwise=use_depthwise,
                    mask_height=mask_head_config.mask_height,
                    mask_width=mask_head_config.mask_width,
                    masks_are_class_agnostic=mask_head_config.
                    masks_are_class_agnostic,
                    name='ConvolutionalMaskHead_%d' % stack_index))

    return convolutional_keras_box_predictor.ConvolutionalBoxPredictor(
        is_training=is_training,
        num_classes=num_classes,
        box_prediction_heads=box_prediction_heads,
        class_prediction_heads=class_prediction_heads,
        other_heads=other_heads,
        conv_hyperparams=conv_hyperparams,
        num_layers_before_predictor=num_layers_before_predictor,
        min_depth=min_depth,
        max_depth=max_depth,
        freeze_batchnorm=freeze_batchnorm,
        inplace_batchnorm_update=inplace_batchnorm_update,
        name=name)
def build_convolutional_keras_box_predictor(is_training,
                                            num_classes,
                                            conv_hyperparams,
                                            freeze_batchnorm,
                                            inplace_batchnorm_update,
                                            num_predictions_per_location_list,
                                            min_depth,
                                            max_depth,
                                            num_layers_before_predictor,
                                            use_dropout,
                                            dropout_keep_prob,
                                            kernel_size,
                                            box_code_size,
                                            add_background_class=True,
                                            class_prediction_bias_init=0.0,
                                            use_depthwise=False,
                                            box_encodings_clip_range=None,
                                            name='BoxPredictor'):
  
  box_prediction_heads = []
  class_prediction_heads = []
  other_heads = {}

  for stack_index, num_predictions_per_location in enumerate(
      num_predictions_per_location_list):
    box_prediction_heads.append(
        keras_box_head.ConvolutionalBoxHead(
            is_training=is_training,
            box_code_size=box_code_size,
            kernel_size=kernel_size,
            conv_hyperparams=conv_hyperparams,
            freeze_batchnorm=freeze_batchnorm,
            num_predictions_per_location=num_predictions_per_location,
            use_depthwise=use_depthwise,
            box_encodings_clip_range=box_encodings_clip_range,
            name='ConvolutionalBoxHead_%d' % stack_index))
    class_prediction_heads.append(
        keras_class_head.ConvolutionalClassHead(
            is_training=is_training,
            num_class_slots=(
                num_classes + 1 if add_background_class else num_classes),
            use_dropout=use_dropout,
            dropout_keep_prob=dropout_keep_prob,
            kernel_size=kernel_size,
            conv_hyperparams=conv_hyperparams,
            freeze_batchnorm=freeze_batchnorm,
            num_predictions_per_location=num_predictions_per_location,
            class_prediction_bias_init=class_prediction_bias_init,
            use_depthwise=use_depthwise,
            name='ConvolutionalClassHead_%d' % stack_index))

  return convolutional_keras_box_predictor.ConvolutionalBoxPredictor(
      is_training=is_training,
      num_classes=num_classes,
      box_prediction_heads=box_prediction_heads,
      class_prediction_heads=class_prediction_heads,
      other_heads=other_heads,
      conv_hyperparams=conv_hyperparams,
      num_layers_before_predictor=num_layers_before_predictor,
      min_depth=min_depth,
      max_depth=max_depth,
      freeze_batchnorm=freeze_batchnorm,
      inplace_batchnorm_update=inplace_batchnorm_update,
      name=name)