生成モデルを用いた異常検知

生成モデルによる異常検知

一般的に、正常なデータは大量に存在するが、異常なデータはごく少数しか入手できない。また、どのような異常が起きるかは事前に予想できない。。 そのため、異常検知には、通常の2値分類ではなくVAEやGANを用いた生成モデルを使うことになる。

生成モデルを用いた異常検知では、 まず、正常データのみを学習させて正常データが生成できるようにする。 「学習した正常データはうまく生成できる」が「学習していない異常データはうまく生成できない」状況となる。 これは、 「正常な画像を入力したときは入力画像と生成画像の差分が少ない」 が 「異常な画像を入力したときは、入力画像と生成画像の差が大きい」 状況である。 これにより正常か異常かの判定を行うことが可能で、 画像の差分を取ることで異常個所を可視化することができる。

異常検知のデータセットの準備 Fruits 360 dataset

100x100 ピクセルの解像度で、81種類の果物画像。

https://md-datasets-cache-zipfiles-prod.s3.eu-west-1.amazonaws.com/rp73yg93n8-1.zip

異常を模した傷を付与する

画像に疑似的に傷のようなノイズを付与して、異常画像とみなすことにする。

8.3 AnoGAN について

  1. 正常画像を用いて、通常のGANと同様に乱数 $z$ から正常な画像を生成できる生成器を作成する。
  2. 作成した生成器を用いて、ある画像を入力として与えたときにその生成器によって生成される画像と入力画像との誤差(= 異常度)を測る
  3. 正常な画像であれば異常度が小さく、異常な画像であれば異常度が大きくなることを利用して、異常検知を行う。

通常のGANと同様に、AnoGAN ではランダムなノイズ $z$ から画像を生成する。そのため入力画像と生成画像を関連づけるための工夫が必要となる。 入力画像を元に、その画像に近い画像を生成するわけでもないので、画像から潜在空間への逆写像ができない。

AnnoGAN では勾配法を用いて、ある画像からその画像に近くなるような$z$を探す。 ただし、勾配法を用いた$z$の探索は推論時に行われるため、推論に時間がかかるという欠点がある。 この問題を解決するには、生成時にエンコーダをつけて画像から潜在空間への逆写像も同時に学習する(EfficientGAN)。

  1. step 1 正常データの生成: 1次元ベクトル $z$ から正常画像 $x$ を生成する方法を学習する。
  2. step 2 入力画像と近い画像を生成できる$z$の探索: 画像$x$をベクトル$z$ にマッピングするために、$x$に一番近い生成画像 $G(z)$ となる$z$を勾配法で見つける。
  3. step 3 正常異常判定: 探索した $z$ から画像を生成し、入力画像との誤差を異常度とみなして正常か異常かを判定する。

異常度の算出

Residual Loss: 生成画像と元画像のピクセルの画素値の差の合計
$\displaystyle L_R(z) = \sum |x-G(z)|$
$x$: 入力画像
$G(z)$: 生成された画像

Discrimination Losss:
$\displaystyle L_D(z) = \sum | f(x) - f(G(z))|$

異常度:
$L(z) = (1 - \lambda) L_R(z) + L_D(z)$

実装

データの読み込みと設定変数一覧

モデルについて

通常の DCGAN と同様に、乱数 $z$ を入力として画像を生成する。

train

Latent Z Optimization and Test anomaly detection