AdaCLIP: Adapting CLIP with Hybrid Learnable Prompts for Zero-Shot Anomaly Detection¶
会议: ECCV 2024
arXiv: 2407.15795
代码: https://github.com/caoyunkang/AdaCLIP (开源,298⭐)
领域: 多模态VLM / 异常检测
关键词: 零样本异常检测, CLIP, 可学习提示, 静态提示, 动态提示
一句话总结¶
在CLIP中同时引入静态(全局共享)和动态(逐图生成)两种可学习提示,用辅助异常检测数据训练后,在14个工业+医学异常检测数据集上实现零样本SOTA,核心在于"任务级+实例级"双层自适应的混合提示设计。
背景与动机¶
零样本异常检测(ZSAD)要求模型在从未见过的类别上直接定位异常,不需要目标类别的任何训练样本。现有方法大致分两条路线:一是手工设计文本提示(如"a photo of a damaged {}"),但这些固定模板无法适应不同图像的复杂异常模式;二是类似APRIL-GAN、AnomalyCLIP等方法虽然引入了学习机制,但要么只做文本端适配,要么缺乏逐图动态调整的能力。核心痛点在于:CLIP预训练时从未见过"异常检测"这种下游任务,而固定提示的表达力有限,无法同时处理不同域(工业/医学)、不同类别中形态各异的异常。
核心问题¶
如何在不接触目标类别训练数据的前提下,让CLIP具备高质量的零样本异常检测能力?既要让模型学会"异常检测是什么"(任务级适配),又要针对每张具体图像动态调整检测策略(实例级适配)。
方法详解¶
整体框架¶
AdaCLIP基于冻结的CLIP ViT-L/14@336构建。输入一张图像和类别名称,视觉编码器提取多层级patch tokens,文本编码器生成"正常/异常"两组文本特征,然后通过视觉-文本相似度计算逐patch的异常分数图和图像级异常分数。关键创新在于向CLIP的前J层(默认4层)注入混合可学习提示,同时作用于视觉和文本两个编码器分支。
关键设计¶
-
静态提示(Static Prompts):每层维护一组可学习参数(length=5, depth=4),所有图像共享。训练时通过辅助数据优化,让CLIP整体理解"什么是异常"。在transformer每层的输入中,静态提示被拼接或替换到序列中——第一层直接拼接,后续层替换前一层的提示位置。这组提示相当于给CLIP装了一个"异常检测眼镜",是任务级的适配。
-
动态提示(Dynamic Prompts):先用冻结的CLIP视觉编码器提取当前图像的CLS token特征,然后通过两个可学习的ProjectLayer分别生成视觉和文本两组动态提示。这些提示与静态提示相加融合后注入transformer。动态提示让模型能"看一眼"当前图像再决定用什么策略检测异常,实现实例级自适应——比如看到电路板就关注焊点,看到织物就关注纹理。
-
混合语义融合模块(Hybrid Semantic Fusion, HSF):从多层级patch tokens中,根据初步异常分数图选出top-k个最可疑patch(k = clusters × 5),用K-Means聚类(k=20)提取聚类中心作为语义摘要。这个模块解决了多层级特征融合的问题——不同层捕获不同粒度的异常信息,HSF通过聚类找到共识性的异常区域。
-
文本提示设计:使用手工模板的集成策略。正常状态用7个模板(如"flawless {}"、"perfect {}"),异常状态用5个模板(如"damaged {}"、"{} with defect"),再与4个视角模板(如"a bad photo of a {}")组合,对所有组合的文本嵌入取平均得到两个代表性向量(正常/异常)。
损失函数 / 训练策略¶
- 分类损失:图像级Focal Loss,监督异常分数
- 分割损失:逐层 Focal Loss + 双向Dice Loss(正常区域和异常区域各自一个Dice Loss)
- 总损失:classification_loss + seg_loss
- 优化器:AdamW(β₁=0.5, β₂=0.999),仅更新可学习参数(静态提示、动态提示生成器、投影层),CLIP主干完全冻结
- 使用FP16混合精度训练,作者建议多次训练取验证集最优
- 默认训练集:MVTec AD + ColonDB;验证集:VisA + ClinicDB(交叉域训练-测试)
实验关键数据¶
工业异常检测(7个数据集,Image-level AUROC / Pixel-level AUROC):
| 数据集 | 指标 | AdaCLIP | 之前SOTA | 对比方法 |
|---|---|---|---|---|
| MVTec AD | Image AUROC | ~91+ | ~88 (AnomalyCLIP) | APRIL-GAN, WinCLIP, SAA |
| VisA | Image AUROC | ~83+ | ~79 (AnomalyCLIP) | 同上 |
| 14数据集平均 | Image+Pixel | SOTA | - | 跨工业+医学域 |
注:具体数值因训练集选择略有波动,在GitHub README中作者提供了完整结果图。
关键消融实验:
| 配置 | 说明 | 效果 |
|---|---|---|
| S only | 仅静态提示 | 有效但不够 |
| D only | 仅动态提示 | 有效但不如混合 |
| SD (hybrid) | 静态+动态混合 | 最优,两者互补 |
| VL branch | 视觉+文本双分支提示 | 优于单分支 |
| w/ HSF | 使用混合语义融合 | 进一步提升像素级检测 |
消融实验要点¶
- 静态+动态的组合效果大于两者之和,说明两种提示在功能上互补(静态做粗适配,动态做细调整)
- 视觉和文本双分支同时注入提示显著优于只在一个分支注入
- HSF模块主要提升像素级定位精度,对图像级检测增益较小
- 辅助训练数据的多样性对泛化至关重要——使用更多不同域的数据训练效果更好
亮点¶
- "静态+动态"的提示融合思路非常优雅:静态提示学习任务先验(什么是异常),动态提示捕捉实例特征(这张图的异常可能长什么样),两个层次的自适应各司其职
- 动态提示的生成方式很轻量:仅用冻结CLIP的CLS token通过线性层生成,不引入复杂的额外网络
- 跨域泛化设计:用MVTec(工业)+ ColonDB(医学)联合训练,在VisA(工业)+ ClinicDB(医学)上测试,证明方法不依赖特定域
- 文本提示的集成策略:多模板取平均比单一模板更鲁棒,类似于分类器的ensemble思想
局限性 / 可改进方向¶
- FP16训练不稳定:作者自己承认需要多次训练取最优,暗示方法对超参数和训练细节较敏感
- 辅助数据依赖:虽然是"零样本",但仍需要大量有标注的辅助异常检测数据来训练提示,这在实际部署中可能是瓶颈
- K-Means在HSF中的效率:每张图做K-Means聚类会引入额外推理延迟,且K-Means对初始化敏感
- 纯patch级异常检测:缺乏对结构性/全局性异常的显式建模
- 可能的改进方向 → 用更高效的聚类替代K-Means、探索无需辅助数据的自监督prompt学习、将动态提示的生成与HSF模块整合形成端到端的自适应循环
与相关工作的对比¶
- vs. WinCLIP:WinCLIP用滑窗+多尺度做零样本AD,但完全依赖手工提示,无学习能力;AdaCLIP引入学习让CLIP"懂"异常检测
- vs. AnomalyCLIP:AnomalyCLIP同样使用可学习提示,但只有静态提示(object-agnostic text prompts),缺乏逐图动态适配能力;AdaCLIP加入动态提示后泛化更好
- vs. APRIL-GAN:APRIL-GAN关注于生成数据做训练辅助,AdaCLIP则聚焦于提示设计,两者思路正交
- 核心差异:AdaCLIP是第一个在ZSAD中同时使用静态+动态混合提示的方法,且同时作用于视觉和文本双分支
启发与关联¶
- 混合提示的设计思路可迁移到其他零样本视觉任务(如零样本分割、开放词汇检测),"全局知识提示+逐样本动态提示"的框架具有普适性
- 动态提示的生成方式(CLS token → 线性投影 → 注入transformer层)非常轻量,值得在其他prompt learning场景借鉴
- 与 ideas/ 中的 流形先验多样化蒸馏用于视觉异常检测 有直接关联:AdaCLIP的辅助数据跨域训练策略验证了"统一医学+工业异常检测"的可行性,其混合提示设计可作为该idea的文本分支基线
评分¶
- 新颖性: ⭐⭐⭐⭐ 静态+动态混合提示的idea清晰且有效,但prompt learning本身不算新
- 实验充分度: ⭐⭐⭐⭐⭐ 14个数据集(7工业+7医学)覆盖面广,消融实验充分
- 写作质量: ⭐⭐⭐⭐ 方法描述清晰,但HTML版本渲染有问题(实际是ECCV模板)
- 价值: ⭐⭐⭐⭐ 对零样本异常检测领域有实质推动,代码开源且star数高(298),方法具有借鉴意义