ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

FoundAD:基于预训练视觉模型的少样本异常检测新范式

FoundAD:基于预训练视觉模型的少样本异常检测新范式 1. 从“零样本”到“少样本”异常检测的范式转移与核心挑战在工业质检、医疗影像分析这些对精度和可靠性要求极高的领域异常检测一直是个老大难问题。传统的路子要么是依赖海量的“正常”样本去训练一个模型让它学会什么是“正常”然后去识别“异常”要么就是需要收集大量“异常”样本搞成一个标准的分类问题。但现实往往很骨感真正的异常样本尤其是那些罕见但致命的缺陷收集起来成本极高甚至可遇不可求。这就催生了“少样本异常检测”这个研究方向——我们能不能只用寥寥几个甚至只有一个异常样本作为参考就让模型学会识别它甚至举一反三发现类似的、从未见过的异常最近ICLR 2026上由慕尼黑工业大学院士Nassir Navab团队与工业视觉软件巨头MVTec联合提出的FoundAD就瞄准了这个痛点。它最吸引人的地方在于它不从头训练一个新模型而是直接“征用”现成的、在大规模通用数据上预训练好的基础视觉编码器比如CLIP、DINOv2这类模型。这个思路有点像什么呢好比你不是去专门培养一个只会看螺丝钉的质检员而是直接找来一个博览群书、见多识广的“通才”然后只用几张有瑕疵的螺丝钉照片快速教会他识别这类瑕疵。FoundAD的核心主张就是这些通才模型基础视觉编码器内部蕴含的、关于视觉世界的通用知识远比我们想象的要强大足以支撑高效的少样本异常学习。这背后其实是一个深刻的范式转变。过去我们总觉得异常检测是个“专用”任务需要“专用”模型。但FoundAD告诉我们或许可以换个思路把它变成一个“提示”或“适配”通用模型的任务。这不仅能极大降低对异常样本数量的依赖还能利用上这些大模型强大的泛化能力。对于工厂里突然出现的一种新缺陷或者医院影像中一种罕见的病变形态这种方法的价值不言而喻。2. FoundAD方法的核心机理如何让通用模型“看懂”异常FoundAD的整个流程可以概括为“征用、提示、对比、检测”四个关键阶段。它巧妙地避开了重新训练骨干网络这个耗时耗力的过程把计算资源集中在了最关键的“适配”环节。2.1 骨干网络的选择与特征激活FoundAD本身不是一个具体的模型架构而是一个方法论框架。它的第一步是选择一个强大的、预训练好的基础视觉编码器作为骨干。论文中重点探讨了基于视觉-语言对齐的模型如CLIP和自监督视觉模型如DINOv2。CLIP类模型这类模型的特点是在海量图文对上训练学会了将图像和文本映射到同一个语义空间。对于异常检测一个直观的想法是我们可以用文本描述如“一个带有划痕的金属表面”来提示模型。但FoundAD走得更远它发现即使不使用文本仅通过极少数异常图像样本也能有效地激活CLIP图像编码器中与异常相关的特征通道。这些特征并非为异常检测而生但在通用语义理解中已经隐含了关于“破损”、“污渍”、“不规则”等概念的表征。DINOv2类模型这类纯视觉的自监督模型通过让模型学习同一图像不同视图之间的一致性获得了强大的视觉特征提取能力。它的特征更侧重于图像的结构和纹理信息。在少样本异常检测中DINOv2的特征对于捕捉细微的纹理变异如织物上的抽丝、液晶屏的亮点往往有奇效。选择哪类骨干取决于异常的类型。对于和语义、概念关联强的异常如零件缺失、装配错误CLIP可能更有优势对于纯视觉模式上的偏离如纹理缺陷、颜色不均DINOv2可能更合适。在实际操作中一个常见的技巧是将不同骨干网络提取的多层次特征进行融合利用CLIP的高层语义和DINOv2的底层细节形成更鲁棒的特征表示。2.2 少样本提示与异常原型构建这是FoundAD最具创新性的环节。假设我们只有K个K可能小到1-5异常样本图像。传统的微调方法在这里会捉襟见肘极易过拟合。FoundAD的做法是将这些少样本异常图像输入到冻结的参数不动基础编码器中提取它们的特征。关键的一步来了它不是简单地对这K个特征取平均而是通过一个轻量级的“提示学习”模块去计算一个“异常原型”。这个提示学习模块可以是一个小型的神经网络如几层MLP甚至是一些可学习的向量即提示向量。它的任务是以少样本异常特征为输入输出一个能够代表该类异常本质的、紧凑的原型向量。这个过程的思想是少样本异常图像本身可能带有一些无关的噪声或背景信息。提示模块的作用就是去伪存真从有限的样本中“蒸馏”出最核心的异常模式。例如对于“划痕”这类异常正常区域的纹理、光照条件可能各不相同但“划痕”本身那条细长的、与背景对比度高的线性特征才是关键。提示模块就是要学会聚焦于这个关键模式并形成一个泛化性更强的原型。注意这里提示模块的训练是唯一需要更新的部分参数量相比整个基础编码器微乎其微。这保证了高效性也避免了在极少样本上对庞大模型进行灾难性的遗忘式微调。2.3 基于原型的特征空间重构与异常评分得到“异常原型”后FoundAD用它来重构整个特征空间的理解。具体来说对于一张待检测的图像我们同样用冻结的基础编码器提取其特征图。接下来的操作很巧妙在特征空间的多个层次上计算待测特征与“异常原型”之间的某种距离或相似度。这不仅仅是简单的余弦相似度。FoundAD引入了一种自适应加权机制它会根据异常原型的特点动态地决定在特征空间的哪些维度、哪些空间位置上进行更密集的比对。例如如果异常原型显示缺陷主要与某些高频纹理通道相关那么算法就会在这些通道对应的特征图上给予更高的权重。如果缺陷是局部性的那么空间注意力机制会聚焦于相关的图像区域。这个过程相当于用“异常原型”作为一把标尺去度量待测图像特征在各个维度上偏离“正常”这里被原型所定义的程度。最终通过综合所有层次、所有位置的距离信息算法会为待测图像生成一个像素级的异常热力图和一个图像级的异常分数。分数越高表明该图像或区域与提供的少样本异常越相似。2.4 与经典方法的对比为什么FoundAD更高效为了更清晰地理解FoundAD的贡献我们可以将其与少样本异常检测中常见的几类方法进行对比方法类别核心思路是否需要训练新编码器对异常样本数量的需求泛化到新异常类别的能力典型缺点基于重构的方法(如Autoencoder)用大量正常样本训练模型学习重构异常样本重构误差大。是需从头训练编码器-解码器。需要大量正常样本异常样本仅用于测试。弱。模型只学到了“正常”遇到训练未见的异常类型可能失效。对复杂正常模式学习困难易将“难重构的正常”误判为异常。基于分布的方法(如SPADE, PaDiM)在预训练特征空间上建模正常特征的多元分布偏离分布即为异常。通常使用ImageNet预训练编码器但需用大量正常样本拟合分布。需要大量正常样本建立分布异常样本仅用于测试。弱。分布基于正常样本对新异常类型的边界不敏感。计算复杂度高且非常依赖正常样本的纯净度和覆盖面。基于微调的方法用少量正常异常样本对预训练模型进行端到端微调。是需要更新整个或大部分编码器参数。需要少量配对的正异常样本。中等。微调可能过拟合到提供的少数异常损害基础模型的通用知识。极易过拟合需要精巧的正则化和大量数据增强不稳定。FoundAD (本文方法)冻结基础编码器用少样本异常学习一个“异常原型”在特征空间进行度量。否。完全冻结强大的预训练编码器仅训练微型提示模块。极少仅需目标异常类的几个样本。强。利用基础模型的通用知识原型可泛化到同类未见过样本。性能依赖于基础编码器本身的质量和与任务的适配度。从上表可以清晰看出FoundAD在“效率”和“泛化”之间找到了一个很好的平衡点。它摒弃了繁重的编码器训练或复杂的分布建模将核心计算转移到轻量的提示学习和原型匹配上这正是其适用于少样本场景的关键。3. 实战演练基于CLIP实现FoundAD思路的简化版代码解读理论说得再多不如动手看看代码骨架。这里我们以CLIP-ViT作为基础编码器实现一个FoundAD思路的极度简化版本旨在阐明其核心流程。请注意这并非论文原版复现而是用于教学理解的原理性代码。import torch import torch.nn as nn import torch.nn.functional as F from PIL import Image from transformers import CLIPProcessor, CLIPModel import numpy as np class SimplifiedFoundAD(nn.Module): def __init__(self, clip_model_nameopenai/clip-vit-base-patch32): super().__init__() # 1. 加载并冻结CLIP模型作为基础编码器 self.clip CLIPModel.from_pretrained(clip_model_name) for param in self.clip.parameters(): param.requires_grad False self.processor CLIPProcessor.from_pretrained(clip_model_name) self.feature_dim self.clip.config.projection_dim # CLIP的联合特征维度例如512 # 2. 定义轻量级提示模块一个简单的MLP用于从少样本异常特征提炼原型 # 输入K个样本的特征 (K, feature_dim) # 输出一个异常原型向量 (1, feature_dim) self.prototype_learner nn.Sequential( nn.Linear(self.feature_dim, 256), nn.ReLU(), nn.Dropout(0.1), nn.Linear(256, self.feature_dim) ) # 3. 可学习的尺度参数用于调整距离度量的敏感性 self.scale nn.Parameter(torch.ones(1) * 10.0) def extract_clip_features(self, images): 提取CLIP的图像特征 inputs self.processor(imagesimages, return_tensorspt, paddingTrue) with torch.no_grad(): # 使用CLIP的视觉编码器获取图像特征 image_features self.clip.get_image_features(**inputs) # 归一化便于后续计算余弦相似度/距离 image_features F.normalize(image_features, dim-1) return image_features def forward(self, support_images, query_images): Args: support_images: list of PIL Images, 少样本异常支持集 (K个) query_images: list of PIL Images, 待检测的查询图像 Returns: anomaly_scores: 查询图像的异常分数 (越高越异常) # 步骤A: 提取支持集少样本异常特征 support_features self.extract_clip_features(support_images) # [K, D] # 步骤B: 通过提示模块学习异常原型 # 先对支持集特征做平均得到一个初始聚合表示再输入MLP进行精炼 aggregated_support support_features.mean(dim0, keepdimTrue) # [1, D] anomaly_prototype self.prototype_learner(aggregated_support) # [1, D] anomaly_prototype F.normalize(anomaly_prototype, dim-1) # 步骤C: 提取查询图像特征 query_features self.extract_clip_features(query_images) # [N, D] # 步骤D: 计算查询特征与异常原型之间的余弦距离作为异常分数 # 余弦相似度范围[-1,1] 1表示完全相同。我们使用 (1 - 相似度) 作为距离范围[0,2] cosine_sim F.cosine_similarity(query_features, anomaly_prototype, dim-1) # [N] anomaly_scores (1 - cosine_sim) * self.scale # 缩放分数便于优化和比较 return anomaly_scores def fit_prototype(self, support_images, lr1e-3, steps100): 训练提示模块以少样本异常图像为输入学习最优的异常原型 optimizer torch.optim.Adam(self.prototype_learner.parameters(), lrlr) support_features self.extract_clip_features(support_images) aggregated_support support_features.mean(dim0, keepdimTrue).detach() # 固定输入 for step in range(steps): prototype self.prototype_learner(aggregated_support) prototype F.normalize(prototype, dim-1) # 一个简单的训练目标让学到的原型与所有支持样本的特征尽可能接近 # 即最小化原型与支持集特征的平均余弦距离 loss 1 - F.cosine_similarity(prototype, support_features).mean() optimizer.zero_grad() loss.backward() optimizer.step() if step % 20 0: print(fStep {step}, Loss: {loss.item():.4f}) print(原型学习完成。) # 使用示例 def demo(): # 模拟数据假设我们有3张划痕异常的图片作为支持集 support_set [Image.open(scratch_1.jpg), Image.open(scratch_2.jpg), Image.open(scratch_3.jpg)] # 以及一批待检测的图片 query_set [Image.open(test_1.jpg), Image.open(test_2.jpg), ...] model SimplifiedFoundAD() # 阶段1用少样本异常训练适配提示模块 model.fit_prototype(support_set, lr1e-3, steps100) # 阶段2检测 model.eval() with torch.no_grad(): scores model(support_set, query_set) # 注意支持集这里再次传入仅用于统一接口实际计算只用其学到的原型 print(异常分数:, scores) # 设定一个阈值高于阈值则判定为异常 threshold 1.0 predictions scores threshold这段代码清晰地展示了FoundAD的核心流程冻结大模型、用小网络学习原型、用距离进行检测。在实际的FoundAD论文中提示模块的设计、多尺度特征融合、距离度量的方式如使用马氏距离或更复杂的度量学习会更加复杂和精细但基本骨架与此一致。提示在实际工业部署中需要重点考虑推理速度。由于基础编码器是冻结的其特征提取过程可以预先完成并缓存。真正的实时计算开销仅来自于轻量的提示模块前向传播和特征比对这使其在边缘设备部署具有潜在优势。4. 在MVTec AD等基准数据集上的表现与启示FoundAD论文在MVTec AD、VisA等权威工业异常检测数据集上进行了验证其设定的场景是“少样本正常少样本异常”或“仅少样本异常”。结果表现出了显著的优势。以MVTec AD中的“晶体管”类别为例假设我们只提供1到5个“引脚弯曲”的异常样本以及可能少量的正常样本。传统方法如基于重构的模型由于正常样本不足无法学习到晶体管复杂的正常外观如金属引脚、黑色塑料体、印刷文字等重构误差会一片混乱。而基于分布的方法在极少数正常样本上估计的高维高斯分布极不可靠。FoundAD的做法是利用CLIP或DINOv2这些模型在预训练时已经“见过”类似晶体管、金属、塑料等概念能提取出有意义的特征。然后用那几个“引脚弯曲”的样本通过提示模块学到一个代表“弯曲”的原型。在检测时模型能精准地在引脚区域产生高异常分数而对正常的晶体管主体、文字区域反应微弱。这是因为“弯曲”的原型与正常引脚的特征在基础模型的特征空间中本就存在可区分的距离。这里给我的一个重要启示是基础视觉编码器的“知识质量”直接决定了FoundAD的上限。如果预训练模型本身对工业零件、纹理、缺陷不敏感那么后续的原型学习就是无源之水。这也是为什么与MVTec合作如此关键因为工业视觉领域的专业知识能帮助筛选和评估更适合的预训练模型甚至指导未来基础模型的训练方向。另一个启示是关于**“少样本”的定义**。FoundAD展示的“少样本”不仅仅是数量少更重要的是样本的代表性和多样性。如果提供的5个异常样本都是几乎一模一样的划痕模型学到的原型可能过拟合于该特定角度和光照下的划痕。因此在实际应用中即便样本数量有限也应尽可能覆盖该异常类别的关键变体如不同方向、不同长度、不同位置的划痕。这需要数据采集阶段的精心设计。5. 超越论文FoundAD思路的扩展应用与潜在陷阱FoundAD的范式具有很强的扩展性不仅仅局限于论文中展示的工业异常检测。在医疗影像领域一种罕见的病变可能只有少数几个标注病例。我们可以用这几个病例作为支持集利用医学影像预训练的基础模型如用在ImageNet和大量放射影像上预训练的模型学习一个“病变原型”。然后用这个原型去筛查大量的影像寻找具有相似特征的疑似病例辅助医生进行初筛能极大提高罕见病诊断的效率。在网络安全中的异常流量检测可以将网络流量数据转换为图像格式如频谱图利用基础视觉编码器提取特征。对于一种新型攻击产生的少量流量样本可以快速构建攻击原型从而检测网络中类似的异常流量模式。在农业病虫害监测针对一种新出现的病害叶片采集少量样本图片即可快速构建检测模型无需等待积累大量数据。然而这种方法的成功也伴随着一些必须警惕的陷阱陷阱一基础编码器的领域鸿沟。这是最大的风险。CLIP、DINOv2主要是在自然图像网络图片上训练的。工业上的X光图像、医疗上的CT切片、天文的光谱图与自然图像的分布差异巨大。直接应用特征可能失效。解决方案是进行轻量的领域自适应。可以在大量无标注的领域数据如工厂拍摄的正常产品图上对基础编码器进行对比学习或掩码自编码的继续预训练让其特征空间更贴近目标领域然后再应用FoundAD流程。陷阱二原型学习的过拟合与欠拟合。提示模块虽然小但在极端少样本如1-shot下仍可能过拟合。反之如果异常本身非常细微或与正常模式高度相似提示模块可能无法提炼出有效的判别性原型。解决方案包括1使用强数据增强如CutMix、MixUp来扩充支持集2在提示模块中加入正则化如Dropout、权重衰减3采用更稳健的原型聚合方式如基于注意力的加权平均而非简单平均。陷阱三距离度量的校准。不同的异常类别其与正常模式在特征空间中的“距离”尺度可能不同。使用固定的阈值可能导致某些类别漏检某些类别误报。解决方案是引入自适应阈值机制。例如可以同时用少量正常样本计算一个“正常原型”或正常特征的分布在检测时动态地根据待测特征到“异常原型”和“正常原型”的相对距离来评分。陷阱四计算与存储成本。虽然推理时轻量但提取和存储所有图像的高维特征尤其是多尺度特征需要可观的存储空间和内存带宽。对于需要处理海量历史数据或实时视频流的应用这是一个工程挑战。解决方案包括使用更紧凑的特征表示如PCA降维、开发专用的特征缓存与检索系统或者探索知识蒸馏将大模型提示模块的知识蒸馏到一个更小的专用网络中。在我自己的实验中发现将FoundAD与一个简单的正常样本记忆库结合效果会非常稳定。具体来说除了学习“异常原型”我们额外保存一批正常样本的特征。在检测时不仅计算待测特征与异常原型的距离也计算其与正常特征记忆库中最近邻的距离。最终的异常分数是这两个距离的某种组合如比值。这种方法巧妙地融合了“少样本异常学习”和“正常模式记忆”既有了对新异常的定向识别能力又有了对已知正常模式的保底判断在实际复杂场景中鲁棒性显著提升。这可以看作是对FoundAD框架一个非常实用的补充。
返回列表