MoECLIP: Patch-Specialized Experts for Zero-shot Anomaly Detection¶
会议: CVPR 2026
arXiv: 2603.03101
代码: 有
领域:目标检测
关键词: 零样本异常检测, 混合专家, CLIP, LoRA, 专家特化
一句话总结¶
提出 MoECLIP,将 Mixture-of-Experts 引入零样本异常检测(ZSAD),通过冻结正交特征分离(FOFS)和等角紧框架(ETF)损失实现 patch 级别的动态专家路由与特化,在14个工业/医学基准上达到 SOTA。
研究背景与动机¶
1. 领域现状¶
视觉异常检测(AD)用于识别偏离正常模式的区域,在工业缺陷检测和医学图像诊断中至关重要。传统无监督异常检测(UAD)仅从正常数据学习,但仍需要大量正常样本。零样本异常检测(ZSAD)利用 CLIP 等视觉-语言模型的强大泛化能力,无需目标类别的训练数据即可检测异常,成为新兴范式。
2. 痛点¶
CLIP 预训练目标是全局语义理解,不擅长检测局部异常。现有 ZSAD 方法(PromptAD、AnomalyCLIP、AdaCLIP、AA-CLIP)虽然通过提示学习、适配器等方式增强 patch 表示,但都采用patch-agnostic 设计:对所有 patch 施加相同的统一变换,忽略不同图像区域(物体部件、背景、异常区域)的独特特性。
3. 核心矛盾¶
需要对 CLIP 做异常检测特化,但又要保留其泛化能力;需要对不同 patch 差异化处理,但简单的多专家组合会产生功能冗余(experts 学到相似功能)。
4. 要解决什么¶
(1) 打破 patch-agnostic 的设计局限,实现 patch 级别的动态适配;(2) 解决 MoE 的专家功能冗余问题,确保每个专家真正特化。
5. 切入角度¶
将 MoE 架构与 LoRA 结合引入 ZSAD,在输入端和输出端同时施加约束来分离专家功能。
6. 核心 idea¶
用 MoE 架构动态路由每个 patch 到合适的 LoRA 专家;用 FOFS 在输入端正交分割特征空间,用 ETF loss 在输出端强制最大等角分离,双管齐下消除专家冗余。
方法详解¶
整体框架¶
MoECLIP 想解决的核心问题是:CLIP 的 patch 特征对所有区域一视同仁,而异常检测恰恰需要区分物体、背景和缺陷这些性质迥异的 patch。它的做法是给冻结的 CLIP Vision Encoder(ViT-L/14-336)装上一组「按 patch 分流」的专家。具体来说,在编码器第 6、12、18、24 层的输出端各插入一个 MoE 模块,每个模块由 K=4 个 LoRA 专家和一个线性路由器组成,路由器为每个 patch 算出专家分数并取 Top-2 加权。
一张图进来后,CLIP ViT 先抽出多层 patch 特征,每一层的 MoE 模块根据 patch 内容把它路由给合适的专家做残差适配;适配后的特征经 PAA 在多个尺度上聚合,再分两路出口——逐 patch 与文本特征算相似度得到像素级异常图,全局特征经 Depth-wise Adapter 与文本算相似度得到图像级异常分数。训练只在辅助数据集(VisA)上做监督,测试时面对的是完全没见过的类别。整条链路里真正可学习的只有 LoRA 的上投影、路由器和两个轻量适配头,CLIP 主干始终冻结。
%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400, 'subGraphTitleMargin': {'top': 8, 'bottom': 16}}}}%%
flowchart TD
A["输入图像 518×518"] --> B["CLIP ViT-L/14(冻结)<br/>取第 6/12/18/24 层 patch 特征"]
subgraph MOE["MoE 特征适配(每层一个 · Top-2 路由 + K=4 LoRA 专家)"]
direction TB
C["FOFS(输入端分离)<br/>正交分块下投影 A 冻结,切 K 个子空间"] --> D["K 个 LoRA 专家<br/>路由器取 Top-2 加权残差"]
D --> E["ETF Loss(输出端分离)<br/>约束专家输出等角最大分离"]
end
B --> MOE
MOE --> F["PAA 多尺度聚合<br/>滑窗 s∈{1,3,5} 均值池化 · 零参数"]
F -->|逐 patch 与文本算相似度| G["像素级异常图"]
F -->|取末层特征| H["Depth-wise Adapter<br/>深度可分离卷积 + GAP → V_image"]
H -->|与文本算相似度| I["图像级异常分数"]
关键设计¶
1. MoE 特征适配:让每个 patch 走自己的专家通道
这一项直接对应「patch-agnostic」的痛点——既然不同区域性质不同,就不该用同一个变换去改它们。每层的 MoE 模块拿到 patch 特征 \(F_i^l \in \mathbb{R}^d\) 后,路由器算出各专家的分数,挑 Top-2 专家加权得到残差输出 \(F_{i,\text{expert}}^l\)。这里有个容易被忽略却很关键的细节:MoE 的原始输出范数和 CLIP 特征对不上,直接相加会把表示空间搅乱、训练不稳还伤泛化,所以先把残差做 \(\ell_2\) 范数归一化对齐到原特征量级,再以很小的权重(\(\lambda_{\text{MoE}}=0.1\))做残差混合。用 LoRA(rank=8)当专家而不是全连接层,本身参数量就少、过拟合风险低,这对「无目标类训练数据」的零样本场景尤其重要。
2. FOFS(冻结正交特征分离):从输入端就把专家的「视野」掰开
多专家最怕的是大家学成一个样(功能冗余),FOFS 的思路是在输入端就物理隔离——把 \(d\) 维特征空间切成 \(K\) 个互不重叠的子空间 \(c_1, \dots, c_K\),让第 \(n\) 个专家只能「看见」第 \(n\) 块。落到实现上,专家的 LoRA 下投影矩阵 \(A_n \in \mathbb{R}^{r \times d}\) 被构造成分块形式:只有第 \(n\) 个子空间对应的那些列填上 QR 分解得到的正交矩阵 \(Q_n\),其余列全置零。这样任意两个专家满足
输入子空间天然正交、从初始化就杜绝了重叠。更巧的是 \(A_n\) 全程冻结、只让 \(B_n\) 学习——这既保住了 CLIP 的泛化能力、压低过拟合,又呼应了近期 LoRA 研究的发现:随机初始化的正交下投影矩阵,效果可以媲美费劲学出来的。
3. ETF Loss(等角紧框架损失):在输出端再补一刀分化
FOFS 只管住了输入端,可学习的 \(B_n\) 仍可能把不同专家的输出又拉回到相似的方向,所以还需要一个输出端的约束。ETF loss 对每层每个 patch,把 \(K\) 个专家输出做 \(\ell_2\) 归一化后算 Gram 矩阵,再用 Frobenius 范数惩罚它和「理想 ETF 结构」的差距——理想结构要求对角线为 1(单位范数)、非对角线统一为 \(-1/(K-1)\),也就是让专家向量在超球面上达到最大等角分离。它和 FOFS 是一对互补搭子:一个在入口切空间、一个在出口拉角度,合起来才能把专家相似度真正压到接近 0(消融里从原始 MoE 的 0.45 一路降到 0.02)。
4. PAA(Patch 平均聚合):把多尺度感知提前到训练阶段
ViT 的 patch 尺寸是固定的,一块小缺陷和一片大病灶用同一粒度去看很难都照顾到;而以往方法的 patch 聚合只在测试时临时拼一下,训练阶段根本没有多尺度信号。PAA 把 patch 嵌入重排成 2D 空间网格,对滑窗尺度 \(s \in \{1, 3, 5\}\) 分别做均值池化,独立产出多组 patch 特征,整个操作零额外参数。这个改动对医学数据集尤其管用——病灶大小跨度大,提前在训练里见过多尺度上下文,检测时才不至于漏掉。
5. Depth-wise Adapter:给图像级分数一个语义对齐的全局表示
像素级异常图之外,还需要一个干净的全局向量来算整图异常分数。这里借鉴 MobileNet 的轻量结构,用 1D 深度可分离卷积(Depthwise + Pointwise)处理最后一层的 PAA 特征,再全局平均池化得到图像级向量 \(V_{\text{image}}\),与文本特征算余弦相似度即为图像级异常分数。深度可分离卷积参数少,不会给冻结主干增加多少负担,又能把局部特征整合成一个语义对齐的表示。
路由确实学到了内容相关的分工:Grad-CAM 可视化里 Expert 1 聚焦异常区、Expert 2 聚焦物体主体、Expert 3 聚焦背景,说明同一张图里不同性质的 patch 被分流到了不同专家。
损失函数 / 训练策略¶
总损失:\(\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{seg}} + \mathcal{L}_{\text{ac}} + \lambda_{\text{etf}}\mathcal{L}_{\text{etf}} + \lambda_{\text{bal}}\mathcal{L}_{\text{bal}}\)
- 分割损失 \(\mathcal{L}_{\text{seg}}\):Focal + Dice Loss,作用于多层多尺度异常图
- 分类损失 \(\mathcal{L}_{\text{ac}}\):BCE Loss,作用于图像级异常分数
- ETF 损失:\(\lambda_{\text{etf}}=0.01\),约束专家输出等角
- Balance 损失:\(\lambda_{\text{bal}}=0.01\),用路由概率的变异系数平方防止专家坍塌
训练配置:OpenCLIP ViT-L/14-336,图像 518×518,Adam \(\text{lr}=5 \times 10^{-4}\),20 epoch,2×V100 16GB。
实验关键数据¶
主实验¶
在14个数据集(5工业+9医学)上与6个 SOTA 方法对比,训练集均为 VisA(评估 VisA 时用 MVTec-AD 训练)。
表1:图像级异常分类(AUROC, AP)
| 方法 | MVTec-AD | VisA | BTAD | RSDD | DTD-Syn | BrainMRI | HeadCT | LiverCT | RetinaOCT | 平均 |
|---|---|---|---|---|---|---|---|---|---|---|
| WinCLIP | (91.8,95.1) | (78.1,77.5) | (83.3,84.1) | (85.3,65.3) | (95.0,97.9) | (45.1,80.3) | (83.7,81.6) | (66.5,56.1) | (53.7,44.3) | (75.8,75.8) |
| AnomalyCLIP | (91.9,96.2) | (82.1,85.4) | (92.5,94.2) | (74.0,73.2) | (93.3,97.7) | (70.8,90.6) | (95.1,95.3) | (68.2,63.4) | (74.7,73.9) | (82.5,85.5) |
| AA-CLIP | (90.9,96.0) | (79.2,83.7) | (94.8,97.5) | (94.9,94.2) | (92.5,97.7) | (79.6,94.4) | (95.4,94.3) | (58.4,49.7) | (83.4,83.8) | (85.5,87.9) |
| Bayes-PFL | (92.2,96.1) | (86.8,89.3) | (93.0,96.7) | (91.3,89.7) | (93.5,97.7) | (81.9,94.5) | (95.4,93.2) | (61.7,55.2) | (83.7,81.8) | (86.6,88.2) |
| MoECLIP | (93.9,96.8) | (83.6,86.2) | (93.1,98.0) | (95.3,95.1) | (95.5,98.6) | (88.5,97.1) | (96.6,94.5) | (74.0,64.6) | (85.5,84.9) | (89.6,90.6) |
MoECLIP 图像级平均 AUROC 89.6%(+3.0%),AP 90.6%(+2.4%)。
表2:像素级异常分割(AUROC, AP)- 部分数据
| 方法 | MVTec-AD | BTAD | BrainMRI | ColonDB | ClinicDB | Kvasir | 平均 |
|---|---|---|---|---|---|---|---|
| AA-CLIP | (91.6,45.4) | (95.6,49.4) | (96.7,55.1) | (82.8,31.5) | (89.2,49.8) | (86.0,52.9) | (93.2,45.8) |
| Bayes-PFL | (91.9,48.4) | (95.6,48.6) | (95.7,42.9) | (82.9,30.7) | (88.2,49.1) | (85.6,53.4) | (93.2,44.3) |
| MoECLIP | (92.5,45.7) | (96.8,50.4) | (97.3,61.3) | (85.4,34.8) | (89.7,49.9) | (88.1,57.6) | (94.3,47.5) |
像素级平均 AUROC 94.3%(+1.1%),AP 47.5%(+1.7%)。医学数据集提升尤为显著(BrainMRI AP +6.2%,Kvasir AP +4.2%)。
消融实验¶
表3:组件消融(Pixel AUROC, Image AUROC)
| 配置 | MVTec-AD | DTD-Syn | HeadCT | ColonDB | 平均 |
|---|---|---|---|---|---|
| Vanilla CLIP | (38.4,74.1) | (33.9,71.6) | (-,56.5) | (49.5,-) | (40.6,67.4) |
| w/o FOFS & ETF | (91.6,91.7) | (97.8,93.1) | (-,94.4) | (84.1,-) | (91.2,93.1) |
| w/o FOFS | (92.0,92.8) | (98.3,93.9) | (-,95.0) | (85.3,-) | (91.9,93.9) |
| w/o ETF Loss | (92.2,92.7) | (98.2,93.4) | (-,96.1) | (84.6,-) | (91.7,94.1) |
| w/o Depth Adapter | (92.0,92.5) | (98.1,93.8) | (-,94.5) | (85.0,-) | (91.7,93.6) |
| w/o PAA | (92.1,92.8) | (98.1,94.7) | (-,93.1) | (81.9,-) | (90.7,93.5) |
| MoECLIP (full) | (92.5,93.9) | (98.8,95.5) | (-,96.6) | (85.4,-) | (92.2,95.3) |
关键发现¶
- FOFS 和 ETF 是互补的:单独移除任一组件均导致性能下降,两者共同移除下降更大,证明输入端+输出端双重约束的必要性
- 功能冗余量化:专家间余弦相似度从原始 MoE 的 0.45 → +FOFS 后 0.24 → +ETF 后 0.02,近乎完全消除冗余
- PAA 对医学域至关重要:移除 PAA 后 HeadCT 下降 3.5%、ColonDB 下降 3.5%,多尺度感知对医学异常检测影响大
- 专家数量不是越多越好:K=4 最优,K>4 反而因功能冗余导致性能下降
- 跨域泛化:仅在工业数据训练,MoE 专家依然能在医学数据上有效特化路由
亮点与洞察¶
- 首次将 MoE 引入 ZSAD:开创性地从 patch-agnostic 到 patch-specialized 的范式转变
- 双端约束设计优雅:FOFS 在输入端物理隔离子空间(冻结、零额外参数),ETF loss 在输出端用几何最优结构约束,两者正交互补
- 可视化验证直观:Grad-CAM 清晰展示 Expert 1 聚焦异常区、Expert 2 聚焦物体主体、Expert 3 聚焦背景,证明路由确实基于内容特性
- FOFS 冻结 A 矩阵的巧妙之处:利用近期 LoRA 研究发现(随机正交 A ≈ 学习 A),同时获得正交分离+参数节省+过拟合抑制三重收益
局限与展望¶
- 专家数量手动设定:K=4 是经验值,缺乏自适应确定专家数量的机制
- FOFS 等分子空间:将特征维度均匀分给各专家,未考虑不同专家可能需要不同维度
- 仅在 ViT-L/14 验证:未探索不同 backbone 规模(如 ViT-B、ViT-H)的效果
- 训练数据单一:始终用 VisA 做辅助训练集,未探索不同训练集对泛化的影响
- PAA 窗口尺度固定:\(s \in \{1,3,5\}\) 是手动设定,可考虑自适应或可学习的尺度选择
相关工作与启发¶
- ZSAD 系列方法演进:WinCLIP → April-GAN → AnomalyCLIP → AdaCLIP → AA-CLIP → Bayes-PFL → MoECLIP,从手工prompt到学习prompt,再到适配器,最终到 MoE 动态路由
- MoE 功能冗余解决方案:现有方法(对比损失、正交正则化)仅作用于输出端,本文同时约束输入端和输出端,思路可推广到其他 MoE 场景
- LoRA 冻结 A 矩阵的启发:VeRA 等工作已验证共享/冻结下投影矩阵的可行性,本文将其与正交分离结合,值得在其他 PEFT+MoE 场景探索
评分¶
- 新颖性: ⭐⭐⭐⭐ 将 MoE 引入 ZSAD 开创 patch-specialized 新范式,FOFS+ETF 双端约束思路独到
- 实验充分度: ⭐⭐⭐⭐⭐ 14个数据集(工业+医学)全面对比+消融+可视化+专家相似度量化,非常扎实
- 写作质量: ⭐⭐⭐⭐ 动机清晰、方法描述系统、可视化丰富
- 价值: ⭐⭐⭐⭐ 对 ZSAD 和 MoE 功能冗余两个问题同时给出了优雅解法,可推广到其他 PEFT+MoE 场景