// Copyright 2019 The MediaPipe Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto2";

package mediapipe;

import "mediapipe/framework/calculator.proto";

// Options to generate anchors for SSD object detection models.
message SsdAnchorsCalculatorOptions {
  extend mediapipe.CalculatorOptions {
    optional SsdAnchorsCalculatorOptions ext = 247258239;
  }
  // Size of input images.
  optional int32 input_size_width = 1;   // required
  optional int32 input_size_height = 2;  // required

  // Min and max scales for generating anchor boxes on feature maps.
  optional float min_scale = 3;  // required
  optional float max_scale = 4;  // required

  // The offset for the center of anchors. The value is in the scale of stride.
  // E.g. 0.5 meaning 0.5 * |current_stride| in pixels.
  optional float anchor_offset_x = 5 [default = 0.5];  // required
  optional float anchor_offset_y = 6 [default = 0.5];  // required

  // Number of output feature maps to generate the anchors on.
  optional int32 num_layers = 7;  // required
  // Sizes of output feature maps to create anchors. Either feature_map size or
  // stride should be provided.
  repeated int32 feature_map_width = 8;
  repeated int32 feature_map_height = 9;
  // Strides of each output feature maps.
  repeated int32 strides = 10;

  // List of different aspect ratio to generate anchors.
  repeated float aspect_ratios = 11;

  // A boolean to indicate whether the fixed 3 boxes per location is used in the
  // lowest layer.
  optional bool reduce_boxes_in_lowest_layer = 12 [default = false];
  // An additional anchor is added with this aspect ratio and a scale
  // interpolated between the scale for a layer and the scale for the next layer
  // (1.0 for the last layer). This anchor is not included if this value is 0.
  optional float interpolated_scale_aspect_ratio = 13 [default = 1.0];

  // Whether use fixed width and height (e.g. both 1.0f) for each anchor.
  // This option can be used when the predicted anchor width and height are in
  // pixels.
  optional bool fixed_anchor_size = 14 [default = false];

  // Generates grid anchors on the fly corresponding to multiple CNN layers as
  // described in:
  // "Focal Loss for Dense Object Detection" (https://arxiv.org/abs/1708.02002)
  //  T.-Y. Lin, P. Goyal, R. Girshick, K. He, P. Dollar
  optional bool multiscale_anchor_generation = 15 [default = false];

  // minimum level in feature pyramid
  // for multiscale_anchor_generation only!
  optional int32 min_level = 16 [default = 3];

  // maximum level in feature pyramid
  // for multiscale_anchor_generation only!
  optional int32 max_level = 17 [default = 7];

  // Scale of anchor to feature stride
  // for multiscale_anchor_generation only!
  optional float anchor_scale = 18 [default = 4.0];

  // Number of intermediate scale each scale octave
  // for multiscale_anchor_generation only!
  optional int32 scales_per_octave = 19 [default = 2];

  // Whether to produce anchors in normalized coordinates.
  // for multiscale_anchor_generation only!
  optional bool normalize_coordinates = 20 [default = true];
}
