見出し画像

ML.netでModel Builderを使ってみる その6

作ってみた画像判定のプログラム、実際に何かの検査で使うことを想定してみます。
何かの検査を行う時、今まで見たことがない異常な部品が見つかりました。

この異常な部品を検出するため、ML.NET Model Builderを使い、新しい学習データを作りました。
この場合、プログラムを実行するフォルダと同一の場所に新しいMLModel.zipを上書きコピーすれば対応できます。

このプログラム、とても実用的と判断されたとします。
2種類目の部品も画像判定したいと思うでしょう。

この時、MLModel.zipを部品ごとに用意する必要があります。
プログラムを起動する前に上書きコピーをする方法もありますが、ファイルの管理を想像すると間違いが絶対に発生します。

そこで、部品ごとにフォルダを作り、部品ごとに専用のMLModel.zipを使うことにします。
この部品ごとに専用のMLModel.zipの位置、VB.net側から指定できるようにしましょう。

前回のソースコードから改造点は最小ですが、実際にプログラムを運用することを考えたら必須の機能だと思います。

このコード、以下の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 #自動判定
#画像 #判定 #検査


VB.netのソースコードです。

Imports System.Reflection
Imports System.Windows.Forms
Imports System.IO
Imports System.Text
Imports Microsoft.VisualBasic.FileIO
Imports System.Globalization


Public Class Form1


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

'クラスライブラリーを使う宣言
Dim ClassLibraryObject As Object = New ClassLibrary1.Class1

'写真を入力するフォルダの指定
'このフォルダ指定は自分の環境にあったものにしてください。
Dim SpecifyFileToInputPhoto As String = "C:\Users\dws57\source\repos\MlTest\ClassLibrary1\data\assets\CD\7001-115.jpg"

'判別結果の格納
Dim JudgmentResult As String = ""

'判断結果の割合
Dim Probability As Single = 0

'学習データを保存している場所の指示
Dim LocationOfLearningData As String = System.AppDomain.CurrentDomain.BaseDirectory + "MLModel.zip"


'C#のクラスライブラリーで画像の判定を行わせる
Dim BooleanReturn As Boolean = ClassLibraryObject.SampleMachineLearning(SpecifyFileToInputPhoto, JudgmentResult, Probability, LocationOfLearningData)


End Sub
End Class

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;

namespace ClassLibrary1
{


public class Class1
{

public void SampleMachineLearning(string SpecifyFileToInputPhoto,ref string JudgmentResult, ref float Probability,string LocationOfLearningData)
{
// 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];
}

}

}


}
}

C#で画像判定を担当する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;

namespace MlTestML.Model
{
public class ConsumeModel
{
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)
{
ModelOutput result = PredictionEngine.Value.Predict(input);
return result;
}

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

public static PredictionEngine<ModelInput, ModelOutput> CreatePredictionEngine()
{
// 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);
var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);

return predEngine;
}
}
}


この記事が気に入ったらサポートをしてみませんか?