前言

说到机器学习,大家可能都不陌生,但是用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 等)并访问更多机器学习场景,如图像分类、物体检测等。

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 应用。

数据集准备

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

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

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

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

添加机器学习模型

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

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

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

选择方案

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

选择训练环境

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

添加数据

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

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

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

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

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

训练模型

开始训练:

需要等待一定的时间。

训练完成:

评估模型

在.NET应用中使用模型

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

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

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

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

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

创建一个控制台应用:

添加项目依赖:

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

选择包含模型的类库:

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

开始运行:

查看这张图片:

在winform中集成该模型

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

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

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)
      {

      }
  }
}

运行效果如下所示:

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

运行效果截图:

总结

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

总体流程图如下所示:

希望对你有所帮助。

 

用C#也能做机器学习?的更多相关文章

  1. TensorFlow从1到2(十五)(完结)在浏览器做机器学习

    TensorFlow的Javascript版 TensorFlow一直努力扩展自己的基础平台环境,除了熟悉的Python,当前的TensorFlow还实现了支持Javascript/C++/Java/ ...

  2. 什么是最小可行性数据产品(MVP)?如何用它做机器学习?

  3. pandas dataframe 做机器学习训练数据=》直接使用iloc或者as_matrix即可

    样本示意,为kdd99数据源: 0,udp,private,SF,105,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0.00,0.00,0.00,0.00,1.0 ...

  4. 机器学习:scikit-learn 做笑脸识别 (SVM, KNN, Logisitc regression)

    scikit-learn 是 Python 非常强大的一个做机器学习的包,今天介绍scikit-learn 里几个常用的分类器 SVM, KNN 和 logistic regression,用来做笑脸 ...

  5. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  6. 【原】Spark之机器学习(Python版)(一)——聚类

      kmeans聚类相信大家都已经很熟悉了.在Python里我们用kmeans通常调用Sklearn包(当然自己写也很简单).那么在Spark里能不能也直接使用sklean包呢?目前来说直接使用有点困 ...

  7. Coursera台大机器学习基础课程学习笔记1 -- 机器学习定义及PLA算法

    最近在跟台大的这个课程,觉得不错,想把学习笔记发出来跟大家分享下,有错误希望大家指正. 一机器学习是什么? 感觉和 Tom M. Mitchell的定义几乎一致, A computer program ...

  8. Coursera台大机器学习课程笔记15 -- Three Learning Principles

    这节课是最后一节,讲的是做机器学习的三个原则. 第一个是Occan's razor,即越简单越好.接着解释了什么是简单的hypothesis,什么是简单的model.关于为什么越简单越好,林老师从大致 ...

  9. 机器学习&人工智能书籍

    Introduction to Machine Learning https://www.amazon.cn/Introduction-to-Machine-Learning-Alpaydin-Eth ...

  10. 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】

    转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...

随机推荐

  1. 关于API数据接口获取商品的数据的说明

    ​ 获取商品数据已经成为许多应用程序的重要组成部分.为了实现这一目标,许多公司和技术开发者使用API数据接口来获取相关数据.本文将详细介绍如何使用API数据接口获取商品数据,并使用Python作为编程 ...

  2. CentOS 8 无痕升级到 Rocky Linux

    CentOS 8 无痕升级到 Rocky Linux 1.升级当前系统 dnf upgrade -y 2.重启当前系统: reboot 3.下载脚本: CentOS 8 到 Rocky Linux 8 ...

  3. 实现自动扫描工作区npm包并同步cnpm

    省流版: npx cnnc 为避免包名重复,取了2个单词的首尾,cnpm sync 前言 在开发一个多npm包的项目时,时常会一次更新多个包的代码,再批量发布到 npm 镜像源后. 由于国内网络环境的 ...

  4. 关于关闭Sublime Text自动更新提示

    Sublime Text默认提示自动更新,实在让人烦不胜烦,那么有没有办法解决嘞,那当然是有的,下面就教你如何关闭Sublime Text自动更新提示 首先注册,不注册的话,一切操作都没有用:(注册码 ...

  5. 【matplotlib 实战】--面积图

    面积图,或称区域图,是一种随有序变量的变化,反映数值变化的统计图表. 面积图也可用于多个系列数据的比较.这时,面积图的外观看上去类似层叠的山脉,在错落有致的外形下表达数据的总量和趋势.面积图不仅可以清 ...

  6. CPU占用99%

    晚间迁移数据库后,第二天下午来调优,发现CPU占用达到惊人的99%,如下: 分析15:00-16:00期间AWR报告,发现SQL硬解析严重,如下: 每秒硬解析达到69.9次,library hit%太 ...

  7. python接口自动化 之excel读取测试数据

    一.当你拥有一个excel版的接口用例 excel中有用例名称.url.请求方式和请求参数 二.获取excel的Url.请求方式和请求参数 # 单独获取某个单元格的值,第二行第二列# 第二行数据 ro ...

  8. Lab3 存储过程与触发器

    实验三 存储过程与触发器  实验目的: 学习SQL语言进行编程的基本方法与技术,能够编写存储过程.触发器解决数据库需要处理的复杂问题.  实验内容: 1. 设计一个存储过程或者自定义函数,练习存储 ...

  9. OTOCI 题解

    OTOCI 题目大意 给定 \(n\) 个带权的点,需要进行四种操作:查询两点连通性:加边:修改点权:查询两点路径的权值和. 思路分析 首先观察题目,我们会发现,在所有的操作结束后,所有的点构成一个森 ...

  10. Unity 在Preferences或Project Setting窗口创建自定义配置

    官方文档链接 https://docs.unity3d.com/2020.3/Documentation/ScriptReference/SettingsProvider.html 一直不习惯使用Un ...