【Python】 異常検知AIライブラリ Anomalib が凄すぎる！

## Anomalibとは
　Anomalibは、画像向けの異常検知ライブラリであり、Intel が提供する [OpenVINOツールキット](https://www.intel.co.jp/content/www/jp/ja/internet-of-things/openvino-toolkit.html) の一部である。最先端の異常検知アルゴリズムを提供し、非常に簡単に画像の異常検知AIが実装できる。この最新版のPython SDKがつい最近 (2024/3/28) に公開されたので、画像における異常検知の学習・推論方法を紹介する。

https://anomalib.readthedocs.io/en/latest/

 **推論結果 (Patch Coreモデル)**
真ん中のヒートマップが異常検出の結果。赤いところが異常個所。かなり正確。

ビン底の異常検出。右下にざらざらした欠陥があり、きれいに検出されている。
![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/bd206080-1892-754d-993b-143eeb371ae0.png)

トランジスタの異常検出。左下の端子が曲がっており、正確に検出できている。
![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/6d390908-42c3-06b6-c7bb-cab01f79b296.png)

歯ブラシの異常検出。左部にバラけたブラシがあり、これも正確に検出できている。
![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/cd42e6fe-8cd3-2b65-0efb-fcfec6b0a272.png)

### インストール方法

Python3.10 以上のバージョンで[Anomalib](https://pypi.org/project/anomalib/)とtimm/PyTorchをpip installするのみ。
```
pip install anomalib timm
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
```

必要な動作環境は以下。大体の環境で実行できる。ない場合はAWSのml.g4dn.xlarge 0.994USD/時でお安く実行できる。
・Windows/Linux両方
・Python 3.10以上
・PyTorch Lightningベース
・GPUメモリ 16 GB以上
・ライセンス Apache-2.0

## 学習・推論手順
下記にMVTecの学習データを用いて、PatchCoreを学習し、異常検知するコードを示す。

　[PatchCore (Karsten Roth et.al, 2022)](https://arxiv.org/pdf/2106.08265v2.pdf)とは、最高レベルの画像用異常検知モデルで、Resnet50などのCNNの中間層を用いて、正常画像のみで異常・正常の二値判定を行う。発表されてから数年経つが、未だ SOTA 10位(2024/4/3時点)を誇る。Anomalibではこんな高性能モデルが非常に簡単に扱える。

Paper with Codeというソースコードが公開されているAIモデルのSOTA一覧サイト
PatchCore LargeがAUROC=99.6で、ランキング10位

https://paperswithcode.com/sota/anomaly-detection-on-mvtec-ad

### PatchCoreを使用した学習・推論コード
```Python
import timm
from anomalib.data import MVTec
from anomalib.models import Patchcore
from anomalib.engine import Engine

if __name__ == '__main__':
    # Initialize the datamodule, model and engine
    datamodule = MVTec(category="bottle")
    model = Patchcore()
    engine = Engine()

    # Train and Test the model
    engine.fit(datamodule=datamodule, model=model, ckpt_path=None)
    engine.test(datamodule=datamodule, model=model, ckpt_path=None, verbose=True)

    # Assuming the datamodule, model and engine is initialized from the previous step,
    # a prediction via a checkpoint file can be performed as folows:
    predictions = engine.predict(datamodule=datamodule, model=model, ckpt_path=None, return_predictions=True)
```

以上。。。。簡単すぎ。
出力結果はresultsフォルダの中に保存される。

![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/8438d07f-4ee8-a52c-2d9b-da6b67d27a96.png)


※MVTeC ADのデータが自動でダウンロードされない場合は、手動で下記フォルダに置く
```
datasets/MVTec
```

※[WinError 1314] クライアントは要求された特権を保有していません。
このエラーが出たら、Windowsの設定から開発者モードをオンにする

### 提供されているモデル

Anomalibで提供されているモデル
 - Classification Type:
    - DFKDE: Deep Learningで特徴量抽出を行い、その後PCAとKernel Density Estimationで異常分類をするモデル
    - GANomaly: 2018年に提案されたモデル
    - DFM: 2019年に提案されたモデル
 - Segmentation Type:
    - PaDiM: 2020年に提案されたモデル
    - anomalibのデフォルトモデル
    - STFPM: 2021年に提案されたモデル
    - PatchCore: 2021年に提案されたモデル
    - CFLOW-AD: 2021年に提案されたモデル
    - FastFlow: 2021年に提案されたモデル

### 使用しているデータセット

異常検知データセットは主に2つを用いている。
 - MVTec AD (CC BY-NC-SA 4.0): ボトルやケーブルなど15種類の5000枚のデータセット
 - BeanTech (CC-BY-SA): 3種類の異なる工業製品で、比較的新しい2830枚のデータセット

### MVTec ADとは
MVTec AD(The MVTec anomaly detection dataset)とは、産業検査に重点を置いた異常検知手法のベンチマークのためのデータセットである。5000枚以上の高解像度画像が 15 の異なるオブジェクトとテクスチャのカテゴリに分類されている。

https://www.mvtec.com/company/research/datasets/mvtec-ad

MCTec ADのデータセットの中身 (約5GB)
```
bottle: ボトル -- ground_truth -- broken_large -- ***.png 異常部を白、その他を黒にした大きく欠けた画像
                               -- broken_small -- ***.png 異常部を白、その他を黒にした小さく欠けた画像
                               -- contamination -- ***.png 異常部を白、その他を黒にしたコンタミがある画像
               -- test -- broken_large -- ***.png 大きく欠けた画像
                       -- broken_small -- ***.png 小さく欠けた画像
                       -- contamination -- ***.png コンタミがある画像
                       -- good -- ***.png 正常な画像
               -- train -- good -- ***.png 正常な画像
cable: ケーブル
capsule: カプセル
carpet: カーペット
grid: グリッド
hazelnut: ヘーゼルナッツ
leather: 革
metal_nut: 金属ナット
pill: 錠剤
screw: ネジ
tile: タイル
toothbrush: 歯ブラシ
transistor: トランジスタ
wood: 木材
zipper: ファスナー
```

今回のPatchCoreはMVTec ADで学習し、テスト画像で異常検出している。

## まとめ
画像における異常検知用ライブラリAnomalibについて紹介した。
非常に簡単に画像の異常検知が学習・推論できるため、サクッと異常検知を実装したい場合はこれがおすすめ。

## 参考文献
各機能のリファレンスガイド

https://anomalib.readthedocs.io/en/v1.0.1/markdown/guides/reference/index.html

その他サンプルプログラムはこちら

https://github.com/openvinotoolkit/anomalib/tree/main/notebooks/000_getting_started