1087 lines
25 KiB
C#
1087 lines
25 KiB
C#
using OrpaonVision.Core.LayerRecognition;
|
|
using OrpaonVision.Core.Results;
|
|
|
|
namespace OrpaonVision.Core.PartRecognition;
|
|
|
|
/// <summary>
|
|
/// 部件识别服务接口。
|
|
/// </summary>
|
|
public interface IPartRecognitionService
|
|
{
|
|
/// <summary>
|
|
/// 映射推理结果到部件。
|
|
/// </summary>
|
|
/// <param name="inference">推理结果。</param>
|
|
/// <param name="currentLayer">当前层级。</param>
|
|
/// <param name="cancellationToken">取消令牌。</param>
|
|
/// <returns>部件映射结果。</returns>
|
|
Task<Result<PartMappingResult>> MapInferenceToPartsAsync(InferenceResultDto inference, int currentLayer, CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>
|
|
/// 校验部件识别精度。
|
|
/// </summary>
|
|
/// <param name="mappedParts">映射的部件列表。</param>
|
|
/// <param name="expectedParts">期望的部件列表。</param>
|
|
/// <param name="cancellationToken">取消令牌。</param>
|
|
/// <returns>精度校验结果。</returns>
|
|
Task<Result<PartAccuracyValidationResult>> ValidatePartAccuracyAsync(IReadOnlyList<MappedPart> mappedParts, IReadOnlyList<ExpectedPart> expectedParts, CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>
|
|
/// 获取部件类别映射配置。
|
|
/// </summary>
|
|
/// <param name="productTypeCode">产品类型编码。</param>
|
|
/// <param name="layerNumber">层级编号。</param>
|
|
/// <param name="cancellationToken">取消令牌。</param>
|
|
/// <returns>类别映射配置。</returns>
|
|
Task<Result<PartClassMappingConfig>> GetPartClassMappingConfigAsync(string productTypeCode, int layerNumber, CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>
|
|
/// 更新部件类别映射配置。
|
|
/// </summary>
|
|
/// <param name="config">映射配置。</param>
|
|
/// <param name="cancellationToken">取消令牌。</param>
|
|
/// <returns>更新结果。</returns>
|
|
Task<Result> UpdatePartClassMappingConfigAsync(PartClassMappingConfig config, CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>
|
|
/// 训练部件识别模型。
|
|
/// </summary>
|
|
/// <param name="trainingData">训练数据。</param>
|
|
/// <param name="cancellationToken">取消令牌。</param>
|
|
/// <returns>训练结果。</returns>
|
|
Task<Result<PartModelTrainingResult>> TrainPartRecognitionModelAsync(IReadOnlyList<PartTrainingData> trainingData, CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>
|
|
/// 优化部件识别参数。
|
|
/// </summary>
|
|
/// <param name="optimizationData">优化数据。</param>
|
|
/// <param name="cancellationToken">取消令牌。</param>
|
|
/// <returns>优化结果。</returns>
|
|
Task<Result<PartOptimizationResult>> OptimizePartRecognitionAsync(IReadOnlyList<PartOptimizationData> optimizationData, CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>
|
|
/// 获取部件识别统计信息。
|
|
/// </summary>
|
|
/// <param name="startTime">开始时间。</param>
|
|
/// <param name="endTime">结束时间。</param>
|
|
/// <param name="cancellationToken">取消令牌。</param>
|
|
/// <returns>统计信息。</returns>
|
|
Task<Result<PartRecognitionStatistics>> GetRecognitionStatisticsAsync(DateTime startTime, DateTime endTime, CancellationToken cancellationToken = default);
|
|
|
|
/// <summary>
|
|
/// 批量映射推理结果。
|
|
/// </summary>
|
|
/// <param name="inferences">推理结果列表。</param>
|
|
/// <param name="currentLayer">当前层级。</param>
|
|
/// <param name="cancellationToken">取消令牌。</param>
|
|
/// <returns>批量映射结果。</returns>
|
|
Task<Result<BatchPartMappingResult>> BatchMapInferenceToPartsAsync(IReadOnlyList<InferenceResultDto> inferences, int currentLayer, CancellationToken cancellationToken = default);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件映射结果。
|
|
/// </summary>
|
|
public sealed class PartMappingResult
|
|
{
|
|
/// <summary>
|
|
/// 映射的部件列表。
|
|
/// </summary>
|
|
public IReadOnlyList<MappedPart> MappedParts { get; init; } = Array.Empty<MappedPart>();
|
|
|
|
/// <summary>
|
|
/// 映射置信度。
|
|
/// </summary>
|
|
public double MappingConfidence { get; init; }
|
|
|
|
/// <summary>
|
|
/// 映射方法。
|
|
/// </summary>
|
|
public PartMappingMethod MappingMethod { get; init; }
|
|
|
|
/// <summary>
|
|
/// 映射时间。
|
|
/// </summary>
|
|
public DateTime MappingTimeUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 详细信息。
|
|
/// </summary>
|
|
public string? Details { get; init; }
|
|
|
|
/// <summary>
|
|
/// 扩展属性。
|
|
/// </summary>
|
|
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 映射的部件。
|
|
/// </summary>
|
|
public sealed class MappedPart
|
|
{
|
|
/// <summary>
|
|
/// 部件ID。
|
|
/// </summary>
|
|
public Guid PartId { get; init; }
|
|
|
|
/// <summary>
|
|
/// 部件编码。
|
|
/// </summary>
|
|
public string PartCode { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 部件名称。
|
|
/// </summary>
|
|
public string PartName { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 部件类型。
|
|
/// </summary>
|
|
public PartType PartType { get; init; }
|
|
|
|
/// <summary>
|
|
/// 原始检测类别。
|
|
/// </summary>
|
|
public string OriginalClass { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 映射置信度。
|
|
/// </summary>
|
|
public double MappingConfidence { get; init; }
|
|
|
|
/// <summary>
|
|
/// 检测置信度。
|
|
/// </summary>
|
|
public double DetectionConfidence { get; init; }
|
|
|
|
/// <summary>
|
|
/// 综合置信度。
|
|
/// </summary>
|
|
public double OverallConfidence { get; init; }
|
|
|
|
/// <summary>
|
|
/// 边界框。
|
|
/// </summary>
|
|
public BoundingBox BoundingBox { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 部件属性。
|
|
/// </summary>
|
|
public Dictionary<string, object> PartAttributes { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 是否为有效部件。
|
|
/// </summary>
|
|
public bool IsValid { get; init; }
|
|
|
|
/// <summary>
|
|
/// 验证错误。
|
|
/// </summary>
|
|
public List<string> ValidationErrors { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 映射时间。
|
|
/// </summary>
|
|
public DateTime MappingTimeUtc { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件精度校验结果。
|
|
/// </summary>
|
|
public sealed class PartAccuracyValidationResult
|
|
{
|
|
/// <summary>
|
|
/// 总体精度。
|
|
/// </summary>
|
|
public double OverallAccuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 精确率。
|
|
/// </summary>
|
|
public double Precision { get; init; }
|
|
|
|
/// <summary>
|
|
/// 召回率。
|
|
/// </summary>
|
|
public double Recall { get; init; }
|
|
|
|
/// <summary>
|
|
/// F1分数。
|
|
/// </summary>
|
|
public double F1Score { get; init; }
|
|
|
|
/// <summary>
|
|
/// 漏检部件列表。
|
|
/// </summary>
|
|
public IReadOnlyList<ExpectedPart> MissedParts { get; init; } = Array.Empty<ExpectedPart>();
|
|
|
|
/// <summary>
|
|
/// 误检部件列表。
|
|
/// </summary>
|
|
public IReadOnlyList<MappedPart> FalsePositiveParts { get; init; } = Array.Empty<MappedPart>();
|
|
|
|
/// <summary>
|
|
/// 正确识别的部件列表。
|
|
/// </summary>
|
|
public IReadOnlyList<PartMatch> CorrectMatches { get; init; } = Array.Empty<PartMatch>();
|
|
|
|
/// <summary>
|
|
/// 按部件类型的精度统计。
|
|
/// </summary>
|
|
public Dictionary<PartType, PartTypeAccuracy> TypeAccuracy { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 校验时间。
|
|
/// </summary>
|
|
public DateTime ValidationTimeUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 详细信息。
|
|
/// </summary>
|
|
public string? Details { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件匹配结果。
|
|
/// </summary>
|
|
public sealed class PartMatch
|
|
{
|
|
/// <summary>
|
|
/// 期望部件。
|
|
/// </summary>
|
|
public ExpectedPart ExpectedPart { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 映射部件。
|
|
/// </summary>
|
|
public MappedPart MappedPart { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 匹配置信度。
|
|
/// </summary>
|
|
public double MatchConfidence { get; init; }
|
|
|
|
/// <summary>
|
|
/// 位置偏差。
|
|
/// </summary>
|
|
public double PositionDeviation { get; init; }
|
|
|
|
/// <summary>
|
|
/// 大小偏差。
|
|
/// </summary>
|
|
public double SizeDeviation { get; init; }
|
|
|
|
/// <summary>
|
|
/// 匹配质量。
|
|
/// </summary>
|
|
public MatchQuality MatchQuality { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件类型精度。
|
|
/// </summary>
|
|
public sealed class PartTypeAccuracy
|
|
{
|
|
/// <summary>
|
|
/// 部件类型。
|
|
/// </summary>
|
|
public PartType PartType { get; init; }
|
|
|
|
/// <summary>
|
|
/// 总数。
|
|
/// </summary>
|
|
public int TotalCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 正确识别数。
|
|
/// </summary>
|
|
public int CorrectCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 精度。
|
|
/// </summary>
|
|
public double Accuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 精确率。
|
|
/// </summary>
|
|
public double Precision { get; init; }
|
|
|
|
/// <summary>
|
|
/// 召回率。
|
|
/// </summary>
|
|
public double Recall { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件类别映射配置。
|
|
/// </summary>
|
|
public sealed class PartClassMappingConfig
|
|
{
|
|
/// <summary>
|
|
/// 配置ID。
|
|
/// </summary>
|
|
public Guid ConfigId { get; init; }
|
|
|
|
/// <summary>
|
|
/// 产品类型编码。
|
|
/// </summary>
|
|
public string ProductTypeCode { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 层级编号。
|
|
/// </summary>
|
|
public int LayerNumber { get; init; }
|
|
|
|
/// <summary>
|
|
/// 类别映射规则。
|
|
/// </summary>
|
|
public IReadOnlyList<ClassMappingRule> MappingRules { get; init; } = Array.Empty<ClassMappingRule>();
|
|
|
|
/// <summary>
|
|
/// 默认映射规则。
|
|
/// </summary>
|
|
public ClassMappingRule? DefaultRule { get; init; }
|
|
|
|
/// <summary>
|
|
/// 置信度阈值。
|
|
/// </summary>
|
|
public double ConfidenceThreshold { get; init; } = 0.5;
|
|
|
|
/// <summary>
|
|
/// 是否启用模糊匹配。
|
|
/// </summary>
|
|
public bool EnableFuzzyMatching { get; init; } = true;
|
|
|
|
/// <summary>
|
|
/// 模糊匹配阈值。
|
|
/// </summary>
|
|
public double FuzzyMatchingThreshold { get; init; } = 0.8;
|
|
|
|
/// <summary>
|
|
/// 创建时间。
|
|
/// </summary>
|
|
public DateTime CreatedAtUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 更新时间。
|
|
/// </summary>
|
|
public DateTime UpdatedAtUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 版本号。
|
|
/// </summary>
|
|
public string Version { get; init; } = "1.0";
|
|
|
|
/// <summary>
|
|
/// 是否启用。
|
|
/// </summary>
|
|
public bool IsEnabled { get; init; } = true;
|
|
|
|
/// <summary>
|
|
/// 扩展属性。
|
|
/// </summary>
|
|
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 类别映射规则。
|
|
/// </summary>
|
|
public sealed class ClassMappingRule
|
|
{
|
|
/// <summary>
|
|
/// 规则ID。
|
|
/// </summary>
|
|
public Guid RuleId { get; init; }
|
|
|
|
/// <summary>
|
|
/// 原始类别。
|
|
/// </summary>
|
|
public string OriginalClass { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 目标部件编码。
|
|
/// </summary>
|
|
public string TargetPartCode { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 目标部件名称。
|
|
/// </summary>
|
|
public string TargetPartName { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 目标部件类型。
|
|
/// </summary>
|
|
public PartType TargetPartType { get; init; }
|
|
|
|
/// <summary>
|
|
/// 映射权重。
|
|
/// </summary>
|
|
public double MappingWeight { get; init; } = 1.0;
|
|
|
|
/// <summary>
|
|
/// 最小置信度要求。
|
|
/// </summary>
|
|
public double MinConfidence { get; init; } = 0.5;
|
|
|
|
/// <summary>
|
|
/// 条件表达式。
|
|
/// </summary>
|
|
public string? ConditionExpression { get; init; }
|
|
|
|
/// <summary>
|
|
/// 部件属性映射。
|
|
/// </summary>
|
|
public Dictionary<string, string> AttributeMapping { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 优先级。
|
|
/// </summary>
|
|
public int Priority { get; init; } = 1;
|
|
|
|
/// <summary>
|
|
/// 是否启用。
|
|
/// </summary>
|
|
public bool IsEnabled { get; init; } = true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 期望部件。
|
|
/// </summary>
|
|
public sealed class ExpectedPart
|
|
{
|
|
/// <summary>
|
|
/// 部件编码。
|
|
/// </summary>
|
|
public string PartCode { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 部件名称。
|
|
/// </summary>
|
|
public string PartName { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 部件类型。
|
|
/// </summary>
|
|
public PartType PartType { get; init; }
|
|
|
|
/// <summary>
|
|
/// 期望位置。
|
|
/// </summary>
|
|
public BoundingBox ExpectedBoundingBox { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 位置容差。
|
|
/// </summary>
|
|
public double PositionTolerance { get; init; } = 10.0;
|
|
|
|
/// <summary>
|
|
/// 大小容差。
|
|
/// </summary>
|
|
public double SizeTolerance { get; init; } = 0.1;
|
|
|
|
/// <summary>
|
|
/// 是否为必需部件。
|
|
/// </summary>
|
|
public bool IsRequired { get; init; } = true;
|
|
|
|
/// <summary>
|
|
/// 最小数量。
|
|
/// </summary>
|
|
public int MinCount { get; init; } = 1;
|
|
|
|
/// <summary>
|
|
/// 最大数量。
|
|
/// </summary>
|
|
public int MaxCount { get; init; } = 1;
|
|
|
|
/// <summary>
|
|
/// 部件属性。
|
|
/// </summary>
|
|
public Dictionary<string, object> PartAttributes { get; init; } = new();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件训练数据。
|
|
/// </summary>
|
|
public sealed class PartTrainingData
|
|
{
|
|
/// <summary>
|
|
/// 数据ID。
|
|
/// </summary>
|
|
public Guid DataId { get; init; }
|
|
|
|
/// <summary>
|
|
/// 推理结果。
|
|
/// </summary>
|
|
public InferenceResultDto Inference { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 正确的部件映射。
|
|
/// </summary>
|
|
public IReadOnlyList<MappedPart> CorrectMappings { get; init; } = Array.Empty<MappedPart>();
|
|
|
|
/// <summary>
|
|
/// 产品类型编码。
|
|
/// </summary>
|
|
public string ProductTypeCode { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 层级编号。
|
|
/// </summary>
|
|
public int LayerNumber { get; init; }
|
|
|
|
/// <summary>
|
|
/// 数据标签。
|
|
/// </summary>
|
|
public string Label { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 创建时间。
|
|
/// </summary>
|
|
public DateTime CreatedAtUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 是否为验证数据。
|
|
/// </summary>
|
|
public bool IsValidationData { get; init; }
|
|
|
|
/// <summary>
|
|
/// 扩展属性。
|
|
/// </summary>
|
|
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件模型训练结果。
|
|
/// </summary>
|
|
public sealed class PartModelTrainingResult
|
|
{
|
|
/// <summary>
|
|
/// 训练ID。
|
|
/// </summary>
|
|
public Guid TrainingId { get; init; }
|
|
|
|
/// <summary>
|
|
/// 模型准确率。
|
|
/// </summary>
|
|
public double Accuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 模型精确率。
|
|
/// </summary>
|
|
public double Precision { get; init; }
|
|
|
|
/// <summary>
|
|
/// 模型召回率。
|
|
/// </summary>
|
|
public double Recall { get; init; }
|
|
|
|
/// <summary>
|
|
/// F1分数。
|
|
/// </summary>
|
|
public double F1Score { get; init; }
|
|
|
|
/// <summary>
|
|
/// 训练样本数量。
|
|
/// </summary>
|
|
public int TrainingSampleCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 验证样本数量。
|
|
/// </summary>
|
|
public int ValidationSampleCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 训练耗时(毫秒)。
|
|
/// </summary>
|
|
public long TrainingElapsedMs { get; init; }
|
|
|
|
/// <summary>
|
|
/// 模型版本。
|
|
/// </summary>
|
|
public string ModelVersion { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 训练时间。
|
|
/// </summary>
|
|
public DateTime TrainingTimeUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 详细信息。
|
|
/// </summary>
|
|
public string? Details { get; init; }
|
|
|
|
/// <summary>
|
|
/// 扩展属性。
|
|
/// </summary>
|
|
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件优化数据。
|
|
/// </summary>
|
|
public sealed class PartOptimizationData
|
|
{
|
|
/// <summary>
|
|
/// 数据ID。
|
|
/// </summary>
|
|
public Guid DataId { get; init; }
|
|
|
|
/// <summary>
|
|
/// 推理结果。
|
|
/// </summary>
|
|
public InferenceResultDto Inference { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 当前映射结果。
|
|
/// </summary>
|
|
public PartMappingResult CurrentMapping { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 期望映射结果。
|
|
/// </summary>
|
|
public IReadOnlyList<MappedPart> ExpectedMapping { get; init; } = Array.Empty<MappedPart>();
|
|
|
|
/// <summary>
|
|
/// 优化目标。
|
|
/// </summary>
|
|
public OptimizationGoal OptimizationGoal { get; init; }
|
|
|
|
/// <summary>
|
|
/// 创建时间。
|
|
/// </summary>
|
|
public DateTime CreatedAtUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 扩展属性。
|
|
/// </summary>
|
|
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件优化结果。
|
|
/// </summary>
|
|
public sealed class PartOptimizationResult
|
|
{
|
|
/// <summary>
|
|
/// 优化ID。
|
|
/// </summary>
|
|
public Guid OptimizationId { get; init; }
|
|
|
|
/// <summary>
|
|
/// 优化前的精度。
|
|
/// </summary>
|
|
public double BeforeAccuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 优化后的精度。
|
|
/// </summary>
|
|
public double AfterAccuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 精度提升。
|
|
/// </summary>
|
|
public double AccuracyImprovement { get; init; }
|
|
|
|
/// <summary>
|
|
/// 优化参数。
|
|
/// </summary>
|
|
public Dictionary<string, object> OptimizedParameters { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 优化耗时(毫秒)。
|
|
/// </summary>
|
|
public long OptimizationElapsedMs { get; init; }
|
|
|
|
/// <summary>
|
|
/// 优化时间。
|
|
/// </summary>
|
|
public DateTime OptimizationTimeUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 详细信息。
|
|
/// </summary>
|
|
public string? Details { get; init; }
|
|
|
|
/// <summary>
|
|
/// 扩展属性。
|
|
/// </summary>
|
|
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 批量部件映射结果。
|
|
/// </summary>
|
|
public sealed class BatchPartMappingResult
|
|
{
|
|
/// <summary>
|
|
/// 映射结果列表。
|
|
/// </summary>
|
|
public IReadOnlyList<PartMappingResult> MappingResults { get; init; } = Array.Empty<PartMappingResult>();
|
|
|
|
/// <summary>
|
|
/// 总数量。
|
|
/// </summary>
|
|
public int TotalCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 成功数量。
|
|
/// </summary>
|
|
public int SuccessCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 失败数量。
|
|
/// </summary>
|
|
public int FailureCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 平均映射置信度。
|
|
/// </summary>
|
|
public double AverageMappingConfidence { get; init; }
|
|
|
|
/// <summary>
|
|
/// 总耗时(毫秒)。
|
|
/// </summary>
|
|
public long TotalElapsedMs { get; init; }
|
|
|
|
/// <summary>
|
|
/// 批量处理时间。
|
|
/// </summary>
|
|
public DateTime BatchProcessingTimeUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 详细信息。
|
|
/// </summary>
|
|
public string? Details { get; init; }
|
|
|
|
/// <summary>
|
|
/// 扩展属性。
|
|
/// </summary>
|
|
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件识别统计信息。
|
|
/// </summary>
|
|
public sealed class PartRecognitionStatistics
|
|
{
|
|
/// <summary>
|
|
/// 总识别次数。
|
|
/// </summary>
|
|
public int TotalRecognitions { get; init; }
|
|
|
|
/// <summary>
|
|
/// 成功识别次数。
|
|
/// </summary>
|
|
public int SuccessfulRecognitions { get; init; }
|
|
|
|
/// <summary>
|
|
/// 失败识别次数。
|
|
/// </summary>
|
|
public int FailedRecognitions { get; init; }
|
|
|
|
/// <summary>
|
|
/// 识别准确率。
|
|
/// </summary>
|
|
public double Accuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 平均映射置信度。
|
|
/// </summary>
|
|
public double AverageMappingConfidence { get; init; }
|
|
|
|
/// <summary>
|
|
/// 总部件数量。
|
|
/// </summary>
|
|
public int TotalParts { get; init; }
|
|
|
|
/// <summary>
|
|
/// 正确识别的部件数量。
|
|
/// </summary>
|
|
public int CorrectParts { get; init; }
|
|
|
|
/// <summary>
|
|
/// 按部件类型的统计。
|
|
/// </summary>
|
|
public Dictionary<PartType, PartStatistics> ByPartType { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 按产品类型的统计。
|
|
/// </summary>
|
|
public Dictionary<string, ProductTypeStatistics> ByProductType { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 按层级的统计。
|
|
/// </summary>
|
|
public Dictionary<int, LayerStatistics> ByLayer { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 按映射方法的统计。
|
|
/// </summary>
|
|
public Dictionary<PartMappingMethod, MethodStatistics> ByMappingMethod { get; init; } = new();
|
|
|
|
/// <summary>
|
|
/// 统计开始时间。
|
|
/// </summary>
|
|
public DateTime StartTimeUtc { get; init; }
|
|
|
|
/// <summary>
|
|
/// 统计结束时间。
|
|
/// </summary>
|
|
public DateTime EndTimeUtc { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件统计。
|
|
/// </summary>
|
|
public sealed class PartStatistics
|
|
{
|
|
/// <summary>
|
|
/// 部件类型。
|
|
/// </summary>
|
|
public PartType PartType { get; init; }
|
|
|
|
/// <summary>
|
|
/// 识别次数。
|
|
/// </summary>
|
|
public int RecognitionCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 成功次数。
|
|
/// </summary>
|
|
public int SuccessCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 准确率。
|
|
/// </summary>
|
|
public double Accuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 平均置信度。
|
|
/// </summary>
|
|
public double AverageConfidence { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 产品类型统计。
|
|
/// </summary>
|
|
public sealed class ProductTypeStatistics
|
|
{
|
|
/// <summary>
|
|
/// 产品类型编码。
|
|
/// </summary>
|
|
public string ProductTypeCode { get; init; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 识别次数。
|
|
/// </summary>
|
|
public int RecognitionCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 成功次数。
|
|
/// </summary>
|
|
public int SuccessCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 准确率。
|
|
/// </summary>
|
|
public double Accuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 平均部件数量。
|
|
/// </summary>
|
|
public double AveragePartCount { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 层级统计。
|
|
/// </summary>
|
|
public sealed class LayerStatistics
|
|
{
|
|
/// <summary>
|
|
/// 层级编号。
|
|
/// </summary>
|
|
public int LayerNumber { get; init; }
|
|
|
|
/// <summary>
|
|
/// 识别次数。
|
|
/// </summary>
|
|
public int RecognitionCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 成功次数。
|
|
/// </summary>
|
|
public int SuccessCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 准确率。
|
|
/// </summary>
|
|
public double Accuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 平均部件数量。
|
|
/// </summary>
|
|
public double AveragePartCount { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 方法统计。
|
|
/// </summary>
|
|
public sealed class MethodStatistics
|
|
{
|
|
/// <summary>
|
|
/// 映射方法。
|
|
/// </summary>
|
|
public PartMappingMethod MappingMethod { get; init; }
|
|
|
|
/// <summary>
|
|
/// 使用次数。
|
|
/// </summary>
|
|
public int UsageCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 成功次数。
|
|
/// </summary>
|
|
public int SuccessCount { get; init; }
|
|
|
|
/// <summary>
|
|
/// 准确率。
|
|
/// </summary>
|
|
public double Accuracy { get; init; }
|
|
|
|
/// <summary>
|
|
/// 平均耗时(毫秒)。
|
|
/// </summary>
|
|
public double AverageElapsedMs { get; init; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件类型枚举。
|
|
/// </summary>
|
|
public enum PartType
|
|
{
|
|
/// <summary>
|
|
/// 未知。
|
|
/// </summary>
|
|
Unknown = 0,
|
|
|
|
/// <summary>
|
|
/// 必装件。
|
|
/// </summary>
|
|
Required = 1,
|
|
|
|
/// <summary>
|
|
/// 选装件。
|
|
/// </summary>
|
|
Optional = 2,
|
|
|
|
/// <summary>
|
|
/// 关键件。
|
|
/// </summary>
|
|
Critical = 3,
|
|
|
|
/// <summary>
|
|
/// 标准件。
|
|
/// </summary>
|
|
Standard = 4,
|
|
|
|
/// <summary>
|
|
/// 定制件。
|
|
/// </summary>
|
|
Custom = 5,
|
|
|
|
/// <summary>
|
|
/// 禁装件。
|
|
/// </summary>
|
|
Forbidden = 6
|
|
}
|
|
|
|
/// <summary>
|
|
/// 部件映射方法。
|
|
/// </summary>
|
|
public enum PartMappingMethod
|
|
{
|
|
/// <summary>
|
|
/// 基于规则。
|
|
/// </summary>
|
|
RuleBased = 0,
|
|
|
|
/// <summary>
|
|
/// 基于机器学习。
|
|
/// </summary>
|
|
MachineLearning = 1,
|
|
|
|
/// <summary>
|
|
/// 基于深度学习。
|
|
/// </summary>
|
|
DeepLearning = 2,
|
|
|
|
/// <summary>
|
|
/// 基于模板匹配。
|
|
/// </summary>
|
|
TemplateMatching = 3,
|
|
|
|
/// <summary>
|
|
/// 混合方法。
|
|
/// </summary>
|
|
Hybrid = 4
|
|
}
|
|
|
|
/// <summary>
|
|
/// 匹配质量。
|
|
/// </summary>
|
|
public enum MatchQuality
|
|
{
|
|
/// <summary>
|
|
/// 优秀。
|
|
/// </summary>
|
|
Excellent = 0,
|
|
|
|
/// <summary>
|
|
/// 良好。
|
|
/// </summary>
|
|
Good = 1,
|
|
|
|
/// <summary>
|
|
/// 一般。
|
|
/// </summary>
|
|
Fair = 2,
|
|
|
|
/// <summary>
|
|
/// 较差。
|
|
/// </summary>
|
|
Poor = 3
|
|
}
|
|
|
|
/// <summary>
|
|
/// 优化目标。
|
|
/// </summary>
|
|
public enum OptimizationGoal
|
|
{
|
|
/// <summary>
|
|
/// 提高准确率。
|
|
/// </summary>
|
|
Accuracy = 0,
|
|
|
|
/// <summary>
|
|
/// 提高精确率。
|
|
/// </summary>
|
|
Precision = 1,
|
|
|
|
/// <summary>
|
|
/// 提高召回率。
|
|
/// </summary>
|
|
Recall = 2,
|
|
|
|
/// <summary>
|
|
/// 平衡精度和召回率。
|
|
/// </summary>
|
|
Balance = 3,
|
|
|
|
/// <summary>
|
|
/// 提高速度。
|
|
/// </summary>
|
|
Speed = 4
|
|
}
|