#はじめに
目視検査の自動化は多くの企業で取り組まれているのではないかと思います。しかし、不良率が低い場合が多く、不良品画像が思うように集まらないのが実情ではないでしょうか(良品画像と不良品画像の数が不均衡なので、ここでは不均衡画像と呼びます)。このような場合、従来技術では上手く学習させることが困難でしたが、今回Metric Learningを活用して上手く学習することが出来たので、紹介させて頂きます。
#Metric Learningとは
下記記事が大変参考になります。
モダンな深層距離学習 (deep metric learning) 手法: SphereFace, CosFace, ArcFace
https://qiita.com/yu4u/items/078054dfb5592cbb80cc
#コード
githubに上げました。(コード汚いです、スイマセン)
https://github.com/chocolat-nya/Imbalanced_Image_Anomaly_Detection
#精度
実データにつき詳細は伏せさせて頂き、結果だけ載せます。
####ケース①
OK画像:2932個(train:test=2345:587)
NG画像:9個(train:test=7:2)
予測 | |||
---|---|---|---|
OK | NG | ||
正解 | OK | 587 | 0 |
NG | 0 | 2 |
上図のように、アウトプットは異常度で出てきます。右から2つがNG画像、その他がOK画像です。
しきい値の引き方に決まりはありませんが、今回はOKテスト画像の異常度の平均+6σとしました。
パーフェクトです。
ヒートマップも出ますが、ここでは割愛します。
####ケース②
限界を知るため、NG画像を2枚にしてトライしてみました。
OK画像:2932個(train:test=2345:587)
NG画像:2個(train:test=1:1)
予測 | |||
---|---|---|---|
OK | NG | ||
正解 | OK | 587 | 0 |
NG | 0 | 1 |
一番右がNG画像、その他がOK画像です。しきい値は同じく平均+6σです。
予想に反して分離出来てしまいました。ただ、異常度の開きは小さくなっています。
n増ししたらヤバそうです。やっぱりそこそこのNG数は必要でしょう。
#まとめ
Metric Learningを使ったら不均衡画像の異常検知が出来てしまいました。
これはちょっとしたブレークスルーではないでしょうか?
#Special Thanks
下記のサイトを参考にさせて頂きました。
DeepAnomalyDetection_benchmark
https://github.com/shinmura0/DeepAnomalyDetection_benchmark
CNNの学習結果を可視化する
https://qiita.com/tom_eng_ltd/items/8d60108b03afe38dff27
⇒Grad-CAM、Grad-CAM++よりも安定してヒートマップが出せます。
EfficientNetを最速で試す方法
https://qiita.com/wakame1367/items/d90fa56bd9d11c4db50e
kerasでScore-CAM実装.Grad-CAMとの比較
https://qiita.com/futakuchi0117/items/95c518254185ec5ea485
#言い訳
初めてQiitaに記事を書いたので、非常に見にくいと思います。ゴメンナサイ。
#追記
20200511 EfficientNetとScoreCAMを導入しました。