Files
OrpaonVision/OrpaonVision.Core/PartRecognition/IPartRecognitionService.cs
2026-04-06 22:04:05 +08:00

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
}