Anomaly Detection
異常検知では、通常のパターンから逸脱するデータポイント、イベント、画像領域にフラグを立てます。異常の種類、主な手法、外観検査、コードを紹介します。
異常検知とは、確立された正常な動作パターンから逸脱するデータポイント、イベント、画像領域を特定するタスクです。外れ値検出とも呼ばれ、製造業のビジョン分野では欠陥検出や自動外観検査と呼ばれることもよくあります。異常はまれで多様であり、これまでに見たことのない種類であることも多いため、ほとんどの手法は主に正常なデータから正常な状態を学習します。そして、新しい入力がそのパターンからどれほど離れているかを示す異常スコアを割り当て、しきい値を超えるスコアを検出します。用途には、生産ラインでの傷やへこみ、不正なカード取引、ネットワーク侵入、機械の故障、医用画像解析での疑わしい所見の検出があります。
異常の種類#
- 点異常:顧客の通常の支出の50倍にあたる取引など、他の値から大きく離れた単一の値や画像です。
- 文脈的異常:ある状況では正常でも、別の状況では異常となる値です。ニューヨークの屋外気温が30 °Cであれば7月には普通ですが、1月には異常です。
- 集合的異常:各要素は正常に見えても、系列やグループとして異常となるものです。たとえば、1分以内に多数の国からログイン試行が集中する場合、個々の試行は特筆すべきものでなくても、全体として異常です。
異常検知の仕組み#
正常データのモデル化方法は手法によって異なります。
- 統計的ルール:平均から一定数の標準偏差以上離れた値や、四分位範囲で定めた範囲外の値を検出します。
- 距離と密度:局所外れ値因子のように、最近傍点から遠い点や、密度の低い領域にある点を検出します。
- 分離:Isolation Forestはランダムな分割でデータを分割します。異常値は正常な点よりも少ない分割回数で分離されます。
- 1クラスモデル:1クラスのサポートベクターマシン (SVM)は学習データを囲む境界を学習し、その外側にある点を検出します。
- 再構成:正常データのみで学習したオートエンコーダーは、正常な入力を適切に再構成し、異常な入力はうまく再構成できません。そのため、再構成誤差を異常スコアとして使用できます。
- 特徴ベースの視覚手法:PatchCoreは、ImageNetで事前学習したネットワークで抽出した、欠陥のない画像のパッチ特徴をメモリバンクに保存します。各テストパッチと、保存された最近傍パッチとの距離をスコア化し、MVTec ADベンチマークで画像レベルAUROC最大99.6%を達成しています。
scikit-learnでは、学習データにすでに一部の異常が含まれる場合を外れ値検出、学習データがクリーンで新しい入力のみをスコア化する場合を新規性検出として区別します。次のスクリプトでは、正常な機械の測定値でIsolation Forestを学習し、新しい4件をスコア化します。
import numpy as np
from sklearn.ensemble import IsolationForest
# 1,000 readings from a healthy machine: temperature (C) and vibration (mm/s)
rng = np.random.default_rng(0)
normal = rng.normal([60, 2.0], [3, 0.3], size=(1000, 2))
# Learn what normal looks like, then score new readings
detector = IsolationForest(random_state=0).fit(normal)
new = np.array([[61, 2.1], [59, 1.8], [75, 2.0], [60, 4.5]])
labels = detector.predict(new) # 1 = normal, -1 = anomaly
scores = detector.decision_function(new) # below 0 = anomaly
for (temp, vibration), label, score in zip(new, labels, scores):
status = "anomaly" if label == -1 else "normal"
print(f"{temp:.0f} C, {vibration:.1f} mm/s -> {status} (score {score:+.3f})")学習データの平均に近い2件の測定値は+0.080と+0.076で、異常として検出されません。75 °Cの過熱測定値は−0.139、通常の2倍を超える振動の測定値は−0.152となり、どちらの故障例もモデルが見たことがないにもかかわらず、異常として検出されます。
視覚的異常検知#
外観検査では、欠陥を収集してラベル付けできるかどうかに応じて、2つのアプローチのいずれかを採用します。欠陥の種類が分かっており、サンプルもある場合は、傷、へこみ、亀裂などのクラスで学習した物体検出モデルまたはインスタンスセグメンテーションモデルが、各欠陥の位置と種類を特定します。こうしたクラスでファインチューニングしたYOLO26の検出モデルまたはセグメンテーションモデルは、画像内で検出した各欠陥について、ボックスまたはマスク、クラス、信頼度スコアを返します。欠陥がまれ、または予測不能な場合、1クラス手法では良品の画像だけで学習し、それと異なるものすべてにフラグを立てるため、誰も想定していなかった種類の欠陥も検出できます。15種類の物体・テクスチャカテゴリに5,000枚を超える画像を含み、学習セットには欠陥のない画像だけが含まれるMVTec ADデータセットは、この設定における標準的なベンチマークであり、Ultralytics Platformでも教師あり手法向けの検出データセットとして提供されています。Anomalibなどのオープンソースライブラリは、PatchCoreや類似の手法を実装しています。
異常検知器は、ROC曲線下面積 (AUC)などのしきい値に依存しない指標に加えて、選択したしきい値での適合率と再現率で評価します。これらの指標は、作業者が実際に目にする誤警報や見逃しを反映します。異常はまれなため、しきい値は正常な検証画像のスコアから設定することがよくあります。たとえば、良品のうち1%だけが超えるスコアをしきい値にします。










