Posted at

【異常検知】学習データは0個でOK!?

前回の記事では、ディープラーニング x ガウス過程の論文を紹介しました。

今回は、その応用をご紹介します。

image.png

※コード全体はこちらに置きました。


異常検知のプロセス

画像の異常検知を例にします。

ディープラーニングを使う場合は、通常は以下のプロセスが考えられます。


  • 正常な画像を集めてくる。画像の数は多ければ多いほど良い(少なくとも10枚以上)。

  • 必要に応じて、cifar-10などの正常画像と見比べる画像を用意する。

  • 集めた画像で学習実行

  • テストデータで推論実行


ところが、正常な画像がなく、いきなり異常検知を実行する場合はどうでしょうか?

つまり、以下のプロセスです。



  • テスト画像(a)が与えられる


  • (a)で学習実行


  • (a)で推論実行

そんなの無理だよ!と思われるかもしれませんが、前回ご紹介した論文を応用すると

可能になります。ただし、制約も多くあります。


手法

前回紹介した論文(NKN)では、以下のようにマスクした部分を忠実に復元する

ことができました。

image.png

※上の図は論文より引用しています。

異常検知を行うには、まずマスクの位置を変えながら復元画像を生成します。

図にすると以下のとおりです。

sigma2.gif

左図は学習画像、マスクする部分を移動させながら、右図のように

再構成画像をつなぎ合わせていきます。

ダウンロード.png

そして、上図のように元画像と再構成画像の差を比べ、差が大きいところを

異常と認識させます。


結果

繰り返しになりますが、本手法は学習データは不要で、テストデータそのものから

学習していく手法です。

コード全体はこちらに置きました。Colab(GPU)で動くはずです。

NKNの著者のコードを雑にいじっており、かなり余分なコードも存在しています。


  • 落書きその1

image.png

左の図は、真ん中に落書きをしたものです。この画像を使って学習させました。

学習の手法は前述したとおりです。

真ん中の図は再構築画像です。落書きが見事に消えています。

右図は元画像と再構築画像の差をとったものであり、落書きの部分が赤くなっています。


  • 落書きその2

image.png

左の図は、下の方に落書きをしたものです。この画像を使って学習させました。

真ん中の図は再構築画像です。落書きが見事に消えています。

右図は元画像と再構築画像の差をとったものであり、落書きの部分が黄色~オレンジに

着色されています。

もちろん、正常な画像で学習させると、ほとんど青いヒートマップになり、

実際の異常スコア(ピクセルの差)も小さくなります。


制約

この手法は、学習画像が実質不要ということもあり、かなり実戦で使えそう!

と思った方もいらっしゃるかもしれませんが、かなり制約が多いです。


  • 学習時間

    この手法は、テストデータ1枚に対しマスクを移動しながら学習を行います。

    ディープラーニングを使った通常の処理、学習(時間がかかる)→推論(速い)

    という概念は通用しません。学習と推論はセットで行っています。

    従って、リアルタイムの処理は不可能です


  • パターンの規則性

    最初はDAGMのデータを使って試してみましたが、うまくいきませんでした。

    パターンの規則性が、はっきりしているものじゃないとうまく機能しません。



改善策

ただし、パターンの規則性については正規化を行えば改善する可能性が高いです。

正規化について説明する前に、ここでの異常スコアの算出方法を説明します。

異常スコアは以下の式を使っています。

AnomalyScore=max(|x_i-\hat{x}_i|)

ただし、$x_i$は元画像のピクセル値、$\hat{x}_i$は再構築画像のピクセル値です。

ピクセルの差が一番大きいところを異常スコアにしています。

そして、ここでいう正規化とは以下の式で異常スコアを算出することを

意味しています。

NewAnomalyScore=max(|\frac{x_i-\hat{x}_i}{\sigma_i}|)

ただし、$\sigma_i$はガウス過程により推定された標準偏差です。

著者の実装から$\sigma_i$を取り出そうとしましたが、中身が分からず諦めました。

どなたか分かる方が、いらっしゃれば教えてください。


まとめ


  • NKNを使えば、学習データはいらず、テストデータのみで異常検知可能。

  • ただし、複雑なパターンの画像はうまくいかない。改善策はあるが、効果は未知数。

  • NKNによる異常検知は、学習時間が長いため、正常データが10個以上集められるときは「ディープラーニングを使った異常検知」を使うのが無難。