前回の記事では、ディープラーニング x ガウス過程の論文を紹介しました。
今回は、その応用をご紹介します。
※コード全体はこちらに置きました。
異常検知のプロセス
画像の異常検知を例にします。
ディープラーニングを使う場合は、通常は以下のプロセスが考えられます。
- 正常な画像を集めてくる。画像の数は多ければ多いほど良い(少なくとも10枚以上)。
- 必要に応じて、cifar-10などの正常画像と見比べる画像を用意する。
- 集めた画像で学習実行
- テストデータで推論実行
ところが、正常な画像がなく、いきなり異常検知を実行する場合はどうでしょうか?
つまり、以下のプロセスです。
- テスト画像(a)が与えられる
- (a)で学習実行
- (a)で推論実行
そんなの無理だよ!と思われるかもしれませんが、前回ご紹介した論文を応用すると
可能になります。ただし、制約も多くあります。
手法
前回紹介した論文(NKN)では、以下のようにマスクした部分を忠実に復元する
ことができました。
※上の図は論文より引用しています。
異常検知を行うには、まずマスクの位置を変えながら復元画像を生成します。
図にすると以下のとおりです。
左図は学習画像、マスクする部分を移動させながら、右図のように
再構成画像をつなぎ合わせていきます。
そして、上図のように元画像と再構成画像の差を比べ、差が大きいところを
異常と認識させます。
結果
繰り返しになりますが、本手法は学習データは不要で、テストデータそのものから
学習していく手法です。
コード全体はこちらに置きました。Colab(GPU)で動くはずです。
NKNの著者のコードを雑にいじっており、かなり余分なコードも存在しています。
- 落書きその1
左の図は、真ん中に落書きをしたものです。この画像を使って学習させました。
学習の手法は前述したとおりです。
真ん中の図は再構築画像です。落書きが見事に消えています。
右図は元画像と再構築画像の差をとったものであり、落書きの部分が赤くなっています。
- 落書きその2
左の図は、下の方に落書きをしたものです。この画像を使って学習させました。
真ん中の図は再構築画像です。落書きが見事に消えています。
右図は元画像と再構築画像の差をとったものであり、落書きの部分が黄色~オレンジに
着色されています。
もちろん、正常な画像で学習させると、ほとんど青いヒートマップになり、
実際の異常スコア(ピクセルの差)も小さくなります。
制約
この手法は、学習画像が実質不要ということもあり、かなり実戦で使えそう!
と思った方もいらっしゃるかもしれませんが、かなり制約が多いです。
学習時間
この手法は、テストデータ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個以上集められるときは「ディープラーニングを使った異常検知」を使うのが無難。