当前位置: 首页 > news >正文

用C#也能做机器学习?

前言✨

说到机器学习,大家可能都不陌生,但是用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 datavar imageBytes = File.ReadAllBytes(@"D:\学习路线\C#\ML.NET\IdentifyDogsAndCats\test1\21.jpg");Model.IdentifyDogsAndCats.ModelInput sampleData = new(){ImageSource = imageBytes,};//Load model and predict outputvar 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 datavar imageBytes = File.ReadAllBytes(selectedImagePath);IdentifyDogsAndCats.IdentifyDogsAndCats.ModelInput sampleData = new(){ImageSource = imageBytes,};//Load model and predict outputvar 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

希望对你有所帮助。

相关文章:

用C#也能做机器学习?

前言✨ 说到机器学习,大家可能都不陌生,但是用C#来做机器学习,可能很多人还第一次听说。其实在C#中基于ML.NET也是可以做机器学习的,这种方式比较适合.NET程序员在项目中集成机器学习模型,不太适合专门学习机器学习&a…...

Python PDF格式转PPT格式

要将PDF文件转换为PPT,我实在python3.9 环境下转成功的,python3.11不行。 需要 pip install PyMuPDF代码说话 # -*- coding: utf-8 -*-""" author: 赫凯 software: PyCharm file: xxx.py time: 2023/12/21 11:20 """im…...

搭建知识付费平台?明理信息科技为你提供全程解决方案

明理信息科技saas知识付费平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和维护…...

漫谈UNIX、Linux、UNIX-Like

漫谈UNIX、Linux、UNIX-Like 使用了这么多年Redhat、Ubuntu等Linux、Windows、Solaris操作系统,你是否对UNIX、Unix-Like(类UNIX)还是不太清楚?我以前一直认为Unix-Like就等于Linux。其实,由UNIX派生出来而没有取得UN…...

Netty Review - Netty与Protostuff:打造高效的网络通信

文章目录 概念PrePomServer & ClientProtostuffUtil 解读测试小结 概念 Pre 每日一博 - Protobuf vs. Protostuff&#xff1a;性能、易用性和适用场景分析 Pom <dependency><groupId>com.dyuproject.protostuff</groupId><artifactId>protostuff-…...

在ClickHouse数据库中启用预测功能

在这篇博文中&#xff0c;我们将介绍如何将机器学习支持的预测功能与 ClickHouse 数据库集成。ClickHouse 是一个快速、开源、面向列的 SQL 数据库&#xff0c;对于数据分析和实时分析非常有用。该项目由 ClickHouse&#xff0c; Inc. 维护和支持。我们将探索它在需要数据准备以…...

目标检测YOLO实战应用案例100讲-树上果实识别与跟踪计数(续)

目录 3.2 损失函数优化 3.3 实验过程 3.3.1 果实图像采集 3.3.2 数据扩增...

Docker 文件和卷 权限拒绝

一 创作背景 再复制Docker影像文件或访问Docker容器内已安装卷上的文件时我们常常会遇到&#xff1a;“权限被拒绝”的错误&#xff0c;在此&#xff0c;您将了解到为什么会出现“权限被拒绝”的错误以及如何解决这个问题。 二 目的 在深入探讨 Docker 容器中的 Permission De…...

Appium Server 启动失败常见原因及解决办法

Error: listen EADDRINUSE: address already in use 0.0.0.0:4723 如下图&#xff1a; 错误原因&#xff1a;Appium 默认的4723端口被占用 解决办法&#xff1a; 出现该提示&#xff0c;有可能是 Appium Server 已启动&#xff0c;关闭已经启动的 Appium Server 即可。472…...

将Abp默认事件总线改造为分布式事件总线

文章目录 原理创建分布式事件总线实现自动订阅和事件转发 使用启动Redis服务配置传递Abp默认事件传递自定义事件 项目地址 原理 本地事件总线是通过Ioc容器来实现的。 IEventBus接口定义了事件总线的基本功能&#xff0c;如注册事件、取消注册事件、触发事件等。 Abp.Events…...

Jupyter Notebook修改默认工作目录

1、参考修改Jupyter Notebook的默认工作目录_jupyter文件路径-CSDN博客修改配置文件 2.在上述博客内容的基础上&#xff0c;这里不是删除【%USERPROFILE%】而是把这个地方替换为所要设置的工作目录路径&#xff0c; 3.【起始位置】也可以更改为所要设置的工作目录路径&#x…...

高校/企业如何去做数据挖掘呢?

随着近年来人工智能及大数据、云计算进入爆发时期&#xff0c;依托三者进行的数据分析、数据挖掘服务已逐渐成为各行业进行产业升级的载体&#xff0c;缓慢渗透进我们的工作和生活&#xff0c;成为新时代升级版的智能“大案牍术”。 那么对于多数企业来说&#xff0c;如何做数据…...

数据仓库-数据治理小厂实践

一、简介 数据治理贯穿数仓中数据的整个生命周期&#xff0c;从数据的产生、加载、清洗、计算&#xff0c;再到数据展示、应用&#xff0c;每个阶段都需要对数据进行治理&#xff0c;像有些比较大的企业都是有自己的数据治理平台或者会开发一些便捷的平台&#xff0c;对于没有平…...

【C++多线程编程】(五)之 线程生命周期管理join() 与 detach()

在C中&#xff0c;std::thread 类用于创建和管理线程。std::thread 提供了两种主要的方法来控制线程的生命周期&#xff1a;join 和 detach。 detach方式&#xff0c;启动的线程自主在后台运行&#xff0c;当前的代码继续往下执行&#xff0c;不等待新线程结束。join方式&…...

金融信贷场景的风险“要素”与主要“风险点”

目录 要素一:贷款对象 风险点1:为不具备主体资格或主体资格有瑕疵的借款人发放贷款 风险表现: 防控措施: 风险点2:向国家限控行业发放贷款 风险表现: 防控措施: 风险点3:受理不符合准入条件的客户申请 风险表现: 防控措施: 要素二:金额 风险点4:过渡授…...

ubuntu下docker安装,配置python运行环境

参考自: 1.最详细ubuntu安装docker教程 2.使用docker搭建python环境 首先假设已经安装了docker&#xff0c;卸载原来的docker 在命令行中运行&#xff1a; sudo apt-get updatesudo apt-get remove docker docker-engine docker.io containerd runc 安装docker依赖 apt-get…...

在Docker中安装kafka遇到问题记录

命令含义解答&#xff1a; 在docker安装kafka的时候&#xff0c;启动kafka的时候会执行下面语句&#xff1a; docker run -d --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name kafka -p 9092:9092 -e KAFKA_BROKER_ID0 -e KAFKA_ZOOKEEPER_CONNEC…...

aws-waf-cdn 基于规则组的永黑解决方案

1. 新建waf 规则组 2. 为规则组添加规则 根据需求创建不同的规则 3. waf中附加规则组 &#xff08;此时规则组所有规则都会附加到waf中&#xff0c;但是不会永黑&#xff09; 此刻&#xff0c;可以选择测试下规则是否生效&#xff0c;测试前确认保护资源绑定无误 4. 创建堆…...

如何实现免费无限流量云同步笔记软件Obsidian?

目录 前言 如何实现免费无限流量云同步笔记软件Obsidian&#xff1f; 一、简介 软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步 1 安装并设置Synology Drive套件 2 局域网内同步文件测试 三、内网穿透群晖Synol…...

GPTs | Actions应用案例

上篇文章说道&#xff0c;如何使用创建的GPTs通过API接口去获取外部的一些信息&#xff0c;然后把获取的外部信息返回给ChatGPT让它加工出来&#xff0c;回答你的问题&#xff0c;今天我们就来做一个通俗易懂的小案例&#xff0c;让大家来初步了解一下它的使用法&#xff01; …...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...