画像の異常検知ライブラリanomalibを動かしてみた

2022.08.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんちには。

データアナリティクス事業本部機械学習チームの中村です。

今回は画像の異常検知用ライブラリのanomalibを紹介します。

anomalibとは

anomalibは画像向け異常検知用ライブラリで、Intelが提供しているOpenVINOツールキットの一つです。

最先端の異常検知アルゴリズムをすぐに使える形でいくつか提供し、またそれを流用して、カスタムモデルの開発を容易にするツールが提供されています。

提供されているモデルは、Deep Learningベースのアルゴリズムが主となります。

ライセンスはApache License 2.0となっています。

実装にはPyTorch Lightningが使用されているようです。

以下がGitHubのリンクです。

提供モデル一覧

Model Typeには、ClassificationとSegmentationの2つがあります。

基本的には、Segmentation Typeのモデルが最近のモデルとなっているようです。

以下がその一覧です。

Classification Type

Segmentation Type

各モデルの理論面はまだ抑えられていませんが、いずれ調査しようと考えています。

データセットについて

ベンチマーク用に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

こちらの場合、出力される画像は以下のようなものです。

まとめ

いかがでしたでしょうか。

画像の異常検知に関するモデルやデータセットなどがまとまっていて、色々試してみるいいきっかけとなるライブラリだなと思いました。

今後は理論面や実装面での解説についてもブログ記事にしていきたいと思います。

本記事が画像の異常検知の理解の助けになれば幸いです。