gLupeを用いた外観検査アルゴリズム開発の進め方

学習

gLupeを使って外観検査をやってみたいけど、実際どんなふうに進めればいいの?という場合の進め方についてご紹介します。

https://glupe.jp/ja/

1


ここでは、検査したい製品の画像が取得できているという前提で進めます。まずは学習です。gLupeに正常品を学習させましょう。

スモールスタート、少量の正常画像でスタート

gLupeは、下記の特徴をもっています。

  • 少量の学習データ
  • 正常品のみを学習

これはDeep LearningをベースとしたAIを使った製品検査を行う際の欠点である、

  • 不良品を含め、大量のデータが必要
  • 大量データを学習させる時間と計算資源(高性能PC)が必要
  • 上記理由による試行錯誤のしんどさ

に無縁であることを示しています。比較的安価なPCで少しの画像を使って、何度も試行錯誤することができます。まずは正常品画像を数十枚学習させ、見つけたい異常に反応できるか試してみましょう。

学習データをどう選別するか

正常品画像を学習させるにあたって、どの様な画像を選べばよいでしょうか。まずは誰が見ても正常品と言えるものを10枚ほど学習させてみてください。そして、学習に使わなかった正常品を評価してみてください。異常度の高い画像が出てくるかと思います。異常度の高い画像で、間違いなく正常品であるものを最初の10枚の学習画像に追加して、改めて学習してください。この様な取り組みを何度か繰り返すことにより、学習データはまっさらな正常品をベースに、正常品の範囲内でバリエーションが広がっていくことになります。以下の記事でも、学習データの選定についてふれておりますので、そちらもぜひご覧ください。

  gLupe をうまく使うコツ

評価

学習したモデルの性能はどう評価したらよいでしょうか。gLupeにおけるモデルの評価方法を紹介します。

精度について

モデルの精度を表す数値はいくつかありますが、gLupeではAccuracy(正解率)、Precision(適合率)、Recall(再現率)といった数値を自動で算出し、表示しています。

Accuracyの確認

gLupeの評価画面で、左上の良品エリアに良品画像を、左下の不良品エリアに不良品画像を配置し、「評価開始」を行ってください。評価結果として、右上エリアにAccuracy/ Precision/Recallの3つの数値が表示されます。

2-1-1

Accuracy(正解率)は正常品を正しく正常、不良品を正しく不良と判定したかを示す数値です。この数値が1.00ならば100%正解、すべての画像を正しく判定できているということになります。
Precision(適合率)は正常品を正しく正常と判定したかを示す数値で、この数値が1.00ならば100%正常品を検出している、すなわち「正常品の異常判定なし(正常の誤検出なし)」と言えます。
Recall(再現率)は不良品を正しく不良と判定したかを示す数値で、この数値が1.00ならば100%不良品を検出している、すなわち「不良品の良品判定なし(異常の見逃しなし)」と言えます。gLupeではこの3つの数値を使ってモデルの性能を評価します。

見逃し、過検知のバランス

では、Accuracy/Precision/Recallがどの様な数値であればよいのでしょうか。もちろんすべての数値が1.0、すなわち100%を示すことが理想ではありますが、ある決まった数値で定めたルールベースの検査に対して、データの統計的関係性を学習した結果をもとに判別を行うAIでは、なかなか100%の正解は容易ではありません。
実際の製品検査では不良品の見逃しが致命的とされますので、Recall(再現率)が1.00(100%)になるように設定して、正常品を不良品判定してしまう「過検出」を許容する方向で調整します。不良品が全製品に対して十分に少数であるなら、不良判定された正常品は検査員の目視で、後工程ですくい上げることも可能です。ただし、この「過検出」が大量に存在するならば、後工程の目視の負担が大きくなり、検査システムを導入する利点がありません。つまり「見逃し」なしかつ「過検出」が最小になるようなモデルの作成を目指すということになります。ただ、外観検査を自動化するにあたって、精度を使った定量評価しか行わないのは非常に危険です。以下に外観検査に関する精度について記述した記事もあるので、そちらもぜひご覧ください。

  外観検査における精度とは

モデルの精度上げの工夫

gLupeにおいてモデルの精度向上策としてどんな取り組みが有効か、いくつかのアイディアをご紹介します。

感度の変更

gLupeはどなたでも簡単に使っていただくため学習パラメータを最小に抑えています。その唯一のパラメータと言えるものが「感度」になります。ではこの感度とは何か、ざっくり言うと「大きな違いを見つけるように学習させる」、「細かな違いを見つけるように学習させる」、ことを指定するものになります。gLupeの感度は1,2,3の3段階で指定します。感度1は大きな違いに反応し、感度3は小さな違いに反応するような学習を行います。感度2はその中間ですね。通常は感度2で検査モデルを構築していいかと思います。ただし、製品の欠陥によっては、細かな違いを見つけたい場合もあるでしょう。その様な場合は感度3で学習させてください。逆に細かな違いを無視したいときは感度1で学習させてみてください。初めての試みでは感度1,2,3のすべてを試してみて、一番目的に合う感度を使ってください。

2-2-1

画像前処理(画像分割、トリミング処理、マスク処理、位置合わせ)

精度向上の方策として有効な、検査業務における画像の前処理をいくつかご紹介します。

画像分割

例えば製品にキズがついていた場合でも、キズが入った部位によっては出荷して構わないといったルールはあるかと思います。その様な場合、画像を部位ごとに分割し、キズを許す部位には「キズあり画像」を正常品として学習させ、キズが許されない部位には「キズの無い画像」だけを学習させるといった方策が考えられます。また、画像が高解像度の場合、gLupeもそうなのですがDeep LearningをベースにしたAIソフトウエアでは学習時に画像を圧縮して扱うことが多くあります。せっかく欠陥を鮮明に写すために高解像度で撮影しておきながら、学習時に圧縮されては本末転倒なので、高解像度画像を使う場合、予め画像を分割し、極端に縮小されないようにするといったことが有効になります。gLupeにおいては前処理設定の「分割(オーバーラップ有り)」、「分割(オーバーラップ無し)」を設定することにより画像の分割が可能です。下図の例では、オーバーラップ無しで上下2分割の前処理を設定しています。

2-2-2a
トリミング処理

製品の画像には往々にして、台座や背景など製品とは関係の無い部分が写り込んでいます。
その様な場合、検査対象としたい部分だけを切り出すということを行います。この様な処理をトリミングと呼びます。gLupeにおいては前処理設定の「トリミング」を設定することにより、このトリミング処理が可能です。gLupeが製品と関係ない部分に異常反応してしまう場合、このトリミング処理を検討してください。下図の例では、画像を左上XY、右下XY座標の矩形で切り出す前処理を設定しています。

2-2-2b
マスク処理

トリミングでは画像の製品部分を切り出しましたが、切り出しは難しいが、逆に無視したい部分が判っているときは、その部分を黒く塗りつぶして画像を消し去るということを行います。この様な処理をマスク処理と呼びます。gLupeにおいては前処理設定の「マスク」を設定することにより、このマスク処理が可能です。gLupeが製品と関係ない部分に異常反応してしまう場合、トリミングと共に、このマスク処理を検討してください。下図の例では、画像を左上XY、右下XY座標の矩形で「黒く塗りつぶす」前処理を設定しています。

2-2-2c
位置合わせ

gLupeは画像における製品の位置ズレがあっても、そのズレに反応しないように感度を調節したり、位置のバラエティーをカバーするような学習画像を用意するといった対策が可能です。ただし、細かな違いを検出したい場合などは位置合わせがされている必要がありますし、そもそも位置は合っているにこしたことはありません。本来撮影の段階で位置を合わせておくのがベストですが、それが難しい場合(食品の検査などはそうかもしれません)、画像の前処理として位置合わせが有効になります。gLupeにおいては前処理設定の「テンプレートマッチング切り出し」を設定することにより、製品部分の位置合わせと画像切り出しが可能です。下図の例では、位置合わせのベースとなるテンプレート画像を指定して、画像の位置合わせと切り出しを行う前処理を設定しています。

2-2-2d

2段階のしきい値

製品検査では、完全な正常品、完全な異常品だけではなく、異常品に近い正常品やその逆の、正常品に近い異常品といった位置づけの製品も存在します。gLupeではしきい値を使って正常品と異常品を分別していますが、例えば異常度0.58以下は完全な正常品、異常度0.62以上は完全な異常品、その間の製品はどちらとも言えないので目視で確認したいといった運用も考えられます。実際の検査では一つのしきい値で正常/異常を分別するだけでなく、複数のしきい値を使って正常/異常/要目視に分けるといった運用も考えられます。

複数モデルの組み合わせ

欠陥の様態が複数あるとき、その様態に特化した学習を行い、それぞれ別モデルを作成して、運用を行うということも可能です。例えば、キズに敏感に反応するモデル、付着物に反応するモデル、あるいはgLupeの感度1で見つけやすい異常を検出するモデル、感度3で見つけやすい異常を検出するモデルなど、特定の異常に特化した複数のモデルを組み合わせるといった運用も有効な手法の一つと言えます。

画像の種類

検査に使う画像のフォーマットは何をお使いでしょうか?
よく見るフォーマットだから、撮像装置のデフォルトだから、といった理由でjpegを使っていますでしょうか。そうであるならば、一度違うフォーマットを使うことを検討してみてください。jpegは画像のファイルサイズを節約するために、画質を犠牲にして保存されていることが多いです。検査に使う画像は是非画質優先で扱ってください。撮像装置がpngやbmp形式で出力可能な場合、学習・評価はそれらのフォーマットの画像を使う様にしてみてください。

運用

モデルの管理

複数の検査モデルを運用するに従い、モデルのバージョン管理が必要になります。
予めモデルを管理するための手法を検討しておいてください。人の手による管理ではなく、オープンソースを使った自動バージョン管理等も有効かと思います。また、運用開始後どこかのタイミングで運用中モデルの評価が必要になります。日々のOK・NGの結果を保存し、その正解率を算出するためのデータを収集してください。gLupeの結果画像保存やCSV出力機能をご利用ください。

画像の蓄積

検査業務を開始しますと、日々検査結果が蓄積されてきます。運用開始後、一定の期間がたった段階で、運用中モデルの評価が必要になります。

  • 見逃し数、過検知数は当初想定と乖離があるか
  • 見逃し画像を確認し、見逃し原因を推測する
  • 過検知画像を確認し、過検知原因を推測する

これらの情報を吟味した上で、さらなる精度向上の方針を立てるといったことが考えられます。ただ闇雲に再学習を検討するのではなく、「評価」の章で述べた、いろいろな方策を含め、方針を立ててください。また、運用を継続していくとNG画像が数十枚単位で蓄積されてゆくかと思います。そうなると異常の分類も可能になり、その分類結果から、異常の原因調査へのアプローチが可能になるかもしれません。

AI検査ノウハウの蓄積

ここまでに述べた「学習」「評価」「運用」を一通り経験することで、AIを使った検査業務のノウハウが製造検査部門に蓄積されます。このことにより、さらに他製品検査への展開や、製造の工程管理といった他分野への応用につながるかと思います。
本稿で紹介した進め方を、弊社でお手伝いしながら進めていくことも可能です。何でもお気軽にご相談ください。また、gLupe製品情報については下記ページでご確認ください。

https://glupe.jp/ja/