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
示例#2
0
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