训练 ML.NET 分类模型以对图像进行分类
0.00
★20次@microsoft
A:赛忞初雪
训练 ML.NET 分类模型以对图像进行分类
了解如何使用预先训练的 TensorFlow 模型对图像进行分类,以便对图像进行处理。
TensorFlow 模型经过训练,将图像分类为一千个类别。 由于 TensorFlow 模型知道如何识别图像中的模式,因此 ML.NET 模型可以使用其管道中的一部分来将原始图像转换为特征或输入来训练分类模型。
本教程介绍如何执行下列操作:
了解问题
将预先训练的 TensorFlow 模型合并到 ML.NET 管道中
训练和评估 ML.NET 模型
对测试图像进行分类
可以在 dotnet/samples 存储库中找到本教程的源代码。 默认情况下,本教程的 .NET 项目配置面向 .NET core 2.2。
深度学习 是机器学习的一部分,它正在彻底改变计算机视觉和语音识别等领域。
深度学习模型是使用包含多个学习层的大量已标记的数据和神经网络来定型。 深度学习:
在某些任务中(如计算机视觉)表现更好。
需要大量的训练数据。
图像分类是一项特定的分类任务,允许我们自动将图像分类为类别,例如:
检测图像中是否有人脸。
检测猫狗的区别。
或者,如以下图像所示,确定图像是否为食品、玩具或设备:
备注
上述图像属于 Wikimedia Commons,其特性如下:
“220px-Pepperoni_pizza.jpg”公共域,https://commons.wikimedia.org/w/index.php?curid=79505,
“119px-Nalle_-_a_small_brown_teddy_bear.jpg”由 乔尼克 - 自行拍摄,CC BY-SA 2.0,https://commons.wikimedia.org/w/index.php?curid=48166。
“193px-Broodrooster.jpg”作者为 M.Minderhoud - 自有作品,CC BY-SA 3.0,[https://commons.wikimedia.org/w/index.php?curid=27403](https://commons.wikimedia.org/w/index.php?curid=27403)
从头开始训练 图像分类 模型,需要设置数百万个参数、大量标记的训练数据和大量的计算资源,即数百小时的GPU运算。 虽然不如从零开始训练自定义模型的效果好,但使用预训练模型可以简化这个过程,因为只需处理数千张图像,而不是数百万张标记的图像,从而能够相当快速地构建自定义模型(在没有 GPU 的计算机上可以在一小时内完成)。 本教程仅使用十几张训练图像来进一步缩减该过程。
Inception model
经过训练,可将图像分类为一千个类别,但在本教程中,你只需要在更小的类别集中分类图像。 您可以利用 Inception model
的图像识别能力,将图像分类到自定义图像分类器中有限的新类别。
食物
玩具
设备
本教程使用 TensorFlow Inception 深度学习模型,这是在 ImageNet
数据集上训练的热门图像识别模型。 TensorFlow 模型将整个图像分类为一千个类,如“Umbrella”、“Jersey”和“洗衣机”。
由于 Inception model
已预先在数千个不同图像上进行过训练,因此内部包含图像识别所需的图像特征。 我们可以利用模型中的这些内部图像特征来训练具有更少类的新模型。
如下图所示,在 .NET 或 .NET Framework 应用程序中添加对 ML.NET NuGet 包的引用。 实际上,ML.NET 包括并引用本机 TensorFlow
库,可用于编写代码来加载已训练的现有 TensorFlow
模型文件。
使用 TensorFlow 初始模型提取适合经典机器学习算法输入的特征后,可以添加 ML.NET 多类分类器。
本例中使用的特定训练器是 多项式逻辑回归算法。
此训练器实现的算法在解决大量特征的问题时表现良好,尤其适用于处理图像数据的深度学习模型。
有关详细信息,请参阅 深度学习与机器学习。
有两个数据源:.tsv
文件和图像文件。 tags.tsv
文件包含两列:第一列定义为 ImagePath
,第二列是对应于图像的 Label
。 以下示例文件没有标题行,如下所示:
tsv复制
broccoli.jpg food pizza.jpg food pizza2.jpg food teddy2.jpg toy teddy3.jpg toy teddy4.jpg toy toaster.jpg appliance toaster2.png appliance
训练和测试图像位于你即将从 zip 文件中下载的资产文件夹中。 这些图像属于维基媒体共享资源。
Wikimedia Commons(免费媒体存储库)。 检索于2018年10月17日10:48,来源:https://commons.wikimedia.org/wiki/Pizzahttps://commons.wikimedia.org/wiki/Toasterhttps://commons.wikimedia.org/wiki/Teddy_bear
创建名为“TransferLearningTF”的 C# 控制台应用程序。 单击“下一步”按钮。
选择 .NET 8 作为要使用的框架。 单击“创建”按钮。
安装 Microsoft.ML NuGet 包:
备注
此示例使用提到的 NuGet 包的最新稳定版本,除非另有说明。
在“解决方案资源管理器”中,右键单击项目,然后选择“管理 NuGet 包”。
选择“nuget.org”作为包源,选择“浏览”选项卡,搜索 Microsoft.ML。
选择“安装”按钮。
选择“预览更改”对话框中的“确定”按钮。
如果同意所列包的许可条款,请选择“接受许可”对话框中的“我接受”按钮。
对 Microsoft.ML.ImageAnalytics、SciSharp.TensorFlow.Redist和 Microsoft.ML.TensorFlow重复这些步骤。
下载 项目资产目录 zip 文件,然后解压缩。
将 assets
目录复制到 TransferLearningTF 项目目录。 此目录及其子目录包含本教程所需的数据和支持文件(Inception模型除外,该模型将在下一步下载并添加)。
下载 Inception 模型,然后解压缩。
将刚刚解压缩的“inception5h
”目录的内容复制到 TransferLearningTF 项目的“assets/inception
”目录中。 此目录包含本教程所需的模型和其他支持文件,如下图所示:
在解决方案资源管理器中,右键单击资产目录和子目录中的每个文件,然后选择 属性。 在“高级”下,将“复制到输出目录”的值更改为“如果较新则复制”。
将以下附加 using
指令添加到 Program.cs 文件的顶部:
C#复制
using Microsoft.ML;using Microsoft.ML.Data;
将以下代码添加到 using
指令下面的行,以指定资产路径:
C#复制
string _assetsPath = Path.Combine(Environment.CurrentDirectory, "assets");string _imagesFolder = Path.Combine(_assetsPath, "images");string _trainTagsTsv = Path.Combine(_imagesFolder, "tags.tsv");string _testTagsTsv = Path.Combine(_imagesFolder, "test-tags.tsv");string _predictSingleImage = Path.Combine(_imagesFolder, "toaster3.jpg");string _inceptionTensorFlowModel = Path.Combine(_assetsPath, "inception", "tensorflow_inception_graph.pb");
为输入数据和预测创建类。
C#复制
public class ImageData{ [LoadColumn(0)] public string? ImagePath; [LoadColumn(1)] public string? Label; }
ImageData
是输入图像数据类,具有以下 String 字段:
ImagePath
包含映像文件名。
Label
包含一个用于图像标签的数值。
向项目添加 ImagePrediction
的新类:
C#复制
public class ImagePrediction : ImageData{ public float[]? Score; public string? PredictedLabelValue; }
ImagePrediction
是图像预测类,具有以下字段:
ImagePrediction
是在训练模型后用于预测的类。 它包含图像路径的 string
(ImagePath
)。 Label
用于重用和训练模型。 PredictedLabelValue
在预测和评估过程中使用。 对于计算,将使用带定型数据的输入、预测值和模型。
Score
包含给定图像分类的置信度百分比。
PredictedLabelValue
包含预测图像分类标签的值。
使用 MLContext
的新实例初始化 mlContext
变量。 将 Console.WriteLine("Hello World!")
行替换为以下代码:
C#
硬件app