您现在的位置是:首页 >学无止境 >C# + .Net6 实现TensorFlow图片分类网站首页学无止境

C# + .Net6 实现TensorFlow图片分类

Ki1381 2024-06-14 17:20:13
简介C# + .Net6 实现TensorFlow图片分类

微软官网上发现一篇很有意思的文档:
教程:用于对图像进行分类的 ML.NET 分类模型 - ML.NET | Microsoft Learn

这篇教程写的很学院派,但有点碎,属于上课不能打一秒钟瞌睡的那种。好在还是给出了完整的代码:samples/Program.cs at main · dotnet/samples · GitHub

当然自己尝试前必要的先决条件还是要满足的。

1、用于训练的图片和两个tsv,以及最重要的模型文件要准备好。示例:samples/image-classifier-assets.zip at main · dotnet/samples · GitHub

2、模型文件也可以从这里下载:https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip

3、VS2022中,项目 -> 管理NuGet程序包 -> 浏览,添加如下四个包:

Microsoft.ML
Microsoft.ML.ImageAnalytics
Microsoft.ML.TensorFlow
SciSharp.TensorFlow.Redist

 严格按照教程顺利跑通。本着能偷懒就偷懒的原则,开始对代码进行简化:
1、训练图集和tsv都直接硬编码了。实践证明如果所有文件在同一个目录下是没问题的:

static readonly string _imagesFolder = @"D:	empForTraining";
static readonly string _trainTagsTsv = @"D:	empForTraining	ags.tsv";
static readonly string _testTagsTsv = @"D:	empForTraining	est-tags.tsv";
static readonly string _inceptionTensorFlowModel = @"D:	empForTraining	ensorflow_inception_graph.pb";

否则按照文档的说法还要修改这些文件的复制属性。

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

2、 Demo里并未给出保存训练好的模型的代码。这意味着每次执行都要重新一次,效率比较低。所以稍微优化了一下代码:

public static ITransformer GenerateModel(MLContext mlContext)
{
    // 略
    // ......

    // 保存训练好的模型
    mlContext.Model.Save(model, trainingData.Schema, "model.zip");

    return model;
}

3、图片识别的代码另起了一个项目,同样要导入那堆NuGet:

        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("请输入预测的图片路径。");
                return;
            }

            string fn = args[0].Trim();
            if (!File.Exists(fn))
            {
                Console.WriteLine("文件不存在。");
                return;
            }

            // Create MLContext to be shared across the model creation workflow objects
            MLContext mlContext = new();

            // 识别模式
            // 训练好的模型文件可复制到指定位置
            DataViewSchema modelSchema;
            // Load trained model
            ITransformer model = mlContext.Model.Load(@"D:	empForTrainingmodel.zip", out modelSchema);


            // <SnippetCallClassifySingleImage>
            ClassifySingleImage(mlContext, model, fn);
            // </SnippetCallClassifySingleImage>

        }

      public static void ClassifySingleImage(MLContext mlContext, ITransformer model,string _predictSingleImage)
        {
            // 无需修改,略
            // ......
        }

        /// 略

所以,接下来开发一个工具,用来生成tags.tsv和test-tags.tsv。嗯,思路已经有了。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。