異常個所を「教師無し学習」で可視化するAno-Unet V2を開発しました。
Ano-Unetに比べ速度と安定性を向上させました。
コード全体はこちらに置きました。
※本稿は【Zoom】Pythonデータ分析勉強会#13 その1の発表資料です。
#Ano-Unetの問題点
以前に開発したAno-Unetは以下の問題点を抱えていました。
- 画像一枚に対し、学習を行っているので非常に遅い。(たぶん画像1枚に20分くらい)
- ハイパーパラメータの調整が、画像毎に必要なため大変。
#Ano-Unet V2
そこで、問題点を解消すべくAno-Unet V2を開発しました。
##特長
- 高速化
- ハイパーパラメータの調整はほとんど不要
- metric learningに限らず、オートエンコーダでも何でも後付け可能なネットワークになった
通常の機械学習と同じく、学習フェーズと推論フェーズを切り離したため
推論は非常に速くなりました(処理時間は画像一枚に1分くらい)。
ただし、学習フェーズは5,6時間かかります。
##構造
- あらかじめ、正常画像で異常検知を学習させておきます。
- さらに、正常画像でPartial Convolutionsを学習させておきます。
- 元画像に対しマスクをかけます(Masked Image)。
- それをPartial Convolutionsに入力し、マスクの部分を補完した画像を取得します(Predicted Image)。
- 取得した画像に対し、異常検知を行い異常スコアを取得します(Anomaly Score)。
- 最後に、取得した異常スコアをヒートマップのマスクした部分に代入します(Heat map)。
- マスクを移動させ、同じ作業を繰り返します。
今回使っている技術は以下のとおりです。
※ Ano-Unet V2とは名ばかりで、メインはPartial Convolutionsの表現力を
頼りにしています。ただ、U-netは一応、Partial Convolutionsの中で
使われているので、Ano-Unet V2という名前でも許されるかなぁと思います。
以下、各技術を説明します。
##Patial Convolutions
Patial Convolutions(以下PCs)はマスクした部分をリアルな画像で補完
するネットワークです。
上の図は、PCsの論文より引用したものです。
かなりリアルな画像が再現されています。
Ano-Unet V2では、まず、PCsを正常画像で学習させます。そして、異常部分をマスクして
PCsで補完すれば異常部分が正常に変わるのでは?という発想で成り立っています。
以下の図が分かりやすいです。
これは、異常部分をマスクした画像を学習させたPCsに入れ、補完させた画像
を取得したものです。期待通り異常部分が消え、正常っぽい画像に変化しました。
PCsは正常画像で学習させているため、マスクした部分は必ず正常っぽい絵柄で
補完してくれます。
そして、マスクを移動させながら、補完した画像を異常検知させ、異常スコアで
評価すれば、異常部分のときだけ異常スコアが下がるため、どこが異常なのかを
特定することができます。
マスクは画像の端から端まで満遍なく移動させます。そして、マスクのサイズは
4種類を用意し、微小な異常個所から大きい異常個所までをカバーしています。
##ディープラーニングによる異常検知
あらかじめディープラーニングによる異常検知を学習させておく必要がありますが、
これはディープラーニングじゃなくても何でも良いです。画像の異常度を算出できる
手法であれば良いです。
極端なことをいえば、画像を二値化して明るいところの面積で合否判定する手法でも
適用できます。(精度は保証できませんが。。。)
###適した手法
ただし、スコアを出す異常検知手法はオートエンコーダのような面積ベースの
評価方法の方が向いている気がします。metric learningのような特徴ベースの
ものだと最も異常な部分を消さないと、スコアが全然下がってくれないため、
少しの異常は見過ごされる傾向にあると思われます。
ただ、オートエンコーダによる異常検知は元々可視化できる構造なので、そもそも
Ano-Unet V2は使う必要ないよ!というジレンマもあるわけですが。。。
#実験
今回は、cifar-10は使わずに、製造業で出てきそうな画像を使います。
使ったデータセットは以下の二つ。
そして、異常検知手法として黒魔術を使いました。
##MVTec-ADを使った結果
コード全体はこちらに置きました。
Colabで動くはずです。
うまくいく確率は約70%という印象。
@daisukelab さんの自己教師あり学習と比べると見劣りしますが、
教師無し学習なので良しとします(^^;
##DAGMを使った結果
うまくいく確率は約50%という印象。
結構難しいデータセットでした。
#まとめ
- Ano-Unet V2の推論は比較的高速、パラメータ調整もほとんど不要
- 学習時間が長いのがネック(5,6時間)
- metric learningに適した可視化手法かといわれると、ベストではない(改善の余地あり)