【連載④】中間表現の分布を用いた異常検知【不良品検知ブログ】

不良品検知の手法に関するナレッジをさらに高めるため、工業製品に対する不良品検知に関して、様々な手法を性能検証する連載です! 今回は最終回となる第4回です。
f:id:brainpad-inc:20210201163323p:plain



こんにちは、AIソリューションサービス部の桶原です。本ブログで、画像による不良品検知に関する連載ブログは最終回となります。

本記事では、学習済みモデルを利用して画像の異常検知を実現する手法について紹介します。前連載までに紹介した内容とは少し毛色が異なりますが、「こんな手法もあるんだ〜」程度に見ていただければ幸いです。

また、記事の最後には本連載で紹介した手法間での簡単な精度比較をしましたので、異常検知モデルを開発される際の参考にしていただければと思います。

異常検知の難しさ

異常検知タスクは異常データが下記のような性質をもつため、機械学習でモデル化することが難しいタスクとされています。

  • 異常の発生はまれ
  • 異常の種類が多様で定義が難しい

過去3回の連載で紹介されてきた良品学習の手法は、これらの異常データが持つ難しい性質をうまく回避するモデル化手法だといえます。

ただ、異常検知タスクをモデル化する際に発生する問題は異常データに起因するものばかりではありません。現実では、モデル化するための正常画像を十分に得られないケースも頻繁に発生します。

この問題を回避する方法として下記の2つのアプローチが考えられます。

  • 少ないデータでもロバストなモデルを生成するアプローチ
  • 大規模なデータセットで学習済みのモデルを活用するアプローチ

本連載の 【連載③】少量の学習データで機能する異常検知手法 -DifferNet-【不良品検知ブログ】 - Platinum Data Blog by BrainPadは前者のアプローチといえます。

本記事では、これまであまり注目されてこなかった後者のアプローチによる異常検知タスクを実現する手法を紹介します。

論文紹介

この章では、本連載で扱う手法を提案した「Modeling the Distribution of Normal Data in Pre-Trained Deep Features for Anomaly Detection」というICPR2020のポスターセッションに投稿された論文を紹介します。

リサーチクエスチョン

本論文では、大規模データセットで学習済みのモデルを利用した異常検知が可能なのか、という点について検証することをテーマとしています。このテーマを検証するために、事前に学習されたモデルの中間表現を利用した新しい異常検知モデルを提案しました。そして、提案モデルと先行研究の異常検知モデル間で精度を比較することで手法の有効性を示しました。

問題設定

本論文では画像単位での異常検知を対象とし、異常検知データとしてMVTecADのデータセットを利用します。また、学習済みモデルは大規模な画像データセットであるImageNetで学習されたモデルを利用しています。

MVTecADは異常検知モデルのベンチマークをとるために作成されたオープンなデータセットです。金属製ナットやヘーゼルナッツといった15種類の商品に対して、良品画像と不良品画像が用意されています。

f:id:bp-writer:20210128102230p:plain:w400
Fig1. MVTecADの画像サンプル

上図はMVTecADのデータセットの一部です。1段目の緑枠で囲われた画像が良品データ例で、2段目の赤枠データが不良品データ例、そして3段目が不良品データ例の不良部分を拡大したものになっています。このデータセットを用いて精度検証を実施することで、提案手法が分野を横断して良い精度が出せるかどうか検証することができます。

ImageNetは、1400万枚以上の多種多様なカテゴリに関する画像のデータセットです。対応しているカテゴリの多様さとその量の多さから汎用的な画像分類モデルを作る際に頻繁に利用されています。下図は犬カテゴリに含まれる画像例です。

f:id:bp-writer:20210128102423p:plain:w400
Fig2. ImageNetの犬カテゴリ画像サンプル

手法詳細説明

本節では、まず本論文で提案されたモデルの概要について説明し、続いて提案されたモデルでどのように異常を定義しているかを説明します。最後に、なぜ一般的な転移学習とは異なるアプローチをとっているのかについて簡単に説明します。

提案されたモデル

提案されたモデルは、大きく分けて2つの要素からなります。1つがImageNetで学習済みのモデル、もう1つが学習済みのモデルから得られた中間表現から異常を判定するモデルです。学習済みモデルについてはImageNetで学習済みのものを利用するだけのため、パラメータの更新について考える必要がありません。そのため、ここでは学習済みモデルの中間表現から異常を判定する部分について説明します。

中間表現の定義
まず、本論文における中間表現の定義について説明します。中間表現を用いる際は、どこの層の出力を中間表現として用いるかといった点や、複数の中間表現をどう扱うのかといった点など、何を中間表現として利用するか検討する必要があります。本論文では、ネットワークの構造が切り替わる点のうち全結合層を除く層からの出力を中間表現として利用し、1つのサンプルに対して得られた複数の中間表現全てを利用します。

下図はEfficientNetB0を学習済みモデルとした場合の本論文での中間表現の取り方の例です。(本論文では主にEfficientNetB4を利用しますが、ブログでは構造がシンプルな方がわかりやすいと思うのでEfficientNetB0を例として扱います。)

f:id:bp-writer:20210128102524p:plain:w400
Fig3. EfficientNetB0での中間表現の取り方

上図においてLevelはモジュール出力を入力に近い側から採番したものを示し、赤点隣の数値はフィルタのサイズ、赤点から出る矢印先の数値はフィルタの数、Mは各レベルから得られる中間表現を示しています。例えば、M1の中間表現にはレベル1で得られる32の特徴マップが含まれます。こうして得られたM1からM9までの中間表現を結合したものが1サンプルで利用する中間表現になるため、この例では1サンプル画像に対して2096(=32+16+24+40+80+112+192+320+1280)の中間表現を利用することになります。

異常検知の方法
続いて、上記の定義で得られた中間表現から異常検知を判定する部分について説明します。まず、得られた中間表現はチャネルごとに幅と高さを持つことが多いため、この値をチャネルごとに1つの代表値をとるように集計します。そして、まず良品画像に関して得られたベクトルを多変量ガウス分布に当てはめることで良品画像の分布を求めます。異常画像は良品画像と異なる分布になっていると想定されるため、この多変量ガウス分布の平均からの距離を異常値と捉え、距離が一定以上離れたデータを異常として判定します。
提案モデルでの異常度の定義

提案手法では、ガウス分布の平均との距離を異常度の指標として利用しています。距離の測り方にも、平均値からの絶対値を利用する方法、平均値からのユークリッド距離を利用する方法など様々あります。本論文では、ユークリッド距離(L2)、標準化されたユークリッド距離(SED)、マハラノビス距離(Mahalanobis)を用いた精度検証を実施し、実験的に異常度としてふさわしい指標を決定しました。

下表は学習済みモデルにEfficientNetB4*、精度指標にAUROCを用いて、中間表現を獲得する層位置(Level)毎に距離指標を変化させた際の実験結果です。MeanがAUROCの平均、SEMが標準偏差を示しています。図よりマハラノビス距離が他の指標と比較して良い精度を出していることがわかります。


*前述の中間表現の取り方の例ではわかりやすさのためにEfficientNetB0を利用しましたが、EfficientNetの中ではEfficientNetB4が最も精度が高かったため、以降はEfficientNetB4をベースとして考えます。

f:id:bp-writer:20210128102921p:plain:w400
Fig4. 異常度定義ごとの精度

この結果を受け、本論文では異常度の指標としてマハラノビス距離を採用しました。

ところで、このマハラノビス距離とはいったいどんな指標なのでしょうか?

マハラノビス距離はxをデータ点の値、μを平均、Σを分散共分散行列とすると下記の式で表せます。

f:id:bp-writer:20210128103133p:plain:w400

この指標が一般的なユークリッド距離(L2)と異なるのは、分散共分散行列を式に含んでいる点です。これにより、マハラノビス距離は変数内や変数間で分散の異なるデータを標準化することで、モデルが極端な値を取る変数の影響を受けづらくなります。

なぜ一般的な転移学習的な手法を取らないのか?

少し話はそれますが、本論文ではなぜわざわざ中間表現を取り出して異常検知に利用するという回りくどいやり方をとっているのでしょうか?一般的な転移学習のように、学習済みモデルを持ってきて、モデルの最終層だけ置き換えて、再学習するというやり方はダメなのでしょうか?

結論から話すと、このやり方は異常の教師データが必要なため難しいです。前述の通り、異常データには異常の種類が多様であるということ、そして異常データの発生頻度が非常に低いという特徴があります。こういった特徴を持つ異常データをモデルが学習できる量を集めるのは非常に大変です。また、もし集めることができたとしても、それまでに発見されていない新たな異常についてモデルは異常と判断することができなくなってしまいます。

本論文では、これを回避するために学習済みモデルの中間表現とその分布により良品を定義し、その分布から外れた製品を不良品と定義する良品学習の考え方に近いモデルを提案しています。

結果

下図は提案手法と、論文公開までに提案されていたモデルの精度をAUROCを指標として比較したものです。Meanは異常カテゴリ間の平均AUROCであることを示し、SEDは異常カテゴリ間でのAUROCの標準偏差を示しています。図より提案手法(Maharanobis)が比較対象の中では最良の結果を残していることが確認できます。(図中においてPre-Trained Classifierの精度が最良となっていますが、Pre-Trained Classifierの精度はモデルの精度上限を測るために提案手法で利用した学習済みモデルを良品・不良品全データを利用してファインチューニングしたものです。教師なし学習手法の中では提案手法が最良となっていることがわかります。)

f:id:bp-writer:20210128103245p:plain:w400
Fig5. 提案手法の精度

MVTec AD Benchmark (Anomaly Detection) | Papers With Codeによるとこの精度は2020年12月時点のMVTecADデータセット において最良とされているDifferNetよりも高い値となっているため、SoTaを達成している手法だといえます。PapersWithCodeに本論文の結果が反映されていないのは、公開されている実装が不十分な状態であるためだと考えられます。

MVTecADにおける検証結果と考察

上記のように今回紹介した論文は、学習済みモデルが利用でき、論文上はSoTaを達成している、なかなかに凄い手法を提案しています。本章では、提案手法の追検証をすると共に、本連載でこれまでに作成してきたモデルの中間表現を提案手法に適用するとどうなるか検証していきたいと思います。

提案手法の追検証

ここでは追検証により、提案手法が論文に記載されているような高い精度で異常検知を実現できているかどうかを確認します。この検証では学習済みモデルとしてImageNetで学習済みのResNet18とEfficientNetB4を利用しました。ResNet18は比較的古いモデルの代表として、EfficientNetB4は新しいモデルの代表として選択しました。なお、評価指標としては論文で利用されたAUCではなく、実際に利用されることの多いPrecisionとRecallをベースとしたF1スコアを用いています。





ResNet18

EfficientNetB4

Bottle

0.975

0.992

Cable

0.865

0.89

Capsule

0.939

0.939

Carpet

0.864

0.934

Grid

0.844

0.92

Hazelnut

0.950

0.957

Leather

0.851

1.000

Metal Nut

0.906

0.932

Pill

0.942

0.92

Screw

0.853

0.859

Tile

0.916

0.976

Toothbrush

0.949

0.933

Transistor

0.8

0.867

Wood

0.921

0.967

Zipper

0.892

0.971

上記結果より、どのカテゴリの異常に対しても各モデルは0.8を超えるF1スコアを叩き出しており、非常に高い精度を出していることがわかります。また、PillとToothbrushを除く全てのカテゴリにおいてEfficientNetB4を学習済みモデルとして利用した場合の方が、ResNet18を利用した場合よりもF1スコアが高くなっていることがわかります。

以上より、提案手法により精度の高い異常検知ができることが本当そうであること、そして新しいアーキテクチャの学習済みモデルを用いることで異常検知精度を改善できそうなことが確認できました。

MVTecADで学習済みのモデルの中間表現への提案手法の適用

ここまで提案手法の中間表現として、ImageNetで学習済みのモデルの中間表現を利用して精度検証してきましたが、MVTecADで学習済みのモデルの中間表現を利用するとどうなるのでしょうか?精度はよくなるのでしょうか?

ここでは、MVTecADで学習したモデルとして本連載で紹介された3つのモデルの中間表現を利用したものと、ImageNetで学習済みのモデルの中間表現を利用したものの精度比較を行います。この比較により、提案手法にはドメインの知識を学習した中間表現に適しているのか、それとも汎用的な中間表現が適しているのかという疑問を簡易的に検証します。(適切な比較を行うためには、同じアーキテクチャでImageNetで学習済みのモデルの中間表現とMVTecADで学習済みのモデルの中間表現を用意したうえで比較をする必要がありますが、両方のデータセットで学習するのはコストが高いため、ここでは片方のデータセットのみで学習済みのモデルを比較しています)

なお、精度評価指標には、先ほどと同様のF1スコアを用いています。



MVTecAD モデル

ImageNet モデル


AutoEncoder

EfficientGAN

DifferNet

ResNet18

EfficientNetB4

Bottle

0.869

0.886

0.960

0.976

0.992

Cable

0.812

0.848

0.861

0.865

0.890

Capsule

0.920

0.907

0.956

0.939

0.940

Carpet

0.864

0.864

0.864

0.864

0.935

Grid

0.844

0.844

0.844

0.844

0.920

Hazelnut

0.778

0.778

0.923

0.950

0.957

Leather

0.852

0.852

0.852

0.852

1.000

Metal Nut

0.899

0.899

0.913

0.906

0.933

Pill

0.916

0.921

0.942

0.942

0.920

Screw

0.853

0.853

0.859

0.853

0.859

Tile

0.852

0.842

0.963

0.917

0.976

Toothbrush

0.949

0.889

0.951

0.949

0.933

Transistor

0.658

0.584

0.814

0.800

0.867

Wood

0.938

0.927

0.915

0.922

0.968

Zipper

0.888

0.888

0.899

0.892

0.971

上表では各カテゴリで1番高いスコアを青字とし、2番目に高いスコアを緑字としています。表より、EfficientNetB4、DifferNet、ResNet18に高いスコアが集中していることが確認できます。DifferNetはEfficientNetより後に発表された新しいアーキテクチャで、かつMVTecADのデータから学習したドメイン知識が反映された中間表現を持つため、EfficientNetB4よりも精度が良くなるのではないかと想定していましたが、予測精度はEfficientNetB4に劣ってしまうことが多いという結果になりました。

このことから、提案手法はドメイン知識の反映された中間表現よりも、一般的な画像特徴の中間表現に対して適用するのが良いのではないかという示唆が得られました。今回はここまでの検証しかできませんでしたが、興味のある方は是非同じアーキテクチャでImageNetとMVTecADで学習した別々のモデルを用意し精度比較を実施してみてください。

プロジェクトへの応用

今回紹介した手法には、学習済みモデルを活用することにより下記のようなメリットがあります。

  • 大量の学習データが必要ない
  • モデルの学習に時間がかからない

一方で、画像単位での異常分類になるため何を根拠としてモデルが異常と判断したかを示すことが難しいというデメリットがあります。

そのため、今回の手法は「業務内容的に大量データを準備するのが難しい」、「モデル開発に時間をかけずにクイックに検証したい」といった異常検知プロジェクトで利用することができます。ただ、近年はモデルの挙動に対する説明を求められる機会が多くなってきています。そのため、プロジェクトでこの手法を直接利用するのはなかなか難しいと思われますが、PoC等で比較対象モデルとして活躍の場を与えることはできると思います。

連載手法のまとめ

最後にこれまでの連載で試してきた手法の精度とその特徴について簡単にまとめます。是非、異常検知モデルを作る際の指標としてご利用ください。

精度

ここでは各モデルの安定性を考慮し、これまでの連載で取り扱ったモデルの3 fold cross validationで得られた平均F1スコアを記載します。




通常モデル

中間表現活用モデル



AutoEncoder

BiGAN

DifferNet

AdaCos

EfficientNetB4

ResNet18

Bottle

0.869

0.861

0.955

0.533

0.992

0.976

Cable

0.758

NaN ※

0.853

0.576

0.835

0.828

Capsule

0.837

0.853

0.906

0.780

0.905

0.904

Carpet

NaN ※

0.924

0.837

0.811

0.940

0.864

Grid

0.900

0.837

0.810

0.375

0.912

0.844

Hazelnut

0.810

NaN ※

0.986

0.813

0.952

0.902

Leather

0.123

0.848

0.888

0.805

1.000

0.851

Metal Nut

0.933

0.900

0.952

0.755

0.919

0.894

Pill

0.913

0.915

0.880

0.759

0.915

0.918

Screw

NaN ※

0.894

0.935

0.992

0.857

0.853

Tile

0.809

0.834

0.943

0.768

0.950

0.878

Toothbrush

0.822

0.828

0.911

0.831

0.882

0.833

Transistor

0.527

0.701

0.692

0.344

0.800

0.667

Wood

0.923

0.868

0.964

0.867

0.959

0.901

Zipper

0.879

0.881

0.910

0.714

0.922

0.887

※NaNは正解がなくPrecisionとRecallが0になってしまったため発生したもの

特徴

下記に、本連載で試した手法のメリットとデメリットを簡単にまとめました。




メリット

デメリット

AutoEncoder

  • 安定して学習でき、ベースラインとして扱いやすい
  • 不良領域の可視化が可能

  • ややぼやけた再構成画像になる

EfficientGAN

  • 精巧な画像生成が期待できる
  • 不良領域の可視化が可能

  • 学習が不安定であり、入力画像の再構成がうまくできない場合がある

DifferNet

  • 大量の学習データが必要ない
  • ロバスト性を意識したアーキテクチャ
  • 不良領域の可視化が可能

  • 他の手法と比較して目立ったデメリットはない
  • 不良領域の可視化が再構成画像によるものではないため、説明が難しい

AdaCos

  • 損失関数のパラメータ調整が不要
  • 学習時間が短い
  • 不良領域の可視化が可能

  • ネットワークパラメータやデータ拡張の設定は必要なため、全て自動でパラメータ調整はできない
  • 不良領域の可視化が再構成画像によるものではないため、説明が難しい

本提案手法

  • 大量の学習データが必要ない
  • モデルの学習に時間がかからない
  • 高い精度で異常データの分類が可能

  • 不良領域の可視化ができないため、根拠の提示が難しい

終わりに

本連載では、MVTecADという15種類の工業製品カテゴリーに関する異常検知データセット に対して様々なモデルを適用し、それらの有用性について検証してきました。今回紹介した手法以外にも様々な手法がありますが、残念ながら「これ」を使えば必ずうまくいくといった手法はまだ見つかってません。そのため、利用するデータや何を異常として検知するかによって適切な異常検知手法は変わってしまいます。モデルを作る際はどんなデータでどんな異常を検知したいのかを意識して、適切な手法を検討していきましょう!
今回期せずして長期間の連載となってしまいましたが、本連載を通じて異常検知について少しでも興味を持っていただけたら幸いです。本連載をご覧下さったみなさま、最後までお付き合いいただき、ありがとうございました!

参考文献

www.mvtec.com

arxiv.org

github.com




ブレインパッドでは、新卒採用・中途採用ともに新しい仲間を積極的に採用しています!
AIによる不良品検知をはじめ、データサイエンスを仕事にしてみたい皆さま、ブレインパッドにご興味のある皆さま、ぜひご応募をお待ちしています!

www.brainpad.co.jp