def build(model_cfg: second_pb2.VoxelNet, voxel_generator, target_assigner, measure_time=False): """build second pytorch instance. """ if not isinstance(model_cfg, second_pb2.VoxelNet): raise ValueError('model_cfg not of type ' 'second_pb2.VoxelNet.') vfe_num_filters = list(model_cfg.voxel_feature_extractor.num_filters) vfe_with_distance = model_cfg.voxel_feature_extractor.with_distance grid_size = voxel_generator.grid_size dense_shape = [1] + grid_size[::-1].tolist() + [vfe_num_filters[-1]] classes_cfg = model_cfg.target_assigner.class_settings num_class = len(classes_cfg) use_mcnms = [c.use_multi_class_nms for c in classes_cfg] use_rotate_nms = [c.use_rotate_nms for c in classes_cfg] if len(model_cfg.target_assigner.nms_pre_max_sizes) != 0: nms_pre_max_sizes = list(model_cfg.target_assigner.nms_pre_max_sizes) assert len(nms_pre_max_sizes) == num_class else: nms_pre_max_sizes = [c.nms_pre_max_size for c in classes_cfg] if len(model_cfg.target_assigner.nms_post_max_sizes) != 0: nms_post_max_sizes = list(model_cfg.target_assigner.nms_post_max_sizes) assert len(nms_post_max_sizes) == num_class else: nms_post_max_sizes = [c.nms_post_max_size for c in classes_cfg] if len(model_cfg.target_assigner.nms_score_thresholds) != 0: nms_score_thresholds = list( model_cfg.target_assigner.nms_score_thresholds) assert len(nms_score_thresholds) == num_class else: nms_score_thresholds = [c.nms_score_threshold for c in classes_cfg] if len(model_cfg.target_assigner.nms_iou_thresholds) != 0: nms_iou_thresholds = list(model_cfg.target_assigner.nms_iou_thresholds) assert len(nms_iou_thresholds) == num_class else: nms_iou_thresholds = [c.nms_iou_threshold for c in classes_cfg] assert all(use_mcnms) or all([not b for b in use_mcnms]), "not implemented" assert all(use_rotate_nms) or all([not b for b in use_rotate_nms ]), "not implemented" if all([not b for b in use_mcnms]): assert all([e == nms_pre_max_sizes[0] for e in nms_pre_max_sizes]) assert all([e == nms_post_max_sizes[0] for e in nms_post_max_sizes]) assert all( [e == nms_score_thresholds[0] for e in nms_score_thresholds]) assert all([e == nms_iou_thresholds[0] for e in nms_iou_thresholds]) num_input_features = model_cfg.num_point_features loss_norm_type_dict = { 0: LossNormType.NormByNumExamples, 1: LossNormType.NormByNumPositives, 2: LossNormType.NormByNumPosNeg, 3: LossNormType.DontNorm, } loss_norm_type = loss_norm_type_dict[model_cfg.loss_norm_type] losses = losses_builder.build(model_cfg.loss) encode_rad_error_by_sin = model_cfg.encode_rad_error_by_sin cls_loss_ftor, loc_loss_ftor, cls_weight, loc_weight, _ = losses pos_cls_weight = model_cfg.pos_class_weight neg_cls_weight = model_cfg.neg_class_weight direction_loss_weight = model_cfg.direction_loss_weight sin_error_factor = model_cfg.sin_error_factor if sin_error_factor == 0: sin_error_factor = 1.0 print("CLASS NAME:", model_cfg.network_class_name) net = get_voxelnet_class(model_cfg.network_class_name)( dense_shape, num_class=num_class, vfe_class_name=model_cfg.voxel_feature_extractor.module_class_name, vfe_num_filters=vfe_num_filters, middle_class_name=model_cfg.middle_feature_extractor.module_class_name, middle_num_input_features=model_cfg.middle_feature_extractor. num_input_features, middle_num_filters_d1=list( model_cfg.middle_feature_extractor.num_filters_down1), middle_num_filters_d2=list( model_cfg.middle_feature_extractor.num_filters_down2), rpn_class_name=model_cfg.rpn.module_class_name, rpn_num_input_features=model_cfg.rpn.num_input_features, rpn_layer_nums=list(model_cfg.rpn.layer_nums), rpn_layer_strides=list(model_cfg.rpn.layer_strides), rpn_num_filters=list(model_cfg.rpn.num_filters), rpn_upsample_strides=list(model_cfg.rpn.upsample_strides), rpn_num_upsample_filters=list(model_cfg.rpn.num_upsample_filters), use_norm=True, use_rotate_nms=all(use_rotate_nms), multiclass_nms=all(use_mcnms), nms_score_thresholds=nms_score_thresholds, nms_pre_max_sizes=nms_pre_max_sizes, nms_post_max_sizes=nms_post_max_sizes, nms_iou_thresholds=nms_iou_thresholds, use_sigmoid_score=model_cfg.use_sigmoid_score, encode_background_as_zeros=model_cfg.encode_background_as_zeros, use_direction_classifier=model_cfg.use_direction_classifier, num_input_features=num_input_features, num_groups=model_cfg.rpn.num_groups, use_groupnorm=model_cfg.rpn.use_groupnorm, with_distance=vfe_with_distance, cls_loss_weight=cls_weight, loc_loss_weight=loc_weight, pos_cls_weight=pos_cls_weight, neg_cls_weight=neg_cls_weight, direction_loss_weight=direction_loss_weight, loss_norm_type=loss_norm_type, encode_rad_error_by_sin=encode_rad_error_by_sin, loc_loss_ftor=loc_loss_ftor, cls_loss_ftor=cls_loss_ftor, target_assigner=target_assigner, measure_time=measure_time, voxel_generator=voxel_generator, post_center_range=list(model_cfg.post_center_limit_range), dir_offset=model_cfg.direction_offset, sin_error_factor=sin_error_factor, nms_class_agnostic=model_cfg.nms_class_agnostic, num_direction_bins=model_cfg.num_direction_bins, direction_limit_offset=model_cfg.direction_limit_offset, ) return net
def build(model_cfg: second_pb2.VoxelNet, voxel_generator, target_assigner, measure_time=False): """build second pytorch instance. """ if not isinstance(model_cfg, second_pb2.VoxelNet): raise ValueError('model_cfg not of type ' 'second_pb2.VoxelNet.') vfe_num_filters = list(model_cfg.voxel_feature_extractor.num_filters) #64 vfe_with_distance = model_cfg.voxel_feature_extractor.with_distance #false grid_size = voxel_generator.grid_size #[400,400,1] max=400 dense_shape = [1] + grid_size[::-1].tolist() + [vfe_num_filters[-1]] #[1,1,400,400,64] classes_cfg = model_cfg.target_assigner.class_settings num_class = len(classes_cfg) #10 use_mcnms = [c.use_multi_class_nms for c in classes_cfg] #false use_rotate_nms = [c.use_rotate_nms for c in classes_cfg] #false if len(model_cfg.target_assigner.nms_pre_max_sizes) != 0: nms_pre_max_sizes = list(model_cfg.target_assigner.nms_pre_max_sizes) assert len(nms_pre_max_sizes) == num_class else: nms_pre_max_sizes = [c.nms_pre_max_size for c in classes_cfg] if len(model_cfg.target_assigner.nms_post_max_sizes) != 0: nms_post_max_sizes = list(model_cfg.target_assigner.nms_post_max_sizes) assert len(nms_post_max_sizes) == num_class else: nms_post_max_sizes = [c.nms_post_max_size for c in classes_cfg] if len(model_cfg.target_assigner.nms_score_thresholds) != 0: nms_score_thresholds = list(model_cfg.target_assigner.nms_score_thresholds) assert len(nms_score_thresholds) == num_class else: nms_score_thresholds = [c.nms_score_threshold for c in classes_cfg] if len(model_cfg.target_assigner.nms_iou_thresholds) != 0: nms_iou_thresholds = list(model_cfg.target_assigner.nms_iou_thresholds) assert len(nms_iou_thresholds) == num_class else: nms_iou_thresholds = [c.nms_iou_threshold for c in classes_cfg] assert all(use_mcnms) or all([not b for b in use_mcnms]), "not implemented" #false assert all(use_rotate_nms) or all([not b for b in use_rotate_nms]), "not implemented" if all([not b for b in use_mcnms]): assert all([e == nms_pre_max_sizes[0] for e in nms_pre_max_sizes]) #e:1000 assert all([e == nms_post_max_sizes[0] for e in nms_post_max_sizes]) #e:300 assert all([e == nms_score_thresholds[0] for e in nms_score_thresholds]) #e:0.05 assert all([e == nms_iou_thresholds[0] for e in nms_iou_thresholds]) #e:0.5 num_input_features = model_cfg.num_point_features #4 loss_norm_type_dict = { 0: LossNormType.NormByNumExamples, 1: LossNormType.NormByNumPositives, 2: LossNormType.NormByNumPosNeg, 3: LossNormType.DontNorm, } loss_norm_type = loss_norm_type_dict[model_cfg.loss_norm_type] losses = losses_builder.build(model_cfg.loss) encode_rad_error_by_sin = model_cfg.encode_rad_error_by_sin cls_loss_ftor, loc_loss_ftor, cls_weight, loc_weight, _ = losses pos_cls_weight = model_cfg.pos_class_weight #1.0 neg_cls_weight = model_cfg.neg_class_weight #1.0 direction_loss_weight = model_cfg.direction_loss_weight #0.2 sin_error_factor = model_cfg.sin_error_factor #1.0 if sin_error_factor == 0: sin_error_factor = 1.0 net = get_voxelnet_class(model_cfg.network_class_name)( #network_class_name :VoxelNet dense_shape, #[1,1,400,400,64] num_class=num_class, vfe_class_name=model_cfg.voxel_feature_extractor.module_class_name, #module_calss_name:pillarfeaturenet # vfe_radar_class_name = model_cfg.voxel_radar_feature_extractor.module_radar_class_name, vfe_num_filters=vfe_num_filters, #64 middle_class_name=model_cfg.middle_feature_extractor.module_class_name, #pointpillarscatter middle_num_input_features=model_cfg.middle_feature_extractor.num_input_features, #64 middle_num_filters_d1=list( model_cfg.middle_feature_extractor.num_filters_down1), middle_num_filters_d2=list( model_cfg.middle_feature_extractor.num_filters_down2), rpn_class_name=model_cfg.rpn.module_class_name, #RPNV2 rpn_num_input_features=model_cfg.rpn.num_input_features, #64 rpn_layer_nums=list(model_cfg.rpn.layer_nums), #[3,5,5] rpn_layer_strides=list(model_cfg.rpn.layer_strides), #[2,2,2] rpn_num_filters=list(model_cfg.rpn.num_filters), #[64,128,256] rpn_upsample_strides=list(model_cfg.rpn.upsample_strides),#[0.25,0.5,1] rpn_num_upsample_filters=list(model_cfg.rpn.num_upsample_filters), #[128,128,128] use_norm=True, use_rotate_nms=all(use_rotate_nms), multiclass_nms=all(use_mcnms), nms_score_thresholds=nms_score_thresholds, #[0.05] nms_pre_max_sizes=nms_pre_max_sizes, #1000 nms_post_max_sizes=nms_post_max_sizes, #300 nms_iou_thresholds=nms_iou_thresholds, #0.5 use_sigmoid_score=model_cfg.use_sigmoid_score, #true encode_background_as_zeros=model_cfg.encode_background_as_zeros, #true use_direction_classifier=model_cfg.use_direction_classifier, #true num_input_features=num_input_features, #4 num_groups=model_cfg.rpn.num_groups, #32 use_groupnorm=model_cfg.rpn.use_groupnorm, #false with_distance=vfe_with_distance, #false cls_loss_weight=cls_weight, #1 loc_loss_weight=loc_weight, #1 pos_cls_weight=pos_cls_weight, #1 neg_cls_weight=neg_cls_weight, #1 direction_loss_weight=direction_loss_weight, #0.2 loss_norm_type=loss_norm_type, encode_rad_error_by_sin=encode_rad_error_by_sin, #true loc_loss_ftor=loc_loss_ftor, cls_loss_ftor=cls_loss_ftor, target_assigner=target_assigner, measure_time=measure_time, #false voxel_generator=voxel_generator, #voxel_size高20,底面0.25,0.25 post_center_range=list(model_cfg.post_center_limit_range), #[-59.599998474121094, -59.599998474121094, -10.0, 59.599998474121094, 59.599998474121094, 10.0] dir_offset=model_cfg.direction_offset, #0.779 sin_error_factor=sin_error_factor, #1.0 nms_class_agnostic=model_cfg.nms_class_agnostic, #false num_direction_bins=model_cfg.num_direction_bins, #2 direction_limit_offset=model_cfg.direction_limit_offset, #0.0 ) return net