/* Copyright 2019 The TensorFlow Authors. All Rights Reserved.

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 lstm_object_detection.tflite.protos;

// The bounding box representation by center location and width/height.
// Also includes optional keypoint coordinates.
// It is a default representation in modern object detection systems.
message CenterSizeEncoding {
  // Encoded anchor box center.
  repeated float y = 1;
  repeated float x = 2;

  // Encoded anchor box height.
  repeated float h = 3;

  // Encoded anchor box width.
  repeated float w = 4;

  // Encoded keypoint coordinates.
  repeated float keypoint_y = 5;
  repeated float keypoint_x = 6;
}

// The scaling factors for decoding predicted offsets with CenterSizeEncoding.
// For example, given a prediction and an anchor in CenterSizeEncoding, the
// decoded location is:
//   y = prediction.y / coder.y_scale() * anchor.h + anchor.y;
//   x = prediction.x / coder.x_scale() * anchor.w + anchor.x;
//   h = exp(prediction.h / coder.h_scale()) * anchor.h;
//   w = exp(prediction.w / coder.w_scale()) * anchor.w;
//   keypoint_y = prediction.keypoint_y / coder.keypoint_y_scale() * anchor.h
//                + anchor.y;
//   keypoint_x = prediction.keypoint_x / coder.keypoint_x_scale() * anchor.w
//                + anchor.x;
// See mobile_ssd::DecodeCenterSizeBoxes for more details.
// This coder is compatible with models trained using
// object_detection.protos.FasterRcnnBoxCoder and
// object_detection.protos.KeypointBoxCoder.
message CenterSizeOffsetCoder {
  // Scale factor for encoded box center offset.
  optional float y_scale = 1 [default = 10.0];
  optional float x_scale = 2 [default = 10.0];

  // Scale factor for encoded box height offset.
  optional float h_scale = 3 [default = 5.0];

  // Scale factor for encoded box width offset.
  optional float w_scale = 4 [default = 5.0];

  // Scale factor for encoded keypoint coordinate offset.
  optional float keypoint_y_scale = 5 [default = 10.0];
  optional float keypoint_x_scale = 6 [default = 10.0];
}

// The canonical representation of bounding box.
message BoxCornerEncoding {
  // Box corners.
  repeated float ymin = 1;
  repeated float xmin = 2;
  repeated float ymax = 3;
  repeated float xmax = 4;

  // Keypoint coordinates.
  repeated float keypoint_y = 5;
  repeated float keypoint_x = 6;
}

// The scaling value used to adjust predicted bounding box corners.
// For example, given a prediction in BoxCornerEncoding and an anchor in
// CenterSizeEncoding, the decoded location is:
//   ymin = prediction.ymin * coder.stddev + anchor.y - anchor.h / 2
//   xmin = prediction.xmin * coder.stddev + anchor.x - anchor.w / 2
//   ymax = prediction.ymax * coder.stddev + anchor.y + anchor.h / 2
//   xmax = prediction.xmax * coder.stddev + anchor.x + anchor.w / 2
// This coder doesn't support keypoints.
// See mobile_ssd::DecodeBoxCornerBoxes for more details.
// This coder is compatible with models trained using
// object_detection.protos.MeanStddevBoxCoder.
message BoxCornerOffsetCoder {
  // The standard deviation used to encode and decode boxes.
  optional float stddev = 1 [default = 0.01];
}
