見出し画像

ML.netでModel Builderを使ってみる その10 ロギングも不足しています

log4netを使ってロギングが出来るようになりました。
そこで、個人的にConsumeModel.csでもロギングしようとしたのですが、結構手間取りました。

自動生成されるソースコードなので、AssemblyInfo.cs が出力されないんですよね。
そこで、サンプルソースコードを作ることにしました。

基本的に自動生成されたソースコードの部分、例外エラーだけロギングできれば十分だと思います。
想定される例外エラーは、判定する画像ファイルかMLModel.zipが存在しないかだけなので。

このソースコードを使って、指定するファイル名を変更するなど例外エラーが発生する状況を作ってみてください。
例外エラーの発生がロギングされているので、効果が実感できると思います。

前回作ったソースコードを改良してみました。
自動生成されるソースコードでも、例外エラーが発生した場合にロギングされます。

このコード、以下のWebアドレスに掲載されているものを基本にしています。
https://docs.microsoft.com/ja-jp/dotnet/machine-learning/

印刷して学びたい場合もPDFファイルがあるので参考になります。
https://docs.microsoft.com/ja-jp/dotnet/opbuildpdf/machine-learning/toc.pdf?branch=live


#学習 #勉強 #AI #機械学習 #プログラミング #Visual #CSharp #BASIC #ソースコード #Windows #自動判定
#画像 #判定 #検査


C#で作ったクラスライブラリーのソースコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using Microsoft.ML;
using static Microsoft.ML.DataOperationsCatalog;
using Microsoft.ML.Vision;
using System.Reflection;
using log4net;

namespace ClassLibrary1
{

public class Class1
{

public bool SampleMachineLearning(string SpecifyFileToInputPhoto,ref string JudgmentResult, ref float Probability,string LocationOfLearningData)
{
//ロギングを開始する、namespaceを超えるので、付加情報は関数ごとに付ける
ILog logger = LogManager.GetLogger("");

//MlTestML.ModelのConsumeModelでも、ロガーの処理を実行させるため、インターフェースを受け渡す
MlTestML.Model.ConsumeModel.loggerObj = logger;

//付加情報
logger.Info(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType +":"+ MethodBase.GetCurrentMethod().Name);

//関数の起動時の引数を保存する
logger.Info("起動時引数一覧");
logger.Info("SpecifyFileToInputPhoto:" + SpecifyFileToInputPhoto);
logger.Info("LocationOfLearningData:" + LocationOfLearningData);

try
{

// Create single instance of sample data from first line of dataset for model input
MlTestML.Model.ModelInput sampleData = new MlTestML.Model.ModelInput()
{
ImageSource = SpecifyFileToInputPhoto,
};

//学習データの位置を指定する
MlTestML.Model.ConsumeModel.modelPath = LocationOfLearningData;


// Make a single prediction on the sample data and print results
var predictionResult = MlTestML.Model.ConsumeModel.Predict(sampleData);

Console.WriteLine("Using model to make single prediction -- Comparing actual Label with predicted Label from sample data...\n\n");
Console.WriteLine($"ImageSource: {sampleData.ImageSource}");
Console.WriteLine($"\n\nPredicted Label value {predictionResult.Prediction} \nPredicted Label scores: [{String.Join(",", predictionResult.Score)}]\n\n");
Console.WriteLine("=============== End of process, hit any key to finish ===============");
//Console.ReadKey();

JudgmentResult = predictionResult.Prediction;

Probability = 0;

for (int i = 0; i < predictionResult.Score.Length; i++)
{
if (Probability < predictionResult.Score[i])
{
Probability = predictionResult.Score[i];
}

}

//関数の終了時の戻り値を保存する
logger.Info("終了時引数一覧");
logger.Info("JudgmentResult:" + JudgmentResult);
logger.Info("Probability:" + Probability);

}
catch (System.Exception ex)
{
logger.Error("HResult:" + ex.HResult);
logger.Error("Exception:"+ex.Message);
return false;
}

//正常終了
return true;

}


}
}

ConsumeModel.csのソースコードです。

// This file was auto-generated by ML.NET Model Builder.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.ML;
using MlTestML.Model;
using static Microsoft.ML.DataOperationsCatalog;
using Microsoft.ML.Vision;
using System.Reflection;
using log4net;

namespace MlTestML.Model
{
public class ConsumeModel
{

// ClassLibrary1のClass1から、ロガーの処理を実行させるため、インターフェースを教えてもらう
public static ILog loggerObj;


private static Lazy<PredictionEngine<ModelInput, ModelOutput>> PredictionEngine = new Lazy<PredictionEngine<ModelInput, ModelOutput>>(CreatePredictionEngine);

// For more info on consuming ML.NET models, visit https://aka.ms/mlnet-consume
// Method for consuming model in your app
public static ModelOutput Predict(ModelInput input)
{
//付加情報
loggerObj.Info(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + ":" + MethodBase.GetCurrentMethod().Name);

//戻り値の初期化
ModelOutput result = null;

try
{
result = PredictionEngine.Value.Predict(input);
}
catch (System.Exception ex)
{
loggerObj.Error("HResult:" + ex.HResult);
loggerObj.Error("Exception:" + ex.Message);
}

return result;

}

//学習結果のMLModel.zipが格納されている場所を指示する。
public static string modelPath;

public static PredictionEngine<ModelInput, ModelOutput> CreatePredictionEngine()
{
//付加情報
loggerObj.Info(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + ":" + MethodBase.GetCurrentMethod().Name);


//戻り値の初期化
PredictionEngine<ModelInput, ModelOutput> predEngine=null;

try
{
// Create new MLContext
MLContext mlContext = new MLContext();

// Load model & create prediction engine
//string modelPath = System.AppDomain.CurrentDomain.BaseDirectory + "MLModel.zip";

ITransformer mlModel = mlContext.Model.Load(modelPath, out var modelInputSchema);

predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);

}
catch(System.Exception ex)
{
loggerObj.Error("HResult:" + ex.HResult);
loggerObj.Error("Exception:" + ex.Message);

}

return predEngine;
}

}
}

いいなと思ったら応援しよう!