文章目錄
- 一、內容說明
- 二、相關鏈接
- 三、概述
- 四、摘要
- 1、現有方法存在的問題
- 2、方案
- 3、效果
- 五、作者的實驗
- 六、如何訓練自己的數據
- 1、數據準備
- 2、修改配置文件
- 3、代碼優化修改
- 4、模型訓練與測試
- 七、結束
一、內容說明
- 在我接觸的缺陷檢測項目中,檢測缺陷有兩種方法。一種是使用傳統方法,采用去噪、二值化、輪廓檢測等,但傳統方法很受閾值的影響,往往這張圖片適用,那張圖片就不行,很難調好閾值。另外一種是使用深度學習方法,例如本篇文章的UniAD,也有朋友使用語義分割的方式。
- 在本文章,我將會介紹無監督缺陷檢測算法UniAD的創新點、網絡以及如何應用在自己的項目中。
- 最后來一句“決定我們自身的不是過去的經歷,而是我們自己賦予經歷的意義”,來自《被討厭的勇氣》
二、相關鏈接
?? 論文名稱:《A Unified Model for Multi-class Anomaly Detection》
?? Github:https://github.com/zhiyuanyou/UniAD
?? Paper:https://arxiv.org/abs/2206.03687.pdf
三、概述
??UniAD是由一個鄰居掩碼編碼器(NME) 和一個分層查詢解碼器(LQD) 組成。
??首先,由固定的預訓練骨干網絡提取的特征token被NME進一步整合,以得出編碼器嵌入。然后,在LQD的每一層中,可學習的查詢嵌入與編碼器嵌入和前一層的輸出相繼融合(第一層為自我融合)。特征融合是由鄰居掩碼注意力(NMA)完成的。LQD的最終輸出被看作是重構的特征。此外,還提出了一個特征抖動(FJ)策略,向輸入特征添加擾動,引導模型從去噪任務中學習正態分布。最后,通過重建差異得到異常定位和檢測的結果。
??通俗說法:我已經學習了正常圖片是什么樣子,輸入一張缺陷圖,我就重構出它的正常圖,將正常圖和輸入圖做對比,不就知道哪里有缺陷了😄
圖1說明:
?(a)圖是已經存在的方法,圖片中有兩種圖片類型,分別是青色和藍色,需要兩個邊界,才能區分兩種類型圖片的缺陷
?(b)圖是該論文提出的方法,用一個邊界就能區分所有類別圖片
?(c)圖說明在以前的方法里,解決多類型圖片缺陷的方法,一種缺陷類型使用一個模型,多個類型用多個模型識別, one-class-one-model
?(d)圖是該論文的重點,用一個統一的模型識別所有缺陷,a unified framework
四、摘要
1、現有方法存在的問題
?? 已有的重構方法存在 “identity shortcut” 的問題,即重構的圖片和輸入圖片差不多,像是對輸入圖片的復制,圖片越復雜,這個問題越嚴重
2、方案
(1)提出了“layer-wise query decoder”(分層查詢解碼器)
?? 看下文圖2的(a)圖,MLP和CNN的曲線逐漸上升,突然下降,Transformer也有下降,但下降幅度要小些。曲線下降主要還是上文提到的“identity shortcut”問題。Ours方法就基本不存在曲線下降問題。
(2)采用了“neighbor masked attention”模塊(鄰居掩碼注意力)
?? 特征不跟自己相關,也不跟鄰居相關,避免了information leak。
??請看圖3,Query是4x4,與Key做Attention操作時,相鄰的值進行mask,將注意力圖Attention Map展開。
??話外題:聯想常見的Transformer結構,Mask主要有兩種作用。第一種是 padding mask ,在encoder和decoder中使用,保證輸入長度的一致性;另外一種是 Sequence mask ,在decoder中使用,掩蓋當前詞后面出現的詞。這么一對比就看出作者的mask改動了什么。
(3)“feature jittering strategy”(特征抖動策略)
??受Bengio的啟發,提出了一個“feature jittering strategy”(特征抖動策略),在有噪聲的情況下也能恢復源信息
3、效果
??用UniAD模型在15個類別的數據集MVTec-AD上做實驗,AUROC分別從88.1%提升到 96.5%,從 89.5%提升到96.8%
五、作者的實驗
??Normal正常圖片;Anomaly異常圖片;Recon重構圖;GT標注的mask圖;Pred是Anomaly和Recon差異圖,對缺陷進行定位,顏色越深,表示缺陷的概率越大。效果看起來,so nice
六、如何訓練自己的數據
??圖6是我在自己的數據上做的訓練,數據特點是:缺陷圖片少、缺陷小,效果還是可以的
1、數據準備
- 進入./data/創建新文件夾/ (可參考./data/MVTec-AD/)
- 創建train.json、test.json文件,格式如下:
{"filename": "000_00_00/train/good/bad_02_0419_Image_20230419104815488_0_0_1280_1280.png", "label": 0, "label_name": "good", "clsname": "000_00_00"}{"filename": "000_02_01/train/good/good_06_0421_Image_20230420180152737_922_563_2202_1843.png", "label": 0, "label_name": "good", "clsname": "000_02_01"}...
字段說明:
??filename:圖片路徑
??label:標簽(0無缺陷、1缺陷)
??label_name:標簽名稱(good無缺陷、bad缺陷)
??clsname:圖片類型名稱
2、修改配置文件
- 進入cd ./experiments/創建新文件夾/ (具體可參考cd ./experiments/MVTec-AD/,將MVTec-AD的文件復制到自己文件夾)
- 修改config.yaml,如圖7
修改說明:
??image_dir:訓練圖片路徑
??meta_file:訓練和測試的json文件
3、代碼優化修改
??預訓練模型提取特征時,卷積采用zero-padding會導致邊界引入新信息,造成誤檢。文獻提出使用reflection_padding可降低邊界誤檢,在github代碼中還未修改,需要手動修改。
代碼路徑:./models/efficientnet/utils.py
原代碼:
self.static_padding = nn.ZeroPad2d((pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2))
修改為:
self.static_padding = nn.ReflectionPad2d((pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2))
4、模型訓練與測試
- 模型訓練:
?? 1. cd ./experiments/自己的文件夾/
?? 2. sh train_torch.sh #NUM_GPUS #GPU_IDS
??例子:sh train_torch.sh 1 0(#NUM_GPUS:gpu個數,#GPU_IDS:gpu編號) - 模型測試 :
?? sh eval_torch.sh #NUM_GPUS #GPU_IDS
七、結束
?? 如果文章對你有所幫助,請記得點贊收藏哦,手動筆芯??????
?