4
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

EfficientNetによる異常検知

Last updated at Posted at 2022-12-09

異常検知でググった際によく出てきたEfficientNetを試してみました。
コードはQiita等の記事をかなり参考にさせて頂きました。
(どういった計算をしているか等、理解できていないところがまだまだ多いです。)

コード以外のメモについては簡単ですがこちら

推論の流れ

  1. データセット作成
    • データはよく出てくるMVTECの中から木の表面とネジの2種で検証
      • ダウンロード時はgood,scratch,hole等にフォルダ分かれているが、good,badフォルダのみに修正
    • 前処理やデータ拡張は今回はなし。リサイズのみ。(実際業務でやる際は前処理の検討は重要)
    • クロスバリデーション用にStratifiedKFoldでデータを分割
    • 教師用データはgood(良品)のみ
  2. モデル作成
    • 画像認識ライブラリのtimmを利用
    • model_nameは結構種類あったと思いますが、tf_efficientnet_b4_nsを使用(b6も試したけど結果は忘れました)
  3. 推論
    • クロスバリデーション3分割で3回実施
    • EfficientNetの指定した層の配列を特徴量として、教師データのマハラノビス距離を算出
    • テストデータの良品、異常品のマハラノビス距離も算出し、f1が最大となるマハラノビス距離の閾値を求める
    • 上の閾値で混同行列を作成し、推論の正誤を確認する

コード

コードはこちら

参照

ほとんど以下記事のコードから抜粋です。
大変参考になりました。ありがとうございます。

【異常検知】MVTec-ADを学習無しで正常/異常分類する
【異常検知】学習ゼロの衝撃!を可視化する

結果

1. 木の表面

クロスバリデーション毎のマハラノビス距離

  • 1分割目
    image.png

  • 2分割目
    image.png

  • 3分割目
    image.png

教師データのマハラノビス距離は0、テストデータの良品の距離は0.1程度、不良品は0.5以上と分類できていそうな感じ

分類結果の混同行列

  • f1が最大となるマハラノビス距離の閾値により分類

  • 対象は全テストデータ
    image.png
    誤りは1つのみ

  • 全データのマハラノビス距離の平均とAUC
    image.png

  • マハラノビス距離のヒストグラム

    • テストデータの良品は0-0.3くらい
    • 不良品は0.3-1.0くらい
      image.png
  • ROC曲線
    image.png

異常部位の可視化

特徴が大きいところの色が明るくなるように可視化している。
木目模様っぽいところも明るくなってしまっているが、全体的に結構可視化できている
(これは全部【異常検知】学習ゼロの衝撃!を可視化するのおかげです。)

  • level=7の場合
    • 特徴量としてEffNetの7個目の層を使用。確か一番深いところで9だった?気がする
    • 覚えていないが9層目より7層目の方が精度高かった気が・・・気のせいかも、いずれにせよ7層でやった深い意味はありません
      image.png

特徴量として使う層を変えると

  • level=2の場合

    • 画像全体的に明るいところが多い
    • よくいう最初の方の層は明るさや輪郭等細かい特徴量を抽出し、深くなるにつれてより大きな特徴を抽出している様子が表れているのかも?
      image.png
  • level=4の場合

    • 2と7の中間くらいの抽出具合
      image.png

2. ネジ

おまけ程度にやってみました。

クロスバリデーション毎のマハラノビス距離

  • 1分割目
    image.png

  • 2分割目
    image.png

  • 3分割目
    image.png

木の表面に比べて、テストデータの良品と不良品の差が小さい。
EffNet調べているときに、素材の表面みたいなのは得意だが、3次元の物体になると精度落ちるという記事を見たがやはりそうなのか。
普通に考えて画像によってネジの向き変わっていたり、EffNetでなくても、ネジの方が何倍も難しそう。

分類結果の混同行列

image.png

木の表面と比べると精度大きく落ちている。
特に異常の予測はランダムに近い。

  • 全データのマハラノビス距離の平均とAUC
    image.png

  • マハラノビス距離のヒストグラム
    テストデータの良品と不良品で結構被ってる
    image.png

  • ROC曲線
    image.png

異常部位の可視化

なぜ背景が黄色い、、、すみませんめんどうなのでこのまま。
上手く特徴抽出できていないのがよくわかる。

image.png
image.png
image.png
image.png

所感

  • 木の表面の精度は高かったが、現実でこういうのやろうとすると、ハードルが相当たくさんあって、こんなに簡単に上手くいかないよね(データの質、撮影環境、どう実運用するのか、費用対効果 等々)
  • とはいえぱっと使う場合に相性が良いものであれば、ある程度の精度はお手軽に出せるのかも

おまけ(HLACによる異常検知)

おまけ程度にやってみました。
HLACによる異常検知

4
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?