训练 ML.NET 分类模型以对图像进行分类 训练

训练 ML.NET 分类模型以对图像进行分类

0.00

★20次@microsoft

A:赛忞初雪

上架: 2025-03-24 13:06:33

训练 ML.NET 分类模型以对图像进行分类

         打开 安装         
 

四方仙域传送阵         

了解如何使用预先训练的 TensorFlow 模型对图像进行分类,以便对图像进行处理。

TensorFlow 模型经过训练,将图像分类为一千个类别。 由于 TensorFlow 模型知道如何识别图像中的模式,因此 ML.NET 模型可以使用其管道中的一部分来将原始图像转换为特征或输入来训练分类模型。

本教程介绍如何执行下列操作:

  • 了解问题

  • 将预先训练的 TensorFlow 模型合并到 ML.NET 管道中

  • 训练和评估 ML.NET 模型

  • 对测试图像进行分类

可以在 dotnet/samples 存储库中找到本教程的源代码。 默认情况下,本教程的 .NET 项目配置面向 .NET core 2.2。

先决条件

选择正确的机器学习任务

深度学习

深度学习 是机器学习的一部分,它正在彻底改变计算机视觉和语音识别等领域。

深度学习模型是使用包含多个学习层的大量已标记的数据神经网络来定型。 深度学习:

  • 在某些任务中(如计算机视觉)表现更好。

  • 需要大量的训练数据。

图像分类是一项特定的分类任务,允许我们自动将图像分类为类别,例如:

  • 检测图像中是否有人脸。

  • 检测猫狗的区别。

或者,如以下图像所示,确定图像是否为食品、玩具或设备:

披萨图像泰迪熊图像烤箱图像

 备注

上述图像属于 Wikimedia Commons,其特性如下:

从头开始训练 图像分类 模型,需要设置数百万个参数、大量标记的训练数据和大量的计算资源,即数百小时的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 体系结构图

多类分类

使用 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

安装

创建项目

  1. 创建名为“TransferLearningTF”的 C# 控制台应用程序。 单击“下一步”按钮。

  2. 选择 .NET 8 作为要使用的框架。 单击“创建”按钮。

  3. 安装 Microsoft.ML NuGet 包

     备注

    此示例使用提到的 NuGet 包的最新稳定版本,除非另有说明。

    • 在“解决方案资源管理器”中,右键单击项目,然后选择“管理 NuGet 包”

    • 选择“nuget.org”作为包源,选择“浏览”选项卡,搜索 Microsoft.ML

    • 选择“安装”按钮

    • 选择“预览更改”对话框中的“确定”按钮

    • 如果同意所列包的许可条款,请选择“接受许可”对话框中的“我接受”按钮。

    • 对 Microsoft.ML.ImageAnalyticsSciSharp.TensorFlow.Redist和 Microsoft.ML.TensorFlow重复这些步骤。

下载素材

  1. 下载 项目资产目录 zip 文件,然后解压缩。

  2. 将 assets 目录复制到 TransferLearningTF 项目目录。 此目录及其子目录包含本教程所需的数据和支持文件(Inception模型除外,该模型将在下一步下载并添加)。

  3. 下载 Inception 模型,然后解压缩。

  4. 将刚刚解压缩的“inception5h”目录的内容复制到 TransferLearningTF 项目的“assets/inception”目录中。 此目录包含本教程所需的模型和其他支持文件,如下图所示:

    Inception 目录内容

  5. 在解决方案资源管理器中,右键单击资产目录和子目录中的每个文件,然后选择 属性。 在“高级”下,将“复制到输出目录”的值更改为“如果较新则复制”

创建类并定义路径

  1. 将以下附加 using 指令添加到 Program.cs 文件的顶部:

    C#复制

    using Microsoft.ML;using Microsoft.ML.Data;
  2. 将以下代码添加到 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");
  3. 为输入数据和预测创建类。

    C#复制

    public class ImageData{
        [LoadColumn(0)]    public string? ImagePath;
    
        [LoadColumn(1)]    public string? Label;
    }

    ImageData 是输入图像数据类,具有以下 String 字段:

    • ImagePath 包含映像文件名。

    • Label 包含一个用于图像标签的数值。

  4. 向项目添加 ImagePrediction 的新类:

    C#复制

    public class ImagePrediction : ImageData{    public float[]? Score;    public string? PredictedLabelValue;
    }

    ImagePrediction 是图像预测类,具有以下字段:

    ImagePrediction 是在训练模型后用于预测的类。 它包含图像路径的 string (ImagePath)。 Label 用于重用和训练模型。 PredictedLabelValue 在预测和评估过程中使用。 对于计算,将使用带定型数据的输入、预测值和模型。

    • Score 包含给定图像分类的置信度百分比。

    • PredictedLabelValue 包含预测图像分类标签的值。

初始化变量

  1. 使用 MLContext的新实例初始化 mlContext 变量。 将 Console.WriteLine("Hello World!") 行替换为以下代码:

    C#

    硬件app