Anomaly Detection
异常检测会标记偏离正常模式的数据点、事件或图像区域。本文介绍异常类型、主要方法、视觉检测和代码。
异常检测是识别偏离既定正常行为模式的数据点、事件或图像区域的任务。它也称离群点检测;在制造业视觉领域,通常称为缺陷检测或自动视觉检测。异常很少见、种类多,而且往往从未出现过,因此大多数方法会用以正常数据为主的数据学习正常模式,为每个新输入分配异常分数以衡量其偏离程度,并将超过阈值的分数标记出来。应用场景包括检测生产线上的划痕和凹痕、欺诈性银行卡交易、网络入侵、设备故障,以及医学图像分析中的可疑发现。
异常的类型#
- 点异常:单个数值或图像与其他数据相差很大,例如某笔交易金额是客户通常消费金额的 50 倍。
- 上下文异常:某个值在一种上下文中正常,在另一种上下文中却异常。纽约 7 月的室外气温 30 °C 很平常,但 1 月出现这一气温就令人担忧。
- 群体异常:一系列数据或一组数据整体异常,但其中每个成员单独看都正常,例如一分钟内来自多个国家的大量登录尝试;单独看每次尝试都并不起眼。
异常检测如何工作#
各类方法对正常数据建模的方式各不相同:
- 统计规则:标记偏离均值超过指定标准差数量的值,或标记落在四分位距所设范围之外的值。
- 距离与密度:标记距离最近邻较远或位于稀疏区域的数据点,局部离群因子就是采用这种方法。
- 孤立法:Isolation Forest通过随机切分数据构建模型;与正常数据点相比,异常点会用更少的切分次数就被孤立。
- 单类模型:单类支持向量机(SVM)会学习训练数据的边界,并标记边界之外的点。
- 重建法:只用正常数据训练的自编码器能很好地重建正常输入,却难以重建异常输入,因此重建误差可用作异常分数。
- 基于特征的视觉方法:PatchCore会将 ImageNet 预训练网络提取的无缺陷图像块特征存入记忆库,并根据每个测试图像块与库中最近图像块的距离进行评分;在 MVTec AD 基准上,其图像级 AUROC 最高可达 99.6%。
scikit-learn 将离群点检测与新颖性检测区分开来:前者的训练数据中已经包含一些异常,后者的训练数据干净,只有新输入会被评分。下面的脚本使用健康机器的读数训练 Isolation Forest,并为四个新读数评分:
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})")接近训练均值的两个读数得分为 +0.080 和 +0.076,均通过检测。温度达到 75 °C 的过热读数得分为 −0.139,而振动幅度超过常见水平两倍的读数得分为 −0.152,因此两者都会被标记,尽管模型从未见过任何一种故障的示例。
视觉异常检测#
视觉检测有两种路径,具体取决于是否能收集并标注缺陷。当缺陷类型已知且有样本时,可以使用在划痕、凹痕和裂纹等类别上训练的目标检测或实例分割模型来定位并命名每种缺陷。在这些类别上微调的 YOLO26检测或分割模型,会为图像中发现的每个缺陷返回边界框或掩码、类别和置信度分数。当缺陷罕见或难以预测时,单类方法只使用合格零件的图像进行训练,并标记任何有差异的内容,因此也能发现无人预料到的缺陷类型。MVTec AD 数据集包含 15 种物体和纹理类别的 5,000 多张图像,训练集中只有无缺陷图像,是这类任务的标准基准;Anomalib等开源库则实现了 PatchCore 及类似方法。
异常检测器使用ROC 曲线下面积(AUC)等不依赖阈值的指标,以及所选阈值下的精确率和召回率进行评估;这些指标反映了操作人员实际会遇到的误报和漏检。由于异常很少见,通常会根据正常验证图像的分数设置阈值,例如设为只有 1% 的合格零件会超过的分数。










