Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
54
Help us understand the problem. What is going on with this article?
@shinmura0

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

More than 1 year has passed since last update.

前回の記事では、ディープラーニング 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個以上集められるときは「ディープラーニングを使った異常検知」を使うのが無難。
54
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
shinmura0
自己紹介はツイッターをご覧ください。 https://twitter.com/shinmura0

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
54
Help us understand the problem. What is going on with this article?