用C#也能做机器学习?

简介: 用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 等)并访问更多机器学习场景,如图像分类、物体检测等。

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# 数据库
|
4月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
162 3
|
4月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
178 3
|
7天前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
23 11
|
1月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
51 7
|
18天前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
31 0