R&D
CENTER

只看良品就找出異常:異常檢測與 PatchCore

不良樣品難以收集,而且明天就可能出現從未見過的不良。本課以最廣泛使用的 PatchCore 為例,說明只用良品影像訓練、找出「與正常不同之處」的異常檢測原理。

入門7 分鐘1 瀏覽
本課重點
  1. 異常檢測不學習不良,只學習正常。因此訓練時沒看過的新不良,也能以「與正常不同」抓出來。
  2. 結果是逐像素的異常度熱圖,以及代表整張影像的一個分數。分數達到閾值以上即為 NG。
  3. PatchCore 將良品影像小區塊(patch)的特徵存放在記憶體中,以新 patch 與最接近的正常 patch 相距多遠來衡量異常度。
  4. 設定兩個閾值會產生 OK / Gray / NG 三個區間,模稜兩可的 Gray 由人員確認後再回饋到訓練中。

檢測的三個世代

第 1 代 · 規則式 第 2 代 · 監督式學習 第 3 代 · 正常樣本學習
訓練資料 無(由人設計規則) 數千張不良影像 + 標註 數十~數百張良品影像,不需標註
從未見過的不良 規則中沒有就放行 對訓練時沒看過的類型較弱 以「與正常不同」檢出
導入期間 數週(專家調校) 數週~數個月(收集不良) 數天

製造現場的不良率通常很低。要收集數千張不良影像得等很久,而且在收集期間還會出現新的類型。異常檢測把這個問題反過來處理:只要讓模型充分看過正常樣本,偏離正常的一律視為異常。 也有少則以 2~30 張良品影像起步的 few-shot 方式。

共通處理流程

fineAi AD Workbench 的 11 種演算法都遵循相同的架構。各演算法不同的只有 ③ 和 ④。

① 輸入原始影像 ② 前處理正方形填補 ③ 特徵擷取CNN · ViT ④ 異常度距離 · 機率 ⑤ 異常圖升取樣·平滑化 ⑥ 分數max · 前 q% ⑦ 判定score≥thr→NG 各演算法不同的部分
② 前處理會在維持比例的前提下填補成正方形。即使是 5:1 這類細長零件也不會被壓扁,瑕疵形狀得以保留。

PatchCore:正常小區塊的記憶

PatchCore 精度高,是 AD Workbench 預設建議的演算法。原理出乎意料地簡單。

訓練:收集正常 patch

  1. 將良品影像輸入以大規模影像預先訓練的神經網路(WideResNet50-2),取出中間層(layer2、layer3)的特徵圖。特徵圖的一格,就是把原始影像中一個小區塊(patch)摘要成數字向量的結果。
  2. 將所有良品影像的所有 patch 向量收集到**記憶庫(memory bank)**中。
  3. 記憶庫太大會使搜尋變慢,因此只挑選能代表整體分布的一部分(coreset 取樣)。

不會重新訓練神經網路的權重。只是把良品影像掃過一次並收集起來,因此訓練只需數秒~數分鐘即可完成。

檢測:與最接近的正常樣本之間的距離

  1. 對新影像以相同方式擷取 patch 向量。
  2. 針對每個 patch,在記憶庫中找出**最接近的 k 個正常 patch(k=3)**並量測距離。
  3. 與正常相似的 patch 距離小;有刮傷的 patch 找不到相似的正常 patch,距離就大。這個距離就是該位置的異常度。
  4. 將各 patch 的異常度放大到原始尺寸並平滑化,就成為熱圖;將熱圖的最大值(或前幾 % 的平均)正規化到 0~1,就是影像分數。
記憶庫(正常 patch 特徵) 正常 patch → 距離小 刮傷 patch → 連最接近的正常樣本也很遠 熱圖 · score 0.71 ≥ 0.50 → NG
異常度是「與最相似的正常 patch 有多不同」。即使是訓練時從未見過的瑕疵,距離也會很大。

閾值與 Gray 區間

得到分數後,與閾值比較進行判定。降低閾值可減少漏掉不良的情況(漏檢),但把良品判為不良的情況(誤判)會增加;提高閾值則相反。這個平衡在 模型評估與現場運作 課程中說明。

fineAi 使用雙閾值。

  • 分數低於低閾值為 OK
  • 高於高閾值為 NG
  • 介於兩者之間為 Gray — 由人員確認。

人員對 Gray 影像所做的判定會再成為訓練資料。這是一種運作越久、Gray 越少的架構。

異常檢測不太適合的情況

  • 正常樣本本身差異很大的對象 — 像形狀各異的農產品這樣「正常」範圍很寬時,難以與瑕疵區分。
  • 需要瑕疵名稱與位置時 — 異常檢測能告訴你「哪裡異常」,但不會分類出「這是刮傷」。這時請搭配 物件偵測 一起使用。

11 種演算法中該選哪一種,將在下一堂課 選擇異常檢測演算法 中說明。