DuoAD:Leveraging [CLS] Dual Characteristics for Training-Free Few-Shot Anomaly Detection
關鍵字:AI, Anomaly Detection, Few-Shot, Training-Free, Vision Transformer, [CLS] Token, DINOv2, DINOv3, Industrial Inspection
論文作者:Jyun-Ze Tang, Po-Han Huang, Ming-Ching Chang, Chih-Fan Hsu, Jeng-Lin Li
時間:2026 / 07 / 27
這篇論文在做什麼?
工業異常檢測通常要回答兩個問題:
- 這張圖片有沒有瑕疵?
- 瑕疵出現在什麼位置?
傳統 Unsupervised Anomaly Detection 會蒐集大量正常影像,針對特定資料集訓練模型。產線剛建立時,正常樣本往往很少,甚至只有一到四張可用參考圖。Few-Shot Anomaly Detection 因此改用預訓練 Vision Foundation Model,直接把少量正常影像建立成 Feature Memory Bank,再以 Feature Distance 判斷測試影像是否偏離正常分布。
這類方法看起來很適合快速部署,實際使用時仍有兩個問題:
- Augmentation Policy 經常需要人工設定。螺絲可允許任意旋轉,但膠囊、電路板等具有固定方向的零件則可能因旋轉產生錯誤參考特徵。同一套 Rotation、Flip Policy 很難直接套用到所有類別。
- Patch-Based 方法通常把所有位置視為同等重要。物件、背景和瑕疵 Patch 都以相同規則進入 Nearest-Neighbor Matching,模型缺少一個可靠的 Global Context 去判斷哪些空間位置更值得注意。
DuoAD 從 ViT 的 [CLS] token 找到兩個互補特性:
- Semantic Stability:
[CLS]embedding 主要描述物件整體語意,對局部瑕疵相對穩定。 - Structural Sensitivity:
[CLS]到 Patch Tokens 的 Pre-Softmax Attention Logits 會對局部結構異常產生較高響應。
DuoAD 將兩個特性分別用在:
- Self-Calibrated Augmentation(SCA):根據未標註產線資料的 Distribution Consistency,自動決定哪些 Augmentation 可以安全使用。
- Attention-Guided Feature Reweighting (Saliency):使用
[CLS]Attention Logits 對 Patch Anomaly Scores 進行連續式加權,放大瑕疵區域並抑制背景。
再搭配 Multi-Level Features,整套方法不需要訓練 Backbone,也不需要逐類別調整參數。
這篇論文從哪裡開始?
DuoAD 的想法最初來自一個簡單的嘗試:能不能用 [CLS] token 與各個 Patch Tokens 的相似度來建立一張 Saliency Map,把背景濾掉、讓前景與瑕疵得到更多關注?
第一個嘗試:CLS–Patch Cosine Similarity
直覺上,[CLS] 聚集整張圖的 Global Semantics,因此與 [CLS] 高度相似的 Patch 應該屬於前景,低相似度的則可能是背景。這個假設確實能區分物件與背景,但也暴露一個問題:[CLS] embedding 對局部異常非常不敏感。結果是 Cosine Similarity 會把異常 Patch 當成背景,給予較低權重,導致加權的假設失效。但另一個想法就是既然比較低,能不能反向找出來,但遺憾的是他也沒有低到能夠很直接的區分出來前景 / 背景 / 瑕疵。
下圖以 MVTec-AD Hazelnut 為例,第三欄是 [CLS] 與每個 Patch 的 Cosine Similarity。異常區域與正常前景的響應幾乎混在一起,只是相較於前景在低一點。
第二個嘗試:Post-Softmax Attention Weights
同一時間,PatchEAD 觀察到 ViT 最後一層的 [CLS] Attention Weights 可以用來切割前後景:前景區域經常獲得較高的 Attention Response,能透過一個 threshold 切出來,看起來是個不錯的 Saliency 信號。但我進一步發現,分數經過 Softmax 後會變得非常稀疏,少數 Patch 拿走絕大部分權重。這種「贏者全拿」的輸出不適合拿來做 Reweighting,這也是為何 PatchEAD 只用了手動 threshold 二值化;何況高 Attention 不等於瑕疵位置,只是 ViT empirically 對異常區域的響應較強,這也是這篇論文的發現之一。
下圖第四欄是 Post-Softmax Attention Weights:雖然異常處有亮點,但響應過度集中,周圍正常區域幾乎被壓到零,無法平滑地調整每個 Patch 的貢獻。
最終選擇:Pre-Softmax Attention Logits
既然 Post-Softmax 的問題來自 Softmax 的競爭式 Normalization,直接使用 Softmax 之前的 Raw Score,也就是 Attention Logits,就能保留完整的響應範圍。如下面最右欄所示,Pre-Softmax Attention Logits 在異常區域有明顯高響應,同時保留正常區域的連續變化,適合用來平滑地對 Patch Anomaly Scores 做 Reweighting。
兩個看似衝突的觀察
Cosine Similarity 對局部瑕疵穩定,Attention Logits 對局部結構異常敏感。這兩個信號的行為互補,正好能分別用在不同任務上。
這就是 DuoAD 標題中的 Dual Characteristics。論文進一步在 MVTec-AD 上驗證這個現象:異常 Patch 傾向呈現「高 Attention Logits、低 Cosine Similarity」的分布,背景則在兩種信號中都被抑制。
這個發現後來衍伸成兩條應用路線:
- 利用
[CLS]embedding 對局部瑕疵不敏感的特性,判斷 Augmentation 後的資料是否偏離原始分布,藉此決定該 Augmentation 能否使用。 - 利用 Attention Logits 對異常敏感的特性,重新調整 Patch Anomaly Score 的空間權重。
整篇研究中,最難定義貢獻的元件其實是 SCA。Attention Logits 的用途相對直接:高 Saliency 區域增加權重,低 Saliency 區域降低權重。SCA 面對的問題更微妙,因為「符合資料分布」和「取得最高 Benchmark Performance」屬於不同目標。
以旋轉為例,某個零件在真實資料中從未旋轉,SCA 因此會拒絕 Rotation,因為旋轉後的 Feature Distribution 明顯偏離觀察到的 Target Distribution。
但在 Benchmark 上,強制加入 Rotation 仍可能提高 Feature Diversity,最後取得更高 AUROC。只是這類增益必須透過 Label、Validation Performance 或事後 Backtrace 才能驗證,違反了 DuoAD 全自動、無人工介入的設定初衷。SCA 的目的是:
在產線初期缺少 Label、Validation Set 與人工設定時,先給出一個 Distribution-Preserving 的 Safe Augmentation Policy。
它避免明顯有害的轉換,讓系統可以直接開始運作,不需要人工介入。這對大規模部署與產線 Scale Up 是很實際的功能,你不能期望每個產線員工都是 AI 專家,清楚各種奇怪的參數該怎麼調。全自動化才能避免錯誤發生。當然,這裡也牽扯到學術和業界之間的差異:學術上未必覺得這很重要,畢竟就只是一個參數設定,但每多一個參數,就多一分出錯的機率。
Few-Shot Memory Bank
雖然 Memory Bank 已經不是新東西,還是先看一下 Patch Memory Bank 的運作方式。
假設只有一張正常參考影像。ViT 會將影像切成 Patch Tokens,並輸出每個位置的 Feature,此時每個 Patch 都可以視為一個 Local Feature Descriptor。這些 Patch Features 收集起來就構成 Memory Bank。檢測時,每個測試 Patch 都到 Memory Bank 中尋找最接近的正常 Feature;距離越大,代表這個 Patch 越偏離正常分布。
DuoAD 的 Framework 圖(見下節)也描繪了這個流程:從少量正常參考影像提取 Multi-Layer Patch Features,建構 Memory Bank,再與測試影像進行 Nearest-Neighbor Matching。
令 Memory Bank 為:
\[\mathcal{M} \in \mathbb{R}^{K \times D}\]其中 $K$ 是儲存的 Feature 數量,$D$ 是 Feature Dimension。對測試影像第 $i$ 個、已經 L2 Normalized 的 Patch Feature $f_i$,基本 Anomaly Score 為:
\[s_i = \min_{m \in \mathcal{M}} \left(1-f_i^\top m\right)\]這就是最基本的 Cosine Nearest-Neighbor Matching。
DuoAD 的完整流程
DuoAD 分成 Warmup Stage 和 Inference Stage。整體流程由一張 Framework 圖概括:
從左到右可以看到兩條主軸:
- 上方 Warmup Stage:未標註 Target-Domain Images 經過 Self-Calibrated Augmentation,選出安全的 Augmentation Policy。
- 下方 Inference Stage:少量正常 Reference 經過選定的 Augmentations 擴充後,建立 Multi-Layer Feature Memory Bank;測試影像的 Patch Features 與 Memory Bank 做 Nearest-Neighbor Matching,再以
[CLS]Attention Logits 對 Patch Scores 做重加權,得到 Final Anomaly Map。
核心元件共有三個:
- Self-Calibrated Augmentation
- Attention-Guided Feature Reweighting
- Multi-Level Feature Fusion
1. Self-Calibrated Augmentation
為什麼 Augmentation Policy 很難設定?
Few-Shot AD 的 Reference 太少,Augmentation 幾乎是最直接的 Feature Expansion 方法。
對方向不敏感的物件,Rotation 和 Flip 可以大幅增加 Coverage。對方向、文字、接腳位置或結構排列有意義的物件,同一組操作可能產生不合理 Reference。
常見做法包含:
- 所有類別套用相同 Augmentation。
- 人工逐類別設定 Rotation、Flip。
- 透過 Validation Set 選擇最高分 Policy。
第一種方式容易傷害方向敏感類別。第二種方式難以擴展到大量產線。第三種方式需要 Label 或 Performance Feedback,冷啟動階段通常沒有這些資訊。
用 Distribution Consistency 決定 Policy
SCA 使用一組未標註 Calibration Set:
\[\mathcal{X}=\{x_1,x_2,\ldots,x_n\}\]這些圖片可以來自:
- 產線 Commissioning Warmup
- Batched Inference
- Online Calibration Buffer
對每張圖片提取 [CLS] embedding:
接著計算集合內不同來源影像之間的平均 Pairwise Cosine Similarity:
\[S(\mathcal{X}) = \frac{1}{|\mathcal{P}|} \sum_{(x_i,x_j)\in\mathcal{P}} \operatorname{sim}\left(f(x_i),f(x_j)\right)\]其中:
\[\mathcal{P} = \left\{ (x_i,x_j) \mid x_i,x_j\in\mathcal{X}, \operatorname{src}(x_i)\neq\operatorname{src}(x_j) \right\}\]src 限制用來避免原圖和自己的 Augmented Version 互相比較,造成不合理的高相似度。
對候選 Augmentation $\phi$,SCA 再計算轉換後集合的 Coherence:
\[S(\phi(\mathcal{X}))\]若轉換後的集合仍維持足夠一致性,就接受該操作:
\[S(\phi(\mathcal{X})) \geq \frac{S(\mathcal{X})}{1+\tau_{\phi}}\]其中 $\tau_{\phi}$ 是固定的 Operator-Specific Tolerance。論文在所有 Backbone 和 Dataset 上固定使用:
- Rotation:$\tau_{\phi}=0.017$
- Flip:$\tau_{\phi}=0.003$
這個判斷只會輸出 Accept 或 Reject,沒有使用 Anomaly Label、Validation Score、Anomaly-Score Feedback 或逐類別人工設定。
一個直覺例子
如果某條產線上的螺絲方向差異很大,旋轉後的樣本仍然屬於同一個物件分布,[CLS] Coherence 幾乎不變,SCA 就會接受 Rotation。反之,如果零件具有固定方向或接腳排列,旋轉後的樣本會偏離原本的 Semantic Manifold,Coherence 明顯下降,SCA 就會拒絕 Rotation。SCA 關心的始終是轉換後的資料能否維持目前觀察到的 Distribution。
Safe Policy 和 Best Policy 的差異
這裡是理解 SCA 最重要的地方。
SCA 的 Policy 選擇依據是 Distribution Consistency。只要某個 Transformation 明顯破壞物件方向、結構或 Pose 分布,它就會被拒絕。這個準則可以在沒有 Label 的條件下執行,也符合產線冷啟動需求。
Benchmark 的最高 Performance 還受到 Feature Diversity 影響。某些 Distribution-Shifting Augmentation 雖然不符合原始資料分布,仍可能擴大 Memory Bank Coverage,降低測試樣本的 Matching Distance。
VisA 的 Macaroni1、Zipper 類別就呈現這種情況。AugAll 有時能靠更廣的 Transformed References 得到額外增益,SCA 則傾向保守地維持原始 Distribution。
因此可以把兩種目標分開理解:SCA 負責在沒有 Label 的情況下自動產生安全且可部署的 Policy;Performance Search 則負責事後透過 Validation 或 Backtrace 尋找最高分的 Policy。前者解決產線初期的可部署性,後者處理後續最佳化。
為什麼髒資料也能運作?
SCA 的 Warmup Set 可以包含異常樣本。
其穩定性來自兩層機制。
第一層是 [CLS] embedding 對局部缺陷的 Semantic Stability。預訓練 ViT 通常以主要前景、物件類型和整體結構形成 Global Representation,小範圍瑕疵對集合 Coherence 的影響有限。
第二層是 Relative Coherence Change。瑕疵會同時存在於 $\mathcal{X}$ 和 $\phi(\mathcal{X})$,其影響在比值中部分抵消。錯誤 Transformation 會改變整體 Semantic Manifold,造成更明顯的 Coherence Drop。
Supplementary 將 MVTec-AD 的 Anomaly Contamination 從 0% 提高到 100%。Object Categories 的 Policy 維持高度一致;Texture Categories 在高污染率下出現部分 Policy Transition,但 Texture 本身通常缺乏固定方向,這些變化對檢測結果影響有限。
Warmup 需要多少樣本?
論文以 60 張樣本得到的 Policy 作為 Reference,再測量不同 Sample Count 的 Policy Inconsistency。
結果顯示:
- 超過 10 張後,Inconsistency 明顯下降。
- 20 到 30 張後逐漸穩定。
- 主要實驗使用 30 張 Warmup Samples。
- 資料不足時仍可使用更少樣本,代價是較高 Policy Variance。
| Sample Count | MVTec DINOv3 I-AUC | MVTec DINOv3 P-PRO | VisA DINOv3 I-AUC | VisA DINOv3 P-PRO |
|---|---|---|---|---|
| 2 | 97.7 | 94.7 | 92.1 | 92.9 |
| 4 | 97.7 | 94.7 | 93.2 | 93.1 |
| 10 | 97.7 | 94.7 | 92.2 | 92.9 |
| 20 | 97.7 | 94.7 | 93.2 | 93.2 |
| 30 | 97.7 | 94.7 | 93.2 | 93.2 |
| 40 | 97.7 | 94.7 | 93.2 | 93.2 |
VisA 的 PCB1 對小樣本較敏感,原因是資料包含兩個主要 Orientation。Warmup Set 太小時,可能只抽到其中一個方向,導致 Rotation Policy 判斷不穩定。
2. Attention-Guided Feature Reweighting
Patch Matching 缺少 Spatial Importance
標準 Memory Bank 只看 Patch Feature Distance:
\[s_i = \min_{m\in\mathcal{M}} \left(1-f_i^\top m\right)\]這個分數沒有區分背景、正常前景和結構關鍵區域。背景紋理改變、光線或邊界噪聲都可能產生高 Matching Cost。
DuoAD 從 ViT 最後一層取出 [CLS] 到所有 Spatial Patches 的 Pre-Softmax Attention Logits:
其中 $H$ 是 Attention Heads 數量,$N$ 是 Patch 數量。
為什麼用 Pre-Softmax Logits?
Softmax 會讓所有 Patch Attention 互相競爭:
\[\operatorname{softmax}(L_i) = \frac{e^{L_i}}{\sum_j e^{L_j}}\]結果通常變得稀疏,少數 Patch 取得大部分權重,其餘位置接近零。這種輸出適合表示注意力分配,但拿來做 Dense Reweighting 時容易丟失連續細節。
Pre-Softmax Logits 保留完整 Response Range,可以在不設定 Binary Threshold 的情況下平滑調整每個 Patch。
Head-Wise Normalization
DuoAD 先對每個 Attention Head 做 Spatial Min-Max Normalization,再跨 Heads 平均:
\[\bar{a}_i = \frac{1}{H} \sum_{h=1}^{H} \frac{ L_{h,i}-\min_j L_{h,j} }{ \max_j L_{h,j}-\min_j L_{h,j}+\epsilon }\]接著做 Mean-Centering:
\[w_i = \bar{a}_i-\mu_{\bar{a}}+1\]其中:
\[\mu_{\bar{a}} = \frac{1}{N} \sum_{i=1}^{N}\bar{a}_i\]這樣每張圖的平均權重會落在 1.0,權重範圍維持在 $[0,2)$。
Mean-Centering 後,$w_i$ 以 1.0 為錨點:低於 1 的權重抑制低 Saliency 區域與背景噪聲,接近 1 的權重維持一般前景 Patch,大於 1 的權重則放大高 Saliency 結構與異常區域。
最後將 Attention Weight 乘上原始 Patch Anomaly Score:
\[\tilde{s}_i = w_i\cdot s_i\]這個設計保留 Memory-Bank Distance 的判斷基礎。Attention Logits 只負責調整 Spatial Contribution。
為什麼不能只用 Attention Map?
Attention Logits 會關注結構重要的位置,其中也包含正常物件邊界、零件中心或高對比區域。單獨把 Attention 當作 Anomaly Map 會產生大量 False Positive。
Nearest-Neighbor Distance 和 Attention Weight 形成雙重條件:高 Matching Cost 加上高 Attention 會產生強異常響應;高 Matching Cost 但低 Attention 的背景噪聲會被抑制;低 Matching Cost 但高 Attention 的則是正常但重要的物件結構。這正是 Multiplicative Reweighting 有效的原因。
Reweighting Signal Ablation
| Normalization | Signal | MVTec I-AUC | MVTec P-PRO | VisA I-AUC | VisA P-PRO | |—|—|—:|—:|—:|—:| | Max-Normed | Pre-Softmax | 97.5 | 93.0 | 92.7 | 92.9 | | Max-Normed | Post-Softmax | 92.3 | 86.2 | 80.3 | 85.6 | | Max-Normed | Cosine Distance | 96.6 | 94.2 | 92.4 | 92.0 | | Mean-Centered | Pre-Softmax | 97.7 | 94.7 | 93.2 | 93.2 | | Mean-Centered | Post-Softmax | 97.4 | 95.1 | 92.7 | 92.6 |
Mean-Centered Pre-Softmax 在兩個 Dataset 的 Image-Level AUROC 最穩定,整體 Trade-Off 也最好。Post-Softmax 在 MVTec P-PRO 略高,跨 Dataset 表現較不一致。
3. Multi-Level Feature Fusion
ViT 不同 Layer 會保留不同層次的資訊:
- 中層 Features 通常保留較多局部紋理與幾何結構。
- 後層 Features 擁有較強語意和物件層次資訊。
- 最後一層有時過度抽象,細小缺陷的局部差異會被壓縮。
DuoAD 從 12-Layer Backbone 的:
\[\mathcal{L}=\{8,10,12\}\]建立獨立 Memory Banks,分別計算 Anomaly Scores 後取平均:
\[s_i = \frac{1}{|\mathcal{L}|} \sum_{l\in\mathcal{L}} \min_{m\in\mathcal{M}_l} \left( 1-{f_i^{(l)}}^\top m^{(l)} \right)\]Layer Ablation 顯示,Layer 8 之後的組合相對穩定。{8,10,12} 在效能和 Feature Bank 成本之間提供穩定平衡。
| Layer | MVTec DINOv2 I-AUC | MVTec DINOv3 I-AUC | VisA DINOv2 I-AUC | VisA DINOv3 I-AUC |
|---|---|---|---|---|
| 7 | 94.8 | 96.4 | 88.6 | 91.3 |
| 8 | 96.4 | 97.1 | 90.4 | 92.6 |
| 9 | 96.7 | 97.6 | 91.5 | 93.4 |
| 10 | 97.1 | 97.7 | 92.9 | 93.6 |
| 11 | 96.8 | 97.0 | 92.5 | 92.5 |
| 12 | 96.0 | 95.1 | 88.2 | 85.4 |
| 8–12 | 97.2 | 97.7 | 92.8 | 93.4 |
| 8, 10, 12 | 97.3 | 97.7 | 92.7 | 93.2 |
這組結果也改變了 DINOv2 和 DINOv3 在 AD 上的比較。
只使用單層或缺少 Multi-Level Fusion 時,DINOv3 可能低於 DINOv2。加入多層 Features、Attention Reweighting 和 Augmentation 後,DINOv3 的 Global Semantics 與 Multi-Level Representations 才能充分發揮,最終取得更高整體結果。
三個元件如何互補?
Ablation 可以直接看出各元件的角色。
DINOv2,1-Shot
| Aug | Attention | Multi-Level | MVTec I-AUC | MVTec P-PRO | VisA I-AUC | VisA P-PRO | |:—:|:—:|:—:|—:|—:|—:|—:| | | | | 94.3 | 90.1 | 83.0 | 80.5 | | ✓ | | | 95.4 | 91.3 | 83.5 | 81.4 | | | ✓ | | 95.1 | 92.1 | 87.7 | 87.8 | | | | ✓ | 95.6 | 93.3 | 90.0 | 90.5 | | ✓ | ✓ | | 96.0 | 92.8 | 88.2 | 88.8 | | ✓ | ✓ | ✓ | 97.3 | 94.3 | 92.7 | 93.2 |
DINOv3,1-Shot
| Aug | Attention | Multi-Level | MVTec I-AUC | MVTec P-PRO | VisA I-AUC | VisA P-PRO | |:—:|:—:|:—:|—:|—:|—:|—:| | | | | 92.1 | 85.5 | 81.9 | 72.9 | | ✓ | | | 94.5 | 89.8 | 83.3 | 75.3 | | | ✓ | | 92.8 | 89.7 | 83.4 | 82.0 | | | | ✓ | 95.0 | 93.8 | 90.5 | 90.4 | | ✓ | ✓ | | 95.1 | 92.5 | 85.4 | 85.2 | | ✓ | ✓ | ✓ | 97.7 | 94.7 | 93.2 | 93.2 |
Multi-Level Features 帶來最大的基礎提升,尤其對 DINOv3 很重要。Attention Reweighting 對 Pixel-Level Localization 的改善明顯。Augmentation 提供額外 Coverage,三者同時使用時產生最高結果。
嚴格 Few-Shot 和 SCA Deployment Protocol
DuoAD 的主實驗與 SCA 結果分開報告。
主表使用 AugAll,僅依賴 Few-Shot Normal References,不讀取額外 Target-Domain Images。這個設定符合嚴格 Few-Shot Comparison Protocol,也方便和既有方法公平比較。
SCA 需要一批未標註 Target-Domain Images 去分析 Distribution Consistency。資料可以含有瑕疵,也不需要 Label;流程仍然包含 Warmup、Batched Inference 或 Online Calibration,因此屬於 Transductive Deployment Protocol。
可以整理成:
| 設定 | Normal Reference | Unlabeled Target Data | Label | Policy |
|---|---|---|---|---|
| DuoAD / AugAll | 1–4 shots | 不需要 | 不需要 | 固定套用全部候選操作 |
| DuoAD-SCA | 1–4 shots | 需要 Warmup Batch | 不需要 | 自動選擇 Distribution-Preserving 操作 |
這個拆分主要基於學術嚴謹性。SCA 更接近產線部署元件,用於冷啟動階段的自動 Policy Calibration。
實驗設定
論文使用三個工業異常檢測資料集:
MVTec-AD:15 個類別,包含 Object 和 Texture。VisA:12 個類別,具有較複雜的物件、食品與 PCB 結構。Real-IAD:30 個類別、151,050 張影像,包含多視角資料。
主要 Backbones:
- DINOv2 ViT-B/14 with Registers,輸入
448 × 448 - DINOv3 ViT-B/16,輸入
512 × 512 - MetaCLIP2 ViT-B/16,輸入
384 × 384,用於跨架構 Ablation
主要 Metrics:
I-AUC:Image-Level AUROC,衡量整張圖的異常分類能力。P-PRO:Pixel-Level AUPRO,衡量不同瑕疵區域的定位品質。- Supplementary 另提供
I-AUPR、I-F1max、P-AUC、P-F1max。
Image-Level Anomaly Score 取 Anomaly Map 中最高 1% 像素的平均值。Real-IAD 採多視角 Memory Bank,每個 View 分別建立 Reference Bank,再聚合各 View Predictions。
所有 DuoAD 結果使用相同五組 Random Seeds,並回報 Mean ± Standard Deviation。
MVTec-AD 與 VisA 結果
下面保留主表中和本文重點最相關的方法。
1-Shot
| Method | Training | Manual Tuning | MVTec I-AUC | MVTec P-PRO | VisA I-AUC | VisA P-PRO | |—|:—:|:—:|—:|—:|—:|—:| | PatchCore | | | 83.4 | 79.7 | 79.9 | 80.5 | | WinCLIP | | | 93.1 | 87.1 | 83.8 | 85.1 | | AdaptCLIP | ✓ | | 94.5 | - | 90.5 | - | | UniVAD | | ✓ | 97.5 | 92.8 | 92.9 | 92.4 | | AnomalyDINO | | ✓ | 96.5 | 91.7 | 85.6 | 90.7 | | FoundAD | ✓ | | 96.1 | 92.8 | 92.6 | 98.0 | | DuoAD DINOv2 | | | 97.2 | 94.1 | 92.5 | 93.3 | | DuoAD DINOv3 | | | 97.5 | 94.1 | 93.3 | 93.2 | | DuoAD-SCA DINOv2 | | | 97.3 | 94.3 | 92.7 | 93.2 | | DuoAD-SCA DINOv3 | | | 97.7 | 94.7 | 93.2 | 93.2 |
4-Shot
| Method | MVTec I-AUC | MVTec P-PRO | VisA I-AUC | VisA P-PRO | |—|—:|—:|—:|—:| | PatchCore | 88.8 | 84.3 | 85.3 | 84.9 | | WinCLIP | 95.2 | 89.0 | 87.3 | 87.6 | | AdaptCLIP | 96.6 | - | 93.1 | - | | AnomalyDINO | 97.6 | 92.4 | 91.3 | 92.5 | | FoundAD | 97.1 | 93.5 | 94.4 | 98.4 | | DuoAD DINOv2 | 98.0 | 94.6 | 94.8 | 94.5 | | DuoAD DINOv3 | 98.5 | 95.0 | 95.5 | 94.9 | | DuoAD-SCA DINOv2 | 98.2 | 94.8 | 94.9 | 94.5 | | DuoAD-SCA DINOv3 | 98.6 | 95.7 | 95.5 | 94.8 |
DuoAD 在固定設定下取得很強的 Image-Level 和 Pixel-Level 表現。VisA 的 P-PRO 以 FoundAD 較高,但該方法需要額外的 Self-Supervised Training 來建立 Dataset-Specific Representations。DuoAD 保留 Frozen Backbone 和 Training-Free Pipeline,並在 Image-Level Performance 與 Pixel F1-Max 上維持優勢。
Real-IAD:大規模、多視角產線資料
Real-IAD 有 30 個類別與多個 Camera Views,逐類別調整 Policy 的成本更高,也更接近大量產線部署情境。
| Shot | Method | I-AUC | P-PRO |
|---|---|---|---|
| 1 | WinCLIP | 74.7 | - |
| 1 | AdaptCLIP | 81.8 | - |
| 1 | AnomalyDINO | 80.6 | 90.1 |
| 1 | DuoAD DINOv2 | 85.1 | 95.5 |
| 1 | DuoAD DINOv3 | 84.3 | 94.6 |
| 1 | DuoAD-SCA DINOv2 | 84.5 | 95.4 |
| 1 | DuoAD-SCA DINOv3 | 83.3 | 94.5 |
| 4 | WinCLIP | 73.6 | - |
| 4 | AdaptCLIP | 82.6 | - |
| 4 | AnomalyDINO | 85.3 | 91.8 |
| 4 | DuoAD DINOv2 | 88.7 | 96.3 |
| 4 | DuoAD DINOv3 | 88.1 | 95.7 |
| 4 | DuoAD-SCA DINOv2 | 88.3 | 96.3 |
| 4 | DuoAD-SCA DINOv3 | 87.5 | 95.7 |
Real-IAD 上 AugAll 高於 SCA 的現象正好反映 Safe Policy 和 Performance-Optimal Policy 的差異。
C2–C5 View 具有斜視角與非 Top-Down Composition。Rotation 對原始 Distribution 的一致性較低,SCA 會傾向拒絕;強制加入 Rotation 仍可能增加 Feature Diversity,讓 AugAll 在部分設定得到更高結果。
這項結果沒有削弱 SCA 的部署價值,反而清楚界定了它的用途:沒有 Label 時保持 Distribution Safety,有 Label 或歷史結果後再做 Performance Optimization。
Augmentation Strategy Ablation
SCA 在 MVTec-AD 上比 AugAll 更高,在 VisA 上維持接近表現。
| Backbone | Dataset | NoAug | AugAll | SCA |
|---|---|---|---|---|
| DINOv3 | MVTec-AD | 95.2 | 97.5 | 97.7 |
| DINOv3 | VisA | 90.9 | 93.3 | 93.2 |
| DINOv2 | MVTec-AD | 95.6 | 97.2 | 97.3 |
| DINOv2 | VisA | 91.7 | 92.5 | 92.7 |
幾個代表性類別:
Screw:Rotation 對 Coverage 很重要,NoAug 大幅落後。Capsule、Pill:方向與結構有意義,SCA 會拒絕部分轉換。Macaroni1、Zipper:AugAll 可能受惠於更大的 Feature Diversity。PCB1:多個主要 Orientation 使 Sample Count 對 Policy 判斷更敏感。
Qualitative Results
Attention Map 和最終 Anomaly Map 的角色可以從圖中分開看:
- Attention Logits 提供 Object-Centric Spatial Prior。
- Nearest-Neighbor Distance 判斷 Feature 是否偏離正常 Reference。
- 相乘後的結果會保留真正異常區域,並降低背景回應。
對細小刮痕、裂縫、缺角與局部結構錯位,這種連續式 Reweighting 比 Binary Mask 更穩定,也省去人工選擇 Threshold。
和其他 Few-Shot AD 方法差在哪裡?
Few-Shot AD 方法大致可以分成幾類。
Memory-Bank Matching
PatchCore、AnomalyDINO 直接儲存正常 Patch Features,再執行 Nearest-Neighbor Search。架構簡單且可解釋,但 Augmentation、Layer Selection 和 Preprocessing 經常需要人工設定。
VLM Prompting / Adapter
WinCLIP、PromptAD、AdaptCLIP 使用文字 Prompt、Learnable Tokens 或 Adapter 建立 Normal / Abnormal Semantics。語意能力較強,但對細微工業瑕疵有時缺少足夠的局部辨識力,部分方法也需要額外訓練。
Multi-Model Fusion
UniVAD、LogSAD 結合多個 Foundation Models、Prompts 或 Segmentation Components。泛化能力較強,但計算量、架構複雜度和 Hyperparameters 也隨之增加。
Manifold / Synthetic Anomaly Training
FoundAD 等方法學習正常 Manifold 或使用 Synthetic Anomaly Training,能處理細粒度的結構歧義,但訓練成本和 Dataset Dependency 隨之增加。
DuoAD 保留單一 ViT Backbone,從同一個 [CLS] token 同時取得 Global Semantic Consistency 與 Local Structural Saliency,因此能在 Training-Free Memory-Bank Framework 中加入 Global Context,並降低人工設定需求。
| 方法類型 | 額外訓練 | 多模型 | Augmentation 自動化 | Spatial Reweighting | 部署特性 |
|---|---|---|---|---|---|
| 標準 Memory Bank | 簡單,Policy 常需人工設定 | ||||
| VLM Prompt / Adapter | 部分需要 | 部分 | 部分 | 語意強,可能需要 Training | |
| Multi-Model Fusion | ✓ | 部分 | ✓ | 泛化強,Pipeline 較重 | |
| DuoAD | ✓ | ✓ | 單一 ViT、固定設定、可直接部署 |
Dual Characteristics 的實驗證據
論文將 Patch 分成:
- Anomalous Foreground
- Normal Foreground
- Background
再分析 [CLS] 與 Patch Tokens 的 Attention Logits 和 Cosine Similarity。
主要結果如下:
- Anomalous Patches 的 Attention Logits 高於一般 Foreground。
- Background 在 Attention 和 Cosine Similarity 上都受到抑制。
- Defect Area 小於等於
1%時,High-Attention Pattern 更清楚。 - 瑕疵範圍變大後,Global
[CLS]Context 會受到更多污染,分布差異變弱。 - DINOv2 和 DINOv3 都呈現 High-Attention / Distinct-Similarity 的異常群集。
- MetaCLIP2 的分離較弱,符合 Image-Text Alignment 偏向高階語意的特性。
這項分析也說明兩個訊號適合不同用途。
[CLS] embedding 的穩定性適合做 Set-Level Consistency;Pre-Softmax Attention Logits 的局部變化適合做 Patch-Level Weighting。將用途交換,效果會下降。
限制
DuoAD 仍有幾個明顯限制。
第一,核心元件依賴 ViT 的 [CLS] 和 Patch Attention Interaction。CNN 缺少相同結構,無法直接套用這套方法。
第二,SCA 需要一小批未標註 Target-Domain Samples。它可以在 Warmup、Batched Inference 或 Online Calibration 中執行,嚴格 Few-Shot Protocol 需要另外報告。
第三,SCA 會優先選擇 Distribution-Preserving Augmentations。某些偏離原始分布的轉換仍可能增加 Feature Diversity,取得更高 Benchmark Performance。這類最佳化需要 Label、Validation 或事後 Backtrace。
第四,SCA 目前主要驗證 Geometric Transformations,例如 Rotation 和 Flip。Brightness、Contrast、Color Jitter 等 Photometric Candidates 可以套用相同原理,仍需要更多實驗確認不同影像品質條件下的行為。
第五,Attention Logits 提供 Saliency Prior,仍然依賴預訓練 Backbone 是否學到適合該資料的結構資訊。語意偏向過強、Attention Artifact 或極端 Domain Shift 都可能降低效果。
第六,Memory Bank 的大小會隨 Shot、Augmentation 和 Multi-Level Features 增加。大量類別或高解析度部署仍需考慮 Coreset、Approximate Search 和 Feature Compression。
結論
DuoAD 的核心概念可以濃縮成一句話:
[CLS]對局部瑕疵保持全局語意穩定,同時透過 Attention Logits 對局部結構異常產生敏感響應。
DuoAD 將前者用於 Self-Calibrated Augmentation,從未標註產線資料選擇 Distribution-Preserving 的 Safe Policy;後者用於 Attention-Guided Feature Reweighting,連續調整 Patch Anomaly Scores。
Multi-Level Feature Fusion 再補上不同 ViT Layers 的局部與語意資訊,使 DINOv2、DINOv3 和 MetaCLIP2 都能使用同一套 Framework。最終的 Pipeline 再次對應到一開始的 Framework 圖:Semantic Stability 負責上半部的 Safe Augmentation Policy;Structural Sensitivity 負責下半部的 Attention-Guided Patch Reweighting;Multi-Level Features 則貫穿 Inference Stage,把多層特徵結合進 Memory Bank。
這份工作的重點落在實際部署問題:產線初期沒有 Label、正常 Reference 很少、類別數量持續增加,導致人工逐類別設定 Policy 難以擴展。SCA 讓系統先取得安全、可解釋、無需人工介入的 Augmentation Policy;Attention Reweighting 則把 ViT 原本就存在的 Global-to-Local Interaction 轉換成 Anomaly Localization Prior。
DuoAD 最終想解決的問題很直接:
正常參考維持 Few-Shot,只額外使用未標註(可含異常)的產線資料,不需人工調參,仍達到學術 SOTA。
到這邊是 學術上 DuoAD 所解決的問題,但實務上距離工廠落地還有一段路。工廠的資料是超高解析度,MVTec-AD 的 1024×1024 都還算低解析度。如何讓這套演算法落地在 Consumer-Grade GPU 和 Embedded 系統又是另一個問題;這部分因為學術界缺少對應的 Setup,我就沒有寫進論文裡。有興趣的話可以洽詢 Inventec AI Center 了解我們的方案 XD
Comments