製造工程の不良品を検出する場合、製造工程の不良率は低いため、不良画像をなかなか集めることができません。そのため、正常品のみから不良個所を判定する手法が求められており、AutoEncoderを使用する方法が提案されています。

AutoEncoderでは、入力画像の特徴を表すベクトルを学習します。Encoderでは入力画像を低次元の潜在変数zに写像します。Decoderでは潜在変数zから元解像度まで復元します。学習では、X->Encoder->z->Decoder->xと計算し、Xとxの誤差を最小化します。

AutoEncoderは正常品から学習しているため、不良品の特徴は捉えることができません。そのため、AutoEncoderの出力と、不良品の画像の差分を取ることで、不良個所を判別することができます。

AutoEncoderのzを直接学習せず、正規分布のパラメータを学習するようにしたのがVAEです。VAEを使用してMNISTで不良品検出をするには、以下の記事が参考になります。

Variational Autoencoderを使った画像の異常検知 前編

Colaboratoryに上記サイトのコードをコピペして実行してみます。実行結果が以下の画像です。画像上(old)がVAE、画像下(new)がVAEの損失関数をMVAEのみにしたバージョンです。1の画像を正常画像、9の画像を異常画像として、濃い青の部分が異常個所になります。このように、正常画像のみから異常画像を検出できることがわかります。

2dim


潜在変数zを2次元から4次元に変更して実行してみます。こちらの方が精度が高いように思われます。

4dim


8次元版。次数を上げすぎるとすべての特徴を表現できてしまい、異常検知が困難になります。

8dim


学習自体は正常画像のみで実行できますが、潜在変数をどれくらいの次元数に設定するかの判断のために、いくつかは不良画像が必要かと思われます。