Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
34
Help us understand the problem. What is going on with this article?
@shinmura0

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

More than 1 year has passed since last update.

異常個所を「教師無し学習」で可視化する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に適した可視化手法かといわれると、ベストではない(改善の余地あり)
34
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
shinmura0
自己紹介はツイッターをご覧ください。 https://twitter.com/shinmura0

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
34
Help us understand the problem. What is going on with this article?