背景を消すために欠陥検出の前に背景を検出するタスクを作りました。
背景だけでなく、欠陥検出の領域範囲内も一部検出されましたが、ランタイム評価にてスコアと面積の閾値を設定し、背景だけを検出することができました。
しかし、欠陥検出タスクでマスクした時にはその閾値が無視されていると思うのですが、もし前タスクで閾値を設定した領域だけをマスクする方法があれば教えてください。
ご質問ありがとうございます。
少しややこしいので1つずつお答えさせてください。
まず、ランタイム評価画面で設定できるスコアと面積の閾値は「検査設定」と呼ばれるものでして、
検査に影響します。
一度ご質問頂いて恐縮ですが、 検査設定と解析結果の関係のようになります。
「検査設定」は子タスクには引き継がれず、自身のタスクの検査にしか影響しません。
次に親の検出結果からマスクを生成する際には、親タスクの「処理設定」の中にある「解析設定」の「閾値」を参照しています。
以下のように結果が変わります。
閾値0.5の親
閾値0.5の子のマスク
閾値0.99の親
閾値0.99の子のマスク
また、既に設定した親タスクの解析設定の閾値を変更したくない場合はスコアマップ加工タスクを間に挟むことで色々出来ます。
閾値0.5の親をもつスコアマップ加工(閾値0.99で二値化)
このタスクの下に繋いでマスク設定を行えば、閾値0.99の親を持った時と同等のマスクが得られます。
親が複数の子タスクを持ち、それぞれ閾値を変更してマスクを作りたい時などに使えると思います。
解析設定もランタイム評価で設定した閾値と同じように設定しています。
紹介いただいた例のように親タスクの解析設定のスコア閾値を極端に変えたら変化は見られましたが、
面積閾も同じように極端に変えてみましたが、こちらは変化が見られませんでした。
領域検出タスク直結では面積閾値は子タスクに引き継がれないのでしょうか。
これが一番ややこしいかもしれませんが、仰る通り面積の閾値は引き継がれないです。
子タスクの解析領域で面積制限を指定していただく必要があります。
ただ、これはあくまでも解析領域に対する設定なので、
マスクで考えた場合は、スコアマップ加工のブロブ解析等を行う必要があります。
スコアマップ加工のブロブ解析で試してみたところ、これはスコア全体の面積の閾値だったのでスポット的にでているところを消すことができませんでした。
マスク前提で考えたときにスポット的に発生しているスコアを排除する方法はありますか?
スコアだけの閾値だけですと、どうしても強く出てしまうところは排除できないので面積閾値を設定できればと思っています。
いろいろ試していたところ形状抽出の面積が使えました!
これで問題は解決しました!
ありがとうございました。
色々試していただきありがとうございます。
解決できてよかったです。
色々試していただいて問題を解決していただいたのが嬉しい反面、
すぐにベストアンサーを出せなかったのが少し心苦しいです。
一応スコアマップの例を記載しておきます。
例えば錠剤ですと、スコアマップを二値化すると以下のようになります。
赤い部分が途切れています。
次にブロブ解析の最小面積を100とします。
これで左側の小さい領域が消えました…が消えて欲しいところが残っちゃっていますね。
ちょっと原因を調査いたします。
当面は形状抽出を使って頂ければと思います。
すぐに対応いただきありがとうございます。
今まで活用してこなかった機能も使えて楽しいです。
ご紹介いただいた例ですが、その通りで小さい領域が残ってしまいます。
それが形状抽出の面積閾値では残らず所望の結果となりました。
ただ、気になることとして今のところ不具合はありませんが、
輪郭だけの抽出となるので、大きい範囲で検出したものはマスクできないところです。
こちらでマスクしたいのは線状のものですのでマスクの膨張でそれをカバーすることができています。
それを考えるとやはり例で挙げてもらったようにスコアマップ加工での面積閾値が効いていくれると手っ取り早いのかなと思いました。
原因が早くわかってよかったです。
ご対応いただきありがとうございました。