スクリプト検査機能

スクリプト検査機能をリリースしました。
スクリプト検査機能とは、領域検出や形状抽出で求めた対象物の位置情報(ブロブ)を入力として、
様々な検査をユーザー自身がプログラミングして記述できる機能になります。
他のタスクとは違い、タスク間の情報を自由にやりとり出来るメリットがあります。

使い方は以下のようになります。

  1. ランタイム評価画面を開く
    ※学習が必要なタスクはすべて学習が完了している必要があります

  2. スクリプト検査設定タブを選択

  3. スクリプトを記述

例 : 錠剤の中心と中心の距離を測定(近いとNG)コード

// 錠剤の距離が近いときはNG
// 距離閾値
const double distanceTh = 170.0;
// 検査をしない場合はnull 条件に一致する場合はtrue 条件に一致しない場合はfalse
bool? result = null;

// 錠剤検出で得られた検査を通過したブロブリスト
var blobs = GetInspectedBlobs("錠剤検出");

// ブロブが存在する場合
if (blobs?.Any() == true)
{
    // ReadOnlyCollectionからListに変換して要素にアクセス出来るようにする
    var blobList = blobs.ToList();
    var count = blobList.Count;
    
    // ブロブと次のブロブをペアとして距離を算出
    var distances = new List<double>();
    for (var i = 0; i < count - 1; i++)
    {
        var blob = blobList[i];
        var nextBlob = blobList[i + 1];
        // ブロブの重心をdouble型に変換
        var blobCentroid = CreatePointD(blob.Centroid.X, blob.Centroid.Y);
        var nextBlobCentroid = CreatePointD(nextBlob.Centroid.X, nextBlob.Centroid.Y);
        // 座標ペアを生成
        var pointPair = CreatePointPair(blobCentroid, nextBlobCentroid);
        // 追加した座標ペアはUIに表示され、レポートも出力できる
        AddPointPair("座標ペア", pointPair);
        distances.Add(pointPair.Distance);
    }
    // 距離を判定(1つでも閾値より低い距離があったらNG)
    result = !distances.Where( distances => distances < distanceTh).Any();
}

// resultは必ず最後の行に記述してください
result

以下がスクリプト検査で使用できる関数、クラスの仕様書となっています。
スクリプト検査ドキュメント

スクリプト検査では、ScriptParameter(P.14)のメソッドを自由に呼び出すことが出来ます。
今回使用した関数ですと、

メソッド名 ページ 内容
GetInspectedBlobs 12 検査設定を通過したブロブの取得
CreatePointD 19 double型の座標を生成
CreatePointPair 19 座標ペアの生成
AddPointPair 14 座標ペアをデバッグ情報に追加
参照したプロパティは、
プロパティ名 ページ 内容
----- ----- -----
IBlob.Centroid 1 ブロブの重心座標
IPointPair.Distance 5 座標間の距離
となります。

そしてintdouble,List等の基本型、Enumerable(System.Linq)、
またデバッグ用途にFile(System.IO)が使えるようになっています。

なお、検査の結果はresultに記述してください。

検査設定との関係
true 条件に一致する
false 条件に一致しない
null 検査をしない
nullの使いどころが難しいと思いますが、
検査する情報が不足していてtruefalseか判断できない時はnullを使い、
そもそも情報が不足している状態がNGな状態であればtrue(異常検知時)かfalse(正常検知時)を使うことになると思います。

最後にresultは必ず最後の行に記述してください。
returnをや;を記述するとエラーになってしまうので気を付けてください。

  1. スクリプトを保存してスクリプト検査を有効
    image

  2. スクリプト検査タブが現れるので選択

すると、あとちょっとで北斗七星になれそうな線が描かれました。

例に書いたスクリプトでは前後に並んだブロブの重心の距離を見ています。
画面には距離を求めるのに用いた情報を描画しています。

今回は距離が170pixel以下の座標ペアがある場合に異常と定義しました。
先ほどの画像の判定結果は正常となりました。
image

そして以下のように錠剤同士の距離の近い場合は異常となります。


image
image

他にも直線のペアを生成して角度をチェックしたり、
座標をあれこれ計算して検査することも可能です。

以下の「実例で学ぶMenou-TE」シリーズでもスクリプト検査を使っています。
実例で学ぶMenou-TE ~その4 板金編~

一般的な処理だけでは検査が難しい、
もしくは独自の検査ロジックがある場合はこのスクリプト検査を使って頂ければと思います。

また、よく使われるロジックは定型スクリプト検査として登録して、
UIからパラメータを指定するだけで検査が行える機能の開発を検討しております。
プログラミングまでするのはちょっと…という方も、
細かい検査設定が出来るよう工夫していきたいと思っています。

なお、現在入力として扱えるのはスコアマップを出力できる領域検出、異常領域検出、スコアマップ加工、そして今回追加した形状抽出の一部の形状情報です。
ご要望があれば随時追加していこうと思っています。

「いいね!」 3

すごく欲しかったサンプルです。参考にさせていただきます。

基準座標は左上(0,0)という認識でいいでしょうか。
(基準座標を変更することは可能でしょうか)
また、カメラ分解能(200万、500万など)の制限は
ないものと考えていいでしょうか。

「いいね!」 1

いつもコメントありがとうございます。

基準座標は左上(0,0)となっています。
今のところ簡単に基準座標を変更する機能は存在しないです。
スクリプト内であれば座標を変換するロジックを記述すれば変換可能という状態です。

カメラの分解能に明確な上限は設けていないですが、
大きいほど処理と描画が遅くなります。

私が試したことがある範囲ですと2400万画素(6000x4000)でも動きます。
しかし、アノテーション時の挙動が若干遅くはなります。
また、学習/推論ともに大幅に処理時間が増加するので、
運用を考えると前処理のリサイズを使うことになると思います。
なお、リサイズを行っても出力される座標はリサイズ前の元の座標系になります。

ご回答ありがとうございます。
AIで提案すると、ルールベースの時には相談もされなかった
アプリケーションの相談が来ます。
その際にこういう情報はすごく参考になります。

結局のところハード依存は致し方がないので何とも言えないのは
理解した上で、それだと案件が進まないという事もあり
勝手なお願いをさせていただいております。

早い/遅いも人による誤差があるかと思いますので
より具体化させたアプリにていろいろと知見を広げて
行ければと思います。

「いいね!」 2