製造ラインで「この部品、微妙に傷がついていないか?」を人間の目で1つずつ確認する——2026年になってもこの作業は多くの工場で続いている。anomalibは、この異常検知をAIで自動化するためのオープンソースライブラリだ。
anomalibの強みは「3行のPythonで最新の異常検知AIが動く」こと。Patchcore、STFPM、PaDiMといった学術論文で発表された最新アルゴリズムを、PyTorch Lightningベースの統一APIで即座に利用できる。さらにIntel OpenVINO形式にエクスポートすれば、CPUだけで高速推論が可能になる。
この記事では、anomalibのインストールから異常検知モデルの学習、推論、OpenVINOデプロイまでを実践的に解説する。
anomalibとは何か — Intel公式の異常検知AIライブラリ
インストールと初回実行 — pip 1コマンド、Python 3行で動く
主要アルゴリズム — Patchcore・STFPM・PaDiMの違いと選び方
CLIとStudio — コマンドラインとノーコードの2つの使い方
OpenVINOデプロイ — CPUだけで高速推論を実現する手順
製造業・セキュリティでの活用例
この記事ではAIエージェントに特化して解説します。AIエージェント全般は AIエージェントフレームワーク比較2026年版 をご覧ください。
anomalibとは — Intel OpenVINO公式の異常検知AIライブラリ
anomalibは、Intel OpenVINOチームが開発・メンテナンスするオープンソースの異常検知(Anomaly Detection)ライブラリだ。GitHubスター5,700以上、Apache 2.0ライセンスで商用利用可能。
なぜanomalibが必要か
異常検知AIの開発には特有の課題がある。
| 課題 | 従来のアプローチ | anomalibの解決策 |
|---|---|---|
| アルゴリズム選定 | 論文を読んで自前実装 | 10以上のアルゴリズムを統一APIで提供 |
| データ不足 | 異常データは少ない(正常データのみで学習したい) | 正常データのみで学習できるアルゴリズムを搭載 |
| ベンチマーク | 各アルゴリズムの比較が困難 | MVTecAD等で統一的にベンチマーク可能 |
| デプロイ | PyTorchモデルのまま本番投入は重い | OpenVINO/ONNX形式にワンコマンドでエクスポート |
| 専門知識 | 画像処理・深層学習の知識が必要 | CLI/Studio でノーコード利用も可能 |
最大の特徴は「正常データだけで学習できる」点。製造業では「不良品のデータ」を大量に集めるのが困難だ。anomalibのアルゴリズムは正常パターンを学習し、そこから外れたものを「異常」として検出する。不良品のサンプルが1枚もなくても異常検知モデルを構築できる。
リポジトリ情報
| 項目 | 内容 |
|---|---|
| リポジトリ | openvinotoolkit/anomalib |
| スター | 5,700+ |
| ライセンス | Apache 2.0 |
| 言語 | Python |
| 依存 | PyTorch 2.6+、PyTorch Lightning 2.2+ |
| 対応環境 | CPU、CUDA、ROCm、Intel XPU |
| 最新バージョン | 2.3.3 |
インストールと初回実行 — 3行で異常検知が動く
インストール
# pip でインストール(最もシンプル)
pip install anomalib
# OpenVINO推論も使う場合
pip install "anomalib[openvino]"
# CUDA + OpenVINO
pip install "anomalib[openvino,cu130]"
# uv を使う場合(高速)
uv pip install anomalib
最小コード — Python 3行で異常検知
from anomalib.data import MVTecAD
from anomalib.models import Patchcore
from anomalib.engine import Engine
# たった3行でモデル学習が完了
engine = Engine()
engine.fit(datamodule=MVTecAD(), model=Patchcore())
これだけで、MVTecADデータセット(製造業向けベンチマーク)を使ってPatchcoreモデルの学習が完了する。学習後のモデルで推論するには以下を追加する。
# 推論(テストデータで評価)
engine.test(datamodule=MVTecAD(), model=Patchcore())
# 単一画像の予測
predictions = engine.predict(
model=Patchcore(),
data_path="path/to/image.png"
)
CLIで実行(コードなし)
Pythonコードを書かずに、コマンドラインだけでも実行できる。
# モデル学習
anomalib train --model Patchcore --data anomalib.data.MVTecAD
# 推論
anomalib predict --model anomalib.models.Patchcore \
--data anomalib.data.MVTecAD
# ベンチマーク(複数アルゴリズム比較)
anomalib benchmark --model Patchcore STFPM PaDiM \
--data anomalib.data.MVTecAD
MVTecADは製造業向けの異常検知ベンチマーク。ボトル、ケーブル、カプセル、カーペットなど15カテゴリの正常・異常画像を含む。anomalibは初回実行時に自動ダウンロードするため、事前準備は不要。
主要アルゴリズム — Patchcore・STFPM・PaDiMの選び方
anomalibは10以上の異常検知アルゴリズムを搭載している。代表的な3つの違いを整理する。
| アルゴリズム | 方式 | 精度 | 速度 | メモリ | 向いているケース |
|---|---|---|---|---|---|
| Patchcore | メモリバンク型 | 最高 | 中 | 大 | 精度最優先。データが十分にある場合 |
| STFPM | 蒸留型 | 高 | 高 | 小 | リアルタイム推論。エッジデバイス向け |
| PaDiM | 確率分布型 | 高 | 高 | 中 | バランス型。最初の選択肢として最適 |
アルゴリズムの選び方フロー
推論が必要?"} B -->|"はい"| C{"エッジ
デバイス?"} B -->|"いいえ"| D["Patchcore
(精度最優先)"] C -->|"はい"| E["STFPM
(軽量・高速)"] C -->|"いいえ"| F["PaDiM
(バランス型)"]
各アルゴリズムの実行例
# Patchcore(精度最高)
from anomalib.models import Patchcore
engine.fit(datamodule=MVTecAD(), model=Patchcore())
# STFPM(高速・軽量)
from anomalib.models import Stfpm
engine.fit(datamodule=MVTecAD(), model=Stfpm())
# PaDiM(バランス型)
from anomalib.models import Padim
engine.fit(datamodule=MVTecAD(), model=Padim())
モデルを切り替えるのはimport文を変えるだけ。APIが統一されているため、アルゴリズムの比較実験が容易だ。
Anomalib Studio — ノーコードで異常検知
anomalibにはWebベースのGUIツール「Anomalib Studio」が搭載されている。コードを一切書かずに、ブラウザ上でモデルの学習・推論・デプロイが可能だ。
Studioの起動
# Dockerで起動(推奨)
docker pull ghcr.io/openvinotoolkit/anomalib/studio:latest
docker run -p 8080:8080 ghcr.io/openvinotoolkit/anomalib/studio:latest
# ブラウザで http://localhost:8080 にアクセス
Studioでできること
| 機能 | 説明 |
|---|---|
| データアップロード | フォルダからドラッグ&ドロップ |
| モデル選択 | Patchcore/STFPM/PaDiM等をプルダウンで選択 |
| 学習実行 | ワンクリックで学習開始 |
| 推論テスト | 画像をアップロードして異常スコア表示 |
| カメラ接続 | USB/IPカメラからリアルタイム異常検知 |
| モデルエクスポート | OpenVINO/ONNX形式でダウンロード |
製造現場の技術者がPythonを知らなくても、Studioだけで異常検知システムを構築できる。USBカメラをPCに接続し、Studioで正常品を数十枚撮影して学習すれば、リアルタイムの外観検査システムが動き出す。
OpenVINOデプロイ — CPUだけで高速推論
anomalibの大きな強みが、Intel OpenVINO形式へのエクスポートだ。GPUがなくても、CPUだけで高速な推論が可能になる。
エクスポート手順
from anomalib.deploy import ExportMode
# OpenVINO IR形式にエクスポート
engine.export(
model=Patchcore(),
export_mode=ExportMode.OPENVINO
)
# CLIでエクスポート
anomalib export --model Patchcore --export_mode openvino
OpenVINOで推論
from anomalib.deploy import OpenVINOInferencer
# OpenVINOモデルの読み込み
inferencer = OpenVINOInferencer(
path="results/patchcore/mvtec/bottle/weights/openvino/model.bin",
metadata="results/patchcore/mvtec/bottle/weights/openvino/metadata.json"
)
# 推論
prediction = inferencer.predict(image="path/to/test_image.png")
print(f"異常スコア: {prediction.pred_score:.4f}")
print(f"異常判定: {'異常' if prediction.pred_label else '正常'}")
パフォーマンス比較
| 推論方式 | デバイス | 推論時間(目安) | メモリ |
|---|---|---|---|
| PyTorch | CUDA GPU | 15ms | 2GB+ |
| PyTorch | CPU | 200ms | 1GB+ |
| OpenVINO | CPU | 30ms | 500MB |
| OpenVINO(INT8量子化) | CPU | 15ms | 250MB |
OpenVINO + INT8量子化で、GPU並みの速度をCPUだけで実現できる。工場のエッジPCにGPUを搭載する必要がなくなるため、導入コストが大幅に下がる。
活用事例 — 製造業からセキュリティまで
anomalibは幅広い分野で活用されている。
| 分野 | 用途 | 検出対象 |
|---|---|---|
| 製造業・外観検査 | 生産ラインでの不良品検出 | 傷、汚れ、変形、色ムラ |
| 半導体 | ウェハ・基板の検査 | パターン欠陥、異物混入 |
| 医療画像 | X線・CT画像の異常検出 | 腫瘍、骨折、病変 |
| セキュリティ | 監視映像の異常行動検知 | 不審行動、侵入、異常滞留 |
| インフラ | 構造物の劣化検出 | ひび割れ、腐食、変色 |
| 食品 | 異物混入検査 | 金属片、毛髪、変色 |
自社データでの学習例
MVTecADではなく、自社の画像データで学習する場合の手順。
from anomalib.data import Folder
from anomalib.models import Patchcore
from anomalib.engine import Engine
# 自社データの読み込み
# normal/ に正常画像、abnormal/ に異常画像を配置
datamodule = Folder(
name="my_product",
root="data/my_product",
normal_dir="normal", # 正常画像フォルダ
abnormal_dir="abnormal", # 異常画像フォルダ(なくてもOK)
image_size=(256, 256),
)
engine = Engine()
engine.fit(datamodule=datamodule, model=Patchcore())
# 新しい画像で推論
predictions = engine.predict(
model=Patchcore(),
data_path="data/my_product/test/"
)
abnormal_dir を省略すれば、正常画像のみで学習できる。「不良品のサンプルがまだない」段階でもモデル構築を始められるのがanomalibの最大のメリット。正常品を50〜100枚用意すれば実用的なモデルが作れる。
ハイパーパラメータ最適化 — Weights & BiasesとComet.mlで自動チューニング
anomalibにはハイパーパラメータ最適化(HPO)機能が組み込まれている。Weights & Biases(W&B)やComet.mlと連携し、最適なパラメータを自動探索できる。
W&Bでのスイープ実行
# W&Bのスイープ設定
anomalib train --model Patchcore \
--data anomalib.data.MVTecAD \
--trainer.logger wandb \
--trainer.callbacks anomalib.callbacks.SweepCallback
調整可能なパラメータ例
| パラメータ | 説明 | 探索範囲の例 |
|---|---|---|
backbone |
特徴抽出ネットワーク | wide_resnet50_2, resnet18 |
layers_to_extract |
特徴マップを取得する層 | [2,3], [1,2,3] |
coreset_sampling_ratio |
メモリバンクのサンプリング率 | 0.01〜0.1 |
num_neighbors |
k近傍法のk | 3〜15 |
image_size |
入力画像サイズ | 224, 256, 384 |
backboneの選択が精度に最も影響する。wide_resnet50_2はPatchcoreのデフォルトで精度が高いが、推論が重い。エッジデバイス向けならresnet18に切り替えると推論速度が3倍以上になる。精度とのトレードオフを自動探索で見つけるのがHPOの役割だ。
実験ログの管理
from anomalib.engine import Engine
from pytorch_lightning.loggers import WandbLogger
# W&Bロガーを設定
logger = WandbLogger(project="anomalib-experiment")
engine = Engine(logger=logger)
engine.fit(datamodule=MVTecAD(), model=Patchcore())
TensorBoard、W&B、Comet.mlの3つのロガーに対応しており、学習曲線・異常スコアの分布・推論結果のビジュアライゼーションをリアルタイムで確認できる。
ベンチマーク — 複数アルゴリズムの一括比較
anomalibのベンチマーク機能を使えば、複数のアルゴリズムを同一データセットで一括比較できる。
CLIでベンチマーク実行
# Patchcore, STFPM, PaDiMを一括比較
anomalib benchmark --model Patchcore STFPM PaDiM \
--data anomalib.data.MVTecAD \
--output results/benchmark/
MVTecADでの代表的なスコア(参考値)
| アルゴリズム | Image AUROC | Pixel AUROC | 推論時間 |
|---|---|---|---|
| Patchcore | 0.99 | 0.98 | 中 |
| STFPM | 0.96 | 0.97 | 高速 |
| PaDiM | 0.95 | 0.97 | 高速 |
| EfficientAd | 0.97 | 0.96 | 最速 |
| FastFlow | 0.93 | 0.98 | 中 |
AUROC(Area Under the Receiver Operating Characteristic)は異常検知の精度指標。1.0が完全な検出、0.5がランダム。Image AUROCは「画像全体が異常かどうか」、Pixel AUROCは「画像のどの部分が異常か」の精度を表す。Patchcoreは両方で最高水準のスコアを出す。
カスタムデータセットの構成ルール
自社データでanomalibを使う際のディレクトリ構成ルールを整理する。
基本構成
data/my_product/
├── train/
│ └── normal/ # 正常画像(学習用)50枚以上推奨
│ ├── img_001.png
│ ├── img_002.png
│ └── ...
├── test/
│ ├── normal/ # 正常画像(テスト用)
│ │ ├── img_101.png
│ │ └── ...
│ └── abnormal/ # 異常画像(テスト用・オプション)
│ ├── img_201.png
│ └── ...
└── ground_truth/ # アノテーション(オプション)
└── abnormal/
├── img_201_mask.png # 異常箇所のマスク画像
└── ...
データ準備のコツ
| ポイント | 説明 |
|---|---|
| 正常画像の枚数 | 最低50枚、理想は200〜500枚。多いほど正常パターンの網羅性が上がる |
| 画像サイズ | 統一する必要はない(anomalibが自動リサイズ)が、元画像は高解像度を推奨 |
| 撮影条件 | 照明・角度・背景のバリエーションを含める。同一条件だけだと汎化性が下がる |
| 異常画像 | なくても学習可能。あれば精度評価に使える |
| ground_truth | Pixel AUROCの計算に必要。Image AUROC のみならなくてOK |
前処理の設定
from anomalib.data import Folder
datamodule = Folder(
name="my_product",
root="data/my_product",
normal_dir="train/normal",
abnormal_dir="test/abnormal",
normal_test_dir="test/normal",
image_size=(256, 256), # リサイズ先
train_batch_size=32, # バッチサイズ
eval_batch_size=32,
num_workers=8, # データ読み込み並列数
transform=None, # カスタム変換(Noneでデフォルト)
)
トラブルシューティング
anomalib導入時によくある問題と対処法。
| 問題 | 原因 | 対処 |
|---|---|---|
CUDA out of memory |
バッチサイズが大きすぎる | train_batch_size=8 に下げる |
| 学習が遅い | wide_resnet50_2が重い |
resnet18に変更 |
| 精度が低い | 正常画像のバリエーション不足 | 照明・角度を変えた画像を追加 |
| OpenVINOエクスポートエラー | バージョン不整合 | pip install openvino>=2024.0 |
| MVTecADダウンロード失敗 | ネットワーク制限 | 手動DL後にパスを指定 |
anomalibの使い方を業務シナリオから逆引きする — 製造・監視・医療の意思決定マトリクス
「anomalibを試したいが、どのアルゴリズムから始めるべきか」は公式READMEだと判断しづらい。GitHubのIssueとMVTec ADベンチマーク値をもとに、業務シナリオから推奨アルゴリズムと運用設計を整理した。
| 業務シナリオ | 推奨アルゴリズム | 学習画像枚数 | 推論ハード | 想定検出率 | 留意点 |
|---|---|---|---|---|---|
| 製造ラインの外観検査(ボトル・ネジ等) | Patchcore | 200〜500枚 | CPU+OpenVINO | 95%以上 | 照明条件を本番と揃える |
| プリント基板の半田不良 | STFPM | 1,000枚〜 | GPU推奨 | 90%前後 | カラーチャネル正規化 |
| 監視カメラ映像の異常行動 | DRAEM + 動画前処理 | 100クリップ〜 | GPU必須 | 80%前後 | 動体検出と組合せ |
| 医療画像の病変検出 | PaDiM | 数千枚〜 | GPU推奨 | 85%前後 | クラス別の閾値調整必須 |
| インフラ点検(ドローン空撮) | Patchcore | 300枚〜 | エッジCPU | 90%前後 | 距離正規化が鍵 |
ポイントは「学習枚数の調達難度」と「推論側ハードの制約」のクロス判定だ。たとえば工場のエッジPCで動かすなら、PatchcoreをOpenVINO INT8で量子化する組み合わせが、コスト・推論速度・精度のバランスで最も使われている。
Pythonコード3行で迷わないための実務テンプレ
from anomalib.data import MVTecAD
from anomalib.engine import Engine
from anomalib.models import Patchcore
# 業務シナリオ別の推奨アルゴリズムをそのまま差し替えられる
engine = Engine()
engine.fit(model=Patchcore(), datamodule=MVTecAD(category="bottle"))
このスニペットのPatchcore()をStfpm() / Padim() / Draem()に差し替えるだけで他アルゴリズムを試せる。意思決定の入り口は「学習データの枚数」と「推論側のCPU/GPU制約」の2軸でほぼ決まる。
他の異常検知ツールとの比較
| 項目 | anomalib | PyOD | scikit-learn |
|---|---|---|---|
| 対象 | 画像・動画 | テーブルデータ | テーブルデータ |
| 手法 | 深層学習(CNN) | 統計・浅い学習 | 統計・浅い学習 |
| アルゴリズム数 | 10以上(画像特化) | 50以上(テーブル特化) | Isolation Forest等 |
| GPU対応 | CUDA / ROCm / XPU | 一部 | なし |
| デプロイ | OpenVINO / ONNX | なし | joblib |
| ノーコード | Studio あり | なし | なし |
| ライセンス | Apache 2.0 | BSD-2 | BSD-3 |
画像ベースの異常検知ならanomalib一択。 テーブルデータ(数値・ログ)の異常検知にはPyODやscikit-learnのIsolation Forestが適している。
商用サービスとの比較
商用の外観検査AIサービスも存在する。anomalibとの使い分けを整理する。
| 項目 | anomalib | AWS Lookout for Vision | Landing AI |
|---|---|---|---|
| 料金 | 無料(OSS) | 従量課金 | 月額+従量 |
| カスタマイズ | フルコントロール | ブラックボックス | 限定的 |
| デプロイ先 | 自由(エッジ〜クラウド) | AWS限定 | クラウド中心 |
| アルゴリズム選択 | 10以上から選択 | 自動(選べない) | 自動 |
| セットアップ工数 | 中(Python知識必要) | 低(GUI) | 低(GUI) |
| データ所有権 | 完全に自社 | AWSに送信 | ベンダーに送信 |
「データを外部に出せない」製造業や防衛関連ではanomalibが唯一の選択肢になる。エッジPCで完結するため、ネットワーク接続なしで稼働する点も工場環境では重要だ。一方、セットアップの手間を最小化したい場合は商用サービスが向いている。
異常検知の限界と注意点
anomalibは強力だが、万能ではない。導入前に理解しておくべき限界がある。
| 限界 | 詳細 | 対処法 |
|---|---|---|
| 正常の定義が曖昧 | 「何が正常か」が明確でないとモデルが混乱する | 正常品の基準を厳密に定義してからデータ収集 |
| 環境変化に弱い | 照明や背景が変わると精度が下がる | 学習データに環境バリエーションを含める |
| 微細な異常 | 1ピクセル以下の異常は検出困難 | 高解像度カメラ+拡大撮影で対応 |
| 偽陽性(False Positive) | 正常品を異常と判定するケース | 閾値の調整+人間のレビューを組み合わせる |
| 新しい異常パターン | 学習時に想定しなかった異常 | 定期的なモデル再学習 |
異常検知AIは「人間の検査員を置き換える」ものではなく、「人間の見落としを補完する」ものとして導入するのが成功のポイントだ。最終判断は人間が行い、AIは「ここが怪しい」というアラートを出す役割に徹するのが実用的だ。
本番環境への導入パターン — エッジからクラウドまで
anomalibを本番環境に導入する際の代表的な構成パターンを示す。
パターン1: エッジPC(工場ライン向け)
カメラ → エッジPC(OpenVINO推論) → 異常検出時にアラート
最もシンプルな構成。USBカメラ+Intel NUCのような小型PCで動作する。OpenVINO INT8量子化モデルなら15ms/枚で推論でき、ライン速度に追従する。
# エッジ推論のループ例
import cv2
from anomalib.deploy import OpenVINOInferencer
inferencer = OpenVINOInferencer(path="model.bin", metadata="metadata.json")
cap = cv2.VideoCapture(0) # USBカメラ
while True:
ret, frame = cap.read()
if not ret:
break
prediction = inferencer.predict(image=frame)
if prediction.pred_label: # 異常検出
print(f"異常検出!スコア: {prediction.pred_score:.4f}")
# アラート送信、画像保存など
パターン2: バッチ処理(品質管理レポート向け)
撮影画像フォルダ → anomalib CLI → レポート出力
1日分の検査画像をまとめて処理し、レポートを生成するパターン。CLIのpredict機能でフォルダ単位の一括推論が可能。
# フォルダ内の全画像を一括推論
anomalib predict --model Patchcore \
--data_path data/daily_inspection/ \
--output results/2026-04-18/
パターン3: APIサーバー(マイクロサービス向け)
クライアント → REST API → anomalib推論 → JSON応答
FastAPIやFlaskと組み合わせてREST APIとして提供するパターン。複数ラインの検査結果をダッシュボードに集約する場合に適している。
from fastapi import FastAPI, UploadFile
from anomalib.deploy import OpenVINOInferencer
import io
from PIL import Image
app = FastAPI()
inferencer = OpenVINOInferencer(path="model.bin", metadata="metadata.json")
@app.post("/predict")
async def predict(file: UploadFile):
image = Image.open(io.BytesIO(await file.read()))
prediction = inferencer.predict(image=image)
return {
"score": float(prediction.pred_score),
"is_anomalous": bool(prediction.pred_label),
}
正常画像50枚+"] --> B["モデル学習
anomalib train"] B --> C["精度評価
anomalib test"] C --> D{"精度OK?"} D -->|"No"| E["データ追加
or アルゴリズム変更"] E --> B D -->|"Yes"| F["OpenVINO
エクスポート"] F --> G{"デプロイ先"} G --> H["エッジPC"] G --> I["バッチ処理"] G --> J["APIサーバー"]
まとめ — anomalibで異常検知AIを始める3ステップ
pip install anomalibでインストール- 正常画像を50枚以上用意して
Folderデータモジュールに設定 engine.fit()で学習、engine.predict()で推論
GPUがなくても、OpenVINOエクスポートでCPU推論が高速に動く。Anomalib Studioを使えば、コードなしでブラウザから操作することも可能だ。
異常検知AIは「不良品データが集まるまで待つ」必要がない。正常データだけで今日から始められる。AIエージェントフレームワークと組み合わせて検査ワークフローを自動化したり、GitHub ActionsでCI/CDパイプラインに異常検知を組み込むことも可能だ。