【CNNより有能？】metric learningによる異常検知を試してみた

# サマリ
- <b>metric learningとは、関連する画像同士における特徴量表現の距離を意図的に近く集合させることが可能な学習モデルであり、サンプルが少ないときや、未知クラスがあるときに有効な手法である。
- <b>ADFI（異常検知用画像データセット）をもとに普段よく用いられる画像分類モデル(ResNet34)と、metric learning(ArcFace)の画像データセットに対する精度を評価。</b>
- <b>metric learning(AUC=0.933)を用いたことで、通常の画像分類モデル(AUC=0.907)より精度向上が見られた。</b>

# 背景・目的
- 東京のとあるデータ分析会社のデータサイエンティスト職として従事。
- 社内メンバーで[日本酒コンペ](https://competition.nishika.com/competitions/sake/summary)にチーム参加した際、metric learning(=距離学習)を用いた画像検索問題に出会う。
- 銅メダルをチームで取得できたが、metric learningについての理解が浅かったので知識の整理のためにまとめたい。（コンペの話については年明け以降に[弊社テックブログ](https://www.ariseanalytics.com/activities/report/tag/kaggle%E9%83%A8/)にて掲載予定。）
- qiitaにてmetric learningについての過去記事を調査すると、異常検知との組み合わせた検証記事が多かったのでそれらを参考に、今回は異常検知×metric learningの検証を行った。

# 用語
## metric learningとは？
- metric learningは、画像処理モデルの一つとして利用されている学習手法。
- 特徴空間内におけるデータ間の距離や類似性を適切に学習するため、分類モデルなどによって画像データからベクトルを抽出し、関連する画像同士は意図的にベクトルの距離が近く、関連しない画像同士は距離が遠くなるようデータ間の距離が計算されような学習を実行。
- 定番のクラス分類の学習であれば、サンプル間の距離を考慮せず全結合層で分離可能な(separable)特徴量になるよう学習してしまうが、metric learningだとサンプル間の距離が考慮されるので識別的な(discriminative)特徴量を得ることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374781/34400f93-ed3c-040b-4f26-cb104a0e438d.png)

- 上記の経緯から、metric learningは各クラスのサンプルが少ないときや、未知クラスがあるときでも十分な性能を発揮できることが強みであり、顔認識や異常検知、画像検索タスクなどで用いられている。
- 今回は、metric learningの中でも実装が手軽なArcFaceを用いて異常検知用データにて精度を検証。
- ArcFaceではソフトマックス損失関数を拡張して同一クラス間の分散を小さくする工夫を追加することで、同一クラスの距離が近くなるように学習させることが可能。ArcFaceの損失関数についての詳細は[こちら](https://tech.unifa-e.com/entry/2019/02/07/172903)の記事の説明が分かりやすい。


## 異常検知とは？
- 異常値（Anomaly）とは、あるデータセットにおける予期せぬ変化、または予期されるパターンからの逸脱を指す。
- 異常検知とは、それらの異常値を検出し警告するために使用される技術。 

# 手法
## データセット
- 使用したデータセット：ADFI, “Real-World Dataset for Anomaly Detection”, AI Robotics LTD., 2022, https://adfi.jp
- `Hazelnut`, `Coffee beans`, `Rotary beacon light`の3種類の画像に「正常」「異常」どちらかのラベルが付与。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374781/205b74f7-28ff-0358-4c63-b7c0d710d064.png)


## 実験条件
[こちら](https://qiita.com/daisukelab/items/5f9ec189959eaf1ef211#%E3%81%B2%E3%81%A8%E3%81%A4%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AE%E8%A9%95%E4%BE%A1%E6%89%8B%E9%A0%86)を参考に学習・評価を実施。

### 評価対象
- ①Conventional = 距離学習を利用しない通常のCNNの場合
- ②ArcFace
- ①②どちらもResNet34をベースにモデル構造を定義。
- ②ArcFaceに関しては最終層に距離学習を行うスクリプトを追加し、出力されるembeddingsは512次元とした。

### 学習手順
- 学習時に際しては「異常」画像を排除し、「正常」画像セットのみを利用。
- `train`データの「正常」データのみを利用し、`Hazelnut`, `Coffee beans`, `Rotary beacon light`の3クラスで画像分類モデルを作成した。


### 評価手順
- 評価用画像は`test`データ全量を用いた。
- すべての評価用画像を、学習済みモデル(Conventional, ArcFace)に与えて512次元のembeddingsを得る。
- 評価用画像のembeddingsと学習用画像(「正常」のみ画像セット)のembeddingsにおける距離を計算。※距離計算はcosine類似度により算出。
- 評価用画像jごとに、すべての学習用画像(「正常」のみ画像セット)との距離を計算し、そのうち一番短い距離の値を、評価用画像jの正解までの距離`distance_j`とした。
- モデルの精度はAUCで評価、評価用画像の内、正常を`0`、異常を`1`でラベリング。
- 評価用画像の正解までの距離指標(`distance_j`)をもとに、AUCを算出。

# 結果

- 精度評価においてArcFaceがConventionalモデルの精度を上回る結果に。


| # | 学習条件 | AUC |
| --- | --- | ---: |
| 1 | <b>ArcFace</b> | <b>0.933</b> |
| 2 | Conventional | 0.907 |

# あとがき
- 今回の検証スクリプトについては[こちら](https://github.com/takuya-tokumoto/deep-metric-fraud-detector/blob/main/scripts/DeepMetrics.ipynb)。
- 今回、metric learningを用いたことで異常検知に関する精度の向上が見られたが、従来の画像分類モデルの方が精度が高い結果になっているケースも他の人の検証結果で見かけたので、従来モデルより精度劣化するユースケースやその理由についても今後理解できるようになりたい。
- metric learning手法は今回採用したArcFace以外にも複数あるが、実装が簡単な点で気軽に試せるのが良かった。今後のデータ分析コンペで上手く活用できるよう研鑚を積みたい。

# 参考にした記事
- [Kaggleに挑む深層学習プログラミングの極意(小嵜耕平／秋葉拓哉／林孝紀／石原祥太郎・著)](https://www.amazon.co.jp/Kaggle%E3%81%AB%E6%8C%91%E3%82%80%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E6%A5%B5%E6%84%8F-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%B0%8F%E5%B5%9C-%E8%80%95%E5%B9%B3/dp/4065305136)
- https://tech-blog.optim.co.jp/entry/2021/10/01/100000
- https://www.nttcoms.com/service/TIBCO/glossary/anomaly-detection/
- https://tech.unifa-e.com/entry/2019/02/07/172903
- https://qiita.com/daisukelab/items/5f9ec189959eaf1ef211