syntax = "proto2";

package object_detection.protos;

// Configuration proto for the convolution op hyperparameters to use in the
// object detection pipeline.
message Hyperparams {

  // Operations affected by hyperparameters.
  enum Op {
    // Convolution, Separable Convolution, Convolution transpose.
    CONV = 1;

    // Fully connected
    FC = 2;
  }
  optional Op op = 1 [default = CONV];

  // Regularizer for the weights of the convolution op.
  optional Regularizer regularizer = 2;

  // Initializer for the weights of the convolution op.
  optional Initializer initializer = 3;

  // Type of activation to apply after convolution.
  enum Activation {
    // Use None (no activation)
    NONE = 0;

    // Use tf.nn.relu
    RELU = 1;

    // Use tf.nn.relu6
    RELU_6 = 2;

    // Use tf.nn.swish
    SWISH = 3;
  }
  optional Activation activation = 4 [default = RELU];

  oneof normalizer_oneof {
    // Note that if nothing below is selected, then no normalization is applied
    // BatchNorm hyperparameters.
    BatchNorm batch_norm = 5;
    // SyncBatchNorm hyperparameters (KerasLayerHyperparams only).
    BatchNorm sync_batch_norm = 9;
    // GroupNorm hyperparameters. This is only supported on a subset of models.
    // Note that the current implementation of group norm instantiated in
    // tf.contrib.group.layers.group_norm() only supports fixed_size_resizer
    // for image preprocessing.
    GroupNorm group_norm = 7;
  }

  // Whether depthwise convolutions should be regularized. If this parameter is
  // NOT set then the conv hyperparams will default to the parent scope.
  optional bool regularize_depthwise = 6 [default = false];

  // By default, use_bias is set to False if batch_norm is not None and
  // batch_norm.center is True. When force_use_bias is set to True, this
  // behavior will be overridden, and use_bias will be set to True, regardless
  // of batch norm parameters. Note, this only applies to KerasLayerHyperparams.
  optional bool force_use_bias = 8 [default = false];
}

// Proto with one-of field for regularizers.
message Regularizer {
  oneof regularizer_oneof {
    L1Regularizer l1_regularizer = 1;
    L2Regularizer l2_regularizer = 2;
  }
}

// Configuration proto for L1 Regularizer.
// See https://www.tensorflow.org/api_docs/python/tf/contrib/layers/l1_regularizer
message L1Regularizer {
  optional float weight = 1 [default = 1.0];
}

// Configuration proto for L2 Regularizer.
// See https://www.tensorflow.org/api_docs/python/tf/contrib/layers/l2_regularizer
message L2Regularizer {
  optional float weight = 1 [default = 1.0];
}

// Proto with one-of field for initializers.
message Initializer {
  oneof initializer_oneof {
    TruncatedNormalInitializer truncated_normal_initializer = 1;
    VarianceScalingInitializer variance_scaling_initializer = 2;
    RandomNormalInitializer random_normal_initializer = 3;
    // Allows specifying initializers by name, as a string, which will be passed
    // directly as an argument during layer construction. Currently, this is
    // only supported when using KerasLayerHyperparams, and for valid Keras
    // initializers, e.g. `glorot_uniform`, `variance_scaling`, etc.
    string keras_initializer_by_name = 4;
  }
}

// Configuration proto for truncated normal initializer. See
// https://www.tensorflow.org/api_docs/python/tf/truncated_normal_initializer
message TruncatedNormalInitializer {
  optional float mean = 1 [default = 0.0];
  optional float stddev = 2 [default = 1.0];
}

// Configuration proto for variance scaling initializer. See
// https://www.tensorflow.org/api_docs/python/tf/contrib/layers/
// variance_scaling_initializer
message VarianceScalingInitializer {
  optional float factor = 1 [default = 2.0];
  optional bool uniform = 2 [default = false];
  enum Mode {
    FAN_IN = 0;
    FAN_OUT = 1;
    FAN_AVG = 2;
  }
  optional Mode mode = 3 [default = FAN_IN];
}

// Configuration proto for random normal initializer. See
// https://www.tensorflow.org/api_docs/python/tf/random_normal_initializer
message RandomNormalInitializer {
  optional float mean = 1 [default = 0.0];
  optional float stddev = 2 [default = 1.0];
}

// Configuration proto for batch norm to apply after convolution op. See
// https://www.tensorflow.org/api_docs/python/tf/contrib/layers/batch_norm
message BatchNorm {
  optional float decay = 1 [default = 0.999];
  optional bool center = 2 [default = true];
  optional bool scale = 3 [default = false];
  optional float epsilon = 4 [default = 0.001];
  // Whether to train the batch norm variables. If this is set to false during
  // training, the current value of the batch_norm variables are used for
  // forward pass but they are never updated.
  optional bool train = 5 [default = true];
}

// Configuration proto for group normalization to apply after convolution op.
// https://arxiv.org/abs/1803.08494
message GroupNorm {
}
