详情

首页手游攻略 AI与.NET技术实现方式图像分类模型的部署与调用的详细步骤实用指南

AI与.NET技术实现方式图像分类模型的部署与调用的详细步骤实用指南

佚名 2026-09-07 13:50:01

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“AI与.NET技术实现方法图像分类模型的部署与调用的详细步骤”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • 引言
  • 准备工作
  • 安装步骤
  • 图像分类模型的选择
  • 模型训练与导出
  • 在 .NET 中调用模型
    • 1. 新建 .NET 项目
    • 2. 定义输入和输出数据结构
    • 3. 定义 estimator 管道
  • 4. 提取预测结果
    • 调用模型进行图像分类
      • 1. 准备素材与分类文件
      • 2. 加载模型
      • 3. 解析输出结果
    • 其他实现方法
      • 实际应用场景
        • 挑战与解决方案
          • 结论
            • 参考资料

              引言

              理解这一步时,人工智能(AI)技术的迅猛发展推动了各行各业的数字化转型。图像分类,作为计算机视觉领域的核心技术之一,能够让机器自动识别图像中的物体、场景或特征,已广泛应用来医疗诊断、安防监控、自动驾驶和电子商务等领域。

              落到代码里,与此同时,.NET 平台凭借其高效性、跨平台能力和强大的 C# 编程语言兼容,成为开发者构建企业级应用的首选技术栈。将 AI 图像分类模型与 .NET 技术结合,不仅能充分发挥两者的优势,还能为开发者提供一种高效、直观的实现方法。

              结合项目来看,下面会系统梳理如何在 .NET 环境下采用 C# 部署和调用 AI 图像分类模型。我们将从环境搭建、模型选择,到模型调用,再到实际应用场景,逐步展开讲解,并提供丰富的示例代码和实践指导,帮助开发者更快上手并应用到实际项目中。

              准备工作

              从实现思路看,在开始实现图像分类之前,我们需准备必要的开发环境和工具。以下是所需的软件和库:

              • Visual Studio:Visual Studio 2022。
              • .NET SDK:安装 .NET 6.0 或更高版本,确保兼容最新的功能和性能优化。
              • ML.NET:微软提供的开源机器学习框架,专为 .NET 开发者设计,兼容模型训练和推理。
              • 模型文件:我们将采用预训练的图像分类模型 tensorflow_inception_graph.pb。

              安装步骤

              新建项目并添加依赖:在命令行中运行以下命令,新建一个控制台应用程序同时安装必要的 NuGet 包:

              dotnet new console -n ImageClassificationDemo
              cd ImageClassificationDemo
              dotnet add package Microsoft.ML
              dotnet add package Microsoft.ML.ImageAnalytics
              dotnet add package Microsoft.ML.TensorFlow
              dotnet add package SciSharp.TensorFlow.Redist

              在这个场景下,完成以上步骤后,你的环境就准备好了。下面,我们将选择一个合适的图像分类模型。

              图像分类模型的选择

              在这个场景下,图像分类模型是基于监督学习的神经网络,其目标是将输入图像分配到预定义的类别中。在选择模型时,我们需考虑模型的性能、计算复杂度和适用场景。以下是几种常用的图像分类模型:

              • 卷积神经网络(CNN):如 LeNet、AlexNet 和 VGGNet,适合基本的图像分类任务,但层数较深时可能面临梯度消失问题。
              • 结合项目来看,残差网络(ResNet):借助引入残差连接(skip connections),解决了深层网络的训练难题,适用来高精度分类任务。
              • EfficientNet:借助平衡网络深度、宽度和分辨率,提供高效的性能,适合资源受限的场景。

              模型训练与导出

              考虑到时间和资源成本,我们将直接采用预训练的 tensorflow_inception_graph.pb 模型。如果你有自定义需求,能够采用以下步骤训练同时导出模型:

              • 数据准备:收集并标注图像数据集,分为训练集和验证集。
              • 训练模型:采用 TensorFlow 或 PyTorch 等框架训练模型。
              • 导出模型:借助框架提供的导出工具导出模型。

              在本下文,我们选择 tensorflow_inception_graph.pb 在这个场景下,作为示例模型,这是一种由Google开发的高性能卷积神经网络(CNN)架构。

              落到代码里,该模块借助同时行采用不同大小的卷积核(如1x1、3x3、5x5)和池化层,提取图像的多尺度特征。这种设计提高了模型在图像分类任务中的表现,同时保持了计算效率。兼容 1000 个类别的分类,且能够轻松集成到 .NET 中。

              在这个场景下,大家能够直接点击 tensorflow_inception_graph.pb 下载(文章最后也有下载方式)预训练的模型文件和分类文件,同时将其放入项目目录中。

              落到代码里,也能够到github上下载(文章最后也有下载方式),里面的内容相对来说也更丰富些。

              在 .NET 中调用模型

              现在,我们进入核心部分:在 .NET 中调用 tensorflow_inception_graph.pb。以下是逐步实现的过程。

              1. 新建 .NET 项目

              采用命令行新建一个控制台应用,项目基本结构如下所示:

              ImageClassificationDemo/
              ├── ImageClassificationDemo.csproj
              ├── Program.cs
              ├── assets/inputs/inception/tensorflow_inception_graph.pb
              ├── assets/inputs/inception/imagenet_comp_graph_label_strings.txt

              2. 定义输入和输出数据结构

              若在运行的时候报错说找不到模型或者label文件,能够进行如下所示操作:

              输入类中定义数据的结构如下所示,后续会采用 TextLoader 加载数据时引用该类型。此处的类名为 ImageNetData

                  public class ImageNetData
                  {
                      [LoadColumn(0)]
                      public string ImagePath;
                      [LoadColumn(1)]
                      public string Label;
                      public static IEnumerable<ImageNetData> ReadFromCsv(string file, string folder)
                      {
                          return File.ReadAllLines(file)
                           .Select(x => x.Split('t'))
                           .Select(x => new ImageNetData { ImagePath = Path.Combine(folder, x[0]), Label = x[1] } );
                      }
                  }
                  public class ImageNetDataProbability : ImageNetData
                  {
                      public string PredictedLabel;
                      public float Probability { get; set; }
                  }

              需强调的是,ImageNetData 理解这一步时,类中的标签在采用 TensorFlow 模型进行评分时同时没有真正采用。而是在测试预测时采用它,这样就能够将每个样本数据的实际标签与 TensorFlow 模型提供的预测标签进行比较。

              输出类的结构如下所示:

              public class ImageNetPrediction
              {
                  [ColumnName(TFModelScorer.InceptionSettings.outputTensorName)]
                  public float[] PredictedLabels;
              }

              Inception 模型还需几个传入的默认参数:

              public struct ImageNetSettings
              {
                  public const int imageHeight = 224;
                  public const int imageWidth = 224;
                  public const float mean = 117;
                  public const bool channelsLast = true;
              }

              3. 定义 estimator 管道

              理解这一步时,在处理深度神经网络时,必须使图像适应网络期望的格式。这就是图像被调整大小随后转换的原因(主要是像素值在所有R,G,B通道上被归一化)。

              var pipeline = mlContext.Transforms.LoadImages(outputColumnName: "input", imageFolder: imagesFolder, inputColumnName: nameof(ImageNetData.ImagePath))
                  .Append(mlContext.Transforms.ResizeImages(outputColumnName: "input", imageWidth: ImageNetSettings.imageWidth, imageHeight: ImageNetSettings.imageHeight, inputColumnName: "input"))
                  .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "input", interleavePixelColors: ImageNetSettings.channelsLast, offsetImage: ImageNetSettings.mean))
                  .Append(mlContext.Model.LoadTensorFlowModel(modelLocation)
                      .ScoreTensorFlowModel(outputColumnNames: new[] { "softmax2" }, inputColumnNames: new[] { "input" },
                          addBatchDimensionInput:true));

              落到代码里,运行代码后,模型将被成功加载到内存中,下面我们能够调用它进行图像分类。

              在这个场景下,通常情况下,这里经常报的错就是输入/输出节点的名称不正确,你能够借助 Netron ((链接已移除))工具查看输入/输出节点的名称。

              在这个场景下,因为这两个节点的名称后面会在 estimator 的定义中采用:在 inception 网络的情况下,输入张量命名为 ‘input’,输出命名为 ‘softmax2’。

              下图是借助 Netron 读取的 tensorflow_inception_graph.pb 模型分析图:

              4. 提取预测结果

              填充 estimator 管道

              ITransformer model = pipeline.Fit(data);
              var predictionEngine = mlContext.Model.CreatePredictionEngine<ImageNetData, ImageNetPrediction>(model);

              实际处理时,当获得预测结果后,我们会在属性中得到一个浮点数数组。数组中的每个位置都会分配到一个标签。

              结合项目来看,比如,如果模型有5个不同的标签,则数组将为length = 5。数组中的每个位置都表示标签在该位置的概率;所有数组值(概率)的和等于1。

              从实现思路看,然后,您需选择最大的值(概率),同时检查配给了该位置的那个以填充 estimator 管道标签。

              调用模型进行图像分类

              下面我们需编写代码来加载图像、进行预测并解析结果。

              1. 准备素材与分类文件

              定义图像文件夹目录和图像分类目录。以下代码加载同时预处理图像:

              string assetsRelativePath = @"../../../assets";
              string assetsPath = GetAbsolutePath(assetsRelativePath);
              string tagsTsv = Path.Combine(assetsPath, "inputs", "images", "tags.tsv");
              string imagesFolder = Path.Combine(assetsPath, "inputs", "images");
              string inceptionPb = Path.Combine(assetsPath, "inputs", "inception", "tensorflow_inception_graph.pb");
              string labelsTxt = Path.Combine(assetsPath, "inputs", "inception", "imagenet_comp_graph_label_strings.txt");

              2. 加载模型

              private PredictionEngine<ImageNetData, ImageNetPrediction> LoadModel(string dataLocation, string imagesFolder, string modelLocation)
              {
                  ConsoleWriteHeader("Read model");
                  Console.WriteLine($"Model location: {modelLocation}");
                  Console.WriteLine($"Images folder: {imagesFolder}");
                  Console.WriteLine($"Training file: {dataLocation}");
                  Console.WriteLine($"Default parameters: image size=({ImageNetSettings.imageWidth},{ImageNetSettings.imageHeight}), image mean: {ImageNetSettings.mean}");
                  var data = mlContext.Data.LoadFromTextFile<ImageNetData>(dataLocation, hasHeader: true);
                  var pipeline = mlContext.Transforms.LoadImages(outputColumnName: "input", imageFolder: imagesFolder, inputColumnName: nameof(ImageNetData.ImagePath))
                                  .Append(mlContext.Transforms.ResizeImages(outputColumnName: "input", imageWidth: ImageNetSettings.imageWidth, imageHeight: ImageNetSettings.imageHeight, inputColumnName: "input"))
                                  .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "input", interleavePixelColors: ImageNetSettings.channelsLast, offsetImage: ImageNetSettings.mean))
                                  .Append(mlContext.Model.LoadTensorFlowModel(modelLocation).
                                  ScoreTensorFlowModel(outputColumnNames: new[] { "softmax2" },
                                                      inputColumnNames: new[] { "input" }, addBatchDimensionInput:true));
                  ITransformer model = pipeline.Fit(data);
                  var predictionEngine = mlContext.Model.CreatePredictionEngine<ImageNetData, ImageNetPrediction>(model);
                  return predictionEngine;
              }

              3. 解析输出结果

              protected IEnumerable<ImageNetData> PredictDataUsingModel(string testLocation, 
                                                                        string imagesFolder,
                                                                        string labelsLocation,
                                                                        PredictionEngine<ImageNetData, ImageNetPrediction> model)
              {
                  ConsoleWriteHeader("Classify images");
                  Console.WriteLine($"Images folder: {imagesFolder}");
                  Console.WriteLine($"Training file: {testLocation}");
                  Console.WriteLine($"Labels file: {labelsLocation}");
                  var labels = ReadLabels(labelsLocation);
                  var testData = ImageNetData.ReadFromCsv(testLocation, imagesFolder);
                  foreach (var sample in testData)
                  {
                      var probs = model.Predict(sample).PredictedLabels;
                      var imageData = new ImageNetDataProbability()
                      {
                          ImagePath = sample.ImagePath,
                          Label = sample.Label
                      };
                      (imageData.PredictedLabel, imageData.Probability) = GetBestLabel(labels, probs);
                      imageData.ConsoleWrite();
                      yield return imageData;
                  }
              }

              Main 方法中调用,完整代码如下所示:

              static void Main(string[] args)
              {
                  string assetsRelativePath = @"../../../assets";
                  string assetsPath = GetAbsolutePath(assetsRelativePath);
                  string tagsTsv = Path.Combine(assetsPath, "inputs", "images", "tags.tsv");
                  string imagesFolder = Path.Combine(assetsPath, "inputs", "images");
                  string inceptionPb = Path.Combine(assetsPath, "inputs", "inception", "tensorflow_inception_graph.pb");
                  string labelsTxt = Path.Combine(assetsPath, "inputs", "inception", "imagenet_comp_graph_label_strings.txt");
                  try
                  {
                      TFModelScorer modelScorer = new TFModelScorer(tagsTsv, imagesFolder, inceptionPb, labelsTxt);
                      modelScorer.Score();
                  }
                  catch (Exception ex)
                  {
                      ConsoleHelpers.ConsoleWriteException(ex.ToString());
                  }
                  ConsoleHelpers.ConsolePressAnyKey();
              }

              运行程序后,你将看到类似以下的输出:

              其他实现方法

              在这个场景下,在实际应用里,我们也能够采用ONNX模型,此处不做额外叙述。由于模型的性能和效率至关重要,只是提供一些优化建议:

              • 模型量化:采用 ONNX Runtime 的量化工具,将模型从浮点数(FP32)转换为整数(INT8),减少模型大小和推理时间。
              • 硬件加速:结合 ONNX Runtime 的 GPU 兼容,借助 CUDA 或 DirectML 加速推理。
              • 批处理:如果需处理多张图像,能够将输入组织为批次(batch),提高吞吐量。比如:

              var inputs = new List<ImageInput> { input1, input2, input3 };
              var batchPrediction = mlContext.Data.LoadFromEnumerable(inputs);
              var predictions = model.Transform(batchPrediction);

              • 缓存机制:对于频繁采用的模型,保持预测引擎的单例实例,避免重复加载。

              实际处理时,借助这些优化,模型能够在 .NET 环境中实现更高的性能,满足实时应用的需求。

              实际应用场景

              图像分类模型在 .NET 应用中有广泛的用途,以下是几个典型场景:

              医疗影像分析
              实际处理时,在医疗系统里,部署图像分类模型能够辅助医生识别 X 光片或 MRI 图像中的异常。比如,检测肺部结节或肿瘤。

              智能安防
              在监控系统里,模型能够实时识别可疑物体或行为,如检测闯入者或遗留物品。

              电子商务
              在商品管理系统里,自动分类上传的商品图像,提升搜索和建议的准确性。

              挑战与解决方案

              • 数据隐私:借助加密传输和本地推理保护用户数据。
              • 模型更新:定期从云端下载新模型,并采用版本控制管理。
              • 计算资源:在资源受限的设备上,采用轻量化模型(如 MobileNet)。

              结论

              从实现思路看,这里会详细说明了如何在 .NET 环境下采用 C# 部署和调用 AI 图像分类模型。从环境搭建到模型选择、部署与调用,再到性能优化和应用场景,我们提供了一套完整的实践指南。借助 ML.NET 和预测模式的兼容,开发者能够轻松地将强大的 AI 能力集成到 .NET 应用中。

              实际处理时,随着 AI 技术的不断进步和 .NET 平台的持续发展,二者的结合将为开发者带来更多可能性。无论是构建智能桌面应用、Web 服务还是跨平台解决方案,图像分类模型都能为项目增添创新价值。希望本文能为你的 AI 之旅提供启发和帮助!

              参考资料

              • 素材下载地址: (链接已移除)
              • Netron工具地址: (链接已移除)
              • 224x224图像素材: (链接已移除)
              • tensorflow教程及模型文件和label文件: (链接已移除)
              • Image Classification - Scoring sample: (链接已移除)
              • ML.NET 官方文档: (链接已移除)
              • ONNX Model Zoo: (链接已移除)

              到此这篇关于AI与.NET技术实现图像分类模型的部署与调用的详细步骤的文章就介绍到这了,更多相关.net 图像分类模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!

              您可能感兴趣的文章:

              • ASP.NET Core 6.0 基于模型验证的数据验证功能
              • ASP.NET Core实现自定义WebApi模型验证详解
              • .NET 8 高性能跨平台图像处理库 ImageSharp 详解
              • asp.net(C#)采用QRCode生成图片中心加Logo或图像的二维码实例
              • asp.net采集页面上所有图像图片资源的具体方法
              • 在Asp.net中为图像加入水印信息并保存为Jpg类型

              相关资讯
              点击查看更多
              游戏推荐
              推荐专题
              热门阅读
              推荐下载