本文将使用ML .NET的​​图像分类​​对猫狗的图像数据进行训练,得到模型;

并且开发一个简单的识别程序用来识别猫咪和狗狗。

流程

根据​​什么是 ML.NET 以及它如何工作?​​中的描述,我们知道,工作流如图:

ML .NET 猫狗图像分类_.net

这里我按照我的理解重新画了一幅:

ML .NET 猫狗图像分类_数据_02

首先我们需要准备训练数据集和测试数据集;

然后通过训练数据集进行训练,获得训练模型;

之后检验模型是否合格;

如果合格,投入使用;

如果不合格,重新设计训练数据集的数据,或者调参,重新训练,直至合格。

数据集来源

在​​kaggle Dogs vs. Cats​​中下载​​train.zip​​和​​test1.zip​​,

其中​​train.zip​​中的图像用于训练,​​test1.zip​​用于测试、检验模型是否可用。

下载解压之后​​train.zip​​得到了很多图像

ML .NET 猫狗图像分类_数据_03

根据图像名称,将猫咪和狗狗的图像分成两个文件夹​​猫​​和​​狗​

ML .NET 猫狗图像分类_数据集_04

ML .NET 猫狗图像分类_数据集_05

ML .NET 猫狗图像分类_数据_06

开始分类训练

在项目中,创建训练模型

ML .NET 猫狗图像分类_数据_07

如图所示,进入一个可视化的配置页面,在方案一栏选择​​图像分类​

ML .NET 猫狗图像分类_.net_08

第二步选择训练环境,选择本地CPU

如果有条件使用​​Azure​​的话,可以选择通过​​Azure​​进行训练

ML .NET 猫狗图像分类_数据_09

也可以选择本地GPU进行训练,点击​检查兼容性​​可以看到提示,根据提示可以确定本机是否支持训练,并且得知需要安装的内容

ML .NET 猫狗图像分类_.net_10

第三步选择准备好的训练数据集

ML .NET 猫狗图像分类_数据_11

根据左边的提示,只需要按照文件夹目录,将不同分类的图像放置到不同的文件夹下即可,这点在准备数据的时候已经完成

第四步,开始训练

ML .NET 猫狗图像分类_.net_12

这里我使用开发机训练了大概1.7天左右的时间,完成了训练

训练结束后有一个简单的测试功能,

ML .NET 猫狗图像分类_数据_13

如果对于结果不满意,可以重新训练

我们也可以通过准备好的测试数据集​​test1.zip​​中的图像进行检验

最后ML .NET给出了一个使用模型的代码段

//Load sample data
var sampleData = new CatAndDogMLModel.ModelInput()
{
//想要识别的图像路径
ImageSource = @"...\TrainData\狗\dog.0.jpg",
};

//Load model and predict output
//获得识别结果
var result = CatAndDogMLModel.Predict(sampleData);

识别结果有​​Prediction​​这个最终结果,也有​​Score​​这样的各个分类的分数集合

当​​Score​​分数相差较小的时候,可能是识别效果不好或者识别出错

比如拿一张既不是猫也不是狗的图像进行识别,得到的分数几乎相同,此时应该处理为​​无法识别为猫或者狗​

至此,我们可以使用训练好的模型了。

调用模型完成功能

制作一个简单的输入-输出功能,调用模型,完成功能

ML .NET 猫狗图像分类_.net_14

评估与重新训练

与价格预测篇基本类似,不再赘述

注意这次使用的算法是​​MLContext.MulticlassClassification​​,所以评估也应该使用​​MLContext.MulticlassClassification.Evaluate​

总结

可以看出,​​ML .NET​​降低了机器学习的复杂度,使对机器学习零基础的开发也可以无压力使用机器学习完成一些工作

我们只需要通过快速学习,了解ML .NET可以完成哪些工作,并通过简单的可视化页面输入数据,选择算法,就可以完成工作

同时,如果对机器学习有一定了解,也可以更改代码,调参,得到更好的模型

示例代码

​CatAndDogClassification​

参考资料

​10分钟快速入门​

​官方示例machinelearning-samples​

​教程:通过 ML.NET 图像分类 API 使用迁移学习自动进行肉眼检查​



学习技术最好的文档就是​​【​官方文档​】​​,没有之一。

还有学习资料​​【​Microsoft Learn​】​​、【​CSharp Learn】、​​【​My Note​】​​。

如果,你希望更容易地发现我的新博客,不妨【​关注​】。