首页 > 编程语言 >用C#也能做机器学习?

用C#也能做机器学习?

时间:2023-12-21 14:23:18浏览次数:30  
标签:机器 模型 C# ML Builder 学习 IdentifyDogsAndCats NET Model

前言✨

说到机器学习,大家可能都不陌生,但是用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

希望对你有所帮助。

 

 

【出处】:https://www.cnblogs.com/mingupupu/p/17918738.html

=======================================================================================

标签:机器,模型,C#,ML,Builder,学习,IdentifyDogsAndCats,NET,Model
From: https://www.cnblogs.com/mq0036/p/17918906.html

相关文章

  • 《Java架构师的第一性原理》31分布式计算之微服务RPC(Dubbo)
    1 互联网架构,究竟为啥要做服务化互联网架构,究竟为啥要做服务化?2 微服务架构,多“微”才合适?微服务架构,多“微”才合适? 3 离不开的微服务架构,脱不开的RPC细节离不开的微服务架构,脱不开的RPC细节3.1服务化解决的问题1)服务化需要解决的问题:一套序列化、反序列化、网络框......
  • 前端导出export2Excel-多级表头
    1,export2Excel.js/*eslint-disable*///import{saveAs}from"file-saver";constsaveAs=require("file-saver");//importXLSXfrom"xlsx";importXLSXfrom"yxg-xlsx-style";importmomentfrom"moment&qu......
  • class080 状压dp-上【算法】
    class080状压dp-上【算法】算法讲解080【必备】状压dp-上Code1464.我能赢吗//我能赢吗//给定两个整数n和m//两个玩家可以轮流从公共整数池中抽取从1到n的整数(不放回)//抽取的整数会累加起来(两个玩家都算)//谁在自己的回合让累加和>=m,谁获胜//若先出手的玩家能稳赢则......
  • class083 动态规划中用观察优化枚举的技巧-下【算法】
    class083动态规划中用观察优化枚举的技巧-下【算法】算法讲解083【必备】动态规划中用观察优化枚举的技巧-下code11235.规划兼职工作//规划兼职工作//你打算利用空闲时间来做兼职工作赚些零花钱,这里有n份兼职工作//每份工作预计从startTime[i]开始、endTime[i]结束,报酬为pr......
  • 大模型:高质量对话数据生成,Enhancing Chat Language Models by Scaling High-quality I
    EnhancingChatLanguageModelsbyScalingHigh-qualityInstructionalConversations论文地址1.导读不少工作已经意识到ChatGPT的秘密在于将指令微调和对其微调做到了极致,是继GPT-3后的又一次大力出奇迹。这篇文章来自清华大学5月份的工作,目的在于生成高质量的指令微调......
  • protobuf、protobuf-c、protobuf-c-rpc在Linux(Ubuntu18.04)编译安装及交叉编译arm\aar
    protobuf、protobuf-c、protobuf-c-rpc在Linux(Ubuntu18.04)编译安装及交叉编译arm\aarch64版本文章目录protobuf、protobuf-c、protobuf-c-rpc在Linux(Ubuntu18.04)编译安装及交叉编译arm\aarch64版本一、前言二、protobuf、rpc、protobuf-c、protobuf-c-rpc介绍1、protobuf2、protob......
  • 查看NVIDIA CUDA版本号的四种方法
    查看CUDA版本号这里有三种方法。nvidia-smi运行nvidia-smi命令:右上角可以看到CUDA版本号。CUDAToolkit下载地址:https://developer.nvidia.com/cuda-downloads$nvcc-Vnvcc:NVIDIA(R)CudacompilerdriverCopyright(c)2005-2023NVIDIACorporationBuiltonFri_Nov__3_17......
  • class081 状压dp-下【算法】
    class081状压dp-下【算法】算法讲解081【必备】状压dp-下Code11434.每个人戴不同帽子的方案数//每个人戴不同帽子的方案数//总共有n个人和40种不同的帽子,帽子编号从1到40//给你一个整数列表的列表hats,其中hats[i]是第i个人所有喜欢帽子的列表//请你给每个人......
  • class073 背包dp-01背包、有依赖的背包【算法】
    class073背包dp-01背包、有依赖的背包【算法】算法讲解073【必备】背包dp-01背包、有依赖的背包code1P1048[NOIP2005普及组]采药//01背包(模版)//给定一个正数t,表示背包的容量//有m个货物,每个货物可以选择一次//每个货物有自己的体积costs[i]和价值values[i]//返回在......
  • class072 最长递增子序列问题与扩展【算法】
    class072最长递增子序列问题与扩展【算法】code1300.最长递增子序列//最长递增子序列和最长不下降子序列//给定一个整数数组nums//找到其中最长严格递增子序列长度、最长不下降子序列长度//测试链接:https://leetcode.cn/problems/longest-increasing-subsequence/dp[i......