[検査結果はファイルで取り出せる?]
MENOU-RNでは検査結果の履歴を画面上から確認することができます。しかし、結果の保存・分析のためにそれらをファイルなどのデータとして取り出す機能は本記事執筆の2022年10月時点において標準では提供しておりません。将来的にはMENOU-RNと連携して検査結果の保存・分析を可能にするサーバー製品の開発を計画しておりますが、当面の間は回避策としてスクリプトタスクを使用していただくようお願いします。この記事ではそれを実現する手順をサンプルプロジェクトとともにご紹介します。
[サンプルプロジェクト]
基板上に配置されたチップ抵抗に汚れがついていたらNG、という検査AIをサンプルとして使っていきましょう。ワークスペースはこちらからダウンロードできます。
https://menoufs.blob.core.windows.net/workspaces/csvsave.zip
[出力したいCSVファイル]
このようなヘッダー情報を持つCSVファイルを保存することにします。
なお、MENOU-TEの領域検出タスクにおいて左上に表示されている「スコア」というのは、検査結果のスコアマップ(ピクセルごとの推論結果である0~255の値を画像化したもの)の全ピクセルにおける最大値を、0.0~1.0の値になるよう255で除算して正規化したものになります。このあと登場するスクリプトタスクではこの値を簡単なコーディングで計算しています。
[スクリプト]
[ランタイム評価] - [スクリプト検査設定]を開き、以下のようにコードを書いてください。
using System.Runtime.InteropServices;
// 検査をしない場合はnull 条件に一致する場合はtrue 条件に一致しない場合はfalse
bool? result = null;
// today.csvには1行目のヘッダーとして
// (検査日時, チップ抵抗タスクのスコア, チップ抵抗タスクの判定結果)
// が書き込まれているものとする
// 追記用にappend = trueを指定
using (var sw = new StreamWriter(@"C:\test\today.csv", true, System.Text.Encoding.UTF8))
{
sw.Write(DateTime.Now.ToString("[yyyy/MM/dd HH:mm:ss.fff], "));
// 「チップ抵抗の汚れ」タスクの検査結果
var tr = GetPredictionTaskResult("チップ抵抗の汚れ");
// 検査結果が存在する場合
if (tr is ISegmentationTaskResult segtr)
{
// スコアマップ画像(グレースケール)のサイズを計算
var sm = segtr.CreateScoreMapImage();
var len = sm.Width * sm.Height;
// バイト配列を作成し、Marshal.Copyする
var ba = new byte[len];
Marshal.Copy(sm.DataPtr, ba, 0, ba.Length);
// 最大値を255で割って0から1の値に直す
sw.Write((ba.Max() / 255.0).ToString("F2"));
sw.Write(", ");
// 検査結果文字列(異常 or 正常)
sw.Write(segtr.InspectionValue);
sw.Write(", ");
}
else
{
// 検査結果なしは-で表現
sw.Write("-, -, ");
}
sw.WriteLine();
}
result = true;
// resultは必ず最後の行に記述してください
result
分類タスク、異常領域検出タスクについても同様の手法で、検査結果の中から所望の情報を取り出し、ファイル保存することができます。各タスクのインターフェース仕様についてはMENOU SDKのドキュメントを参照してください。
[MENOU SDKドキュメント]
https://docs.menou.co.jp/sdk/
[APIリファレンス - IPredictionTaskResult]
https://docs.menou.co.jp/sdk/api/latest/Menou.Menoute.Runtime.IPredictionTaskResult.html
こちらのトピックでもCSV保存についてディスカッションされていますので参考になさってください。