督工業(yè)缺陷檢測新突破:HLGFA高低分辨率引導機制解析)
做工業(yè)視覺這幾年我最頭疼的從來不是“算法不夠聰明”而是“壞品樣本根本不夠”。一個外觀檢測項目里良品能堆滿幾個硬盤缺陷圖卻可能一個月都湊不出幾百張更麻煩的是這批缺陷和下一批可能長得完全不一樣。正因為這種現實無監(jiān)督工業(yè)缺陷檢測的熱度一直沒降過——大家拼的是同一件事能不能只拿正常樣本訓練就把從沒見過的新缺陷也揪出來。最近HLGFA這個新方法在MVTec AD基準上刷到98%同行群里討論度很高。這篇文章就把它背后的高低分辨率引導思路、復現關鍵點和真實落地時會踩的坑一次性講清楚。1. 缺陷數據湊不齊無監(jiān)督檢測是怎么“繞過去”的1.1 為什么有監(jiān)督方案在工業(yè)現場經常翻車先聊一個很現實的問題有監(jiān)督缺陷檢測在實驗室里跑得再好進了產線往往第一個月就被打回原形。原因是工業(yè)缺陷不像貓狗分類那樣有穩(wěn)定的視覺結構它天生就是“長尾中的長尾”。以常見的3C外殼劃痕為例劃痕可能是直線的、弧形的、網狀的可能出現在邊緣、平面或曲面光照角度一變同一個缺陷的紋理都不一樣。你不可能提前把所有這些形態(tài)都標注出來。更麻煩的是新產品一導入表面材質變了舊模型直接失效又得重新標注、重新訓練。一條產線一天能產幾萬件缺陷率按百分之一算也有幾百個壞品但人工標注這些壞品并對應到具體缺陷類型成本往往比檢測設備本身還高。所以工業(yè)現場真正需要的不是“分得越細越好”的分類器而是“正常和異常分得越清楚越好”的檢測器。無監(jiān)督方案之所以能繞過去是因為它壓根不學缺陷長什么樣而是只學正常樣本長什么樣。1.2 無監(jiān)督異常檢測的基本套路正常樣本也能學出“異?!备拍顭o監(jiān)督缺陷檢測的基本假設可以濃縮成一句話正常樣本在特征空間中應該扎堆缺陷樣本會漂移出去。具體操作上主流做法分三步。第一步用預訓練骨干網絡常見的是在ImageNet上預訓練的ResNet系列對正常樣本做特征提取同一張圖不同尺度會得到多層特征圖第二步把正常樣本的這些特征收集起來做成一個“正常特征記憶庫”或者用高斯分布、歸一化流去建模正常特征的分布第三步推理時提取測試樣本的特征度量它與記憶庫/分布之間的“距離”距離越大越可能是缺陷。這個思路最有意思的地方在于預訓練骨干網絡從來沒有“見過”工業(yè)缺陷但它在大規(guī)模自然圖像上學到的紋理、邊緣、形狀表征已經足夠把絕大多數工業(yè)異常和正常表面區(qū)分開。這也解釋了為什么這類方法不需要在目標數據上做大規(guī)模訓練很多時候只需要提取特征、建庫、算距離就能達到相當可用的效果。1.3 HLGFA在無監(jiān)督路線上的位置高低分辨率引導的價值了解基本套路之后HLGFA的定位就很清晰了。它沒有推翻“特征提取記憶庫距離度量”這套框架而是把火力集中在改進特征本身的質量上。用過這類方法的人應該都有體會直接用骨干網絡單層特征效果往往很飄。高分辨率淺層特征保留了紋理、邊緣這類細節(jié)對細小劃痕敏感但語義信息弱背景干擾一多就誤報低分辨率深層特征語義強、抗干擾好但邊緣和細小缺陷被嚴重模糊化定位精度上不去。單層特征總歸是顧此失彼。HLGFA從方法名就能看出來核心是“高低分辨率引導”。它想做的事情是讓低分辨率特征和高分辨率特征相互引導、彼此對齊最后得到一個既能看清缺陷邊緣、又能理解全局語義的融合特征。換句話說不讓模型在“看得清”和“看得懂”之間二選一。這個方向的實際價值我們在模擬項目X里做過對比。只拿某一層特征去做MVTec AD的圖像級檢測AUROC普遍在93%到96%之間但遇到皮革、木材這類紋理類缺陷或者膠囊這類小目標缺陷時波動很大。把多尺度特征簡單concat在一起指標能漲一點但對齊不充分最終98%這個量級的成績靠的是真正把引導機制做出效果。2. HLGFA核心組件拆解高低分辨率引導到底在引導什么2.1 多尺度特征金字塔高分辨率管細節(jié)低分辨率管語義理解HLGFA先要把特征金字塔這件事掰開揉碎。骨干網絡從淺到深特征圖分辨率逐步下降通道數逐步上升。以標準的ResNet結構為例輸入256×256的圖像stage2輸出大約是64×64stage3是32×32stage4是16×16。分辨率從64降到16意味著每個像素對應的原始圖像區(qū)域從4×4擴大到16×16。淺層高分辨率特征里的每個格子只管圖像里一小塊區(qū)域所以它能捕捉到劃痕的走向、紋理的細微斷裂但正因為每個格子管得太細缺少上下文它很難判斷“這個區(qū)域是不是整體不對勁”。深層低分辨率特征反過來每個格子對應的感受野很大能“看到”物體整體形狀和上下文但在這個尺度下細小缺陷可能只占了不到一個格子特征被周圍正常區(qū)域稀釋掉了。HLGFA的多尺度特征提取階段會同時保留淺層高分辨率特征和深層低分辨率特征而不是像一些簡化方法那樣只取中間某層。這一步看起來簡單實際是后續(xù)引導模塊的前提沒有高分辨率特征細節(jié)無從談起沒有低分辨率特征全局語義缺失。兩路特征后續(xù)通過引導模塊做對齊核心目標是把各自優(yōu)勢整合到同一個特征表達里。2.2 引導對齊模塊低層特征“指路”高層特征“落地”HLGFA的引導模塊我復現時最關注的是它的對齊方式。這里可以用“師傅帶徒弟”來類比低分辨率語義特征像一個老法師知道大方向上應該看哪里高分辨率細節(jié)特征像一個新手眼神好但容易看花眼。引導模塊要做的就是讓老法師給新手畫重點同時讓新手把老法師模糊的判斷落實成精確的邊緣。具體的實現路徑可以拆成兩個方向。一個方向是低分辨率語義特征生成注意力引導圖用來校準高分辨率特征。低分辨率特征經過全局池化或小卷積輸出一個空間注意力權重圖再上采樣到高分辨率尺寸對高分辨率特征做加權。這么做的好處是高分辨率特征在計算距離時會更關注真正可能有異常的局部區(qū)域抑制背景紋理的干擾。另一個方向是高分辨率細節(jié)特征反過來修正低分辨率特征的邊緣。低分辨率特征在上采樣找回細節(jié)時直接用雙線性插值會顯得很糊這時候可以用高分辨率特征作為引導做類似可變形對齊或跨尺度互注意力的操作讓低分辨率特征的邊緣重新“銳化”起來。最終把兩路特征融合成一路得到一個兼顧全局和細節(jié)的表示。實際操作中對齊模塊要特別注意分辨率倍率帶來的計算量。64×64的特征和16×16的特征做互注意力注意力圖尺寸跨越4倍如果直接計算內存和耗時都不小。比較務實的做法是在對齊前先對高分辨率特征做一次輕量降維或者只在局部窗口內做注意力而不是全局做。否則方法精度還沒上去顯存先爆了。2.3 異常的度量方式距離、密度與閾值的聯(lián)動特征提取得再好最終都要落到“怎么判斷異?!鄙稀LGFA在這條鏈路里采用的方式本質上還是和無監(jiān)督框架一致的拿融合后的正常特征建庫然后度量距離。距離度量最常見的兩種歐氏距離和馬氏距離。歐氏距離簡單直接但有個毛病它對特征不同維度的尺度差異很敏感某個維度方差大它就會主導距離。馬氏距離會顯式計算特征協(xié)方差矩陣相當于對每個維度做標準化理論上更合理但特征維度一旦很高協(xié)方差矩陣求逆的計算量和數值穩(wěn)定性都是問題。工業(yè)場景里更常用的折中方案是對特征做白化或者向量歸一化然后再算歐氏距離效果接近馬氏距離但便宜得多。閾值的選擇同樣關鍵。正常樣本在特征空間里的分布并不是一個圓而是有疏密之分。最樸素的方法是統(tǒng)計所有正常樣本距離的最大值或高分位數作為閾值更穩(wěn)一點的做法是劃分一個小驗證集專門用來校準閾值讓誤檢率和漏檢率達到可接受的平衡點。這里有個容易被忽略的點不同類別的正常特征分布差異很大比如瓶子的背景簡單正常特征非常緊湊皮革的紋理隨機性大正常特征天然分散。全局一個閾值通常不是最優(yōu)解各類別相對獨立的閾值配合少量人工復查往往能得到更實用的結果。3. MVTec AD上刷到98%訓練配置與評估細節(jié)復盤3.1 數據集劃分與評價指標98%到底是哪個98%聊HLGFA的成績必須先說清楚MVTec AD這個基準是怎么評的否則很容易被數字誤導。MVTec AD一共覆蓋15類工業(yè)物品大致分成兩類一類是瓶、膠囊、金屬螺母這類規(guī)則物體另一類是皮革、木材、瓷磚這類紋理材料。每個類別只提供少量正常樣本用于訓練測試樣本里混合了正常和多種缺陷類型。模型在訓練階段只能看到正常樣本測試階段則要對每一張圖給出“正常/異常”判斷同時對需要定位的場景輸出逐像素的異常圖。評價指標有兩個維度圖像級AUROC和像素級AUROC。圖像級AUROC衡量的是“整張圖判定為異?!钡哪芰ο袼丶堿UROC衡量的是“異常區(qū)域定位”的準確度。標題里的98%通常指的是圖像級AUROC這個量級近幾年確實是被頭部方法不斷推高的而像素級AUROC在MVTec AD上普遍要比圖像級低幾個點能做到95%以上已經非常強。如果你的任務最終要用熱力圖引導人工復檢像素級指標才是更需要關注的。3.2 骨干網絡、圖像尺寸和特征層選擇的影響在MVTec AD上復現這類方法第一件要決定的事是骨干網絡和輸入分辨率。骨干網絡方面ResNet-50和WideResNet-50是主流選擇。后者同等深度下通道更寬特征表達能力更強但顯存和推理時間也對應上漲。我在模擬項目X里對比過兩種網絡在同等輸入尺寸下的表現WideResNet-50在紋理類缺陷上通常能比ResNet-50高0.5到1個點在物體類缺陷上差距沒那么明顯。如果你的硬件資源有限優(yōu)先用ResNet-50起步先把流程跑通再考慮換寬網絡。輸入分辨率的影響更直接。256×256是平衡點512×512對細小缺陷更友好但特征圖尺寸翻四倍建庫和檢索的壓力都會明顯變大。紋理類物品建議至少用384或512因為皮革、木材上的缺陷往往尺度很小瓶、螺絲這類結構清晰的物體256或256以上通常就夠用了。特征層選擇也是一個經常被低估的變量。實踐經驗是太淺的特征比如stage1噪聲大太深的特征比如stage5或pool5丟失空間細節(jié)太多最常用的是stage2和stage3的高分辨率特征配合stage4的低分辨率語義特征。HLGFA這種引導式方法區(qū)別于簡單concat的點就在這里不是所有層權重平等相加而是讓低分辨率特征主導語義、高分辨率特征補充細節(jié)通過引導機制把兩路特征真正揉合起來。我在做對照實驗時發(fā)現去掉引導模塊、只做特征拼接AUROC平均會下降1到2個點部分紋理類下降更明顯這也側面說明引導不是花架子。3.3 記憶庫采樣與推理階段的關鍵處理訓練階段因為只用正常樣本流程其實很“輕”提取所有正常訓練圖像的多尺度融合特征存入記憶庫。但這里有一個工程矛盾特征存得越全庫越準確但推理時在庫里的最近鄰檢索就越慢。所以記憶庫不能直接全量塞進去基本都會做采樣壓縮。常見做法是coreset采樣也就是從原始特征集合里挑出一個最小子集保證子集對原集合的覆蓋誤差盡可能小。壓縮率通??梢宰龅?%到10%精度損失卻能控制在可接受范圍內。MVTec AD一個小類訓練集大概有兩三百張圖滑動窗口切patch后特征數量很大不壓縮的話單張推理可能要好幾百毫秒壓縮后能壓到幾十毫秒級別。推理階段還有一個細節(jié)patch特征的匹配方式。工業(yè)缺陷檢測最終要輸出像素級熱力圖所以測試圖像通常會切成patch與記憶庫匹配而不是整張圖只給一個全局距離。劃痕這類局部缺陷占比小如果不做patch級的度量很容易被整圖正常區(qū)域“稀釋”掉。patch有重疊時定位更平滑但計算量增大不重疊則速度快但可能切壞邊緣。實踐經驗是步長設為patch尺寸的一半兼顧平滑和效率。最后把patch級異常分數上采樣回原圖尺寸熱力圖基本可以直接用。4. 復現HLGFA最容易踩的坑4.1 高低分辨率特征對齊時的尺寸不匹配問題如果說復現這類方法有一個“新手必踩”的坑那就是特征圖對齊時的尺寸不匹配。骨干網絡不同stage的輸出分辨率相差整數倍但很多框架里因為padding策略和stride設置實際寬高并不是簡單整除。比如stage3輸出是17×17而不是16×16上采樣到stage2的尺寸時如果用固定的倍數插值結果就對不齊。處理方式一般有兩種。第一種是在插值時顯式指定目標尺寸而不是用scale_factor倍數縮放比如F.interpolate(deep_feat, size(high_feat.shape[-2], high_feat.shape[-1]), modebilinear, align_cornersFalse)。第二種是在骨干網絡層面就把各stage的輸出對齊到統(tǒng)一尺寸比如都上采樣到輸入圖像的1/4分辨率再做后續(xù)引導計算。第二種做法更省心因為后續(xù)所有模塊都工作在固定分辨率上不容易出錯。還有一個容易被忽略的細節(jié)是align_corners這個參數。不同的設置會改變插值坐標映射方式尤其在偶數到奇數尺寸變化時偏差雖然只有一兩個像素但在缺陷檢測這種對邊緣敏感的任務里可能直接造成熱力圖偏移。建議在項目初始化時就把所有插值統(tǒng)一成同一套參數不要這個模塊用align_cornersTrue另一個模塊用False否則排查起來非常難受。4.2 閾值校準與全局標準化漏檢和誤檢的博弈第二個高頻坑是閾值校準。很多剛上手的人會直接給所有類別設同一個異常分數閾值這在MVTec AD這種多類別基準上往往表現不佳。原因不復雜不同類別正常特征的“緊湊程度”差異非常大。瓶子的正常特征非常集中異常分數大多壓在低位皮革、木材這類高紋理類別正常樣本本身方差就大異常分數天然偏高。如果用統(tǒng)一閾值對紋理類容易漏檢對物體類容易誤檢。我建議的校準流程是訓練集正常樣本里留出一部分不加入記憶庫作為校準集。推理時先算校準集的異常分數分布取99分位或者最高值作為初始閾值再由現場需求做偏移。如果業(yè)務更怕漏檢閾值往下調更怕誤檢閾值往上調。這里沒有標準答案只有業(yè)務取向。另外異常分數在不同類別之間的量綱差異也很大如果想把分數統(tǒng)一展示給產線人員看最好做一次全局標準化比如把分數映射到0到1區(qū)間。具體做法是記錄訓練集正常樣本分數的均值mu和標準差sigma推理時用(score - mu) / sigma做標準化再套一個sigmoid或者截斷到0到1。如果不做這一步你給客戶展示的“異常分數0.8”和另一類產品的“異常分數0.8”可能完全不是一個含義解釋成本很高。4.3 推理速度與內存工業(yè)現場比排行榜更苛刻最后這個坑是實驗室環(huán)境里最不容易暴露、到了現場卻最致命的推理速度與內存占用。MVTec AD只有15類每類訓練樣本很少所以在榜單上跑一個方法哪怕推理慢一點大家也能接受。但工業(yè)現場往往要同時檢測多個產品型號一個型號一個模型模型數量一多內存和耗時都會被放大。HLGFA這類方法因為有較多的特征層和引導模塊模型參數量和中間特征圖都比單層特征方法更大再加上記憶庫檢索推理鏈路很容易變成算法精度98%但單張推理時間100毫秒產線節(jié)拍300毫秒根本跑不滿。我踩過的經驗有三條。第一記憶庫一定要壓縮優(yōu)先試5%的coreset壓縮比例精度下降通常不到0.3個點第二特征檢索用向量檢索庫而不是自己寫雙重循環(huán)第三如果部署在嵌入式平臺嘗試把引導模塊里的卷積替換成可重參數化的結構再用TensorRT做int8量化。量化的對象不要只盯著骨干網絡記憶庫特征向量的數值范圍也值得統(tǒng)一否則量化后距離度量會產生奇怪的偏置。5. 從SOTA到產線無監(jiān)督缺陷檢測的工程化落地思考5.1 數據分布漂移與模型更新策略榜單上的98%很好但產線環(huán)境不是靜態(tài)數據集。現場最常見的問題就是數據漂移換了批次原材料、調整了打光角度、產品模具修過正常樣本的特征分布都會慢慢偏離原始訓練數據。遇到這種情況不需要立刻全部重新訓練。更務實的做法是定期用當前產線上的正常樣本重新估算記憶庫和異常分數分布。因為無監(jiān)督方法的“訓練”本來就很輕只是提取特征建庫所以更新成本遠低于有監(jiān)督模型。也正因如此HLGFA這類方法在部署上有一個天然優(yōu)勢不需要標注新缺陷只需要不斷補充正常樣本就能維持檢測器的有效性。更穩(wěn)妥的方案是維護一個“黃金基準庫”。設備剛調試完成、確認沒有缺陷時的那些正常樣本是最重要的資產把它們單獨存好每次模型更新都以它們?yōu)殄^點只擴充不替換防止分布漂移把基準也帶偏了。5.2 多缺陷類型與類別不均衡的處理雖然無監(jiān)督方法不需要標注缺陷但缺陷類型不均衡依然會影響體驗。舉個例子如果某類產品歷史上只出現過劃痕那么已有的正常特征庫對于“異色區(qū)域”這種全新類型的缺陷可能距離不夠大表現為漏檢。當出現這種“已知正常樣本無法覆蓋新異常”的情況時一個很實用的補充手段是把現場人工已經確認的缺陷樣本的特征摳出來作為“偽異?!奔尤腴撝敌驶蜃鰠⒖季嚯x對比而不是直接重訓模型。這個思路可以理解成把無監(jiān)督方法升級成“半監(jiān)督”我們不需要大量標注只需要幾十張缺陷圖就能顯著改善特定類型缺陷的召回。另外不同缺陷類型的像素面積差異也很大。點狀缺陷很小patch級的特征距離可能不夠突出大面積的臟污又可能讓全局圖像級分數明顯升高。建議同時保留圖像級和像素級兩個分數分別設置閾值再做邏輯融合任意一個超過閾值就判異常最終熱力圖以像素級分數為準。5.3 與人工復檢流程的銜接算法做得再好工業(yè)現場通常還是需要人工復檢兜底。但一條產線每天幾萬件人工不可能逐張看。HLGFA這類方法的價值在于它能把“所有人都要看的圖”縮減成“只有異常分數落在模糊區(qū)間的少數圖才需要人看”。實際操作中我會把結果劃分成三檔明顯正常、模糊地帶、明顯異常。明顯正常直接放行明顯異常自動剔除模糊地帶的人工復檢。模糊地帶的比例可以通過閾值調整剛開始上線時建議放寬閾值讓更多樣本進入人工復檢收集數據并統(tǒng)計誤報/漏報率運行一兩周后再慢慢收緊。對人工復檢來說單給一個“異常分數”意義不大更重要的是熱力圖。HLGFA經過高低分辨率引導之后熱力圖邊緣比單層特征方法清晰得多我能直接跟師傅說“你看這個位置有一道弧形的劃痕”而不只是“這張圖異?!?。這一點看似無關緊要實際決定了現場工人愿不愿意信任這個系統(tǒng)。檢測技術終歸是工具得讓人用得順手才算真正落地。最后再分享一個小經驗不管你在MVTec AD上復現到什么水平都不要直接拿榜單參數硬套自己的產線數據。建議先拿二三十張現場正常圖快速建一個最小可用版本跑通上面提到的閾值校準和熱力圖輸出鏈路再逐步優(yōu)化。無監(jiān)督缺陷檢測的好處本來就是輕量啟動別等項目全做完了才拿到現場驗證。