Anomaly detection

良品だけを覚えて、
違いに気づく。

異常検知は、不良の見本を集めて教える代わりに、良品だけを学習し、 そこからの隔たりを数値にする方法です。当社の判定エンジン E3 ENGINE の中核にある考え方でもあります。

「不良を集めなくてよい」とはどういうことか。そして、それでも不良が要る場面はどこか。 このページは、その 2 つを読むのではなく触って確かめるためにあります。

同じ基板の異常マップ。良品モデルからの隔たりが大きい箇所が暖色で示され、部品の隙間を走る 3 本の細い擦り傷の位置に、それぞれ独立した輝点が立っている。部品や配線パターンそのものは寒色のまま残り、反応していない。
プリント基板を FORESIGHT STEREO の 2D Texture で撮像した画像。無数の部品と印字の中に、髪の毛ほどの細さの擦り傷が数本走っているが、周囲の模様に紛れて見分けがつきにくい。
入力(2D Texture) 異常マップ

ドラッグして比べる

実案件のプリント基板。良品 122 枚だけで学習した E3 ENGINE の実出力で、 異常スコア 0.45(しきい値 0.169)の NG 判定。 このあとの体験は、この仕組みを簡略版で再現して触れるようにしたものです。

Experiment 01

覚えた良品が増えるほど、
良品は静かになる。

下の青い面は写真ではありません。公開データセットのコンクリート画像を使い、 入力画像の小さな窓ひとつひとつについて「記憶している良品の窓のうち、いちばん近いものとの距離」を ブラウザ上でその場で計算し、距離が大きい場所ほど濃く塗ったものです。 いまは良品 16 枚を覚えた状態です。覚えている枚数を減らし、 それから健全な面 D に切り替えてみてください。

計算した異常マップ(画像の上にポインタを置くと、その場所の「いちばん近い良品」を右の一覧に示します)

テスト画像

16 枚

±0 %

記憶した良品と違う明るさで撮ると、どうなるか。

画像スコア(窓のスコア上位 1% の平均)

いちばん遠い窓

 

記憶している良品(薄いものはまだ覚えていない)

入力は公開データセット「Concrete Crack Images for Classification」(Özgenel, Ç.F., 2018 / Mendeley Data / CC BY 4.0)の 227px 画像 20 枚(良品 17 枚・ひび割れ 3 枚)。計算は 96px に縮めた濃淡画像に対して、 5×5 画素の窓を 2 画素おきに切り出し、記憶している良品の全窓との距離を総当たりで求めています(近似はしていません)。 青の濃さは距離 0.6 で飽和する固定の尺度です。

起きていること。

1 枚しか覚えていないときは、健全な面 D も青く塗られます。記憶にない模様や明るさが、 ひび割れと同じ「知らないもの」として扱われるからです。 覚える枚数を増やすと、健全な面は静かになり、ひび割れだけが残ります。 良品のばらつきを覚えることが、この方法の学習です。

明るさをずらしてみてください。暗い側へ寄せるほど、健全な面まで青くなります。 記憶にない明るさは異常と区別がつかない── だから撮像条件が変わったら、同じモデルを使い回さず学習し直すことになります。

E3 ENGINE との違い。

ここでは窓の画素値そのものを特徴にしています。E3 ENGINE は学習済みのニューラルネットワークが取り出す特徴で 同じ距離を測るので、模様の揺らぎや明るさの差に対してずっと鈍く、ひび割れのような「構造の違い」に敏感です。

共通しているのは、良品だけを記憶すること、記憶の中でいちばん近いものを総当たりで探すこと、 画像 1 枚のスコアを窓のスコアの上位 1% の平均で決めること。仕組みの骨格は同じです。

※ 対象物も画像も当社の検査対象ではなく、仕組みを見るための公開データです。 当社の装置での実例は上の基板と、下の エナメル線 をご覧ください。

スコアが出たあと「どこで OK / NG を分けるか」を自分で動かしてみたい方へ ── 分布としきい値をブラウザで動かせるデモを公開しています。 LAB

The principle

「普通」からの距離を、
窓ごとに測る。

良品の画像を小さな窓に分け、それぞれの特徴を記憶として持ちます。 入力画像も同じ窓に分け、窓ごとに「記憶の中でいちばん近い良品の窓」までの距離を測ります。 この距離が、その場所の異常スコアです。

s(p) = minm ∈ M ‖ f(p) − f(m) ‖

M が良品の記憶、f が窓から特徴を取り出す関数です。 距離を画像の上に並べたものが異常マップ。マップの上位 1% の平均が画像スコアになり、 それをしきい値と比べて判定します。

学習に不良の画像は出てきません。不良が「どう見えるか」を教えていないので、 想定していなかった種類の不良にも距離は立ちます。 その代わり、良品にない明るさや模様も同じように距離が立つ── これが長所と短所の両方を決めています。

E3 ENGINE は記憶を作るとき、互いに遠い代表点だけを残して圧縮し(既定で全体の 10%)、 推論では近似索引を使わず総当たりで最近傍を探します。速さより、答えが変わらないことを選んでいます。

最近傍探索による異常スコアの求め方 左に入力画像を窓に分けた格子があり、1 つの窓が強調されている。右には良品の記憶として多数の点が散らばっている。強調した窓の特徴は記憶の中の 1 点として置かれ、いちばん近い良品の点までの距離が線で示されている。この距離がその窓の異常スコアになる。 入力画像を窓に分ける p f(p) 良品の記憶 M f(p) 距離 s(p) = この窓の異常スコア

入力の窓を特徴の空間に置き、良品の記憶の中でいちばん近い点までの距離を測る。 良品に似た窓は距離が短く、良品に無いものは距離が長い。

Experiment 02

線を引くには、
不良の実例が要る。

学習は良品だけで済みます。ところが「どこからを NG と呼ぶか」は、 良品のスコアだけでは決まりません。上の基板と同じ実案件で実測した 18 枚のスコアの上で、 2 本の境界を自分で動かしてみてください。

実案件の実測スコア 18 枚(良品 13・不良 5)。境界線は図の上でドラッグしても、下のスライダでも動きます。

データ

良品 13 枚

不良 5 枚

 

実案件のスコアは E3 ENGINE Trainer の評価出力(プリント基板・良品 122 枚で学習・画像サイズ 1024・2026-02-12)。 不良 5 枚は results_summary.csv の値、良品 13 枚は評価図から 小数 2 桁で読み取った値です。 破線は Trainer が算出した最適しきい値 0.169。 公開データセットの分布は Trainer のヒストグラム(幅 0.005 / 0.007 のビン)から読み取った値で、 割合はすべて概算です。良品 4,000 枚・不良 20,000 枚を、それぞれの総数で正規化して描いています。

Human_Check は、逃げではありません。

良品の上限と不良の下限のあいだには、どちらとも言い切れない帯があります。 E3 ENGINE はそこを Human_Check として切り出し、人の目に戻します。 帯を広く取れば見逃しも過検出も減りますが、人が見る枚数は増えます。 どこに線を引くかは、機械ではなく現場の判断です。

公開データセットに切り替えると、良品と不良の山が重なる場合の手触りが分かります。 片方の境界を動かすと、もう片方の数字が必ず動きます。

だから、評価には不良が要ります。

「不良の実例を隠す」を入れてみてください。良品の上限は見えます。 しかしその上のどこに線を引けば不良が入るのかは、不良を 1 枚も見ていない状態では決めようがありません

学習は良品だけで足ります。けれどもしきい値の較正には、良品・不良を含む評価用のデータが要ります。 この 2 つを混同しないことが、この方法を現場で使うための最初の約束事です。

What to feed

同じ仕組みでも、
何を見せるかで答えが変わる。

異常検知が拾うのは「記憶と違うもの」です。だから入力に何を渡すかが、結果を決めます。 同じエナメル線を、人が見るままの Live で学習・判定した場合と、 FORESIGHT STEREO® の Surface Normal で学習・判定した場合のスコアマップです。

電気モーター用エナメル線の Live 画像。透明な絶縁被膜の下で銅の撚り線が縞として並び、光沢の揺らぎが全体に乗っている。被膜の傷みは色ではほとんど現れない。
01 / 入力 Live

人の目に見える、そのままの像。

光沢の揺らぎも、そのまま「記憶」に入る。

Live 画像を入力にした E3 ENGINE のスコアマップ。傷の位置にも反応は出ているが、健全な撚り線の全体と画面右端にも広く暖色が乗り、反応が傷に絞り込まれていない。
02 / Live → スコアマップ

反応が、傷の外にも広がる。

傷にも反応はする。ただし健全な撚り線にも暖色が乗り、どこを見るべきかが絞り込めない。

同じエナメル線の Surface Normal 出力。面の向きを色で符号化したもので、撚り線の縞が整って並び、3 か所で縞の流れが途切れて乱れている。
03 / 入力 Surface Normal

面の向きを、色で符号化したもの。

照明に依存しない物理量。光沢の揺らぎは入らず、形の乱れだけが残る。

Surface Normal を入力にした E3 ENGINE のスコアマップ。反応が傷の 3 か所に絞られ、健全な撚り線と背景は冷たい青のまま残っている。
04 / Surface Normal → スコアマップ

反応が、傷の上だけに立つ。

記憶に入るのが形だけになると、距離が立つのも形の異常だけになる。

※ 測定条件 ─ Surface Normal: 良品 63 枚で学習/評価は良品 14・不良 7Live: 良品 61 枚で学習/評価は良品 10・不良 7学習・評価の枚数が揃っていないため、入力だけを入れ替えた厳密な比較ではありません。 この 1 標本で観察されたことであり、あらゆる対象物で同じ差が出ることを示すものではありません。 どの出力を渡すかは対象物ごとにサンプルで確かめます。 Surface Normal がどう測られるかは、フォトメトリックステレオの解説へ

Strengths and limits

不良を教えない、
ということの裏側。

良品だけを学習する異常検知は、不良を集めて教える分類と、得意と不得意がちょうど裏返しの関係にあります。

  良品だけを学習する異常検知 不良を集めて教える分類
学習に要るもの 良品の画像だけ 良品と、種類ごとにラベルを付けた不良
返すもの 異常スコアと、どこが違うかのマップ 「どの種類の不良か」という分類
想定外の不良 良品に無いものなら距離が立つ 教えていない種類は判定できない
良品の変動 記憶に無い変動も異常として出る(撮像条件が変わると学習し直し) 学習に含めた範囲なら吸収できる
しきい値 良品・不良を含む評価データで較正する 分類器の出力をそのまま使えることが多い

※ 方式どうしの一般的な比較であり、個別の製品の性能を示すものではありません。 何が見つかるかは、対象物・撮像条件・良品のばらつきによって変わります。

苦手なことも、はっきりあります。

この方法は「良品に無いものは、すべて異常」という前提の上に立っています。 体験①②で触れたとおり、その前提は便利さと引き換えに、いくつかのことを諦めています。

01
種類は言わない

返るのは「良品からどれだけ離れているか」と「どこが」です。キズなのか汚れなのか欠けなのかは判定しません。 種類を分けたいなら、この仕組みの後段に別の仕事が要ります。

02
記憶に無いものは、すべて光る

照明・角度・ラインが変わると、良品も記憶から遠くなります。 体験①で明るさをずらしたときに起きたことが、現場では撮像条件の変化として起きます。 条件が変わったら、別のモデルを作り直すのが前提です。

03
線は、自動では引けない

学習は良品だけで足りますが、OKHuman_CheckNG を分ける境界は 良品・不良を含む評価データで較正します。体験②のとおり、不良を 1 枚も見ずに線を置くことはできません。

04
窓より細かいものは、埋もれる

距離は窓ごとに測るので、窓の粒度より細かい違いは窓全体の中に薄まります。 細かい欠陥を拾うには画像サイズを上げて窓を細かくしますが、記憶と計算はその分だけ重くなります (E3 ENGINE の目安: 512px で VRAM 4GB 以上、768px で 6GB 以上、1024px で 8GB 以上)。

当社が異常検知のに力を入れてきたのは、この 02 と 04 を少しでも楽にするためです。 照明に依存しない Surface Normal を渡せば「記憶に無い明るさ」は減り、反射に埋もれていた形が距離として立ちます。 アルゴリズムを変える前に、見るものを変える── それが当社の順序です。

Where it sits

この方法は、どこにあるか。

異常検知は方法であって、製品名ではありません。 当社の製品でこの方法を担っているのは、3 層のうち Layer 02 です。

Layer 01 / センサ

FORESIGHT STEREO®

フォトメトリックステレオを独自に発展させた 3D 画像化技術。多方向照明から 表面法線を照明不変に取得する。異常検知に渡す「見るもの」を作る層。 仕組みを見る

Layer 02 / 判定

E3 ENGINE®

このページの方法を実装した AI 異常検知エンジン。良品だけを学習しOKHuman_CheckNG の 3 値で返す。 製品を見る

Layer 03 / 装置

TR シリーズ

センサと判定を、現場で動く 1 台にまとめたもの。卓上の観察機から、 ライン上の連続検査機、ロボット搭載機まで。

※ 単体ソフトウェアの AI SMART MASK は、この 3 層の外側にあります(「どこを見るか」を決める前処理で、良否判定はしません)。

Contact

あなたの良品は、
不良と分かれるか。

分かれるかどうかは、対象物と、良品のばらつきと、見つけたい状態で決まります。 画面の上で確かめられるのは、ここまでです。良品の画像をお預かりして学習し、 不良の実例でスコアがどう分かれるかをお返しするところからご相談ください。