寫在前面
準備近期將微軟的machinelearning-samples翻譯成中文,水平有限,如有錯漏,請大家多多指正。
如果有朋友對此感興趣,可以加入我:https://github.com/feiyun0112/machinelearning-samples.zh-cn
影象分類 - 評分示例
問題
影象分類是許多業務場景中的常見情況。 對於這些情況,您可以使用預先訓練的模型或訓練自己的模型來對特定於自定義域的影象進行分類。
資料集
有兩個資料來源:tsv
檔案和影象檔案。tsv 檔案 包含2列:第一個定義為ImagePath
,第二個定義為對應於影象的Label
。正如你所看到的,檔案沒有標題行,看起來像這樣:
broccoli.jpg broccoli
broccoli.png broccoli
canoe2.jpg canoe
canoe3.jpg canoe
canoe4.jpg canoe
coffeepot.jpg coffeepot
coffeepot2.jpg coffeepot
coffeepot3.jpg coffeepot
coffeepot4.jpg coffeepot
pizza.jpg pizza
pizza2.jpg pizza
pizza3.jpg pizza
teddy1.jpg teddy bear
teddy2.jpg teddy bear
teddy3.jpg teddy bear
teddy4.jpg teddy bear
teddy6.jpg teddy bear
toaster.jpg toaster
toaster2.png toaster
toaster3.jpg toaster
訓練和測試影象位於assets資料夾中。這些影象屬於維基共享資源。
維基共享資源, 免費媒體儲存庫。 於 10:48, October 17, 2018 檢索自:
https://commons.wikimedia.org/wiki/Pizza
https://commons.wikimedia.org/wiki/Coffee_pot
https://commons.wikimedia.org/wiki/Toaster
https://commons.wikimedia.org/wiki/Category:Canoes
https://commons.wikimedia.org/wiki/Teddy_bear
預訓練模型
有多個模型被預先訓練用於影象分類。在本例中,我們將使用基於Inception拓撲的模型,並用來自Image.Net的影象進行訓練。這個模型可以從 https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip 下載, 也可以在 / src / ImageClassification / assets /inputs / inception / tensorflow_inception_graph.pb
找到。
解決方案
控制檯應用程式專案ImageClassification.Score
可用於基於預先訓練的Inception-v3 TensorFlow模型對樣本影象進行分類。
再次注意,此示例僅使用預先訓練的TensorFlow模型和ML.NET API。 因此,它不會訓練任何ML.NET模型。 目前,在ML.NET中僅支援使用現有的TensorFlow訓練模型進行評分/預測。
您需要按照以下步驟執行分類測試:
1) 設定VS預設啟動專案: 將ImageClassification.Score
設定為Visual Studio中的啟動專案。
2) 執行訓練模型控制檯應用程式: 在Visual Studio中按F5。 在執行結束時,輸出將類似於此螢幕截圖:
程式碼演練
解決方案中有一個名為ImageClassification.Score
的專案,它負責以TensorFlow格式載入模型,然後對影象進行分類。
ML.NET:模型評分
TextLoader.CreateReader()
用於定義將用於在ML.NET模型中載入影象的文字檔案的模式。
var loader = new TextLoader(env,
new TextLoader.Arguments
{
Column = new[] {
new TextLoader.Column("ImagePath", DataKind.Text, 0)
}
});
var data = loader.Read(new MultiFileSource(dataLocation));
用於載入影象的影象檔案有兩列:第一列定義為ImagePath
,第二列是與影象對應的Label
。
需要強調的是,在使用TensorFlow模型進行評分時,這裡並沒有真正使用標籤。該檔案僅作為測試預測時的參考,以便您可以將每個樣本資料的實際標籤與TensorFlow模型提供的預測標籤進行比較。這就是為什麼當使用上面的'TextLoader'載入檔案時,您只需要獲取ImagePath或檔案的名稱,但不需要獲取標籤。
broccoli.jpg broccoli
bucket.png bucket
canoe.jpg canoe
snail.jpg snail
teddy1.jpg teddy bear
正如您所看到的,檔案沒有標題行。
第二步是定義估計器流水線。通常,在處理深度神經網路時,必須使影象適應網路期望的格式。這就是為什麼影象被調整大小然後被轉換的原因(主要是,畫素值在所有R、G、B通道上被標準化)。
var pipeline = new ImageLoaderEstimator(env, imagesFolder, ("ImagePath", "ImageReal"))
.Append(new ImageResizerEstimator(env, "ImageReal", "ImageReal", ImageNetSettings.imageHeight, ImageNetSettings.imageWidth))
.Append(new ImagePixelExtractorEstimator(env, new[] { new ImagePixelExtractorTransform.ColumnInfo("ImageReal", "input", interleave: ImageNetSettings.channelsLast, offset: ImageNetSettings.mean) }))
.Append(new TensorFlowEstimator(env, modelLocation, new[] { "input" }, new[] { "softmax2" }));
您還需要檢查神經網路,並檢查輸入/輸出節點的名稱。為了檢查模型,可以使用Netron,它會隨Visual Studio Tools for AI一起安裝。
這些名稱稍後在評估器管道的定義中使用:在初始網路的情況下,輸入張量被命名為“input”,輸出被命名為“softmax2”。
最後,我們在擬合評估器管道之後提取預測函式。 預測函式接收型別為ImageNetData
的物件(包含2個屬性:ImagePath
和Label
)作為引數,然後返回型別為ImagePrediction
的物件。
var modeld = pipeline.Fit(data);
var predictionFunction = modeld.MakePredictionFunction<ImageNetData, ImageNetPrediction>(env);
在獲得預測時,我們得到屬性PredictedLabels
中的浮點數陣列。陣列中的每個位置都被分配給一個標籤,例如,如果模型有5個不同的標籤,那麼陣列長度將等於5。陣列中的每個位置的值表示標籤在該位置上的概率;所有陣列值(概率)的總和等於1。然後,您需要選擇最大值(概率)並檢查指定給該位置的標籤。
引用
訓練和預測影象
維基共享資源, 免費媒體儲存庫。 於 10:48, October 17, 2018 檢索自 https://commons.wikimedia.org/w/index.php?title=Main_Page&oldid=313158208.