示例:在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 的一部分,旨在简化机器学习模型的创建过程,使开发人员无需深入了解机器学习的复杂细节即可构建和使用模型。

        使用 ML.NET 的 Model Builder 创建对象检测模型是一个简便的方法。以下是如何在 Visual Studio 中使用 Model Builder 创建对象检测模型的步骤。

下面示例演示应用Model Builder创建一个人眼目标检测的模型


二、实现


1. 安装 Model Builder


确保你已经安装了 Model Builder。你可以通过 Visual Studio 的扩展管理器进行安装。


2. 创建新项目或打开现有项目


打开 Visual Studio 并创建一个新的控制台应用程序或打开现有项目。


3. 添加 Model Builder


在解决方案资源管理器中,右键点击项目并选择 Add > Machine Learning Model。这将启动 Model Builder。


4. 选择场景


在 Model Builder 中,选择 Object Detection 场景。


5. 加载数据


选择你的数据集。对象检测的数据集通常包含图像文件和一个标注文件(例如VOTT COCO 格式的 JSON 文件或 CSV 文件)。

本示例采用Vott数据源进行训练 

如何创建Vott数据集参考如下文档

教程:使用 Model Builder 检测图像中的对象 - ML.NET | Microsoft Learn

应用Vott工具可以简单快速创建用于训练目标识别的数据源,Vott工具采用标记图片的方式,最终导出Json数据供ML.NET使用


6. 配置训练


配置训练参数,例如训练时间和计算资源(CPU 或 GPU)。


7. 训练模型


点击 Start Training 开始训练模型。训练完成后,Model Builder 会生成一个模型文件和相关代码。

 8. 评估模型

9. 使用生成的模型


Model Builder 会在项目中生成一个 .mbconfig 文件和一个包含模型代码的文件夹。你可以在项目中使用生成的模型进行预测。

可以使用模板创建,也可以自定义封装调用

首先安装必要的Nuget包,如:

Microsoft.ML.OnnxTransformer

是一个用于在 .NET 应用程序中加载和运行 ONNX(Open Neural Network Exchange)模型的库。ONNX 是一个开放的格式,用于表示机器学习模型,支持多种框架和工具之间的互操作性。

主要功能
1.    加载 ONNX 模型:可以将预训练的 ONNX 模型加载到 .NET 应用程序中。
2.    模型推理:使用加载的 ONNX 模型进行推理(预测)。
3.    集成到 ML.NET 管道:可以将 ONNX 模型集成到 ML.NET 的数据处理和机器学习管道中。 

主要步骤
1.    创建 MLContext:这是 ML.NET 的上下文对象,用于创建和管理机器学习模型。
2.    加载 ONNX 模型:使用 ApplyOnnxModel 方法加载 ONNX 模型。
3.    创建预测引擎:使用 CreatePredictionEngine 方法创建预测引擎。
4.    进行预测:使用预测引擎进行预测。


通过 Microsoft.ML.OnnxTransformer,您可以轻松地在 .NET 应用程序中集成和使用 ONNX 模型进行机器学习推理。

Microsoft.ML.Transforms.Onnx 命名空间 | Microsoft Learn

Microsoft.ML.ImageAnalytics

是 ML.NET 中的一个包,专门用于处理图像数据的分析和处理。它提供了一些转换器和工具,可以帮助您在机器学习管道中处理图像数据。

主要功能
1.    图像加载:从文件或目录中加载图像。
2.    图像转换:对图像进行各种转换操作,如调整大小、裁剪、旋转等。
3.    图像特征提取:从图像中提取特征,用于机器学习模型的训练和推理。

主要步骤
1.    创建 MLContext:这是 ML.NET 的上下文对象,用于创建和管理机器学习模型。
2.    加载图像数据:使用 LoadFromTextFile 方法加载图像路径数据。
3.    创建图像处理管道:使用 LoadImages、ResizeImages、ExtractPixels 和 DnnFeaturizeImage 等方法创建图像处理管道。
4.    训练模型:使用 Fit 方法训练模型。
5.    创建预测引擎:使用 CreatePredictionEngine 方法创建预测引擎。
6.    进行预测:使用预测引擎进行图像特征提取。


通过 Microsoft.ML.ImageAnalytics,您可以轻松地在 ML.NET 中处理和分析图像数据,为机器学习模型提供丰富的图像特征。 

Microsoft.ML.Data 命名空间 | Microsoft Learn

Microsoft.ML.TorchSharp

是一个用于在 .NET 应用程序中集成和使用 TorchSharp 的库。TorchSharp 是一个 .NET 库,它提供了对 PyTorch 的访问,使得开发者可以在 .NET 环境中使用 PyTorch 的功能进行深度学习任务。

主要功能
1.    深度学习模型训练:使用 PyTorch 的 API 在 .NET 中训练深度学习模型。
2.    模型推理:加载和运行预训练的 PyTorch 模型进行推理。
3.    与 ML.NET 集成:将 TorchSharp 模型集成到 ML.NET 的数据处理和机器学习管道中。

主要步骤
1.    设置设备:选择使用 CPU 或 GPU 进行计算。
2.    定义模型:使用 TorchSharp 的 API 定义深度学习模型。
3.    创建输入数据:生成或加载输入数据。
4.    前向传播:使用模型进行前向传播,获取输出。


与 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 的功能进行深度学习任务。


主要功能
1.    深度学习模型训练:使用 LibTorch 的 API 在 .NET 中训练深度学习模型。
2.    模型推理:加载和运行预训练的 PyTorch 模型进行推理。
3.    与 TorchSharp 集成:结合 TorchSharp 库,提供对 PyTorch 的全面支持。 

主要步骤
1.    设置设备:选择使用 CPU 进行计算。
2.    定义模型:使用 TorchSharp 的 API 定义深度学习模型。
3.    创建输入数据:生成或加载输入数据。
4.    前向传播:使用模型进行前向传播,获取输出。


通过在项目中引用 libtorch-cpu-win-x64,您可以在 .NET 环境中利用 PyTorch 的强大功能,进行各种深度学习任务,并与其他 ML.NET 库无缝集成。

封装如下方法

    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;
        }
    }

 定义了一个静态方法,根据一个图片的路径输出一些识别到目标区域的矩形外框

        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轻量控件和皮肤库

了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值