心愿沉沦 發表於 2023-12-21 12:49:00

用C#也能做机器学习?

<h1 class="md-end-block md-heading"><span class="md-plain">前言✨</span></h1>
<p class="md-end-block md-p"><span class="md-plain">说到机器学习,大家可能都不陌生,但是用C#来做机器学习,可能很多人还第一次听说。其实在C#中基于ML.NET也是可以做机器学习的,这种方式比较适合.NET程序员在项目中集成机器学习模型,不太适合专门学习机器学习,本文我将基于ML.NET Model Builder(低代码、入门简单)构建一个猫狗识别实例,并在.NET应用中集成它。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">效果✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">效果如下所示:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/%E7%8C%AB%E7%8B%97%E8%AF%86%E5%88%AB%E6%95%88%E6%9E%9C2.gif"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/%E7%8C%AB%E7%8B%97%E8%AF%86%E5%88%AB%E6%95%88%E6%9E%9C2.gif"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">目录✨</span></h2>
<ol class="ol-list">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">ML.NET简介</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">ML.NET Model Builder简介</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">数据集准备</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">添加机器学习模型</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">选择方案</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">选择训练环境</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">添加数据</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">训练</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">评估模型</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">在.NET应用中使用模型</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">总结</span></p>
</li>
</ol>
<h2 class="md-end-block md-heading"><span class="md-plain">ML.NET简介✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">ML.NET 是由 Microsoft 为 .NET 开发者平台创建的免费、开源、跨平台的机器学习框架。</span></p>
<p class="md-end-block md-p"><span class="md-plain">ML.NET,无需离开 .NET 生态系统,便可以使用 C# 或 F# 创建自定义 ML 模型。</span></p>
<p class="md-end-block md-p"><span class="md-plain">ML.NET 提供 Model Builder(简单的 UI 工具)和 ML.NET CLI,使生成自定义 ML 模型变得非常容易。</span></p>
<p class="md-end-block md-p"><span class="md-plain">ML.NET 被设计为一个可扩展平台,因此可以使用其他流行的 ML 框架(TensorFlow、ONNX、Infer.NET 等)并访问更多机器学习场景,如图像分类、物体检测等。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220210642734.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220210642734.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">ML.NET Model Builder简介✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">Model Builder 提供易于理解的可视界面,用于在 Visual Studio 内生成、训练和部署自定义机器学习模型。无需先前的机器学习专业知识。</span></p>
<p class="md-end-block md-p"><span class="md-plain">Model Builder 支持 AutoML,它会自动探索不同的机器学习算法和设置,以帮助找到最适合方案的算法和设置。</span></p>
<p class="md-end-block md-p"><span class="md-plain">Model Builder 的当前预览版可用于 csv 文件、tsv 文件以及 SQL Server 数据库。</span></p>
<p class="md-end-block md-p"><span class="md-plain">Model Builder 可生成经过训练的模型,以及加载模型和开始进行预测所需的代码。</span></p>
<p class="md-end-block md-p"><span class="md-plain">Model Builder 为你提供计算机上所需的一切功能。不需要连接到云资源或其他服务即可生成和使用模型。</span></p>
<p class="md-end-block md-p"><span class="md-plain">Model Builder 是一个 Visual Studio 扩展,便于你在已知的开发环境中继续工作。</span></p>
<p class="md-end-block md-p"><span class="md-plain">Model Builder 可用于在 Visual Studio 中开发的任何 .NET 应用。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221103403282.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221103403282.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">数据集准备✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">本文使用的数据集,来源于kaggle,共包含25000张JPEG数据集照片,其中猫和狗的照片各占12500张。</span></p>
<p class="md-end-block md-p"><span class="md-plain">下载地址:<span class="md-link md-pair-s">https://www.kaggle.com/c/dogs-vs-cats/data</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">将压缩包解压,有test1.zip与train.zip,再分别解压得到test1与train文件夹:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220221657444.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220221657444.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">在train文件夹中各有12500张猫的图片和狗的图片,本示例不用那么多的图片,分别选取2500张的猫和狗的图片。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">添加机器学习模型✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">右键解决方案,新建一个类库,命名为IdentifyDogsAndCats:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220222726459.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220222726459.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">右键该类库,添加机器学习模型:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220222911054.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220222911054.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">命名为IdentifyDogsAndCats.mbconfig,然后会跳出如下界面:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220223109571.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220223109571.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">选择方案✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">本文中的猫狗识别,属于计算机视觉中的图像分类,因此选择该方案:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220223329503.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220223329503.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">选择训练环境✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">本文只是示例,选择本地(CPU):</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220223412642.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220223412642.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">添加数据✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">添加数据需要选择一个文件夹,文件夹的结构示例,如右侧所示:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220223727032.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220223727032.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">像右侧所示这样组织文件:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221090614621.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221090614621.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">先创建一个名为猫狗图片的文件夹然后在里面再分别添加一个命名为狗和猫的文件夹,在里面各添加2500张图片。</span></p>
<p class="md-end-block md-p"><span class="md-plain">在狗文件夹中添加狗的图片:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221090811257.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221090811257.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">在猫文件夹中添加猫的图片:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221091034432.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221091034432.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">训练模型✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">开始训练:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220210411840.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220210411840.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">需要等待一定的时间。</span></p>
<p class="md-end-block md-p"><span class="md-plain">训练完成:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220212720758.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220212720758.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">评估模型✨</span></h2>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220213352174.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220213352174.png"></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220213451843.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220213451843.png"></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220213534280.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231220213534280.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">在.NET应用中使用模型✨</span></h2>
<p class="md-end-block md-p"><span class="md-plain">训练完成后,在解决方案的mbconfig下生成了三个文件:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221092356947.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221092356947.png"></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>IdentifyDogsAndCats.consumption.cs</code><span class="md-plain">: 此文件包含模型输入和输出类以及可用于模型消耗的 <span class="md-pair-s"><code>Predict</code><span class="md-plain"> 方法。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>IdentifyDogsAndCats.mlnet</code><span class="md-plain">: 该文件是经过训练的 ML.NET 模型,它是一个序列化的 zip 文件。</span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>IdentifyDogsAndCats.training.cs</code><span class="md-plain">: 此文件包含用于了解输入列对模型预测的重要性的代码。</span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">在应用台程序中集成该模型✨</span></h3>
<p class="md-end-block md-p"><span class="md-plain">创建一个控制台应用:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221092839597.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221092839597.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">添加项目依赖:</span></p>
<p class="md-end-block md-p"><span class="md-plain">右键TestModel,选择“添加项目引用”。</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221092945301.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221092945301.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">选择包含模型的类库:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221093034754.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221093034754.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">将Program.cs中的代码替换为如下代码:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">using <span class="cm-variable">Model <span class="cm-operator">= <span class="cm-variable">IdentifyDogsAndCats;<br><span><span class="cm-keyword">namespace <span class="cm-def">TestModel<br><span>{<br><span> &nbsp; &nbsp;<span class="cm-keyword">internal <span class="cm-keyword">class <span class="cm-def">Program<br><span> &nbsp;{<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">static <span class="cm-keyword">void <span class="cm-variable">Main(<span class="cm-variable-3">string[] <span class="cm-variable">args)<br><span> &nbsp; &nbsp; &nbsp;{<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//Load sample data<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">var <span class="cm-def">imageBytes <span class="cm-operator">= <span class="cm-variable">File.<span class="cm-variable">ReadAllBytes(<span class="cm-string">@"D:\学习路线\C#\ML.NET\IdentifyDogsAndCats\test1\21.jpg");<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">Model.<span class="cm-variable">IdentifyDogsAndCats.<span class="cm-variable">ModelInput <span class="cm-variable">sampleData <span class="cm-operator">= <span class="cm-keyword">new()<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ImageSource <span class="cm-operator">= <span class="cm-variable">imageBytes,<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//Load model and predict output<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">var <span class="cm-def">result <span class="cm-operator">= <span class="cm-variable">Model.<span class="cm-variable">IdentifyDogsAndCats.<span class="cm-variable">Predict(<span class="cm-variable">sampleData);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//输出结果<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">Console.<span class="cm-variable">WriteLine(<span class="cm-variable">result.<span class="cm-variable">PredictedLabel);<br><span> &nbsp; &nbsp; &nbsp;}<br><span> &nbsp;}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">开始运行:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221102750438.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221102750438.png"></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221102810219.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221102810219.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">查看这张图片:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221102839318.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221102839318.png"></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">在winform中集成该模型✨</span></h3>
<p class="md-end-block md-p"><span class="md-plain">添加一个winform项目,右键添加项目引用:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221103159329.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221103159329.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">为了便于演示,设计页面如下:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221104030480.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221104030480.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">Form1.cs中代码如下:</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">namespace <span class="cm-def">WinFormsApp1<br><span>{<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">partial <span class="cm-keyword">class <span class="cm-def">Form1 : <span class="cm-variable">Form<br><span> &nbsp;{<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">string <span class="cm-variable">selectedImagePath;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable">Form1()<br><span> &nbsp; &nbsp; &nbsp;{<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">InitializeComponent();<br><span> &nbsp; &nbsp; &nbsp;}<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">private <span class="cm-keyword">void <span class="cm-variable">button1_Click(<span class="cm-variable-3">object <span class="cm-variable">sender, <span class="cm-variable">EventArgs <span class="cm-variable">e)<br><span> &nbsp; &nbsp; &nbsp;{<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">OpenFileDialog <span class="cm-variable">openFileDialog <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">OpenFileDialog();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// 设置对话框的标题<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">openFileDialog.<span class="cm-variable">Title <span class="cm-operator">= <span class="cm-string">"选择图片文件";<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// 设置对话框初始目录<br><span> &nbsp;<span class="cm-variable">openFileDialog.<span class="cm-variable">InitialDirectory <span class="cm-operator">= <span class="cm-string">@"D:\学习路线\C#\ML.NET\IdentifyDogsAndCats\test1";<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// 设置对话框允许选择的文件类型<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">openFileDialog.<span class="cm-variable">Filter <span class="cm-operator">= <span class="cm-string">"图片文件|*.jpg;*.jpeg;*.png;*.gif;*.bmp|所有文件|*.*";<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// 如果用户点击了“确定”按钮<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if (<span class="cm-variable">openFileDialog.<span class="cm-variable">ShowDialog() <span class="cm-operator">== <span class="cm-variable">DialogResult.<span class="cm-variable">OK)<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// 获取选择的文件路径<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">selectedImagePath <span class="cm-operator">= <span class="cm-variable">openFileDialog.<span class="cm-variable">FileName;<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// 在这里可以使用selectedImagePath进行后续操作,比如显示图片到窗体上<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pictureBox1.<span class="cm-variable">Image <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">Bitmap(<span class="cm-variable">selectedImagePath);<br><span><span>​<br><span><span>​<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br><span> &nbsp; &nbsp; &nbsp;}<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">private <span class="cm-keyword">void <span class="cm-variable">button2_Click(<span class="cm-variable-3">object <span class="cm-variable">sender, <span class="cm-variable">EventArgs <span class="cm-variable">e)<br><span> &nbsp; &nbsp; &nbsp;{<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//Load sample data<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">var <span class="cm-def">imageBytes <span class="cm-operator">= <span class="cm-variable">File.<span class="cm-variable">ReadAllBytes(<span class="cm-variable">selectedImagePath);<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">IdentifyDogsAndCats.<span class="cm-variable">IdentifyDogsAndCats.<span class="cm-variable">ModelInput <span class="cm-variable">sampleData <span class="cm-operator">= <span class="cm-keyword">new()<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ImageSource <span class="cm-operator">= <span class="cm-variable">imageBytes,<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//Load model and predict output<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">var <span class="cm-def">result <span class="cm-operator">= <span class="cm-variable">IdentifyDogsAndCats.<span class="cm-variable">IdentifyDogsAndCats.<span class="cm-variable">Predict(<span class="cm-variable">sampleData);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//提示识别是否完成<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">MessageBox.<span class="cm-variable">Show(<span class="cm-variable">$<span class="cm-string">"识别已完成,识别结果为:{result.PredictedLabel}");<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//将结果显示在label1上<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">label1.<span class="cm-variable">Text <span class="cm-operator">= <span class="cm-variable">result.<span class="cm-variable">PredictedLabel;<br><span> &nbsp; &nbsp; &nbsp;}<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">private <span class="cm-keyword">void <span class="cm-variable">Form1_Load(<span class="cm-variable-3">object <span class="cm-variable">sender, <span class="cm-variable">EventArgs <span class="cm-variable">e)<br><span> &nbsp; &nbsp; &nbsp;{<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp;}<br><span> &nbsp;}<br><span>}<br><span><span>​</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">运行效果如下所示:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/%E7%8C%AB%E7%8B%97%E8%AF%86%E5%88%AB%E6%95%88%E6%9E%9C2.gif"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/%E7%8C%AB%E7%8B%97%E8%AF%86%E5%88%AB%E6%95%88%E6%9E%9C2.gif"></span></p>
<p class="md-end-block md-p"><span class="md-plain">可见第一次识别确实久一点,但是后面识别挺快的。</span></p>
<p class="md-end-block md-p"><span class="md-plain">运行效果截图:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221111125031.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221111125031.png"></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221110957744.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221110957744.png"></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">总结✨</span></h2>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">本文先是简单介绍了<span class="md-pair-s"><code>ML.NET</code><span class="md-plain">与<span class="md-pair-s"><code>ML.NET Model Builder</code><span class="md-plain">,其次基于<span class="md-pair-s"><code>ML.NET Model Builder</code><span class="md-plain md-expand">构建了一个猫狗识别的机器学习模型实例,最后在.NET项目中集成了它。</span></span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">总体流程图如下所示:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221120437686.png"><img src="https://mingupupup.oss-cn-wuhan-lr.aliyuncs.com/imgs/image-20231221120437686.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">希望对你有所帮助。</span></p>
<div><span class="md-plain">&nbsp;</span></div><br><br>
来源:https://www.cnblogs.com/mingupupu/p/17918738.html
頁: [1]
查看完整版本: 用C#也能做机器学习?