Edited at

【高速化】Ano-Unet V2で異常部分の可視化

異常個所を「教師無し学習」で可視化するAno-Unet V2を開発しました。

Ano-Unetに比べ速度と安定性を向上させました。

image.png

コード全体はこちらに置きました。

※本稿は【Zoom】Pythonデータ分析勉強会#13 その1の発表資料です。


Ano-Unetの問題点

以前に開発したAno-Unetは以下の問題点を抱えていました。


  • 画像一枚に対し、学習を行っているので非常に遅い。(たぶん画像1枚に20分くらい)

  • ハイパーパラメータの調整が、画像毎に必要なため大変。


Ano-Unet V2

そこで、問題点を解消すべくAno-Unet V2を開発しました。


特長


  • 高速化

  • ハイパーパラメータの調整はほとんど不要

  • metric learningに限らず、オートエンコーダでも何でも後付け可能なネットワークになった

通常の機械学習と同じく、学習フェーズと推論フェーズを切り離したため

推論は非常に速くなりました(処理時間は画像一枚に1分くらい)。

ただし、学習フェーズは5,6時間かかります。


構造

全体の構造は以下のとおりです。

無題.jpg


  • あらかじめ、正常画像で異常検知を学習させておきます。

  • さらに、正常画像で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)はマスクした部分をリアルな画像で補完

するネットワークです。

image.png

上の図は、PCsの論文より引用したものです。

かなりリアルな画像が再現されています。

Ano-Unet V2では、まず、PCsを正常画像で学習させます。そして、異常部分をマスクして

PCsで補完すれば異常部分が正常に変わるのでは?という発想で成り立っています。

以下の図が分かりやすいです。

image.png

これは、異常部分をマスクした画像を学習させたPCsに入れ、補完させた画像

を取得したものです。期待通り異常部分が消え、正常っぽい画像に変化しました。

PCsは正常画像で学習させているため、マスクした部分は必ず正常っぽい絵柄で

補完してくれます。

そして、マスクを移動させながら、補完した画像を異常検知させ、異常スコアで

評価すれば、異常部分のときだけ異常スコアが下がるため、どこが異常なのかを

特定することができます。

マスクは画像の端から端まで満遍なく移動させます。そして、マスクのサイズは

4種類を用意し、微小な異常個所から大きい異常個所までをカバーしています。


ディープラーニングによる異常検知

あらかじめディープラーニングによる異常検知を学習させておく必要がありますが、

これはディープラーニングじゃなくても何でも良いです。画像の異常度を算出できる

手法であれば良いです。

極端なことをいえば、画像を二値化して明るいところの面積で合否判定する手法でも

適用できます。(精度は保証できませんが。。。)


適した手法

ただし、スコアを出す異常検知手法はオートエンコーダのような面積ベースの

評価方法の方が向いている気がします。metric learningのような特徴ベースの

ものだと最も異常な部分を消さないと、スコアが全然下がってくれないため、

少しの異常は見過ごされる傾向にあると思われます。

ただ、オートエンコーダによる異常検知は元々可視化できる構造なので、そもそも

Ano-Unet V2は使う必要ないよ!というジレンマもあるわけですが。。。


実験

今回は、cifar-10は使わずに、製造業で出てきそうな画像を使います。

使ったデータセットは以下の二つ。

そして、異常検知手法として黒魔術を使いました。


MVTec-ADを使った結果

コード全体はこちらに置きました。

Colabで動くはずです。

image.png

image.png

image.png

image.png

image.png

うまくいく確率は約70%という印象。

@daisukelab さんの自己教師あり学習と比べると見劣りしますが、

教師無し学習なので良しとします(^^;


DAGMを使った結果

image.png

image.png

image.png

image.png

image.png

うまくいく確率は約50%という印象。

結構難しいデータセットでした。


まとめ


  • Ano-Unet V2の推論は比較的高速、パラメータ調整もほとんど不要

  • 学習時間が長いのがネック(5,6時間)

  • metric learningに適した可視化手法かといわれると、ベストではない(改善の余地あり)