---
# System prepended metadata

title: towards total recall in industrial anomaly detection

---

ImageNet專案是一個大型視覺資料庫，用於視覺目標辨識軟體研究。 該專案已手動注釋了1400多萬張圖像，以指出圖片中的對象，並在至少100萬張圖像中提供了邊框。 ImageNet包含2萬多個典型類別，例如「氣球」或「草莓」，每一類包含數百張圖像


**PatchCore對SPADE,PaDiM等一系列基於影像Patch的無監督異常檢測演算法工作進行了擴展，主要解決了SPADE測試速度太慢的問題，並且在特徵提取部分做了一些探索。相較於SPADE,PaDiM，PatchCore 僅使用stage2、stage3的特徵圖進行建模，透過增加視窗大小為3、步長為1、padding為1的平均池化AvgPool2d增大感受野後拼接，使用KNN Greedy CoreSet採樣選取最具代表性的特徵點（選擇與其他特徵點最遠的點以實現盡可能平衡的採樣，效果類似泊松圓盤）,構建特徵向量記憶池，只保留1%~10%的特徵數，進而實現高效的特徵篩選並用於異常檢測。並提出採用了re-weighting策略計算Image-Level的異常得分代替先前的最大值異常得分**






challenge : cold-start problem 
goal: build systems that work well simultaneously on many different tasks automatically 
best performing approach combine embedding from ImageNet models with an outlier detection model 

Patch Core uses a maximally representative memory bank of nominal patch features


知識點：
Patch: 所謂補丁，指的是像素； 
PatchCore： 也就是補丁的核心訊息； 
Embedding: 所謂嵌入，指的是將網路提取的不同特徵組合到一塊；
Nominal samples： 正常樣本即不包含異常的樣本； 
Memory bank: 是記憶提取到的特徵的集合;
Pretrained Encoder: 使用預訓練模型（wide_resnet50_2） backbone 提取影像特徵, 採用[2, 3]層特徵作為影像特徵，具有較強的底層特徵（輪廓、邊緣、顏色、紋理和形狀特徵），更能夠反映影像 內容。 不採用最後幾層原因：深層特徵偏向分類任務，具有更強的語意資訊。 
Locally aware patch features： 擷取影像的 Patch特徵，這個特徵帶有周圍資料的資訊。 特徵值的集合建構 PatchCore Memory bank; Coreset Subsampling: 核心集二次抽樣;
Coreset-reduced patch-feature memory bank：: 稀疏採樣 目的是Reduce memory bank，加快演算法運行速度。
anomaly score: 就是你訓練正常的數據，捕捉正常影像的特徵，然後有一個異常的數據進來，就會和正常數據產生一個差異，透過整個差異來判斷是否是異常。
ingrained: 根深蒂固的
superimposed: 疊加的
contours: 輪廓
![image](https://hackmd.io/_uploads/BJ-EMo7QC.png)
![image](https://hackmd.io/_uploads/Hy2Nfo7QR.png)

#### Introdution


提出了利用來自 ImageNet 分類的通用深度表示，而不對目標分佈進行適應

PatchCore 可以看作是Spade和PaDiM的extension
PatchCore和Spade 一樣會使用memory bank，但PatchCore uses neighborhood-aware patch-level feature critical 來讓inference cost 降低 並且有較高的performance
除此之外，PatchCore的patch-level approach 和PaDiM是相似的但有一些地方不一樣，首先，PatchCore equally accessible to all patches evaluated at test time， 但PadiM limits patch-level anomaly detection to Mahalanobis distance.
而有了這些差別，PatchCore becomes less reliant on image alignment and estimating with larger nominal context 並且每個patch 不需要是一樣的shape
透過這些步驟，PatchCore解決了一些Spade和PaDiM的缺點

##### intoduction:
PatchCore最重要的特點是，它利用了從預先訓練的模型中獲得的特徵，不需要在圖像特徵提取方面進行額外的訓練，除此之外，PatchCore根據記憶體庫中包含的正常影像的特徵向量與要判斷的影像（測試資料）的特徵向量之間的距離計算出異常程度，並確定影像是正常還是異常。它還可以獲得影像中每個像素的異常程度，使其能夠偵測到異常區域。
##### 算法
![image](https://hackmd.io/_uploads/rJg9Bmvm0.png)
在訓練中只使用正常影像。影像通過訓練後的CNN模型，以獲得每個patch的特徵向量，然後進行取樣，並將選定的特徵向量儲存在記憶庫中。
因此，推理(inference)是透過一個記憶庫來進行的，其中正常影像的特徵向量已被累積。在推理過程中，圖像也通過pretrained的CNN模型，以獲得每個patch的(embedding vector)特徵向量（（i））。然後根據所獲得的特徵向量和記憶庫中的特徵向量之間的距離計算影像和每個像素的異常情況。 
##### Locally aware patch features
局部感知的補丁特徵從圖像中獲得一個逐個補丁的特徵向量。 PatchCore使用一個CNN模型從影像中取得特徵向量，該模型已在ImageNet的資料集上訓練完了。 CNN模型的這一部分不會再次訓練。 然後將從訓練好的CNN模型得到的特徵向量進行自適應平均池化。數學公式表示如下：
1. 合併鄰域的特徵集合（採用Adaptive Average Pooling)，組合feature map
![image](https://hackmd.io/_uploads/r1o6FXP7R.png)
local aware feature 在位置(h,w)
![image](https://hackmd.io/_uploads/H1wf97DXA.png)
2. local aware patch-feature collection
![image](https://hackmd.io/_uploads/rJR4q7wmA.png)
4. 遍歷整個資料集，取聯集，得到PatchCore memory bank M 
![image](https://hackmd.io/_uploads/Sy_I9XP70.png)
##### 應該使用哪一層使用訓練好的CNN模型的哪一層的特徵向量
candidate : last layer 
最後一層提供了最聚合的、高抽象度（高水準）的特徵向量，在先前的研究中也有幾個使用它的例子。然而，本文指出了使用從最後一層獲得的特徵向量的兩個問題。
1. local feature loss
雖然深層的特徵向量處於較高的水平，但由於重複卷積和集合，分辨率較低。這意味著局部（精細）特徵可能會遺失
2. last layer may have bias
假設訓練過的模型是在一個與推理目標領域不同的任務上訓練的，更深的層包含了更多針對該任務的特徵。因此，有人認為，使用受不同領域任務影響的最後一層特徵向量是不合適的。
### 所以使用中間層獲得特徵向量 j屬於[2,3] // 第二和三層
![image](https://hackmd.io/_uploads/ry5wl4D70.png)
上圖顯示，對於包含中間層 "2 "的圖案，準確率確實很高。這一結果顯示，PatchCore從 "2 "和 "3 "層（2+3）獲取了特徵向量

#### Coreset-reduced patch-feature memory bank
這部分是將前面所得到的特徵向量儲存在Memory Bank中
隨著輸入樣本增加，記憶庫 M 也會隨之增加，要求更大的儲存空間和推理時間。因此，本文使用coreset subsampling方法來減少M ，
採樣方法表示如下：其中M是採樣前的特徵向量集，MC是採樣後的特徵向量集。
![image](https://hackmd.io/_uploads/SJ28rEwQ0.png)
上述公式意味著，進行抽樣時，要使預抽樣的特徵向量（m）和後抽樣的特徵向量中的最大最小距離最小。 然而，這個最佳化問題是NP-hard，需要大量的計算時間來獲得最佳解。因此採用了以下兩種創新方法，以更快地獲得一個接近最優的解決方案。


### method 
1. Locally aware patch features
2. Coreset-reduced patch-feature memory bank
3. Anomaly detection with Patchcore



anomalous : 異常的

演算法流程大致為：透過預先訓練好的ResNet-50在正常樣本上面進行特徵提取（不從Resnet最後一層獲取特徵，而是從中間獲取）隨後再採用coreset subsampling，進行有效的降採樣生成更加核心 的特徵集即memory bank 。 在測試的時候，將提取到的特徵通過nearest neighbour search（最近鄰搜索：每個query進來，首先找最近距離最近的領域質心，找到距離query最近的質心後，鎖定該領域） 然後在該領域內 計算距離最遠的資料點，用該距離計算anomaly score，判斷是否為異常，得到結果。

what is downsample and cold-start problem
關於anomalib 的相關問題以及虛擬環境的程式碼保存和執行(GPU CPU和實驗室的資料夾 如何用jupter notebook 更改和執行程式碼，看如何model pruning 改參數 

backbone : wide_resnet50_2
https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py
https://pytorch.org/vision/main/models/generated/torchvision.models.wide_resnet50_2.html