syntax = "proto3";

package second.protos;
import "second/protos/losses.proto";
import "second/protos/box_coder.proto";
import "second/protos/target.proto";
import "second/protos/voxel_generator.proto";

message VoxelNet {
  uint32 num_class = 1;
  message VoxelFeatureExtractor {
    string module_class_name = 1;
    repeated uint32 num_filters = 2;
    bool with_distance = 3;
  }
  VoxelFeatureExtractor voxel_feature_extractor = 2;
  message MiddleFeatureExtractor {
    string module_class_name = 1;
    repeated uint32 num_filters_down1 = 2;
    repeated uint32 num_filters_down2 = 3;
  }
  MiddleFeatureExtractor middle_feature_extractor = 3;
  message RPN {
    string module_class_name = 1;
    repeated uint32 layer_nums = 2;
    repeated uint32 layer_strides = 3;
    repeated uint32 num_filters = 4;
    repeated uint32 upsample_strides = 5;
    repeated uint32 num_upsample_filters = 6;
    bool use_groupnorm = 7;
    uint32 num_groups = 8;
  }
  RPN rpn = 4;
  bool use_sigmoid_score = 5;
  Loss loss = 6;
  bool encode_rad_error_by_sin = 7;
  bool encode_background_as_zeros = 8;
  bool use_aux_classifier = 9;
  bool use_rotate_nms = 10;
  bool use_multi_class_nms = 11;
  uint32 nms_pre_max_size = 12;
  uint32 nms_post_max_size = 13;
  float nms_score_threshold = 14;
  float nms_iou_threshold = 15;
  repeated float post_center_limit_range = 16;
  bool use_direction_classifier = 17;
  float direction_loss_weight = 18;
  float pos_class_weight = 19;
  float neg_class_weight = 20;
  enum LossNormType {
    NormByNumExamples = 0;
    NormByNumPositives = 1;
    NormByNumPosNeg = 2;
  }
  LossNormType loss_norm_type = 21;
  bool use_bev = 22;
  bool without_reflectivity = 23;
  bool encode_angle_to_vector = 24;
  BoxCoder box_coder = 25;
  TargetAssigner target_assigner = 26;
  bool lidar_input = 27;
  uint32 num_point_features = 28;
  VoxelGenerator voxel_generator = 29;
}