syntax = "proto2"; package object_detection.protos; import "object_detection/protos/calibration.proto"; // Configuration proto for non-max-suppression operation on a batch of // detections. message BatchNonMaxSuppression { // Scalar threshold for score (low scoring boxes are removed). optional float score_threshold = 1 [default = 0.0]; // Scalar threshold for IOU (boxes that have high IOU overlap // with previously selected boxes are removed). optional float iou_threshold = 2 [default = 0.6]; // Maximum number of detections to retain per class. optional int32 max_detections_per_class = 3 [default = 100]; // Maximum number of detections to retain across all classes. optional int32 max_total_detections = 5 [default = 100]; // Whether to use the implementation of NMS that guarantees static shapes. optional bool use_static_shapes = 6 [default = false]; // Whether to use class agnostic NMS. // Class-agnostic NMS function implements a class-agnostic version // of Non Maximal Suppression where if max_classes_per_detection=k, // 1) we keep the top-k scores for each detection and // 2) during NMS, each detection only uses the highest class score for sorting. // 3) Compared to regular NMS, the worst runtime of this version is O(N^2) // instead of O(KN^2) where N is the number of detections and K the number of // classes. optional bool use_class_agnostic_nms = 7 [default = false]; // Number of classes retained per detection in class agnostic NMS. optional int32 max_classes_per_detection = 8 [default = 1]; // Soft NMS sigma parameter; Bodla et al, https://arxiv.org/abs/1704.04503) optional float soft_nms_sigma = 9 [default = 0.0]; // Whether to use partitioned version of non_max_suppression. optional bool use_partitioned_nms = 10 [default = false]; // Whether to use tf.image.combined_non_max_suppression. optional bool use_combined_nms = 11 [default = false]; // Whether to change coordinate frame of the boxlist to be relative to // window's frame. optional bool change_coordinate_frame = 12 [default = true]; // Use hard NMS. Note that even if this field is set false, the behavior of // NMS will be equivalent to hard NMS; This field when set to true forces the // tf.image.non_max_suppression function to be called instead // of tf.image.non_max_suppression_with_scores and can be used to // export models for older versions of TF. optional bool use_hard_nms = 13 [default = false]; } // Configuration proto for post-processing predicted boxes and // scores. message PostProcessing { // Non max suppression parameters. optional BatchNonMaxSuppression batch_non_max_suppression = 1; // Enum to specify how to convert the detection scores. enum ScoreConverter { // Input scores equals output scores. IDENTITY = 0; // Applies a sigmoid on input scores. SIGMOID = 1; // Applies a softmax on input scores SOFTMAX = 2; } // Score converter to use. optional ScoreConverter score_converter = 2 [default = IDENTITY]; // Scale logit (input) value before conversion in post-processing step. // Typically used for softmax distillation, though can be used to scale for // other reasons. optional float logit_scale = 3 [default = 1.0]; // Calibrate score outputs. Calibration is applied after score converter // and before non max suppression. optional CalibrationConfig calibration_config = 4; }