製造ラインで「この部品、微妙に傷がついていないか?」を人間の目で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データセット
MVTecADは製造業向けの異常検知ベンチマーク。ボトル、ケーブル、カプセル、カーペットなど15カテゴリの正常・異常画像を含む。anomalibは初回実行時に自動ダウンロードするため、事前準備は不要。

主要アルゴリズム — Patchcore・STFPM・PaDiMの選び方

anomalibは10以上の異常検知アルゴリズムを搭載している。代表的な3つの違いを整理する。

アルゴリズム 方式 精度 速度 メモリ 向いているケース
Patchcore メモリバンク型 最高 精度最優先。データが十分にある場合
STFPM 蒸留型 リアルタイム推論。エッジデバイス向け
PaDiM 確率分布型 バランス型。最初の選択肢として最適

アルゴリズムの選び方フロー

graph TD A["異常検知の要件"] --> B{"リアルタイム
推論が必要?"} 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とは
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),
    }
graph TD A["データ収集
正常画像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ステップ

  1. pip install anomalib でインストール
  2. 正常画像を50枚以上用意して Folder データモジュールに設定
  3. engine.fit() で学習、engine.predict() で推論

GPUがなくても、OpenVINOエクスポートでCPU推論が高速に動く。Anomalib Studioを使えば、コードなしでブラウザから操作することも可能だ。

異常検知AIは「不良品データが集まるまで待つ」必要がない。正常データだけで今日から始められる。AIエージェントフレームワークと組み合わせて検査ワークフローを自動化したり、GitHub ActionsでCI/CDパイプラインに異常検知を組み込むことも可能だ。

参照ソース