深度拆解 AnomalyCLIP:用 CLIP 做零样本异常检测,不看目标数据也能精准定位缺陷

一、简介:

做工业质检、医学影像分析的朋友,一定遇到过这些零样本困境

  • 新产品上线,一张缺陷样本都没有,模型直接 "瞎";
  • 医疗数据隐私严格,无法获取目标域训练样本,传统方法全失效;
  • 不同领域缺陷天差地别:金属划痕、PCB 错位、肿瘤、息肉,一套模型根本通吃不了

传统异常检测依赖目标域数据,无数据就无法训练;就算用 CLIP 这类大模型,也总盯着 "物体是什么",看不到 "哪里不正常",零样本效果拉胯。

直到这篇arXiv 2026 的《AnomalyCLIP: Object-Agnostic Prompt Learning for Zero-Shot Anomaly Detection 》横空出世,彻底解决零样本异常检测(ZSAD)的泛化难题 ------ 不用目标域数据、不用手工设计百级提示、一套提示通杀工业 + 医疗,在 17 个数据集上屠榜 SOTA。

今天我就把AnomalyCLIP 从痛点→原理→创新→实验→落地讲透,算法工程师、工业视觉、医学 AI 方向都能直接用。

论文地址https://arxiv.org/abs/2310.18961
代码地址https://github.com/zqhang/AnomalyCLIP

二、先搞懂:零样本异常检测的 "死结" 到底在哪?

异常检测(AD)我们很熟:判断图片有没有异常、异常在哪 ,广泛用在工业缺陷、医学病灶检测。

零样本异常检测(ZSAD) 更极端:
模型只用辅助数据训练,目标域一张样本都不用,直接上线检测。

它面临 3 个死结:

  • 无目标数据:隐私、新品、成本导致拿不到训练样本,传统监督 / 无监督全废;
  • 域差异巨大:工业缺陷 vs 医学肿瘤,物体外观、背景、异常模式完全不同;
  • CLIP 跑偏:CLIP 天生学 "物体语义"(猫 / 狗 / 胶囊),不学 "正常 / 异常",拿来做 ZSAD 直接拉胯。

现有方法的致命缺陷:

  • WinCLIP:手工堆几百个提示,繁琐、泛化差、推理慢;
  • CoOp/VAND:学物体相关提示,换个物体就崩,抓不住细粒度局部异常;
  • 都只做全局特征,忽略像素级异常区域,分割一塌糊涂。

一句话:不会 "无视物体、只看异常",就做不好真正的零样本异常检测。

而 AnomalyCLIP 的核心答案只有一句:
学一套与物体无关的 "正常 / 异常" 文本提示,只看异常模式,不看物体是什么,实现跨域零样本泛化。

三、AnomalyCLIP 核心逻辑:让 CLIP"忘掉物体,只看异常"

先给你一个最直白的直觉:

  • 普通 CLIP:看到图片→识别 "这是螺母"→判断类别;
  • AnomalyCLIP:看到图片→无视 "是螺母还是器官"→直接判断 "这里正常 / 异常"。


图 1:在(b)测试数据上使用(c)CLIP(Radford 等人,2021)中的原始文本提示、(d)WinCLIP(Jeong 等人,2023)中针对 AD 的定制文本提示、(e)CoOp(Zhou 等人,2022a)中用于通用视觉任务的可学习文本提示以及(f)我们 AnomalyCLIP 中的无对象文本提示的 ZSAD 结果比较。(a)展示了一组可用于学习文本提示的辅助数据。结果是通过测量文本提示嵌入和图像嵌入之间的相似度获得的。在(a)和(b)中,真实异常区域用红色圈出。(c)、(d)和(e)在不同领域中的泛化能力较差,而我们的 AnomalyCLIP 在(f)中能够很好地泛化到来自不同领域的各种类型对象的异常情况。

它的整体设计围绕3 个核心目标

  • 提示与物体无关(Object-Agnostic),只建模通用正常 / 异常;
  • 同时学全局(图级有无异常)+ 局部(像素级在哪异常);
  • 修正 CLIP 注意力,强化局部细粒度异常,不被物体语义带偏。

整体流程极简:

  • 设计物体无关提示模板,只学 normal/abnormal 两种语义;
  • 用全局 + 局部联合损失(Glocal Loss) 训练提示;
  • 用DPAM 对角突出注意力优化视觉编码器,强化局部异常特征;
  • 推理时:算文本 - 图像相似度→输出异常分数 + 异常分割图。

下面逐点硬核拆解。

3.1 核心创新 1:物体无关提示(Object-Agnostic Prompt)------ 真正跨域的关键

这是 AnomalyCLIP最灵魂的创新,也是它能通杀工业 + 医疗的根本。

为什么要 "物体无关"?

划痕、破损、变形、肿瘤、息肉......异常模式是通用的,但物体千差万别。如果提示里带物体名(a photo of a damaged nut),换个物体(pill、brain)直接失效。


图 2:AnomalyCLIP 概览。为了将 CLIP 应用于零样本异常检测(ZSAD),AnomalyCLIP 引入了与对象无关的文本提示模板,以捕获与对象语义无关的通用正常性和异常性。然后,我们引入全局和局部上下文优化,将全局和细粒度的异常语义纳入与对象无关的文本提示学习中。最后,通过文本提示调优和 DPAM,使 CLIP 的文本和局部视觉空间中的提示学习成为可能。

AnomalyCLIP 的提示设计

它把提示分成正常 / 异常两类,彻底删掉物体类别名,只保留 object:

正常提示:gn=[V1][V2]...[VE][object]g_{n}=[V1][V2]...[VE] [object]gn=[V1][V2]...[VE][object]

异常提示:ga=[W1][W2]...[WE][damaged][object]g_{a}=[W1][W2]...[WE] [damaged] [object]ga=[W1][W2]...[WE][damaged][object]

对比一下:

方法 提示形式 泛化能力
CLIP a photo of a [cls] 极低
WinCLIP 手工缺陷提示
CoOp 可学习 + [cls]
AnomalyCLIP 可学习 + damaged + object 极高(跨域)

效果:

训练时用工业数据,推理直接杀到医疗影像,肿瘤、息肉、结节全能检,一套提示走天下。

3.2 核心创新 2:全局 + 局部联合优化(Glocal Context Optimization)

CLIP 原本只做图级分类 ,异常检测需要图级检测 + 像素级分割

AnomalyCLIP 提出联合损失 ,同时搞定两个任务:
Ltotal=Lglobal+λ∑Ml∈MLlocalMl \mathcal{L}{total} = \mathcal{L}{global} + \lambda \sum_{M_l \in \mathcal{M}} \mathcal{L}_{local}^{M_l} Ltotal=Lglobal+λMl∈M∑LlocalMl

  • λ=4\lambda = 4λ=4(论文默认)

  • 同时优化图像级检测与像素级分割

    ① 全局损失 LglobalL_{global}Lglobal(图像级)
    Lglobal=−∑iyilog⁡P(ga,fi)+(1−yi)log⁡P(gn,fi) \mathcal{L}{global} = -\sum{i} y_i \log P(g_a, f_i) + (1-y_i)\log P(g_n, f_i) Lglobal=−i∑yilogP(ga,fi)+(1−yi)logP(gn,fi)

  • 用交叉熵,对齐文本嵌入 ↔ 全局图像嵌入;

  • 让模型学会:这张图整体是正常还是异常。

② 局部损失 L_local(像素级)

异常往往是小区域、细粒度 ,必须做像素级监督:
Llocal=Focal(⋅)+Dice(⋅) \mathcal{L}_{local} = \text{Focal}(\cdot) + \text{Dice}(\cdot) Llocal=Focal(⋅)+Dice(⋅)

  • 上采样局部 patch 特征,得到逐点异常概率;
  • 用Focal Loss解决正负样本极度不平衡(异常区域通常很小);
  • 用Dice Loss强化分割重叠度,精准定位异常边缘。

为什么这样设计?

  • 只全局:能判断有无异常,不知道在哪
  • 只局部:能定位,容易误检噪声
  • 联合优化:有无 + 定位一起学,检测 + 分割双 SOTA

3.3 核心创新 3:DPAM 对角突出注意力(Diagonally Prominent Attention Map)

CLIP 的视觉编码器有个大毛病:
自注意力总盯着物体语义 token,忽略局部异常细节,导致分割模糊、定位不准。

如图所示:原始 Q-K 注意力会被少数物体 token 带偏,注意力呈条状,局部特征被破坏,分割模糊、漏检小缺陷。

图 3:DPAM 可视化。

DPAM 怎么做?

注意力权重:
aijvv=exp⁡(vivj⊤D) a_{ij}^{vv} = \exp\left(\frac{v_i v_j^\top}{\sqrt{D}}\right) aijvv=exp(D vivj⊤)

直接把 CLIP 的Q-K 自注意力 替换成对角突出的自注意力,支持三种模式:

  • Q-Q、K-K、V-V(论文默认 V-V 效果最好)

核心思想:
让每个位置更多关注自己,减少跨位置干扰,保留细粒度局部异常语义。

效果:

  • 注意力图呈强对角分布;
  • 异常分割边缘更准、小缺陷不漏检;
  • 视觉编码器全程冻结,只改注意力,训练极快、超稳。

3.4 核心创新 4:文本空间精调(Textual Space Refinement)

为了让文本嵌入更区分 "正常 / 异常",AnomalyCLIP 在文本编码器里插入可学习 token

  • 替换文本编码器前 N 层的前缀 token 为可学习向量;
  • 逐层精调文本空间,强化正常 / 异常的判别性;
  • 参数量极小,只训提示和少量 token,CLIP 主体冻结。


表 1:ZSAD 在工业领域的性能对比。表现最佳的项目以红色突出显示,次优的项目以蓝色突出显示。t 表示源自原始论文的结果。

四、训练 & 推理流程(代码级)

4.1 训练流程

  1. 加载 CLIP(ViT-L/14@336px)
  2. 冻结图像编码器、文本编码器
  3. 初始化物体无关提示
  4. 构建 Glocal Loss
  5. 开启 DPAM(V-V)
  6. 插入文本精调 token
  7. 在 MVTec AD/VisA 上训练
  8. 保存提示参数

4.2 推理流程(零样本)

  1. 图像 → CLIP 视觉编码器 → 全局特征 + 局部 Patch 特征
  2. 计算相似度:
    • 图像级:score = cosine(vis_feat, g_a)
    • 像素级:逐 Patch 计算相似度
  3. 异常图 = 上采样 + 高斯平滑
  4. 输出:异常分数 + 异常分割图

五、实验结果|17 数据集全面屠榜

5.1 工业数据集(MVTec AD)

  • 图像级 AUROC:91.5%
  • 像素级 AUROC:91.1%
  • PRO:81.4%

5.2 医疗数据集(零样本跨域)

训练数据:工业 MVTec AD

测试数据:医疗影像

  • HeadCT(脑肿瘤):93.4%
  • Br35H(脑肿瘤):94.6%
  • ISIC(皮肤癌):89.7%
  • 结肠息肉、甲状腺结节全部 SOTA

5.3 消融实验(完整版)

配置 像素 (AUROC,PRO) 结论
Base 46.8,15.4 基线
+DPAM 68.4,47.4 局部增强
+物体无关提示 89.5,81.2 性能暴涨
+文本精调 91.1,81.4 最终 SOTA

六、核心代码片段(可直接运行)

python 复制代码
# 物体无关提示模板
normal_prompt = ["{} object" for i in range(8)]
abnormal_prompt = ["{} damaged object" for i in range(8)]

# Glocal Loss
class GlocalLoss(nn.Module):
    def __init__(self, lambda_local=4):
        super().__init__()
        self.global_loss = nn.CrossEntropyLoss()
        self.focal = FocalLoss()
        self.dice = DiceLoss()
        self.lambda_local = lambda_local

    def forward(self, global_out, local_out, global_label, mask_label):
        l_global = self.global_loss(global_out, global_label)
        l_local = self.focal(local_out, mask_label) + self.dice(local_out, mask_label)
        return l_global + self.lambda_local * l_local

# DPAM:V-V Self-Attention
def dpam_attention(v):
    attn = (v @ v.transpose(-2,-1)) / torch.sqrt(torch.tensor(v.shape[-1]))
    attn = attn.softmax(dim=-1)
    return attn @ v

七、落地部署指南(工业 / 医疗直接用)

7.1 环境配置

  • Python 3.8+
  • PyTorch 2.0
  • OpenCV
  • OpenCLIP

7.2 训练步骤

  1. 下载 MVTec AD 测试集作为训练数据
  2. 运行 train.py
  3. 训练 15 epoch,单张 3090 只需几小时
  4. 保存 prompt.pt

7.3 推理步骤

  1. 加载模型 + 提示
  2. 输入任意图片(工业/医疗)
  3. 输出:是否异常 + 异常位置图

八、AnomalyCLIP vs AnomalyDiffusion|选型指南

模型 核心能力 适用场景 数据要求
AnomalyDiffusion 小样本缺陷生成 缺少缺陷样本 少量缺陷
AnomalyCLIP 零样本检测+分割 完全无数据、跨域 目标域 0 样本

结论:

  • 0 样本、跨域、快速上线 → AnomalyCLIP
  • 有少量缺陷,想扩充数据 → AnomalyDiffusion

九、总结|AnomalyCLIP 强在哪里

  1. 物体无关提示:真正实现跨域零样本
  2. 全局+局部联合学习:检测+分割一步到位
  3. DPAM 注意力:修复 CLIP 局部特征丢失问题
  4. 文本空间精调:异常判别性大幅提升
  5. 17 数据集 SOTA:工业 + 医疗全场景屠榜

一句话总结:

零样本异常检测的本质,不是认识更多物体,而是学会什么是正常、什么是异常

相关推荐
网络工程小王8 小时前
【LCEL 链式调用详解】调用篇-2
java·服务器·前端·数据库·人工智能
BU摆烂会噶8 小时前
【LangGraph】运行时上下文(Runtime Context)
人工智能·python·langchain
一个处女座的程序猿O(∩_∩)O8 小时前
大模型决战2026:从百模大战到空间智能,AI Agent与推理架构的深度实战
人工智能·架构
第七种黄昏9 小时前
用AI一天做出一个完整App:VibeCoding全流程实战记录(小白也能复现)
人工智能
skilllite作者9 小时前
SkillLite 原生系统级沙箱功能代码导览
人工智能·chrome·后端·架构·rust
GISer_Jing9 小时前
AI Agent中游产业链全景拆解:智能体开发的核心生态与技术版图
前端·人工智能·后端
冬奇Lab9 小时前
RAG 系列(七):检索策略——如何找到最相关的内容
人工智能·llm·源码
薛定猫AI9 小时前
【深度解析】DeepSeek V4 + Cloud Code:构建低成本、高吞吐的混合 AI 编码工作流
人工智能·log4j
数智工坊9 小时前
【Transfer CLIP论文阅读】跨模态大模型赋能!CLIP迁移学习实现超强泛化图像去噪
论文阅读·人工智能·迁移学习