示例#1
0
def build_net_loss(model_cfg, target_assigner):
    num_class, use_mcnms, use_rotate_nms, nms_pre_max_sizes, nms_post_max_sizes, \
    nms_score_thresholds, nms_iou_thresholds = load_target_assigner_param(model_cfg)
    losses = losses_builder.build(model_cfg.loss)
    cls_loss_ftor, loc_loss_ftor, cls_weight, loc_weight, _ = losses

    net_loss = PointPillarsLoss(target_assigner,
                                nms_score_thresholds=nms_score_thresholds,
                                nms_iou_thresholds=nms_iou_thresholds,
                                nms_pre_max_sizes=nms_pre_max_sizes,
                                nms_post_max_sizes=nms_post_max_sizes,
                                cls_loss_ftor=cls_loss_ftor,
                                loc_loss_ftor=loc_loss_ftor,
                                cls_loss_weight=cls_weight,
                                loc_loss_weight=loc_weight)
    return net_loss
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
示例#3
0
def build(model_cfg: second_pb2.VoxelNet,
          voxel_generator,
          target_assigner,
          measure_time=False) -> VoxelNet:
    """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]]
    num_class = len(target_assigner.classes)
    class_cfg = model_cfg.target_assigner
    use_iou_param_partaa = class_cfg.use_iou_param_partaa

    num_input_features = model_cfg.num_point_features
    if model_cfg.without_reflectivity:
        num_input_features = 3
    loss_norm_type_dict = {
        0: LossNormType.NormByNumExamples,
        1: LossNormType.NormByNumPositives,
        2: LossNormType.NormByNumPosNeg,
    }
    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, iou_loss_ftor, \
        cls_weight, loc_weight, iou_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

    # if model_cfg.use_rpn:
    net = VoxelNet(
        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_voxel_classifier=model_cfg.use_aux_classifier,
        use_rotate_nms=model_cfg.use_rotate_nms,
        multiclass_nms=model_cfg.use_multi_class_nms,
        nms_score_threshold=model_cfg.nms_score_threshold,
        nms_pre_max_size=model_cfg.nms_pre_max_size,
        nms_post_max_size=model_cfg.nms_post_max_size,
        nms_iou_threshold=model_cfg.nms_iou_threshold,
        use_sigmoid_score=model_cfg.use_sigmoid_score,
        use_sparse_rpn=False,
        encode_background_as_zeros=model_cfg.encode_background_as_zeros,
        use_direction_classifier=model_cfg.use_direction_classifier,
        use_bev=model_cfg.use_bev,
        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,
        use_iou_branch=model_cfg.use_iou_branch,
        iou_dict=model_cfg.iou,
        use_iou_param_partaa=use_iou_param_partaa,
        iou_loss_weight=iou_weight,
        iou_loss_ftor=iou_loss_ftor)
    return net
def build(model_cfg: second_pb2.VoxelNet, fv_generator, #voxel_generator,
          save_path=None, RGB_embedding=False) -> VoxelNet:
    """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
    fv_dim = fv_generator.fv_dim
    dense_shape = [1] + fv_dim[::-1].tolist() + [vfe_num_filters[-1]]
    num_class = model_cfg.num_class

    num_input_features = model_cfg.num_point_features
    if model_cfg.without_reflectivity:
        num_input_features = 3
    loss_norm_type_dict = {
        0: LossNormType.NormByNumExamples,
        1: LossNormType.NormByNumPositives,
        2: LossNormType.NormByNumPosNeg,
    }
    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

    net = VoxelNet(
        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_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_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=model_cfg.use_rotate_nms,
        # multiclass_nms=model_cfg.use_multi_class_nms,
        # nms_score_threshold=model_cfg.nms_score_threshold,
        # nms_pre_max_size=model_cfg.nms_pre_max_size,
        # nms_post_max_size=model_cfg.nms_post_max_size,
        # nms_iou_threshold=model_cfg.nms_iou_threshold,
        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,
        # use_bev=model_cfg.use_bev,
        # 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,
        # voxel_size=voxel_generator.voxel_size,
        # pc_range=voxel_generator.point_cloud_range,
        # grid_size=fv_generator.grid_size,
        # cartesian_coord_range=fv_generator.cartesian_coord_range,
        save_path=save_path,
        RGB_embedding=RGB_embedding
    )
    return net
def build(model_cfg: second_pb2.VoxelNet, voxel_generator,
          target_assigner) -> VoxelNet:
    """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]]
    num_class = model_cfg.num_class

    num_input_features = model_cfg.num_point_features
    if model_cfg.without_reflectivity:
        num_input_features = 3
    loss_norm_type_dict = {
        0: LossNormType.NormByNumExamples,
        1: LossNormType.NormByNumPositives,
        2: LossNormType.NormByNumPosNeg,
    }
    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

    net = VoxelNetForCudaImplementation(
        dense_shape,
        num_class=num_class,
        vfe_num_filters=vfe_num_filters,
        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=model_cfg.use_rotate_nms,
        multiclass_nms=model_cfg.use_multi_class_nms,
        nms_score_threshold=model_cfg.nms_score_threshold,
        nms_pre_max_size=model_cfg.nms_pre_max_size,
        nms_post_max_size=model_cfg.nms_post_max_size,
        nms_iou_threshold=model_cfg.nms_iou_threshold,
        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,
        use_bev=model_cfg.use_bev,
        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,
        voxel_size=voxel_generator.voxel_size,
        pc_range=voxel_generator.point_cloud_range)
    return net
def build(model_cfg: second_pb2.VoxelNet, voxel_generator,
          target_assigner) -> VoxelNet:
    """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
    grid_size = voxel_generator.grid_size  #[432,496,1]
    dense_shape = [1] + grid_size[::-1].tolist() + [vfe_num_filters[-1]
                                                    ]  #[1,1,496,432,64]
    num_class = model_cfg.num_class

    num_input_features = model_cfg.num_point_features  #4
    if model_cfg.without_reflectivity:
        num_input_features = 3
    loss_norm_type_dict = {
        0: LossNormType.NormByNumExamples,
        1: LossNormType.NormByNumPositives,
        2: LossNormType.NormByNumPosNeg,
    }
    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

    net = VoxelNet(  # 以VoxelNet为基础搭建网络
        dense_shape,  # 输入VFE的张量格式
        num_class=num_class,  # 训练类别
        vfe_class_name=model_cfg.voxel_feature_extractor.
        module_class_name,  # VFE配置
        vfe_num_filters=vfe_num_filters,  # 64
        middle_class_name=model_cfg.middle_feature_extractor.
        module_class_name,  # 中间特征提取层配置
        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,  # SSD网络配置
        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=model_cfg.use_rotate_nms,  # NMS配置
        multiclass_nms=model_cfg.use_multi_class_nms,
        nms_score_threshold=model_cfg.nms_score_threshold,
        nms_pre_max_size=model_cfg.nms_pre_max_size,
        nms_post_max_size=model_cfg.nms_post_max_size,
        nms_iou_threshold=model_cfg.nms_iou_threshold,
        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,
        use_bev=model_cfg.use_bev,
        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,  # 训练目标
        voxel_size=voxel_generator.voxel_size,  # 体素参数配置
        pc_range=voxel_generator.point_cloud_range)
    return net
示例#7
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