示例:在ML.NET中应用Model Builder模型生成器构建图片对象检测模型

news2024/11/15 8:50:47

一、目的: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个人主页-哔哩哔哩视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五、栈与队列(2)

五、栈与队列&#xff08;2&#xff09; [150. 逆波兰表达式求值 ](https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/)[239. 滑动窗口最大值 ](https://leetcode.cn/problems/sliding-window-maximum/description/)[347.前 K 个高频元素 ](https:/…

python学习(day1)

1.Python 是大小写敏感的语言。 比如 print 函数名&#xff0c;该函数定义就是全部小写的&#xff0c; 不能写成 Print 或者 PRINT。 2.在Python语言中也会涉及到 对象&#xff0c; 这些对象包含了一定的数据信息。 Python语言中&#xff0c;所有的 数据 都被称之为 对象。 …

Docker 环境下使用 Traefik v3 和 MinIO 快速搭建私有化对象存储服务

上一篇文章中&#xff0c;我们使用 Traefik 新版本完成了本地服务网关的搭建。接下来&#xff0c;来使用 Traefik 的能力&#xff0c;进行一系列相关的基础设施搭建吧。 本篇文章&#xff0c;聊聊 MinIO 的单独使用&#xff0c;以及结合 Traefik 完成私有化 S3 服务的基础搭建…

C语言:qsort详解

在上一篇文章我们大致的了解了回调函数的用法和作用&#xff0c;在这一篇让我们来了解一下在回调函数qsort的使用吧。 一.qsort qsort是一种用来排各种类型数据的函数&#xff0c;利用的是快速排序的方式。说到排序&#xff0c;我们就想到了之前学习的冒泡排序&#xff0c;但…

MySQL数据如何高效实时同步到Elasticsearch?【送源码】

概述 在实际的项目开发与运维过程中&#xff0c;MySQL 常常扮演着业务数据库的核心角色&#xff0c;以其强大的事务处理能力和数据完整性保障&#xff0c;支撑着系统的稳定运行。然而&#xff0c;随着数据量的急剧增长和查询复杂度的不断提升&#xff0c;单一依赖 MySQL 进行高…

文章管理接口——里面有动态SQL编写,在分页查询里

1.实体类和表结构 2. 新增文章分类 接口文档 实现 完整代码放在校验部分 结果&#xff1a; 参数校验&#xff08;Validation自定义&#xff09; 对state的校验&#xff08;已发布|草稿&#xff09;&#xff0c;已有的注解不能满足校验需求&#xff0c;这时就需要自定义校验注解…

Day30 | 62.不同路径 63. 不同路径 II 343.整数拆分 96不同的二叉搜索树

语言 Java 62.不同路径 不同路径 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问…

JVM类加载中的双亲委派机制

【1】什么是双亲委派 Java虚拟机对class文件采用的是按需加载的方式&#xff0c;也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时&#xff0c;Java虚拟机采用的是双亲委派模式&#xff0c;即把请求交由父类处理&#xff0c…

【Git企业级开发实战指南①】Git安装、基本操作!

目录 一、Git是什么&#xff1f;1.1特点1.2功能1.3基本概念 二、Git安装2.1Ubuntu下安装2.2Centos下安装Git 三、Git基本操作3.1创建git本地仓库3.2配置Git3.3 工作区&暂存区&版本库3.4 实操案例3.4.1添加文件 3.5 修改文件3.6版本回退3.7查看历史操作日志3.7撤销修改3…

广东省各区县农业产量数据,数据精度至各区县,2020-2023年四年数据可选!

数据名称: 广东省各区县农业产量数据 数据格式: Shpexcel 数据几何类型: 面 数据坐标系: WGS84 数据时间&#xff1a;2020-2023年 数据来源&#xff1a;广东省统计年鉴 数据字段&#xff1a; 序号字段名称字段说明1province省份名称2city城市名称3county区县名称4cou…

【C++深度探索】红黑树的底层实现机制

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;C从入门至进阶 这里将会不定期更新有关C/C的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 前言 红…

VNC未授权访问漏洞

VNC 是虚拟网络控制台Virtual Network Console的英文缩写。它是一款优秀的远程控制工具软件由美国电话电报公司AT&T的欧洲研究实验室开发。VNC是基于 UNXI 和 Linux 的免费开源软件由 VNC Server 和 VNC Viewer 两部分组成。VNC 默认端口号为 5900、5901。VNC 未授权访问漏…

STM32F407移植LVGL(V8.3版本)

一、LVGL简述 1.丰富且强大的模块化图形组件&#xff1a;按钮、图表、列表、滑条、图片等 2.高级图形引擎&#xff1a;动画、抗锯齿、透明度、平滑滚动、图层混合等效果 3.支持多种输入设备&#xff1a;触摸屏、键盘、编码器、按键等 4.配置可裁剪&#xff0c;最低资源占用&am…

latex中Function函数报错

latex写伪码时&#xff0c;发现报错&#xff0c;截图如下&#xff1a; 解决办法&#xff0c;添加宏包&#xff0c;截图如下&#xff1a; \usepackage{algpseudocode}

虚幻引擎 C++ 实现平面阴影

1、平面阴影介绍 平面阴影是一种相对简单的渲染阴影的方式&#xff0c;可以理解为对一个模型渲染两次&#xff0c;一次是渲染模型本身&#xff0c;另一次是渲染模型的投影。渲染投影可以看作是将模型的顶点变换到地面的投影空间再渲染&#xff0c;可以理解为渲染了一个“压扁”…

pytorch学习笔记6 tensor拼接和拆分

cat 合并 dim必须首选相同&#xff08;上例都是3&#xff09;&#xff0c;其次除了合并的dim&#xff08;上例中为dim0&#xff09;外&#xff0c;其它dim的size必须相同&#xff08;dim 1的size是32&#xff0c;dim2的size是8&#xff09;&#xff0c;否则需要手动处理到相同…

vue3 + Spingboot + oracle 通过Base64存储图片

一 、前言 近期在做vue3 Springboot oracle 的工作&#xff0c;有个小功能通过页面导入图片保存到oracle数据库中&#xff0c;本人对前端不是很熟悉&#xff0c;借此记录一下实现方法&#xff1b; 二、前端部分代码 <template><div class"dialog-mian"&…

SQL注入实例(sqli-labs/less-7)

0、初始页面 1、确定闭合字符 确定闭合字符为单引号括号括号 )) ?id1 and 11 ?id1 and 12 ?id1 ?id1)) 2、查看securie_file_priv参数 ?id1)) and upddatexml(1,concat(0x7e,(select secure_file_priv),0x7e),1) -- 3、写入一句话木马 ?id1)) union select null,&q…

SFT、RLHF、DPO、IFT —— LLM 微调的进化之路

TL;DR • SFT、RLHF 和 DPO 都是先估计 LLMs 本身的偏好&#xff0c;再与人类的偏好进行对齐&#xff1b; • SFT 只通过 LLMs 生成的下一个单词进行估计&#xff0c;而 RLHF 和 DPO 通过 LLMs 生成的完整句子进行估计&#xff0c;显然后者的估计会更准确&#xff1b; • 虽然…

壹连科技净利润增速放缓:毛利率清一色下滑,研发费用率远弱同行

《港湾商业观察》施子夫 王璐 从2022年6月20日递表创业板以来&#xff0c;深圳壹连科技股份有限公司&#xff08;以下简称&#xff0c;壹连科技&#xff09;已经走了2年多的历程&#xff0c;如今离挂牌上市近在咫尺。 今年7月22日&#xff0c;壹连科技提交了注册申请。8月2日…