論文まとめ：GANomaly: Semi-Supervised Anomaly Detection via Adversarial Training

# はじめに 
GAN を用いた異常検知系の以下の論文
[1] S. Akcay, et. al."GANomaly: Semi-Supervised Anomaly Detection via Adversarial Training"
のまとめ

ACCV 2018で発表された。
http://accv2018.net/wp-content/uploads/pocketprogramweb.pdf

arXiv：
https://arxiv.org/abs/1805.06725

著者らの GitHub コード：
https://github.com/samet-akcay/ganomaly
PyTorch 使ってます。

# 概要 
- 画像から異常検知するモデル
- GAN と auto-encoder を組み合わせたようなアーキテクチャ
- 既存の手法を上回る性能

このモデルを使った異常検出の一例は以下。

<img width="744" alt="ganomaly_img_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/c0159bc2-54e8-618d-8372-5a020292296b.png">

X 線を使ってバッグの中に危険物がないか判定する。左３列は正常データ（危険物なし）。この正常データでtrainingする。

右２列は推論時のもの。赤の矩形内に危険物があるが、これらを検出できている。

# アーキテクチャ 

### アーキテクチャの概要 
アーキテクチャの概要は以下。

<img width="754" alt="ganomaly_img_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/d940eeec-7ba5-979e-1e64-b65bdcd65410.png">

左の方は auto-encoder のような構造。その右側にさらに encoder が存在する。

右下は discriminator。

### アーキテクチャの詳細

まず左から元画像 $x$ を入力し、encoder して latent space の $z$ となる。

$z$ を decode して再構築画像 $\hat{x}$ となる。再構築画像 $\hat{x}$ をさらに別に用意した encoder に入力し、$\hat{z}$ を得る。

discriminator には元画像 $x$ と再構築画像 $\hat{x}$ を入力し、discriminatorはそれが real（つまり元画像）か fake （つまり再構築画像）かを識別する。

### 他のモデルとの比較 
以下は AnoGAN、Efficient-GAN（EGBADと呼ぶ説もあり）との比較図。

<img width="752" alt="ganomaly_img_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/e5317511-16d9-2b1d-29fc-dc20e8702381.png">

左 A のAnoGANのアーキテクチャはDCGANなどのベーシックなGAN構造をしてる。

中央 B の Efficient-GAN は encoderが加わり、encoder と generator を同時に学習させる。discriminatorには１）real画像 $x$ とそのencodeした $\hat{z}$ のペア、２）$z$ とそれをgeneratorにかけて生成した画像 $\hat{x}$ とのペア、を入力し、それらを区別するよう学習する。

右 C の本モデルは更に encoder が加わっているが、discriminator に入力するのは画像と再構築画像のみ。

# 目的関数 
### トータルのロス 
トータルのロスは3種類からなる。

```math
\mathcal{L} = w_{adv} \mathcal{L}_{adv} + w_{con} \mathcal{L}_{con} + w_{enc} \mathcal{L}_{enc} 
```

$\mathcal{L}_{adv}$ ： adversarial loss。

$\mathcal{L}_{con}$ ： contextual loss。

$\mathcal{L}_{enc}$ ： encoder loss。

### adversarial loss 

generator はvanilaなGAN のロスではなく、[4]のfeature matching を用いる。つまりdiscriminatorからの中間層の差から求める。<font color="red">discriminatorは？</font>

### contexual loss

adversarialなlossによりrealな画像が再構築されるようになるが、それが元画像っぽい保証はない。そこで元画像っぽいものを再構築するよう、両者でL1をとる。

```math
\mathcal{L}_{con} = \mathbb{E}_{x \sim pX} \| x - G(x) \|_1
```

### encoder loss
推論時に latent 同士で比較するため、generator の encoder からの出力 $G_E(x)$ と、再構築した画像をさらにもう１つのencoderに入れた時の出力 $E(G(x))$ との L2 をとる。

```math
\mathcal{L}_{enc} = \mathbb{E}_{x \sim pX} \| G_E(x) - E(G(x)) \|_2
```

# 正常・異常の判定法
こうして学習したモデルにある推論用データ $\hat{x}$ を入力した場合、まず generatorのencoderでlatentに次元削減されるが、そのベクトル $G_E(\hat{x})$ は正常データなら学習データの分布を満たす値、異常データなら分布から外れるような値となる。

その $G_E(\hat{x})$ を generator の decoderに入力し、出てきた再構築画像 $G_D(G_E(\hat{x})) = G(\hat{x})$ は、正常画像ならかなり正確に再現するが、異常画像の場合は異常な部分が再現されず、正常画像っぽいものに変化する。

再構築画像 $G(\hat{x})$ を更にもう１つの encoder に入力すると、いずれも正常データの latentの分布に従うものとなる。

よって、以下のように

```math
\mathcal{A}(\hat{x}) = \| G_E ( \hat{x} ) - E (G( \hat{x})) \|_1
```

$G_E ( \hat{x} )$ と $E (G( \hat{x}))$ との差をとると、正常値は小さくなり、異常値は大きくなるだろう。

# 実験と結果
### MNISTデータ

### CIFAR10データ

### UBAデータ

### FFOBデータ

<font color="red">書きかけ</font>


# reference 
[2] AnoGAN： T. Schlegl, et. al."Unsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discovery" IPMI 2017

[3] EGBAD：H. Zenati, et. al. "EFFICIENT GAN-BASED ANOMALY DETECTION"

[4] T. Salimans, et. al, "Improved techniques for training gans." NIPs 2016