一、目的:ML.NET 是一个开源且跨平台的机器学习框架,专为 .NET 开发人员设计。它允许你在 .NET 应用程序中构建、训练和部署机器学习模型,而无需离开 .NET 生态系统。ML.NET 支持多种机器学习任务,包括分类、回归、聚类、异常检测、推荐系统和图像处理等。
主要特点
-
跨平台:支持 Windows、Linux 和 macOS。
-
集成:与 .NET 生态系统无缝集成,支持 C# 和 F#。
-
多种任务:支持分类、回归、聚类、推荐系统、异常检测、自然语言处理和图像处理等任务。
-
易于使用:提供简单易用的 API,适合初学者和专业开发人员。
-
可扩展:支持自定义机器学习算法和模型。
典型工作流程
-
加载数据:从文件、数据库或内存中加载数据。
-
预处理数据:对数据进行清洗、转换和特征工程。
-
选择和训练模型:选择合适的机器学习算法并训练模型。
-
评估模型:使用测试数据评估模型性能。
-
部署模型:将训练好的模型部署到生产环境中进行预测。
Model Builder 是 Microsoft 提供的一个用于在 Visual Studio 中构建、训练和部署机器学习模型的工具。它是 ML.NET 的一部分,旨在简化机器学习模型的创建过程,使开发人员无需深入了解机器学习的复杂细节即可构建和使用模型。
使用 ML.NET 的 Model Builder 创建对象检测模型是一个简便的方法。以下是如何在 Visual Studio 中使用 Model Builder 创建对象检测模型的步骤。
下面示例演示应用Model Builder创建一个人眼目标检测的模型
二、实现
1. 安装 Model Builder
确保你已经安装了 Model Builder。你可以通过 Visual Studio 的扩展管理器进行安装。
- 创建新项目或打开现有项目
打开 Visual Studio 并创建一个新的控制台应用程序或打开现有项目。
3. 添加 Model Builder
在解决方案资源管理器中,右键点击项目并选择 Add > Machine Learning Model。这将启动 Model Builder。
4. 选择场景
在 Model Builder 中,选择 Object Detection 场景。
- 加载数据
选择你的数据集。对象检测的数据集通常包含图像文件和一个标注文件(例如VOTT COCO 格式的 JSON 文件或 CSV 文件)。
本示例采用Vott数据源进行训练
如何创建Vott数据集参考如下文档
教程:使用 Model Builder 检测图像中的对象 - ML.NET | Microsoft Learn
应用Vott工具可以简单快速创建用于训练目标识别的数据源,Vott工具采用标记图片的方式,最终导出Json数据供ML.NET使用
6. 配置训练
配置训练参数,例如训练时间和计算资源(CPU 或 GPU)。
- 训练模型
点击 Start Training 开始训练模型。训练完成后,Model Builder 会生成一个模型文件和相关代码。
8. 评估模型
9. 使用生成的模型
Model Builder 会在项目中生成一个 .mbconfig 文件和一个包含模型代码的文件夹。你可以在项目中使用生成的模型进行预测。
可以使用模板创建,也可以自定义封装调用
首先安装必要的Nuget包,如:
Microsoft.ML.OnnxTransformer
是一个用于在 .NET 应用程序中加载和运行 ONNX(Open Neural Network Exchange)模型的库。ONNX 是一个开放的格式,用于表示机器学习模型,支持多种框架和工具之间的互操作性。
主要功能
-
加载 ONNX 模型:可以将预训练的 ONNX 模型加载到 .NET 应用程序中。
-
模型推理:使用加载的 ONNX 模型进行推理(预测)。
主要步骤
-
创建 MLContext:这是 ML.NET 的上下文对象,用于创建和管理机器学习模型。
-
加载 ONNX 模型:使用 ApplyOnnxModel 方法加载 ONNX 模型。
-
创建预测引擎:使用 CreatePredictionEngine 方法创建预测引擎。
-
进行预测:使用预测引擎进行预测。
通过 Microsoft.ML.OnnxTransformer,您可以轻松地在 .NET 应用程序中集成和使用 ONNX 模型进行机器学习推理。
Microsoft.ML.Transforms.Onnx 命名空间 | Microsoft Learn
Microsoft.ML.ImageAnalytics
是 ML.NET 中的一个包,专门用于处理图像数据的分析和处理。它提供了一些转换器和工具,可以帮助您在机器学习管道中处理图像数据。
主要功能
-
图像加载:从文件或目录中加载图像。
-
图像转换:对图像进行各种转换操作,如调整大小、裁剪、旋转等。
-
图像特征提取:从图像中提取特征,用于机器学习模型的训练和推理。
主要步骤
-
创建 MLContext:这是 ML.NET 的上下文对象,用于创建和管理机器学习模型。
-
加载图像数据:使用 LoadFromTextFile 方法加载图像路径数据。
-
创建图像处理管道:使用 LoadImages、ResizeImages、ExtractPixels 和 DnnFeaturizeImage 等方法创建图像处理管道。
-
训练模型:使用 Fit 方法训练模型。
-
创建预测引擎:使用 CreatePredictionEngine 方法创建预测引擎。
-
进行预测:使用预测引擎进行图像特征提取。
通过 Microsoft.ML.ImageAnalytics,您可以轻松地在 ML.NET 中处理和分析图像数据,为机器学习模型提供丰富的图像特征。
Microsoft.ML.Data 命名空间 | Microsoft Learn
Microsoft.ML.TorchSharp
是一个用于在 .NET 应用程序中集成和使用 TorchSharp 的库。TorchSharp 是一个 .NET 库,它提供了对 PyTorch 的访问,使得开发者可以在 .NET 环境中使用 PyTorch 的功能进行深度学习任务。
主要功能
-
深度学习模型训练:使用 PyTorch 的 API 在 .NET 中训练深度学习模型。
-
模型推理:加载和运行预训练的 PyTorch 模型进行推理。
主要步骤
-
设置设备:选择使用 CPU 或 GPU 进行计算。
-
定义模型:使用 TorchSharp 的 API 定义深度学习模型。
-
创建输入数据:生成或加载输入数据。
-
前向传播:使用模型进行前向传播,获取输出。
与 ML.NET 集成
您可以将 TorchSharp 模型集成到 ML.NET 管道中,结合其他数据处理和机器学习任务。例如,您可以使用 Microsoft.ML.ImageAnalytics 处理图像数据,然后使用 TorchSharp 模型进行图像分类或其他任务。
通过 Microsoft.ML.TorchSharp,您可以在 .NET 环境中利用 PyTorch 的强大功能,进行各种深度学习任务,并与 ML.NET 无缝集成。
Microsoft.ML.TorchSharp 命名空间 | Microsoft Learn
libtorch-cpu-win-x64
是一个 NuGet 包,它包含了 LibTorch 的 CPU 版本,用于在 Windows x64 平台上运行。LibTorch 是 PyTorch 的 C++ 库版本,提供了强大的深度学习功能。通过在 .NET 项目中引用 libtorch-cpu-win-x64,您可以在 .NET 环境中使用 PyTorch 的功能进行深度学习任务。
主要功能
-
深度学习模型训练:使用 LibTorch 的 API 在 .NET 中训练深度学习模型。
-
模型推理:加载和运行预训练的 PyTorch 模型进行推理。
-
与 TorchSharp 集成:结合 TorchSharp 库,提供对 PyTorch 的全面支持。
主要步骤
-
设置设备:选择使用 CPU 进行计算。
-
定义模型:使用 TorchSharp 的 API 定义深度学习模型。
-
创建输入数据:生成或加载输入数据。
-
前向传播:使用模型进行前向传播,获取输出。
通过在项目中引用 libtorch-cpu-win-x64,您可以在 .NET 环境中利用 PyTorch 的强大功能,进行各种深度学习任务,并与其他 ML.NET 库无缝集成。
封装如下方法
cs
public static class EyeDetection
{
/// <summary>
/// 根据图片路径预测物体,返回BoundingBox列表
/// </summary>
/// <param name="imagePath"></param>
/// <returns></returns>
public static List<BoundingBox> PredictObjects(string imagePath)
{
var input = new EyeDetectMLModel.ModelInput { Image = MLImage.CreateFromFile(imagePath) };
var modelOutput = EyeDetectMLModel.PredictEngine.Value.Predict(input);
return GetBoundingBoxes(modelOutput);
}
/// <summary>
/// 根据输出结果返回BoundingBox列表
/// </summary>
/// <param name="output"></param>
/// <param name="scoreThreshold"></param>
/// <returns></returns>
private static List<BoundingBox> GetBoundingBoxes(EyeDetectMLModel.ModelOutput output, float scoreThreshold = 0.5f)
{
var boundingBoxes = new List<BoundingBox>();
if (output.PredictedBoundingBoxes == null || output.PredictedBoundingBoxes.Length == 0)
return boundingBoxes;
for (int i = 0; i < output.PredictedBoundingBoxes.Length; i += 4)
{
var score = output.Score[i / 4];
if (score < scoreThreshold)
continue;
var label = output.PredictedLabel[i / 4];
var x = output.PredictedBoundingBoxes[i];
var y = output.PredictedBoundingBoxes[i + 1];
var width = output.PredictedBoundingBoxes[i + 2] - x;
var height = output.PredictedBoundingBoxes[i + 3] - y;
var boundingBox = new BoundingBox
{
Label = label,
Confidence = score,
X = x,
Y = y,
Width = width,
Height = height
};
boundingBoxes.Add(boundingBox);
}
return boundingBoxes;
}
}
定义了一个静态方法,根据一个图片的路径输出一些识别到目标区域的矩形外框
cs
private async void Button_Click_2(object sender, RoutedEventArgs e)
{
string fileName = OpenFileDialog();
if (fileName == null)
return;
var result = await Task.Run(() =>
{
return EyeDetection.PredictObjects(fileName);
});
DetectView detectView = new DetectView() { Width = 600, Height = 600 };
detectView.ImageSource = new BitmapImage(new Uri(fileName));
detectView.BoundingBoxs = new ObservableCollection<BoundingBox>(result);
Window window = new Window();
window.Content = detectView;
window.ShowDialog();
}
浏览一张图片,调用接口,把浏览的图片和识别到的外框矩形绘制到视图上
三、效果演示
总结
以上步骤展示了如何使用 ML.NET 的 Model Builder 创建对象检测模型,并在项目中使用生成的模型进行对象检测。通过这种方式,你可以快速构建和部署对象检测模型。
本文主要演示使用过程,采用更准、更多的数据源、应用更精确的标记方式可以提高准确率。
需要了解的知识点
教程:使用 Model Builder 检测图像中的对象 - ML.NET | Microsoft Learn
ML.NET 文档 - 教程和 API 参考 | Microsoft Learn
什么是模型生成器,它的工作原理是怎样的? - ML.NET | Microsoft Learn
什么是模型生成器,它的工作原理是怎样的? - ML.NET | Microsoft Learn
什么是 ML.NET 以及它如何工作? - ML.NET | Microsoft Learn
教程:使用 ONNX 深度学习模型检测对象 - ML.NET | Microsoft Learn
源码地址
https://github.com/HeBianGu/ML-API
GitHub - HeBianGu/WPF-ControlDemo: 示例
GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库
GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库