示例:在ML.NET中应用Model Builder模型生成器构建图片分类模型
一、目的:ML.NET 是一个开源且跨平台的机器学习框架,专为 .NET 开发人员设计。它允许你在 .NET 应用程序中构建、训练和部署机器学习模型,而无需离开 .NET 生态系统。ML.NET 支持多种机器学习任务,包括分类、回归、聚类、异常检测、推荐系统和图像处理等。
主要特点
1. 跨平台:支持 Windows、Linux 和 macOS。
2. 集成:与 .NET 生态系统无缝集成,支持 C# 和 F#。
3. 多种任务:支持分类、回归、聚类、推荐系统、异常检测、自然语言处理和图像处理等任务。
4. 易于使用:提供简单易用的 API,适合初学者和专业开发人员。
5. 可扩展:支持自定义机器学习算法和模型。
典型工作流程
1. 加载数据:从文件、数据库或内存中加载数据。
2. 预处理数据:对数据进行清洗、转换和特征工程。
3. 选择和训练模型:选择合适的机器学习算法并训练模型。
4. 评估模型:使用测试数据评估模型性能。
5. 部署模型:将训练好的模型部署到生产环境中进行预测。
Model Builder 是 Microsoft 提供的一个用于在 Visual Studio 中构建、训练和部署机器学习模型的工具。它是 ML.NET 的一部分,旨在简化机器学习模型的创建过程,使开发人员无需深入了解机器学习的复杂细节即可构建和使用模型。
下面示例演示应用Model Builder创建一个按男女分类图像的训练和使用过程
二、实现
1. 安装 Model Builder:
• 在 Visual Studio 中,打开“扩展和更新”窗口。
• 搜索并安装“ML.NET Model Builder”。
2. 启动 Model Builder:
• 在解决方案资源管理器中,右键点击项目并选择“添加” > “机器学习模型”。
3. 选择场景:
• 选择你要解决的机器学习任务,例如分类、回归、推荐系统等。
本示例选择图像分类
4. 加载数据:
• 选择数据源,可以是本地文件、SQL 数据库或其他数据源。
• 配置数据加载选项,例如分隔符、是否包含标题等。
本示例选择的是本地已经创建好的男女图片数据源,如下是我本机数据源
MAN目录数据集
WOMAN数据集
5. 训练模型:
• Model Builder 会自动选择最佳算法并进行训练。
• 你可以查看训练进度和模型性能指标。
6. 评估模型:
• 查看模型的评估结果,例如准确率、精度、召回率等。
• 如果不满意,可以调整数据或重新训练。
点击浏览图片选择一张图片,此时会应用训练好的模型对该图像进行分类,并输出分类结果
7. 生成代码:
• Model Builder 会生成用于训练和预测的代码文件。
• 你可以将这些代码集成到你的项目中。
可以使用上面模板生成项目,也可以提取代码封装成通用API调用
public class SexClassification{public static IOrderedEnumerable<KeyValuePair<string, float>> PredictAllLabels(byte[] imageBytes){//var imageBytes = File.ReadAllBytes(@"C:\Users\LENOVO\Pictures\图像分类\人物\0348134dd5de2a80f148522228b33263.jpg");var sampleData = new SexClassificationMLModel.ModelInput(){ImageSource = imageBytes,};// Make a single prediction on the sample data and print results.return SexClassificationMLModel.PredictAllLabels(sampleData);}public static string PredictLabel(byte[] imageBytes){return PredictAllLabels(imageBytes)?.FirstOrDefault().Key;}}
如上既是封装的一个图像按男女分类的方法,你可以按如下方法,浏览一张图片并调用接口来输出分类结果
private async void Button_Click(object sender, RoutedEventArgs e){OpenFileDialog openFileDialog = new OpenFileDialog();//openFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory; //设置初始路径openFileDialog.Filter = "PNG文件(*.png)|*.png|JPG文件(*.jpg)|*.jpg|所有文件(*.*)|*.*"; //设置“另存为文件类型”或“文件类型”框中出现的选择内容openFileDialog.FilterIndex = 2; //设置默认显示文件类型为Csv文件(*.csv)|*.csvopenFileDialog.Title = "打开文件"; //获取或设置文件对话框标题openFileDialog.RestoreDirectory = true; //设置对话框是否记忆上次打开的目录openFileDialog.Multiselect = false;//设置多选if (openFileDialog.ShowDialog() != true)return;//var imageBytes = System.IO.File.ReadAllBytes(@"C:\Users\LENOVO\Pictures\图像分类\人物\0348134dd5de2a80f148522228b33263.jpg");this.btn.Background = new ImageBrush(new BitmapImage(new Uri(openFileDialog.FileName))) { Stretch = Stretch.UniformToFill };this.btn.Content = "正在生成结果...";var result = await Task.Run(() =>{var imageBytes = System.IO.File.ReadAllBytes(openFileDialog.FileName);return SexClassification.PredictLabel(imageBytes);});this.btn.Content = $"输出结果:{result}";}
效果:
三、环境
VS2022,NET8.0
需要了解的知识点
ML.NET 文档 - 教程和 API 参考 | Microsoft Learn
什么是模型生成器,它的工作原理是怎样的? - ML.NET | Microsoft Learn
什么是 ML.NET 以及它如何工作? - ML.NET | Microsoft Learn
教程:在 Azure 中使用 Model Builder 训练图像分类模型 - ML.NET | Microsoft Learn
教程:用于对图像进行分类的 ML.NET 分类模型 - ML.NET | Microsoft Learn
源码地址
https://github.com/HeBianGu/ML-API
GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库
GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库
了解更多
System.Windows.Controls 命名空间 | Microsoft Learn
https://github.com/HeBianGu
HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频