def __init__(self, output_shape, num_class=2, num_input_features=4, vfe_class_name="VoxelFeatureExtractor", vfe_num_filters=[32, 128], with_distance=False, middle_class_name="SparseMiddleExtractor", middle_num_input_features=-1, middle_num_filters_d1=[64], middle_num_filters_d2=[64, 64], rpn_class_name="RPN", rpn_num_input_features=-1, rpn_layer_nums=[3, 5, 5], rpn_layer_strides=[2, 2, 2], rpn_num_filters=[128, 128, 256], rpn_upsample_strides=[1, 2, 4], rpn_num_upsample_filters=[256, 256, 256], use_norm=True, use_groupnorm=False, num_groups=32, use_direction_classifier=True, use_sigmoid_score=False, encode_background_as_zeros=True, use_rotate_nms=True, multiclass_nms=False, nms_score_thresholds=None, nms_pre_max_sizes=None, nms_post_max_sizes=None, nms_iou_thresholds=None, target_assigner=None, cls_loss_weight=1.0, loc_loss_weight=1.0, pos_cls_weight=1.0, neg_cls_weight=1.0, direction_loss_weight=1.0, loss_norm_type=LossNormType.NormByNumPositives, encode_rad_error_by_sin=False, loc_loss_ftor=None, cls_loss_ftor=None, measure_time=False, voxel_generator=None, post_center_range=None, dir_offset=0.0, sin_error_factor=1.0, nms_class_agnostic=False, num_direction_bins=2, direction_limit_offset=0, name='voxelnet'): super().__init__() self.name = name self._sin_error_factor = sin_error_factor self._num_class = num_class self._use_rotate_nms = use_rotate_nms self._multiclass_nms = multiclass_nms self._nms_score_thresholds = nms_score_thresholds self._nms_pre_max_sizes = nms_pre_max_sizes self._nms_post_max_sizes = nms_post_max_sizes self._nms_iou_thresholds = nms_iou_thresholds self._use_sigmoid_score = use_sigmoid_score self._encode_background_as_zeros = encode_background_as_zeros self._use_direction_classifier = use_direction_classifier self._num_input_features = num_input_features self._box_coder = target_assigner.box_coder self.target_assigner = target_assigner self.voxel_generator = voxel_generator self._pos_cls_weight = pos_cls_weight self._neg_cls_weight = neg_cls_weight self._encode_rad_error_by_sin = encode_rad_error_by_sin self._loss_norm_type = loss_norm_type self._dir_loss_ftor = WeightedSoftmaxClassificationLoss() self._diff_loc_loss_ftor = WeightedSmoothL1LocalizationLoss() self._dir_offset = dir_offset self._loc_loss_ftor = loc_loss_ftor self._cls_loss_ftor = cls_loss_ftor self._direction_loss_weight = direction_loss_weight self._cls_loss_weight = cls_loss_weight self._loc_loss_weight = loc_loss_weight self._post_center_range = post_center_range or [] self.measure_time = measure_time self._nms_class_agnostic = nms_class_agnostic self._num_direction_bins = num_direction_bins self._dir_limit_offset = direction_limit_offset self.voxel_feature_extractor = voxel_encoder.get_vfe_class( vfe_class_name)( num_input_features, use_norm, num_filters=vfe_num_filters, with_distance=with_distance, voxel_size=self.voxel_generator.voxel_size, pc_range=self.voxel_generator.point_cloud_range, ) self.middle_feature_extractor = middle.get_middle_class( middle_class_name)(output_shape, use_norm, num_input_features=middle_num_input_features, num_filters_down1=middle_num_filters_d1, num_filters_down2=middle_num_filters_d2) self.rpn = rpn.get_rpn_class(rpn_class_name)( use_norm=True, num_class=num_class, layer_nums=rpn_layer_nums, layer_strides=rpn_layer_strides, num_filters=rpn_num_filters, upsample_strides=rpn_upsample_strides, num_upsample_filters=rpn_num_upsample_filters, num_input_features=rpn_num_input_features, num_anchor_per_loc=target_assigner.num_anchors_per_location, encode_background_as_zeros=encode_background_as_zeros, use_direction_classifier=use_direction_classifier, use_groupnorm=use_groupnorm, num_groups=num_groups, box_code_size=target_assigner.box_coder.code_size, num_direction_bins=self._num_direction_bins) self.rpn_acc = metrics.Accuracy( dim=-1, encode_background_as_zeros=encode_background_as_zeros) self.rpn_precision = metrics.Precision(dim=-1) self.rpn_recall = metrics.Recall(dim=-1) self.rpn_metrics = metrics.PrecisionRecall( dim=-1, thresholds=[0.1, 0.3, 0.5, 0.7, 0.8, 0.9, 0.95], use_sigmoid_score=use_sigmoid_score, encode_background_as_zeros=encode_background_as_zeros) self.rpn_cls_loss = metrics.Scalar() self.rpn_loc_loss = metrics.Scalar() self.rpn_total_loss = metrics.Scalar() self.register_buffer("global_step", torch.LongTensor(1).zero_()) self._time_dict = {} self._time_total_dict = {} self._time_count_dict = {}
def __init__(self, output_shape, num_class=2, num_input_features=4, vfe_class_name="VoxelFeatureExtractor", vfe_num_filters=[32, 128], with_distance=False, middle_class_name="SparseMiddleExtractor", middle_num_input_features=-1, middle_num_filters_d1=[64], middle_num_filters_d2=[64, 64], rpn_class_name="RPN", rpn_num_input_features=-1, rpn_layer_nums=[3, 5, 5], rpn_layer_strides=[2, 2, 2], rpn_num_filters=[128, 128, 256], rpn_upsample_strides=[1, 2, 4], rpn_num_upsample_filters=[256, 256, 256], use_norm=True, use_groupnorm=False, num_groups=32, use_direction_classifier=True, use_sigmoid_score=False, encode_background_as_zeros=True, use_rotate_nms=True, multiclass_nms=False, nms_score_thresholds=None, nms_pre_max_sizes=None, nms_post_max_sizes=None, nms_iou_thresholds=None, target_assigner=None, cls_loss_weight=1.0, loc_loss_weight=1.0, pos_cls_weight=1.0, neg_cls_weight=1.0, direction_loss_weight=1.0, loss_norm_type=LossNormType.NormByNumPositives, encode_rad_error_by_sin=False, loc_loss_ftor=None, cls_loss_ftor=None, measure_time=False, voxel_generator=None, post_center_range=None, dir_offset=0.0, sin_error_factor=1.0, nms_class_agnostic=False, num_direction_bins=2, direction_limit_offset=0, name='voxelnet'): super().__init__() self.name = name self._sin_error_factor = sin_error_factor self._num_class = num_class self._use_rotate_nms = use_rotate_nms self._multiclass_nms = multiclass_nms self._nms_score_thresholds = nms_score_thresholds self._nms_pre_max_sizes = nms_pre_max_sizes self._nms_post_max_sizes = nms_post_max_sizes self._nms_iou_thresholds = nms_iou_thresholds self._use_sigmoid_score = use_sigmoid_score self._encode_background_as_zeros = encode_background_as_zeros self._use_direction_classifier = use_direction_classifier self._num_input_features = num_input_features self._box_coder = target_assigner.box_coder self.target_assigner = target_assigner self.voxel_generator = voxel_generator self._pos_cls_weight = pos_cls_weight self._neg_cls_weight = neg_cls_weight self._encode_rad_error_by_sin = encode_rad_error_by_sin self._loss_norm_type = loss_norm_type self._dir_loss_ftor = WeightedSoftmaxClassificationLoss() self._diff_loc_loss_ftor = WeightedSmoothL1LocalizationLoss() self._dir_offset = dir_offset self._loc_loss_ftor = loc_loss_ftor self._cls_loss_ftor = cls_loss_ftor self._direction_loss_weight = direction_loss_weight self._cls_loss_weight = cls_loss_weight self._loc_loss_weight = loc_loss_weight self._post_center_range = post_center_range or [] self.measure_time = measure_time self._nms_class_agnostic = nms_class_agnostic self._num_direction_bins = num_direction_bins self._dir_limit_offset = direction_limit_offset self.voxel_feature_extractor = voxel_encoder.get_vfe_class(vfe_class_name)( num_input_features, use_norm, num_filters=vfe_num_filters, with_distance=with_distance, voxel_size=self.voxel_generator.voxel_size, pc_range=self.voxel_generator.point_cloud_range, ) self.middle_feature_extractor = middle.get_middle_class(middle_class_name)( output_shape, use_norm, num_input_features=middle_num_input_features, num_filters_down1=middle_num_filters_d1, num_filters_down2=middle_num_filters_d2) self._rpn_layer_nums = rpn_layer_nums self.rpn = rpn.get_rpn_class(rpn_class_name)( use_norm=True, num_class=num_class, layer_nums=rpn_layer_nums, layer_strides=rpn_layer_strides, num_filters=rpn_num_filters, upsample_strides=rpn_upsample_strides, num_upsample_filters=rpn_num_upsample_filters, num_input_features=rpn_num_input_features, num_anchor_per_loc=target_assigner.num_anchors_per_location, encode_background_as_zeros=encode_background_as_zeros, use_direction_classifier=use_direction_classifier, use_groupnorm=use_groupnorm, num_groups=num_groups, box_code_size=target_assigner.box_coder.code_size, num_direction_bins=self._num_direction_bins) self.rpn_acc = metrics.Accuracy( dim=-1, encode_background_as_zeros=encode_background_as_zeros) self.rpn_precision = metrics.Precision(dim=-1) self.rpn_recall = metrics.Recall(dim=-1) self.rpn_metrics = metrics.PrecisionRecall( dim=-1, thresholds=[0.1, 0.3, 0.5, 0.7, 0.8, 0.9, 0.95], use_sigmoid_score=use_sigmoid_score, encode_background_as_zeros=encode_background_as_zeros) self.rpn_cls_loss = metrics.Scalar() self.rpn_loc_loss = metrics.Scalar() self.rpn_total_loss = metrics.Scalar() self.register_buffer("global_step", torch.LongTensor(1).zero_()) self._time_dict = { 'PFE': [], #'PillarGen': [], #'PillarPrep': [], #'PillarFeatureNet': [], #'PillarScatter': [], 'RPN-stage-1': [], 'RPN-stage-2': [], 'RPN-stage-3': [], 'RPN-finalize': [], 'Predict': [], 'Pre-stage-1': [], 'Post-stage-1': [], 'End-to-end': [],} self._cuda_event_dict = copy.deepcopy(self._time_dict) self._det_num = 1 self._dump_scores = False if self._dump_scores: for i in range(1, len(rpn_layer_nums) + 1): mypath = os.getenv('HOME') + "/scores_" + str(i) if not os.path.exists(mypath): os.makedirs(mypath) #self._cuda_streams = [] #for i in range(4): # We are assuming 4 slices # self._cuda_streams.append(torch.cuda.Stream()) self._num_class_with_bg = self._num_class if not self._encode_background_as_zeros: self._num_class_with_bg = self._num_class + 1