C# .NET ML.NET 機器學習 圖像分類

  • 2022 年 5 月 20 日
  • 筆記

一、 準備工作

IDE是 VS2019。
先下載好「resnet_v2_50_299.meta」這個文件,放入「C:\Users\jk\AppData\Local\Temp\MLNET\」這個文件夾,目錄不存在自己新建下。「jk」是WINDOWS登錄名,注意換成你自己的。

下載地址://download.csdn.net/download/runliuv/15724931

新建一個「z機器學習樣本1」目錄,再建立「貓」和「狗」2個子目錄。在網上下載「貓」和「狗」的圖片各幾十張,分別放到這2個子目錄中。這2個子目錄名也稱為標籤(Label)。

二、 添加和使用
新建一個「WindowsFormsApp1」的.NET FRAMEWORK 4.7 的WINFORM程序。

在菜單-工具-選項-環境-預覽功能中,選中「Enable ML.NET Model Builder」

 

在「WindowsFormsApp1」上右鍵-添加機器學習。

 

選擇圖像分類.

 

選擇本地.

 

選擇剛才收集好的圖片文件夾(D:\z機器學習樣本1)。

 

開始訓練。

 

訓練完成(可能要幾分鐘)。

 

試用模型(隨便選一張貓或狗的圖片)。

 

添加項目。

 

如何調用ML.NET的提示

 

可以把 WindowsFormsApp1ML.ConsoleApp 設置為啟動項。F5運行試用下。
其中predictionResult.Prediction 是識別出來的類別,predictionResult.Score 是相似度。

 

 

把「WindowsFormsApp1」右鍵設置為啟動項。
Nuget 中安裝:
Microsoft.ML 1.5.0
Microsoft.ML.ImageAnalytics 1.5.0
Microsoft.ML.Vision 1.5.0
SciSharp.TensorFlow.Redist 1.14.0

,這4個包盡量和「WindowsFormsApp1ML.ConsoleApp」中版本一致

在WINFORM界面上添加按鈕和文件對話框(openFileDialog).

private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (openFileDialog1.ShowDialog() != DialogResult.OK)
                {
                    return;
                }
                string fileName = openFileDialog1.FileName;

                ModelInput sampleData = new ModelInput()
                {
                    ImageSource = fileName,
                };
                // Make a single prediction on the sample data and print results
                var predictionResult = ConsumeModel.Predict(sampleData);
                MessageBox.Show(predictionResult.Prediction);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

 

 

運行起來。就可以了。

 

三、簡單解析
查看 WindowsFormsApp1ML.ConsoleApp中的 ModelBuilder 類。
這個類是用來訓練的。
TRAIN_DATA_FILEPATH 是訓練文件索引(C:\Users\jk\AppData\Local\Temp\4233eca3-43b3-479f-97f8-50ac3124e9c7.tsv)。用記事本打開TRAIN_DATA_FILEPATH路徑的文件。裏面包含2列,Label和ImageSource。

 

MODEL_FILEPATH 是訓練後保存的模型。使用時要放到使用程序的根目錄,微軟自動生成的代碼,路徑是寫死的。
CreateModel() 是訓練方法。相當於我們剛才的鼠標點擊訓練。
如果要用代碼來訓練,就用代碼生成 TRAIN_DATA_FILEPATH 中的 .tsv 文件 。再調用 CreateModel()。

再看 WindowsFormsApp1ML.Model 中的 ConsumeModel類。
這個類是使用。
Predict() 就是調用主入口了,子方法中 CreatePredictionEngine(),modelPath 是寫死的,有需要則替換。

 

這個提示是正在下載resnet_v2_50_299.meta文件,從微軟下載這個可能需要花很長時間:

[Source=ImageClassificationTrainer; Ensuring meta files are present., Kind=Info] Downloading resnet_v2_50_299.meta from //aka.ms/mlnet-resources/resnet_v2_50_299.meta to C:\Users\jk\AppData\Local\Temp\MLNET\resnet_v2_50_299.meta
[Source=ImageClassificationTrainer; Ensuring meta files are present., Kind=Info] resnet_v2_50_299.meta: Downloaded 3596 bytes out of 102616931

 

end