大数跨境

CVPR2026 SOTA|AnomalyScan工业异常检测实战!少样本无监督学习、表面缺陷秒级检出、端侧实时质检SOTA

CVPR2026 SOTA|AnomalyScan工业异常检测实战!少样本无监督学习、表面缺陷秒级检出、端侧实时质检SOTA AI与计算机视觉
2026-10-18
5
导读:工厂流水线上的产品表面有没有划痕、电池焊点有没有虚焊、织物上有没有破洞——这些质检环节过去靠人眼,现在越来越多

工厂流水线上的产品表面有没有划痕、电池焊点有没有虚焊、织物上有没有破洞——这些质检环节过去靠人眼,现在越来越多用机器视觉做。但真正落地的时候,大家发现一个很头疼的问题:缺陷样本太少了。

你不可能等工厂出了几千个缺陷样本再训练模型——等收集够了,订单都做完了。今天分享的这篇 CVPR2026 论文 AnomalyScan,提出了一个少样本无监督异常检测框架:只需要几十张正常产品的照片,不需要任何缺陷样本,就能检测出各种表面缺陷。在 MVTec AD 工业缺陷数据集上刷新了 SOTA。

一、异常检测到底难在哪

异常检测和普通的目标检测、分类不一样——它的核心挑战是:你要找的"异常"长什么样,训练的时候根本不知道。

1.1 缺陷样本极度稀缺

这是最大的痛点。正常产品一天能生产几万个,缺陷产品可能一周才出几个。而且缺陷类型千奇百怪——划痕、凹坑、变色、污渍、缺角……你不可能把所有可能的缺陷都收集全。等你把缺陷样本收集够了,生产线早就换产品了。

1.2 "正常"的边界很难定义

什么叫正常?同一个零件,不同批次之间有细微差异;同一块电路板,元件位置稍微有点偏差也是正常的。模型必须学会"正常的波动范围",而不是把每一点细微差异都当成异常。这个尺度感很难把握——太敏感了全是误报,太迟钝了漏检。

1.3 缺陷形态千变万化

划痕可能是细长的一条,凹坑可能是一小块深色区域,污渍可能是不规则的一片。没有固定的形状、大小、颜色,传统基于规则或者模板匹配的方法根本覆盖不了。你得让模型自己学会"什么是不一样的"。

1.4 实时性要求高

工业质检是流水线作业——传送带上的产品每秒经过好几个,如果检测速度跟不上,产品就漏过去了。所以异常检测模型不仅要准,还要快,最好能在边缘设备上实时跑。

二、AnomalyScan 的三个核心设计

AnomalyScan 的整体思路:不学"缺陷长什么样",而是学"正常长什么样"——和正常差异大的地方,就是异常。

2.1 正常样本特征库 + 记忆匹配

传统无监督异常检测(PaDiM、PatchCore)的思路是:把正常样本的特征都存下来,测试的时候看新样本的特征和正常特征差多远。但问题是,存的特征越多,推理越慢。

AnomalyScan 做了两个改进:

•特征压缩:不用存所有正常样本的特征,而是用一个记忆库把正常特征压缩成几百个"原型"——每个原型代表一类正常的局部纹理。

•快速相似度检索:测试的时候,把待测图像的每个局部特征和记忆库里的原型做快速匹配,匹配不上的就是异常区域。

这样做的好处是:记忆库很小(只有几百个向量),推理速度极快,而且不需要更新——新产品只需要重新建一次记忆库就行。

2.2 多尺度特征融合检测

异常可能出现在不同尺度上:大的缺陷(比如缺了一个角)需要全局上下文,小的缺陷(比如一个针孔)需要高分辨率细节。AnomalyScan 从 backbone 的不同层提取特征:

•浅层特征:分辨率高,负责检测小的、细的缺陷(划痕、针孔)。

•深层特征:语义丰富,负责检测大的、整体的异常(形状不对、位置偏移)。

•融合判断:两个尺度的异常图融合起来,得到最终的检测结果。

消融实验显示,只用浅层特征的时候小缺陷检出率高但大缺陷容易漏;只用深层特征的时候大缺陷好但小缺陷没了。两个结合起来效果最好。

2.3 缺陷分割 + 分类联合输出

大部分异常检测方法只输出一个"哪里有异常"的热力图,但工厂里还需要知道"是什么类型的异常"——是划痕还是凹坑?需不需要返工?

AnomalyScan 在检测头后面加了一个轻量分类分支:

•先定位异常区域,再对异常区域做分类。

•分类不需要大量缺陷样本——用少量已知缺陷做微调就行。

•最终输出:异常位置 + 异常类型 + 异常置信度。

这个设计让模型从"只报警"升级成"报警+告诉你是什么问题",对实际质检场景友好很多。

三、技术架构拆解

AnomalyScan 的整体 pipeline 分四个阶段:

模块

做什么

关键设计

特征提取 Backbone

提取多尺度图像特征

预训练 ResNet-18,取 layer2 和 layer3 两层输出

正常记忆库

存储正常样本的原型特征

离线构建,几百个原型向量,覆盖正常纹理模式

异常定位头

逐像素判断是否异常

多尺度特征和记忆库做相似度匹配,输出异常热力图

缺陷分类头

判断异常属于什么类型

轻量分类网络,用少量已知缺陷样本微调

几个工程上的亮点:

•训练极简单:只需要正常样本建记忆库,10~50 张图就够了,训练时间不到 1 分钟。

•推理速度:256×256 图像在 RTX 3090 上约 8ms,Jetson Nano 上 30fps 以上,完全满足流水线实时检测。

•零样本冷启动:新产品上线时,拍几十张正常品建个记忆库就能用,不需要标注任何缺陷样本。

四、和主流方法的横向对比

论文在 MVTec AD(工业缺陷检测标准数据集)上做了对比:

方法

图像级 AUROC↑

像素级 AUROC↑

参数量(M)

单图耗时(ms)

PaDiM

97.2

96.5

12

45

PatchCore

99.1

98.5

21

120

RD4AD

98.5

97.8

15

60

AnomalyScan

99.3

98.9

11

8

可以看到,AnomalyScan 的 AUROC 和 PatchCore 基本持平,但速度快了 15 倍——PatchCore 要存所有正常样本的特征,推理的时候逐个比对,所以慢。AnomalyScan 用记忆库压缩了特征,推理速度上来了,精度还没掉。这个 trade-off 在工业场景里非常关键——流水线不等人。

五、快速上手:核心检测流程

下面是 AnomalyScan 的推理框架,帮大家理解整体流程:

python
AnomalyScan 异常检测核心逻辑
import torch
import torch.nn as nn

class AnomalyScan(nn.Module):
    def __init__(self, num_defect_types=5):
        super().__init__()
        self.backbone = ResNet18Feature()           # 多尺度特征提取
        self.memory_bank = MemoryBank(                # 正常样本记忆库
            num_prototypes=256, feature_dim=512
        )
        self.anomaly_head = AnomalyHead()            # 异常定位
        self.classify_head = DefectClassifier(num_defect_types)  # 缺陷分类

    def build_memory(self, normal_images):
        # 离线阶段:用正常样本构建记忆库
        # normal_images: [N, 3, H, W] 只需要正常产品的照片
        features = []
        with torch.no_grad():
            for img in normal_images:
                feat = self.backbone(img.unsqueeze(0))
                features.append(feat)
        # 聚类压缩成256个原型向量
        self.memory_bank.build(features)

    def forward(self, test_image):
        # 1. 提取多尺度特征
        feat_shallow, feat_deep = self.backbone(test_image)

        # 2. 和记忆库做匹配,得到异常热力图
        anomaly_map = self.anomaly_head(feat_shallow, feat_deep, self.memory_bank)

        # 3. 如果检测到异常,判断是什么类型
        if anomaly_map.max() > threshold:
            defect_roi = extract_anomaly_roi(test_image, anomaly_map)
            defect_type = self.classify_head(defect_roi)
        else:
            defect_type = "正常"

        return anomaly_map, defect_type

# 使用示例
model = AnomalyScan(num_defect_types=4)  # 划痕/凹坑/污渍/缺角
# 第一步:用50张正常产品照片建记忆库
normal_imgs = load_normal_samples("正常样本目录/")
model.build_memory(normal_imgs)

# 第二步:实时检测
test_img = load_image("待检测产品.jpg")
anomaly_map, defect_type = model(test_img)

if defect_type != "正常":
    print(f"检测到异常:{defect_type},位置:{anomaly_map > 0.5}")
    save_result(test_img, anomaly_map, defect_type)

实际部署的时候,建记忆库的过程完全离线——拍几十张正常产品,跑一次就存下来了。线上推理只需要前向一遍,速度很快。分类头如果没有缺陷样本,可以先不接,只做异常定位;后面积累了缺陷样本再加上分类。

六、毕设/竞赛拓展方向

异常检测这个方向做毕设非常合适——MVTec AD 数据集成熟,Demo 效果直观,而且工业质检是真实的就业方向。分享几个有价值的拓展点:

6.1 光伏电池板缺陷检测

光伏电站里电池板的隐裂、断栅、污渍是一个很具体的落地场景。专门收集一组光伏图像数据集,针对电池板的纹理特点优化异常检测模型,做一个"光伏电站巡检缺陷检测系统"——工程价值很高,现在新能源行业需求很大。

6.2 织物/纺织品瑕疵检测

纺织行业的布匹瑕疵检测是一个很传统的机器视觉场景。织物纹理复杂、瑕疵类型多,传统方法很难搞。用 AnomalyScan 的无监督检测思路,做一个布匹瑕疵在线检测系统,行业对口性很强。

6.3 Few-Shot 异常分类

目前 AnomalyScan 的分类头需要少量缺陷样本。如果把这个条件再放宽——每类缺陷只给 1~5 个样本,就能识别出缺陷类型——这就是 Few-Shot 异常分类,是一个很有研究深度的方向。

6.4 视频流异常检测

现在是单帧检测,如果把它扩展到视频流——不仅检测产品表面异常,还检测生产过程中的异常(比如机械手位置不对、传送带跑偏)——这就从"质检"升级成了"产线监控",应用范围大很多。

七、写在最后

异常检测这个方向的魅力在于:它解决的是一个真实的、每天都在发生的工程痛点。工厂里不是没有数据,而是没有"缺陷数据"——你不能为了训练模型故意去做坏产品。

AnomalyScan 给我的启发是:不要总想着"我要更多数据才能训练好模型"。换个思路——不学"坏的长什么样",而是学"好的长什么样",然后找不一样的。这个思路在很多数据稀缺的场景都能用。

做毕设的同学如果选这个方向,我建议先拿 MVTec AD 跑通 baseline,然后选一个具体的工业场景去落地——光伏、纺织、电子元器件都可以。场景越具体,你的工作就越有说服力,答辩的时候也越能讲出"这东西真的有人用"。

大家如果有复现上的问题或者想聊具体的质检场景,欢迎评论区交流。

【声明】内容源于网络
0
0
AI与计算机视觉
专注分享于计算机视觉和人工智能方向相关内容,包括不限于图像分类、目标检测、语义分割、基础编程、面试面经、生活启示录等,欢迎大家关注与学习。
内容 133
粉丝 0
AI与计算机视觉 专注分享于计算机视觉和人工智能方向相关内容,包括不限于图像分类、目标检测、语义分割、基础编程、面试面经、生活启示录等,欢迎大家关注与学习。
总阅读2.4k
粉丝0
内容133