【論文読み】新・オートエンコーダで異常検知

[以前の記事](https://qiita.com/shinmura0/items/06d81c72601c7578c6d3)でオートエンコーダによる異常検知は古い！と書いてしまいましたが、
最近は進化しているようです。

今回ご紹介する論文は、損失関数を工夫することで通常のオートエンコーダよりも
異常検知能力を上げる手法です。

※本稿の図は論文（[Improving Unsupervised Defect Segmentation by Applying Structural Similarity To Autoencoders](https://arxiv.org/abs/1807.02011)）より引用しています。

#論文の概要
+ 通常のオートエンコーダによる異常検知は、微小な異常は捉えられない。
+ そこで、一枚の画像に対し小さな枠を用意して「輝度」、「コントラスト」、「構造情報」の類似度を計算して異常検知を行う。
+ 本手法を使うことで、通常のオートエンコーダやVAEの異常検知と比べて、AUCで大幅な向上が見られた。
+ 異常部分の可視化についても、通常のオートエンコーダよりも優れていた。

#オートエンコーダによる異常検知

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/7da6849f-6edd-810f-32d0-55e12fce3935.png)

上の図はオートエンコーダによる異常検知を説明した図です。
異常検知の手順は以下のとおりです。（上段の図を見ていただくと分かりやすいです。）

+ まず、元画像をオートエンコーダに渡し、再構築画像(Reconstruction)を得ます。
+ そして、再構築画像と元画像の差をとって差分画像(Residual Map)を得ます。
+ 最後に差分画像で数値が大きいところを色付け(Segmentation)します。

通常のオートエンコーダによる異常検知は、損失関数が以下の式になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/3d3b1a4f-e5b9-6752-223d-855845fa5b67.png)

論文では、これを$l_2-Autoencoder$と呼んでいます。

ところが、上図の上段のように可視化がうまくいっていません。
そして、後述するように異常検知のスコアも今一つといったところです。

そこで、論文ではSSIMという指標を使って損失関数を変更しています。
SSIMを使うと、上図の下段のように可視化がうまくいっています。

##SSIM オートエンコーダ
SSIMは、2004年に提唱された画像の類似度を測る指標です。
いま、pとqという画像があるとしてSSIMは以下の式で与えられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/57663d4d-09c2-a1ac-53bd-1cd1c5bd3a3d.png)

ただし、$l$は輝度、cはコントラスト、sは構造情報です。
$l,c,s$は次で定義されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/4e4ae1b8-53cd-7f4e-7c3d-d595232bbe22.png)

ここで、$\mu_p,\mu_q$は画像の平均強さ、$\sigma_p^2,\sigma_q^2$は画像の分散、$\sigma_{pq}$は画像p,qの共分散です。
パラメーターは以下の値を使っています。

```math
\alpha=\beta=\gamma=1\\
c_1=0.01\\
c_2=0.03
```

まとめると、SSIMは以下の式になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/71f60722-c635-76c6-ae06-20d33360559c.png)

式（8）は微分可能で、オートエンコーダの損失関数に組み込めます。

#謎の後処理
ここまでは理解できたのですが、差分画像を得たあとに、SSIMでは
謎の後処理が入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/b9640dbf-cce4-4965-b49f-08f56f4e8401.png)

上図のように、差分画像の白い部分がそのまま色付けされているわけではなく、
ノイズを消してから色付けされています。論文中では以下の記載があります。

> An opening with a circular structuring element of diameter 4 is applied as a morphological post-processing to delete outlier regions that are only a few pixels wide (Steger et al., 2018). 

推察するに、「数ピクセルしかない異常部分を消すために直径4のフィルターの
ようなものを適用した」らしいのですが、参考文献が書籍のため、調査することが
できませんでした。（力及ばず、残念。）

#実験
実験条件は以下のとおりです。

+ 元画像は512 x 512で256 x 256に圧縮し、128 x 128でランダムに画像を切り取る
+ 上記の手法で正常画像10000枚を採取
+ SSIMを適用する画像のサイズは11 x 11
+ 最適化手法はAdam（パラメーターは初期値）を使用

下の表は今回使用したエンコーダの構造を示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/2c4599dd-9270-f054-de2d-46f6831e176e.png)

デコーダはエンコーダと逆の構造です。

下の図は異なるデータセット(a),(b),(c)を使って異常検知したときの
AUCを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/d228098d-ac54-95d4-a3b4-633843d6ebe3.png)

ご覧のとおり、AE(SSIM)（赤線）が圧倒的な性能を示しており、うまく機能している
ことが分かります。

下の図は異常部分の色付けを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/29eb251d-e7aa-c2b9-12c1-e42d2e4c71ce.png)

ご覧のとおり、SSIMだと過不足なく可視化ができています。

下の表はパラメータを変えたときのAUCを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/8cd1f721-c8bf-312a-db03-73e46e26afe8.png)

パラメータ変更によるAUCの変動は少なく、パラメータの探索はあまり必要ないようです。

#感想
+ 可視化がきれいに行われていて現場で非常に役立ちそうです。
+ 本当は、本手法を実装して「metric learningによる異常検知」と比較してみたかったのですが、謎の後処理があり断念しました。
+ 論文で使われているデータセットもリンク切れになっている模様？

[次回](https://qiita.com/shinmura0/items/5c728da8a74208c1308f)は「最新の異常検知データセット」を使って、SSIM vs metric learningの精度対決を行います。