アイリアSDKを試す <第4回>PaDiMを利用した異常検知実験

※本企画は雑誌『Interface』のWebサイトに掲載された記事を再編集したものです。
※本記事はアイリアの製品およびサービスを紹介するPR記事です。

今回は、アイリアSDKのPaDiMベースの異常検知モデルを紹介します。アイリアMODELSに含まれているサンプルを用いて、画像ベースの製品異常検知を試します。このサンプルを利用してPaDiM(Patch Distribution Modeling)を用いた異常検知の実装例で、トレーニングからテストまでを確認できます。

PaDiMの特徴

特長とメリット

  • 教師なし学習:正常データのみで学習を行う方式のため、実運用において異常データを収集できないケースでも有利に利用できます。
  • 高速かつ高精度:K-NNベースのSPADEなどと比較して、推論速度が速く、かつ検知精度も既存手法を上回る結果が報告されています。

注意点/制約

  • 事前学習モデルへの依存:特徴抽出に用いるCNNの性能に大きく依存するため、利用するモデルの選定が重要になります。

実行環境

今回使用した環境を次に示します.

名称内容
OSWindows 11 Pro
CPUインテル® プロセッサ N100
RAM16GB
Pythonpython-3.10.11-amd64
(3.11以上だとSRCの変更が必要になる)
ailia-SDKVersion 1.5.0.0
ailia-modelsv1.4.0(https://github.com/axinc-ai/ailia-models)
(表1)実行環境

環境構築

アイリアMODELSのウェブ・サイトに記載されている情報は一部古くなっているため、依存関係のあるモジュールについてはバージョンを明確に指定してインストールする必要があります。
環境構築の手順を次に示します。

> python –version
Python 3.10.11
> git clone https://github.com/axinc-ai/ailia-models.git
> cd ailia-models
# ailia-modelsのパスを <AILIA_HOME> とします。
> $Env:AILIA_HOME = pwd
> python -m venv .venv       <―― Pythonの仮想環境 作成
> .venv\Scripts\activate       <―― 仮想環境 で作業してください
> python -m pip install –upgrade pip
> pip install setuptools wheel
#  matplotlib、scikit-image、pillow に関しては依存するバージョンがあります
> pip install matplotlib==3.8    
> pip install “scikit-image<0.20” “pillow<10”
> pip install -r requirements.txt
> pip install scikit-learn******

環境構築の手順

データ・セットの登録

試験用のデータ(異常検知用の画像データセット)は、次のウェブ・サイトからダウンロードしてください(図1)。

Image from MVTec AD datasets:https://www.mvtec.com/company/research/datasets/mvtec-ad/
(図1)データ・セットのダウンロード・ページ

ダウンロードしたファイルは、xz形式で圧縮されています。解凍にはxz対応ツールを使用してください。もしツールがない場合は、WSL上でLinux(Ubuntuなど)に入り、次のコマンドで解凍し、解凍されたらmvtec_anomaly_detection.tarをailia-models/mvtecにtarのコマンドで展開してください。

PS> cd $Env:AILIA_HOME
PS> mkdir mvtec
PS> cd mvtec
#試験用のデータをダウンロードしたフォルダを{ダウンロード}と記述しています.
PS> mv {ダウンロード}/mvtec_anomaly_detection.tar.xz .
#以下はWSLのコマンドです
$ wsl
$ xz -dv mvtec_anomaly_detection.tar.xz
$ tar xvf mvtec_anomaly_detection.tar
$ exit

プログラムの修正と起動

1、フォルダへの移動

まず、プログラムが保存されているフォルダに移動します。

PS> $Env:AILIA_HOME
PS> cd ailia-models\anomaly_detection\padim

2、プログラムの修正(padim_utils.py)

配布されているソースコードには、sysモジュールのimportが含まれていません。そのため、実行時にエラーが発生する場合があります。必要に応じて、ソースコードの先頭付近に次の1行を追加してください。

import sys

3、プログラムの起動

次のコマンドでGUIを起動します。

PS> python padim_gui.py
INFO arg_utils.py (13) : Start!
INFO arg_utils.py (163) : env_id: 3
INFO arg_utils.py (166) : VulkanDNN-Intel(R) UHD Graphics (FP16)

出力ログからわかるように、PCに搭載されているIntel(R) UHD Graphicsが正しく認識されています。

PaDiM GUI画面

PaDiM GUI画面を図2に示します

(図2)PaDiM GUI画面

図2に対応するボタンやリスト類は次の通りです。

①:Train用イメージ・ファイル・リスト
②:Train用フォルダ選択ボタン
③:試験(確認)用データ・ファイルの保存フォルダ選択ボタン
④:試験用フォルダ選択ボタン
④:トレーニング開始ボタン
⑤:試験開始ボタン
⑥:試験結果ファイル・リスト
⑦:プレビュー

異常検知を試す…学習から試験まで

手順を次に示します。

ステップ1:フォルダの選択

Train用フォルダ選択ボタン(②)を押し、ailia-models\mvtec\bottle\train\goodフォルダを選択します。

ステップ2:ファイルの選択とプレビュー表示

Train用イメージファイルリスト(①)に表示されたファイルを選択すると、内容がプレビュー(⑧)に表示されます。

ステップ3:学習の実行

トレーニング開始ボタン(⑤)を押すと学習が開始されます。

ステップ4:異常検知の開始

試験開始ボタン(⑥)を押すと試験が実行され、試験が完了すると異常な領域が示されます。試用のbottoleの画像で異常な領域が示されました(図3)。

(図3)異常検知の結果例

別データ(タイル画像)での検証

ボトルは形状が明確であるため、比較的容易に判定できる対象と考えられます。そこで次に、形状がはっきりしていないデータでの検証を試みました。その例として、MVTec ADデータ・セットに含まれるtileを用いて確認を行いました。

\mvtec\tile\train\good

タイルの画像(図4)には、表面に不定形な斑点模様があり、しかもすべてのタイルで模様が異なっています。このため、システムが模様を異常と誤判定せず、ゴミや傷といった本来の欠陥のみを異常として検出できるのかという課題が生じます。

(図4)タイル画像

今回の検証の結果、タイル表面の不定形な斑点模様については正常と判定され、ゴミや傷といった本来の欠陥のみを異常として検出できていました。タイルの斑点模様は正常、ゴミを異常と判断できていました(図5)

(図5a)タイル画像の異常検知結果・異常検知結果例1
(図5b)タイル画像の異常検知結果・異常検知結果例2

Intel N100での実行環境による違い

今回使用したCPUはIntel N100です。そのため、CPU最適化ライブラリであるIntel MKLを利用した実行や、内蔵 GPU(Intel(R) UHD Graphics)を利用した実行が可能です。
次に実行環境ごとの推論時間(1回あたりの試験時間)の比較結果を示します。

ENV_ID利用環境推論時間[s]
0CPU0.68
1CPU-IntelMKL0.68
2VulkanDNN-Intel(R) UHD Graphics (FP32)0.68
3VulkanDNN-Intel(R) UHD Graphics (FP16)0.68
(表2)実行環境による推論時間の変化

今回のサンプル・プログラムでは、インテルの内蔵GPUを利用しても処理時間に差は見られませんでした。今後、機会があればエヌビディアのGPU環境での実行も試してみたいと思います。

まとめ

PaDiMを用いた異常検知は、正常データのみで学習できる手軽さと、高速かつ高精度な判定性能が特長です。今回紹介したサンプルを利用すれば、学習から検知までをGUIで簡単に体験できます。ボトルやタイルといった異なるデータでも挙動の違いを確認できるので、ぜひ実際に試していただき、対象や条件に応じた設定を工夫してみてください。

【参考文献】

(1)Paul Bergmann, Kilian Batzner, Michael Fauser, David Sattlegger, Carsten Steger: The MVTec Anomaly Detection Dataset: A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection; in: International Journal of Computer Vision 129(4):1038-1059, 2021, DOI: 10.1007/s11263-020-01400-4.

(2)Paul Bergmann, Michael Fauser, David Sattlegger, Carsten Steger: MVTec AD — A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection; in: IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 9584-9592, 2019, DOI: 10.1109/CVPR.2019.00982.

※記事に掲載している会社名、各製品名は、一般に各社の商標または登録商標です。

氏森 充(うじもり・たかし)氏

約30年間、株式会社構造計画研究所にてIoT、ビッグデータ、機械学習、AI関連のシステム開発や実務応用に従事。退職後はLLM(大規模言語モデル)関連の情報収集や技術動向の調査・発信に注力し、雑誌『Interface』でもLLM技術に関する記事を執筆中。

コンピューター・サイエンス&テクノロジ専門誌『Interface』

CQ出版社が発行するコンピュータ技術専門の月刊誌です。1974年の創刊以来、組み込みシステム、ソフトウェア、AI、IoTなど、時代とともに進化するコンピュータ技術を幅広く紹介しています。理論だけでなく、実践的なプログラミングや実機製作の記事も豊富で、エンジニアから学生まで、コンピュータ技術を深く学びたい読者に支持されています。
https://interface.cqpub.co.jp/

SHARE THIS ARTICLE