如何提升ASP.NET Core中CustomVision的物体识别准确率?代码排查
代码问题排查及修复
核心代码问题
- 项目ID不匹配
你的RunTrainingAsync方法每次执行都会调用CreateProject创建新的项目,但预测时使用的是硬编码的projectId(b933984e-1c7f-4ef6-8a25-5726b3c846f7),这意味着你预测的模型根本不是刚训练的那个,而是之前创建的某个未充分训练的项目,直接导致结果无意义。
修复方式:修改训练逻辑,先检查是否存在同名项目,存在则复用,不存在再创建,确保训练和预测使用同一个项目ID:
// 替换RunTrainingAsync里的项目创建代码 var existingProject = trainer.GetProjects().FirstOrDefault(p => p.Name == "CatsVsDogsProject"); var project = existingProject ?? trainer.CreateProject("CatsVsDogsProject"); // 同时更新全局的projectId为当前项目的ID,或者在训练完成后输出ID用于预测 Console.WriteLine($"当前项目ID: {project.Id}");
- 图片上传无校验
调用CreateImagesFromData上传图片时,没有检查返回结果是否成功。如果部分图片上传失败(比如格式错误、重复上传),实际参与训练的图片数量会更少,模型训练效果极差。
修复方式:添加上传结果校验:
foreach (var file in Directory.GetFiles(Path.Combine(imagesFolder, "Cat"))) { using var stream = File.OpenRead(file); var result = trainer.CreateImagesFromData(project.Id, stream, new[] { catTag.Id }); if (result.IsBatchSuccessful == false) { foreach (var error in result.Images.Where(i => i.Status != "OK")) { Console.WriteLine($"图片 {file} 上传失败: {error.Status}"); } } }
- 训练结果无验证
训练完成后没有查看迭代的性能指标(如精确率、召回率),无法确认模型本身是否训练有效。
修复方式:训练完成后输出性能数据:
iteration = trainer.GetIteration(project.Id, iteration.Id); Console.WriteLine($"训练完成,精确率: {iteration.Precision:P1}, 召回率: {iteration.Recall:P1}");
模型准确率提升方案
数据层面
- 扩充训练数据:20张图片远不足以训练出有效模型,每个类别至少需要100张以上,最好200+。图片要覆盖不同场景:不同品种的猫狗、不同光照条件、不同背景、不同角度姿态。
- 保证类别平衡:猫狗两类的图片数量尽量接近,避免数量差距过大导致模型偏向数量多的类别。
- 数据增强:在CustomVision门户或训练代码中开启自动增强功能(翻转、旋转、亮度调整、裁剪等),可以在有限数据下提升模型泛化能力。代码中创建项目时可设置:
var project = trainer.CreateProject("CatsVsDogsProject", domainId: Guid.Parse("ee85a72c-405e-4adc-bb47-ffa8ca0c9f31"), // 通用分类领域 classificationType: ClassificationType.Multiclass, enableImageProcessing: true); // 开启自动增强
- 分离测试集:单独准备10%-20%的图片作为测试集,不要用训练过的图片测试,才能真实反映模型效果。
训练层面
- 选择合适的领域:如果是猫狗分类,选择“通用(Compact)”或“动物”领域(如果有),比通用领域更贴合场景,训练效率更高。
- 多次迭代训练:单次训练可能效果不足,可以在训练完成后,基于现有迭代继续训练(使用
TrainProject再次调用),或者在门户中使用“高级训练”(如果是付费资源)。 - 检查标注准确性:确保所有训练图片的标注完全正确,没有把猫标成狗或反之,错误标注会严重误导模型。
内容的提问来源于stack exchange,提问作者max ray
相关产品推荐
相关产品推荐

