画像の異常検知ライブラリanomalibを動かしてみた
こんちには。
データアナリティクス事業本部機械学習チームの中村です。
今回は画像の異常検知用ライブラリのanomalibを紹介します。
anomalibとは
anomalibは画像向け異常検知用ライブラリで、Intelが提供しているOpenVINOツールキットの一つです。
最先端の異常検知アルゴリズムをすぐに使える形でいくつか提供し、またそれを流用して、カスタムモデルの開発を容易にするツールが提供されています。
提供されているモデルは、Deep Learningベースのアルゴリズムが主となります。
ライセンスはApache License 2.0となっています。
実装にはPyTorch Lightningが使用されているようです。
以下がGitHubのリンクです。
提供モデル一覧
Model Typeには、ClassificationとSegmentationの2つがあります。
基本的には、Segmentation Typeのモデルが最近のモデルとなっているようです。
以下がその一覧です。
Classification Type
- DFKDE
- Deep Learningで特徴量抽出を行う
- その後PCAとKernel Density Estimationで異常分類をするモデル
- GANomaly (2018-05-17) / arXiv
- DFM (2019-09-25) / arXiv
Segmentation Type
- PaDiM (2020-11-17) / arXiv
- anomalibのデフォルトモデル
- STFPM (2021-03-07) / arXiv
- PatchCore (2021-06-15) / arXiv
- CFLOW-AD (2021-07-27) / arXiv
- FastFlow (2021-11-15) / arXiv
各モデルの理論面はまだ抑えられていませんが、いずれ調査しようと考えています。
データセットについて
ベンチマーク用に2つのデータセットに対応しています。
- MVTec AD (CC BY-NC-SA 4.0)
- ボトルやケーブルなど15種類の異なるデータセットで構成される
- 2019年に公開された標準的なデータセット
- BeanTech (CC-BY-SA)
- 論文内にリンクあり
- 3種類の異なるデータセットで構成される
- 2021年に公開された、比較的新しいデータセット
実行環境
今回はGoogle Colaboratory環境で実行しました。
ハードウェア情報は以下の通りです。
- GPU: Tesla P100 (GPUメモリ16GB搭載)
- メモリ: 26GB
主なソフトウェア・ライブラリのバージョンは以下となります。
- CUDA: 11.2
- PyTorch: 1.12.0+cu113
またデータを永続化するために、Google Drive上に作業ディレクトリを実施します。
動かしてみた
セットアップ
データを永続化するため、ストレージはGoogle Driveを使用します。
実行前に、Google Driveをマウントします。
そして以下のコマンドで作業ディレクトリをGoogle Driveに変更します。
%cd /content/drive/MyDrive
各種ライブラリをインストールします。まずはGitHubからコードを取得します。
!pip install anomalib %cd anomalib
学習
以下のコマンドで学習が可能です。
!python tools/train.py
上記のコマンドは以下と同じです。
!python tools/train.py --model padim --config anomalib/models/padim/config.yaml
config.yamlには、モデル定義やパラメータ設定の他、使用するデータセットやモデルの出力先などを記述します。
ですので、上記のコマンドではMVTecのbottleデータをPaDiMで学習することとなります。
また上記のデフォルトのコマンドでは、以下に結果が出力されます。
- testデータの推論結果
results/padim/mvtec/bottle/images
- PyTorch Lightningのログ
results/padim/mvtec/bottle/lightning_logs
- 学習済みモデルの重み
results/padim/mvtec/bottle/weights
推論
以下のコマンドで、特定の画像ファイルに対する推論を行うことができます。
!python tools/inference/lightning_inference.py \ --config anomalib/models/padim/config.yaml \ --weights results/padim/mvtec/bottle/weights/model.ckpt \ --input datasets/MVTec/bottle/test/broken_large/000.png \ --output results_inference/
--input
オプションには、画像ファイルではなく、フォルダを指定することも可能です。
--output
オプションで出力先を指定します。
出力先配下は、画像ファイルの親フォルダ名で作成されます(推論結果ではないので注意)。
そのフォルダ配下に推論時のsegmentation結果が配置されます。
出力される画像は以下のようなものです。
これは、元画像やヒートマップ、Segmentation結果などいくつかの画像が重なったものが表示されます。
このそれぞれの結果を単品で見たい場合は、以下のように--visualization_mode full
を指定します。
!python tools/inference/lightning_inference.py \ --config anomalib/models/padim/config.yaml \ --weights results/padim/mvtec/bottle/weights/model.ckpt \ --input datasets/MVTec/bottle/test/broken_large/000.png \ --output results_inference/ \ --visualization_mode full
こちらの場合、出力される画像は以下のようなものです。
まとめ
いかがでしたでしょうか。
画像の異常検知に関するモデルやデータセットなどがまとまっていて、色々試してみるいいきっかけとなるライブラリだなと思いました。
今後は理論面や実装面での解説についてもブログ記事にしていきたいと思います。
本記事が画像の異常検知の理解の助けになれば幸いです。