用C#也能做机器学习?

news2025/2/4 16:03:26

前言✨

说到机器学习,大家可能都不陌生,但是用C#来做机器学习,可能很多人还第一次听说。其实在C#中基于ML.NET也是可以做机器学习的,这种方式比较适合.NET程序员在项目中集成机器学习模型,不太适合专门学习机器学习,本文我将基于ML.NET Model Builder(低代码、入门简单)构建一个猫狗识别实例,并在.NET应用中集成它。

效果✨

效果如下所示:

猫狗识别效果

目录✨

  1. ML.NET简介
  2. ML.NET Model Builder简介
  3. 数据集准备
  4. 添加机器学习模型
  5. 选择方案
  6. 选择训练环境
  7. 添加数据
  8. 训练
  9. 评估模型
  10. 在.NET应用中使用模型
  11. 总结

ML.NET简介✨

ML.NET 是由 Microsoft 为 .NET 开发者平台创建的免费、开源、跨平台的机器学习框架。

ML.NET,无需离开 .NET 生态系统,便可以使用 C# 或 F# 创建自定义 ML 模型。

ML.NET 提供 Model Builder(简单的 UI 工具)和 ML.NET CLI,使生成自定义 ML 模型变得非常容易。

ML.NET 被设计为一个可扩展平台,因此可以使用其他流行的 ML 框架(TensorFlow、ONNX、Infer.NET 等)并访问更多机器学习场景,如图像分类、物体检测等。

image-20231220210642734

ML.NET Model Builder简介✨

Model Builder 提供易于理解的可视界面,用于在 Visual Studio 内生成、训练和部署自定义机器学习模型。无需先前的机器学习专业知识。

Model Builder 支持 AutoML,它会自动探索不同的机器学习算法和设置,以帮助找到最适合方案的算法和设置。

Model Builder 的当前预览版可用于 csv 文件、tsv 文件以及 SQL Server 数据库。

Model Builder 可生成经过训练的模型,以及加载模型和开始进行预测所需的代码。

Model Builder 为你提供计算机上所需的一切功能。不需要连接到云资源或其他服务即可生成和使用模型。

Model Builder 是一个 Visual Studio 扩展,便于你在已知的开发环境中继续工作。

Model Builder 可用于在 Visual Studio 中开发的任何 .NET 应用。

image-20231221103403282

数据集准备✨

本文使用的数据集,来源于kaggle,共包含25000张JPEG数据集照片,其中猫和狗的照片各占12500张。

下载地址:https://www.kaggle.com/c/dogs-vs-cats/data

将压缩包解压,有test1.zip与train.zip,再分别解压得到test1与train文件夹:

image-20231220221657444

在train文件夹中各有12500张猫的图片和狗的图片,本示例不用那么多的图片,分别选取2500张的猫和狗的图片。

添加机器学习模型✨

右键解决方案,新建一个类库,命名为IdentifyDogsAndCats:

image-20231220222726459

右键该类库,添加机器学习模型:

image-20231220222911054

命名为IdentifyDogsAndCats.mbconfig,然后会跳出如下界面:

image-20231220223109571

选择方案✨

本文中的猫狗识别,属于计算机视觉中的图像分类,因此选择该方案:

image-20231220223329503

选择训练环境✨

本文只是示例,选择本地(CPU):

image-20231220223412642

添加数据✨

添加数据需要选择一个文件夹,文件夹的结构示例,如右侧所示:

image-20231220223727032

像右侧所示这样组织文件:

image-20231221090614621

先创建一个名为猫狗图片的文件夹然后在里面再分别添加一个命名为狗和猫的文件夹,在里面各添加2500张图片。

在狗文件夹中添加狗的图片:

image-20231221090811257

在猫文件夹中添加猫的图片:

image-20231221091034432

训练模型✨

开始训练:

image-20231220210411840

需要等待一定的时间。

训练完成:

image-20231220212720758

评估模型✨

image-20231220213352174

image-20231220213451843

image-20231220213534280

在.NET应用中使用模型✨

训练完成后,在解决方案的mbconfig下生成了三个文件:

image-20231221092356947

IdentifyDogsAndCats.consumption.cs: 此文件包含模型输入和输出类以及可用于模型消耗的 Predict 方法。

IdentifyDogsAndCats.mlnet: 该文件是经过训练的 ML.NET 模型,它是一个序列化的 zip 文件。

IdentifyDogsAndCats.training.cs: 此文件包含用于了解输入列对模型预测的重要性的代码。

在应用台程序中集成该模型✨

创建一个控制台应用:

image-20231221092839597

添加项目依赖:

右键TestModel,选择“添加项目引用”。

image-20231221092945301

选择包含模型的类库:

image-20231221093034754

将Program.cs中的代码替换为如下代码:

using Model = IdentifyDogsAndCats;
namespace TestModel
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Load sample data
            var imageBytes = File.ReadAllBytes(@"D:\学习路线\C#\ML.NET\IdentifyDogsAndCats\test1\21.jpg");
            Model.IdentifyDogsAndCats.ModelInput sampleData = new()
            {
                ImageSource = imageBytes,
            };

            //Load model and predict output
            var result = Model.IdentifyDogsAndCats.Predict(sampleData);

            //输出结果
            Console.WriteLine(result.PredictedLabel);
        }
    }

开始运行:

image-20231221102750438

image-20231221102810219

查看这张图片:

image-20231221102839318

在winform中集成该模型✨

添加一个winform项目,右键添加项目引用:

image-20231221103159329

为了便于演示,设计页面如下:

image-20231221104030480

Form1.cs中代码如下:

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        string selectedImagePath;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();

            // 设置对话框的标题
            openFileDialog.Title = "选择图片文件";

              // 设置对话框初始目录
  openFileDialog.InitialDirectory = @"D:\学习路线\C#\ML.NET\IdentifyDogsAndCats\test1";
            
            // 设置对话框允许选择的文件类型
            openFileDialog.Filter = "图片文件|*.jpg;*.jpeg;*.png;*.gif;*.bmp|所有文件|*.*";

            // 如果用户点击了“确定”按钮
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                // 获取选择的文件路径
                selectedImagePath = openFileDialog.FileName;

                // 在这里可以使用selectedImagePath进行后续操作,比如显示图片到窗体上
                pictureBox1.Image = new Bitmap(selectedImagePath);



            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Load sample data
            var imageBytes = File.ReadAllBytes(selectedImagePath);
            IdentifyDogsAndCats.IdentifyDogsAndCats.ModelInput sampleData = new()
            {
                ImageSource = imageBytes,
            };

            //Load model and predict output
            var result = IdentifyDogsAndCats.IdentifyDogsAndCats.Predict(sampleData);

            //提示识别是否完成
            MessageBox.Show($"识别已完成,识别结果为:{result.PredictedLabel}");
            //将结果显示在label1上
            label1.Text = result.PredictedLabel;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

运行效果如下所示:

猫狗识别效果

可见第一次识别确实久一点,但是后面识别挺快的。

运行效果截图:

image-20231221111125031

image-20231221110957744

总结✨

本文先是简单介绍了ML.NETML.NET Model Builder,其次基于ML.NET Model Builder构建了一个猫狗识别的机器学习模型实例,最后在.NET项目中集成了它。

总体流程图如下所示:

image-20231221120437686

希望对你有所帮助。

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

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

相关文章

Grafana高可用-LDAP

一. grafana高可用 1. 迁移之前的 grafana sqlitedump.sh #!/bin/bash DB$1 TABLES$(sqlite3 $DB .tables | sed -r s/(\S)\s(\S)/\1\n\2/g | grep -v migration_log) for t in $TABLES; doecho "TRUNCATE TABLE $t;" done for t in $TABLES; doecho -e ".mode…

【Skynet 入门实战练习】事件模块 | 批处理模块 | GM 指令 | 模糊搜索

文章目录 前言事件模块批处理模块GM 指令模块模糊搜索最后 前言 本节完善了项目,实现了事件、批处理、模糊搜索模块、GM 指令模块。 事件模块 什么是事件模块?事件模块是用来在各系统之间传递事件消息的。 为什么需要事件模块?主要目的是…

Android笔记(二十一):Room组件实现Android应用的持久化处理

一、Room组件概述 Room是Android JetPack架构组件之一,是一个持久处理的库。Room提供了在SQLite数据库上提供抽象层,使之实现数据访问。 (1)实体类(Entity):映射并封装了数据库对应的数据表中…

[前端优化]项目优化--Lighthouse

[前端优化]项目优化--Lighthouse 前端优化的分类Lighthouse 优化工具优化维度--性能(Performance)性能指标概览白屏时间--FP首字节时间--TTFB首次输入延迟--FID累积布局偏移--CLS 性能指标分析Lighthouse的性能优化方案性能优化实战解析Serve images in next-gen formatsEnable…

Postman报:400 Bad Request

● 使用Postman发送Post请求报400,入参为JSON; 二、分析 1、Postman请求并没有请求到后台Api(由于语法错误,服务器无法理解请求); 2、入参出错范围:cookie、header、body、form-data、x-www-f…

C# Onnx yolov8n csgo player detection

目录 效果 模型信息 项目 代码 下载 C# Onnx yolov8n csgo player detection 效果 模型信息 Model Properties ------------------------- date:2023-12-22T15:01:08.014205 author:Ultralytics task:detect license:AGPL-…

Open5GSUeRANSim3:VirtualBOX VM使用static IP并和host互通

本文档参考 https://blog.csdn.net/shuaihj/article/details/127589833 https://www.cnblogs.com/manongqingcong/articles/16659150.html https://blog.csdn.net/justlpf/article/details/132977047 VM默认使用的是自动分配的IP,每个VM的ip都是10.0.2.15。后续为了…

管理类联考——数学——真题篇——按知识分类——代数——数列

【等差数列 ⟹ \Longrightarrow ⟹ 通项公式: a n a 1 ( n − 1 ) d a m ( n − m ) d n d a 1 − d A n B a_n a_1(n-1)d a_m(n-m)dnda_1-dAnB an​a1​(n−1)dam​(n−m)dnda1​−dAnB ⟹ \Longrightarrow ⟹ A d , B a 1 − d Ad&#x…

HBuilderX项目配置使用uview

配置uview,先安装再配置 如果没有package.json文件,先打开终端,执行命令 npm init -y 然后就会生成 package.json 安装 使用npm安装uview npm install uview-ui2.0.36 安装好之后,可以看到package.json里面已经显示版本了 查…

中间件系列 - Redis入门到实战(实战篇)

前言 学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 本内容仅用于个人学习笔记,如有侵扰,联系删除 本章学习目标: 短信登录 这一块我们会使用redis…

Java_集合进阶Map实现类

一、Map集合 已经学习了Map集合的常用方法,以及遍历方式。 下面学习的是Map接口下面的是三个实现类HashMap、LinkedHashMap、TreeMap。实际上这三个实现类并没有什么特有方法需要我们学习,它们的方法就是前面学习Map的方法。这里我们主要学习它们的底层…

由浅入深走进Python异步编程【多进程】(含代码实例讲解 || multiprocessing、异步进程池、进程通信)

写在前面 从底层到第三方库,全面讲解python的异步编程。这节讲述的是python的多线程实现,纯干货,无概念,代码实例讲解。 本系列有6章左右,点击头像或者专栏查看更多内容,陆续更新,欢迎关注。 …

JavaWeb笔记之前端开发JQuery

一、引言 1.1 概述 jQuery是一个快速、简洁的JavaScript代码库。jQuery设计的宗旨是“Write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的 JavaScript操作方式&#xff0c…

微信小程序格创校园跑腿小程序源码v1.1.64+前端

简介: 版本号:1.1.64 – 多学校版本 本次更新内容: 订单问题修复 (无需上传小程序) 版本号:1.1.63 – 多学校版本 本次更新内容: 失物招领增加内容安全接口; 认证增加性别选…

谷歌 | Duet AI 让洞察、聚类模型和可视化变得简单

迷失在数据的海洋 我们都经历过这样的情况:淹没在数据的海洋中,努力驾驭复杂的管道,感觉数据令人头晕。管理大量充满不同工具和 Google 搜索的选项卡以及花费大量时间筛选数据和代码以创建满足您需求的模型所带来的挫败感,真的会…

elasticsearch 与 mysql的概念对比

文档 elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。 文档数据会被序列化为json格式后存储在elasticsearch中。 索引(Index) 索引(index):相同类型的文档的集合映射(mapping):索引中文档的字段约束信息,类似…

SoapUI、Jmeter、Postman三种接口测试工具的比较分析!

前段时间忙于接口测试,也看了几款接口测试工具,简单从几个角度做了个比较,拿出来与诸位分享一下。本文从多个方面对接口测试的三款常用工具进行比较分析,以便于在特定的情况下选择最合适的工具,或者使用自己编写的工具…

开放式耳机推荐哪款好、百元最好的蓝牙耳机

说起开放式蓝牙耳机,相信大部分小伙伴儿都不会陌生吧。与传统的封闭式耳机相比,其不仅提升了佩戴的舒适性,而且对耳朵的保护上也非常的友好。尤其是适用于那些喜欢户外运动和长途旅行佩戴的用户。不过也因为发展的比较快,开放式耳…

vscode debug c++代码

需要提前写好CMakeLists.txt 在tasks.json中写好编译的步骤,即tasks,如cmake … 和make -j 在lauch.json中配置可执行文件的路径和需要执行tasks中的哪一个任务 具体步骤: 1.写好c代码和CMakeLists.txt 2.配置tasks.json 终端–>配置任务…