缺陷檢測小樣本訓(xùn)練與漏檢控制實(shí)戰(zhàn):YOLO模型調(diào)優(yōu)與產(chǎn)線部署)
1. 工業(yè)缺陷檢測到底難在哪從一條產(chǎn)線說起我在工廠里蹲過的第一條缺陷檢測產(chǎn)線是做金屬沖壓件的。產(chǎn)線速度每分鐘120件相機(jī)每秒拍8張一天下來光圖像就有幾十萬張。但真正讓我頭疼的不是數(shù)據(jù)量而是缺陷樣本少得可憐——一整天的良品可能有五十萬張但劃痕、凹坑、毛刺這些缺陷加起來可能不到兩百張其中某些罕見缺陷甚至只有個位數(shù)。這就是工業(yè)缺陷檢測最核心的矛盾良品泛濫缺陷稀缺。你跟老板說要做深度學(xué)習(xí)檢測老板第一反應(yīng)是“行那你去收集數(shù)據(jù)”結(jié)果你收集了三個月發(fā)現(xiàn)能用的缺陷樣本還不夠訓(xùn)練一個像樣的分類器。更麻煩的是產(chǎn)線不能停你不可能為了收集缺陷樣本故意讓產(chǎn)線生產(chǎn)不良品——這在制造業(yè)里是原則性問題。所以這個項目要解決的核心問題就兩個第一怎么用極少量的缺陷樣本訓(xùn)練出可用的檢測模型第二怎么在實(shí)際部署中把漏檢率壓到產(chǎn)線能接受的水平。前者是訓(xùn)練策略問題后者是工程落地問題兩者缺一不可。這篇文章適合誰看如果你正在做工業(yè)視覺檢測的項目手頭缺陷樣本不多但又必須把系統(tǒng)跑起來那這篇內(nèi)容應(yīng)該能幫你少走一些彎路。我會從數(shù)據(jù)策略、模型選型、訓(xùn)練技巧、漏檢控制、部署調(diào)優(yōu)這幾個維度把整個流程拆開講清楚。涉及到的工具鏈以YOLO系列為主因?yàn)樗诠I(yè)場景里部署成本低、推理速度快但思路對其他框架同樣適用。注意工業(yè)缺陷檢測和學(xué)術(shù)界的通用目標(biāo)檢測有本質(zhì)區(qū)別。學(xué)術(shù)界追求mAP工業(yè)界追求的是“不漏檢”和“低誤報”之間的平衡。一個mAP 0.85但漏檢率5%的模型在產(chǎn)線上就是廢品一個mAP 0.70但漏檢率0.5%的模型反而可能被接受。這個認(rèn)知差異會貫穿整個項目的技術(shù)決策。2. 小樣本訓(xùn)練的核心思路與方案選型2.1 為什么不能直接拿YOLO硬訓(xùn)很多人拿到項目的第一反應(yīng)是找個YOLO的預(yù)訓(xùn)練權(quán)重把缺陷數(shù)據(jù)標(biāo)一標(biāo)直接fine-tune。這個思路在缺陷樣本有幾百上千張的時候勉強(qiáng)能用但在小樣本場景下會出大問題。原因很簡單YOLO的檢測頭是在COCO數(shù)據(jù)集上訓(xùn)練的它學(xué)到的是“人、車、狗、貓”這些類別的特征分布。你拿幾十張劃痕圖片去fine-tune模型會傾向于快速擬合這幾十張圖的紋理和背景而不是學(xué)到“劃痕”這個概念的通用特征。結(jié)果就是訓(xùn)練集上loss降得很漂亮但換一批新圖片就崩了。我實(shí)測過一個案例某五金件表面缺陷檢測缺陷樣本只有63張直接用YOLOv8n fine-tune訓(xùn)練集mAP能到0.92但驗(yàn)證集只有0.41典型的過擬合。后來換了策略驗(yàn)證集mAP提到了0.78雖然不算完美但已經(jīng)能配合人工復(fù)檢跑起來了。2.2 小樣本訓(xùn)練的四種主流策略對比在小樣本工業(yè)缺陷檢測里常見的策略有這么幾種我做一個橫向?qū)Ρ炔呗院诵乃悸穬?yōu)點(diǎn)缺點(diǎn)適用場景數(shù)據(jù)增強(qiáng)Fine-tune通過幾何變換、色彩擾動擴(kuò)充樣本實(shí)現(xiàn)簡單見效快增強(qiáng)多樣性有限容易過擬合缺陷樣本50-200張異常檢測無監(jiān)督只學(xué)良品分布偏離即異常不需要缺陷樣本誤報率高定位精度差缺陷樣本30張遷移學(xué)習(xí)特征凍結(jié)凍結(jié)backbone只訓(xùn)檢測頭防止過擬合特征適配性受限缺陷與自然圖像特征接近合成數(shù)據(jù)域適應(yīng)用渲染/生成方式造缺陷樣本量可控域間隙大需額外對齊缺陷形態(tài)可建模我的經(jīng)驗(yàn)是缺陷樣本在50張以上優(yōu)先考慮數(shù)據(jù)增強(qiáng)Fine-tune低于30張先上異常檢測兜底同時并行收集數(shù)據(jù)。兩者不是互斥的可以做成兩級檢測——異常檢測做粗篩YOLO做精定位。2.3 數(shù)據(jù)增強(qiáng)在工業(yè)場景的特殊玩法通用的數(shù)據(jù)增強(qiáng)手段翻轉(zhuǎn)、旋轉(zhuǎn)、縮放、色彩抖動在工業(yè)場景里要慎用。比如劃痕檢測你把圖片上下翻轉(zhuǎn)劃痕的方向分布就變了模型可能學(xué)到錯誤的方向先驗(yàn)。再比如色彩抖動某些缺陷是靠顏色差異體現(xiàn)的比如氧化變色你一動色調(diào)缺陷特征就被破壞了。我在實(shí)際項目里常用的增強(qiáng)策略是這樣的幾何增強(qiáng)限定范圍旋轉(zhuǎn)控制在±15度以內(nèi)縮放控制在0.9-1.1倍翻轉(zhuǎn)只在缺陷方向無關(guān)時使用。光照模擬工業(yè)現(xiàn)場光照變化是最大的干擾源之一。我會用隨機(jī)亮度調(diào)整±20%、隨機(jī)對比度調(diào)整±15%、模擬局部陰影隨機(jī)遮擋塊來增強(qiáng)模型的光照魯棒性。噪聲注入高斯噪聲和椒鹽噪聲各加一點(diǎn)模擬相機(jī)在不同ISO下的表現(xiàn)。CutMix和Mosaic這兩個對YOLO特別有效。CutMix把兩張圖的局部區(qū)域互換Mosaic把四張圖拼成一張。它們能顯著提升小樣本下的泛化能力但要注意——Mosaic在缺陷檢測里可能把缺陷切碎導(dǎo)致標(biāo)注框不完整。我的做法是Mosaic概率設(shè)低一點(diǎn)0.3左右CutMix保持在0.5。還有一個技巧是缺陷復(fù)制粘貼從一張圖里把缺陷區(qū)域摳出來隨機(jī)粘貼到其他良品圖的合理位置。這個方法的本質(zhì)是增加缺陷在不同背景下的出現(xiàn)次數(shù)讓模型學(xué)到“缺陷本身”而不是“缺陷背景”的組合。實(shí)測下來這個技巧在樣本少于100張時效果非常明顯驗(yàn)證集mAP能提升8-12個百分點(diǎn)。實(shí)操心得復(fù)制粘貼的時候粘貼位置要避開產(chǎn)品的功能區(qū)域。比如你檢測的是連接器缺陷粘貼到插針區(qū)域就不合理了模型會學(xué)到錯誤的上下文關(guān)系。我一般會先標(biāo)注一個“允許缺陷出現(xiàn)區(qū)域”的mask粘貼時只在這個區(qū)域內(nèi)隨機(jī)。3. YOLO模型選型與損失函數(shù)調(diào)優(yōu)細(xì)節(jié)3.1 工業(yè)場景下YOLO版本怎么選YOLO系列更新很快從v5到v8到v11還有各種改進(jìn)版本。工業(yè)缺陷檢測選版本核心看三個指標(biāo)推理速度、小目標(biāo)檢測能力、部署便利性。我的選型邏輯是這樣的YOLOv5生態(tài)最成熟資料最多部署工具鏈最完善。缺點(diǎn)是backbone相對老舊小目標(biāo)檢測一般。適合剛?cè)腴T的團(tuán)隊。YOLOv8精度和速度平衡得最好anchor-free設(shè)計對小目標(biāo)更友好支持實(shí)例分割。目前工業(yè)場景的首選。YOLOv11在v8基礎(chǔ)上進(jìn)一步優(yōu)化了neck結(jié)構(gòu)小目標(biāo)檢測有提升但部署生態(tài)還在完善中。改進(jìn)版本如Efficient Head YOLO如果缺陷目標(biāo)特別小比如小于20x20像素可以考慮用帶注意力機(jī)制或改進(jìn)檢測頭的版本。我目前在產(chǎn)線上跑得最多的是YOLOv8s和YOLOv8m。s版本在T4上跑640分辨率能到120FPS以上m版本大概60FPS都夠用。如果產(chǎn)線速度特別快可以考慮n版本但精度會降一些。3.2 損失函數(shù)里藏著的漏檢控制開關(guān)YOLO的損失函數(shù)由三部分組成分類損失、定位損失、置信度損失。很多人訓(xùn)練的時候直接用默認(rèn)配置但在工業(yè)缺陷檢測里損失函數(shù)的調(diào)整直接關(guān)系到漏檢率。先說分類損失。YOLOv8默認(rèn)用的是BCE Loss二值交叉熵在多類別缺陷檢測里沒問題。但如果你的缺陷類別極度不平衡——比如劃痕有200個樣本凹坑只有5個——那分類損失會被劃痕主導(dǎo)凹坑的梯度信號被淹沒。這時候可以用Focal Loss替代它通過降低易分類樣本的權(quán)重讓模型更關(guān)注難分類的少數(shù)類。再說定位損失。YOLOv8默認(rèn)用CIoU Loss它同時考慮重疊面積、中心點(diǎn)距離和長寬比。但在缺陷檢測里有些缺陷的形狀很不規(guī)則比如毛刺、裂紋CIoU的長寬比懲罰項可能反而有害。我試過用SIoU Loss替代在某些不規(guī)則缺陷上效果更好因?yàn)镾IoU考慮了角度因素。最關(guān)鍵的是置信度損失。漏檢的直接來源就是置信度閾值設(shè)得太高或者模型對某些缺陷的置信度輸出普遍偏低。我的做法是訓(xùn)練時把置信度損失的權(quán)重適當(dāng)調(diào)高比如從默認(rèn)的1.0調(diào)到1.5讓模型更重視“有沒有缺陷”這個判斷。推理時不要用默認(rèn)的0.25置信度閾值而是根據(jù)驗(yàn)證集上的PR曲線找到漏檢率和誤報率的平衡點(diǎn)。工業(yè)場景通常把閾值設(shè)在0.1-0.15寧可誤報多一點(diǎn)也不能漏檢。這里有一個參數(shù)計算的實(shí)際例子。假設(shè)驗(yàn)證集有1000張圖其中50張有缺陷。我用不同置信度閾值測試置信度閾值漏檢數(shù)誤報數(shù)漏檢率誤報率0.2581216%1.2%0.153286%2.8%0.101552%5.5%0.0501200%12%從表里可以看到閾值從0.25降到0.10漏檢率從16%降到2%但誤報率從1.2%升到5.5%。在產(chǎn)線上5.5%的誤報意味著每100件產(chǎn)品有5件被誤判為不良需要人工復(fù)檢。這個成本產(chǎn)線能不能接受取決于復(fù)檢工位的人力配置。我的經(jīng)驗(yàn)是漏檢率控制在1%以內(nèi)誤報率控制在5%以內(nèi)是一個比較合理的平衡點(diǎn)。3.3 NWD在缺陷檢測中的應(yīng)用NWDNormalized Wasserstein Distance是近幾年在小目標(biāo)檢測里比較火的一個改進(jìn)。它的核心思想是用高斯分布來建模邊界框然后計算兩個分布之間的Wasserstein距離而不是傳統(tǒng)的IoU。為什么這個對工業(yè)缺陷檢測有用因?yàn)楹芏嗳毕菽繕?biāo)非常小IoU對位置偏移極其敏感。兩個框稍微偏幾個像素IoU就從0.5掉到0.1梯度信號就斷了。NWD對位置偏移更魯棒能提供更平滑的梯度。我實(shí)測過在PCB板缺陷檢測里用NWD替換CIoU小缺陷小于15x15像素的召回率提升了約7個百分點(diǎn)。但NWD也不是萬能的它對大目標(biāo)的檢測幫助不大而且計算量比IoU大。所以我的建議是如果缺陷目標(biāo)普遍偏小可以試試NWD如果缺陷大小分布均勻用CIoU就夠了。4. 漏檢控制的系統(tǒng)工程從模型到產(chǎn)線4.1 漏檢的根源分析漏檢不是單一原因造成的它是一個系統(tǒng)性問題。我在實(shí)際項目里總結(jié)的漏檢根源主要有這么幾類模型能力不足缺陷特征太微弱模型根本學(xué)不到。比如某些內(nèi)部裂紋表面看不出來需要特殊光源才能成像。置信度閾值過高模型其實(shí)檢測到了但置信度低于閾值被過濾掉了。NMS抑制兩個缺陷靠得很近NMS把其中一個低置信度的框抑制掉了。圖像質(zhì)量問題過曝、欠曝、模糊、遮擋導(dǎo)致缺陷不可見。域偏移訓(xùn)練數(shù)據(jù)和實(shí)際產(chǎn)線數(shù)據(jù)分布不一致比如換了批次材料、換了光源。標(biāo)注遺漏訓(xùn)練時有些缺陷沒標(biāo)模型學(xué)會了忽略它們。針對每一類根源對應(yīng)的解決策略完全不同。模型能力不足要改網(wǎng)絡(luò)結(jié)構(gòu)或增強(qiáng)數(shù)據(jù)閾值問題要調(diào)參NMS問題要改NMS策略圖像問題要改硬件域偏移要做在線學(xué)習(xí)或域適應(yīng)標(biāo)注問題要重新審查數(shù)據(jù)集。4.2 多級檢測架構(gòu)設(shè)計單靠一個YOLO模型想把漏檢率壓到極低難度很大。我在產(chǎn)線上通常會用多級檢測架構(gòu)第一級異常檢測粗篩。用無監(jiān)督方法比如基于特征重建的異常檢測對全圖做快速掃描輸出一個異常熱力圖。這一級的閾值設(shè)得很低寧可誤報也不漏報。它的作用是保證“有缺陷的圖不會被直接放過”。第二級YOLO精定位。對第一級標(biāo)記為可疑的區(qū)域用YOLO做精細(xì)檢測和分類。這一級負(fù)責(zé)確定缺陷的類型、位置、大小。第三級規(guī)則后處理。根據(jù)缺陷的面積、長寬比、位置等幾何特征做規(guī)則過濾。比如面積小于10像素的可能是噪聲面積大于5000像素的可能是誤報。這一級能有效降低誤報率。第四級人工復(fù)檢兜底。對于置信度在灰色地帶比如0.1-0.3之間的檢測結(jié)果推送到人工復(fù)檢界面。這一級是最后的保險。這個架構(gòu)的優(yōu)點(diǎn)是每一級只做自己擅長的事整體漏檢率可以壓到0.5%以下同時誤報率控制在可接受范圍。缺點(diǎn)是系統(tǒng)復(fù)雜度高需要更多的工程投入。4.3 在線學(xué)習(xí)與模型迭代產(chǎn)線環(huán)境不是一成不變的。換了材料批次、換了光源、換了相機(jī)角度模型的表現(xiàn)都可能下降。所以漏檢控制不是一次性的工作而是一個持續(xù)迭代的過程。我的做法是建立一個在線學(xué)習(xí)閉環(huán)產(chǎn)線每天產(chǎn)生的檢測結(jié)果自動存檔包括原圖、檢測框、置信度。人工復(fù)檢的結(jié)果反饋回系統(tǒng)標(biāo)記哪些是漏檢、哪些是誤報。每周做一次增量訓(xùn)練把新收集的缺陷樣本加入訓(xùn)練集重新fine-tune模型。新模型在驗(yàn)證集上評估通過后灰度上線觀察一周再全量替換。這個閉環(huán)的關(guān)鍵是數(shù)據(jù)回流。很多團(tuán)隊做完部署就不管了模型半年不更新漏檢率慢慢就上去了。我見過最夸張的案例一個模型上線一年沒更新漏檢率從1%漲到了15%因?yàn)楫a(chǎn)線換了三次材料供應(yīng)商缺陷形態(tài)完全變了。注意事項增量訓(xùn)練的時候不要只用新數(shù)據(jù)訓(xùn)要把舊數(shù)據(jù)按一定比例混進(jìn)去。否則模型會發(fā)生“災(zāi)難性遺忘”在新數(shù)據(jù)上表現(xiàn)好在舊數(shù)據(jù)上崩掉。我一般新老數(shù)據(jù)比例控制在1:3左右。5. 部署調(diào)優(yōu)與性能實(shí)測5.1 TensorRT加速與多路視頻流支持工業(yè)產(chǎn)線通常有多條線、多個工位需要同時處理多路視頻流。用PyTorch原生推理T4上跑YOLOv8s 640分辨率大概只能到30FPS勉強(qiáng)夠一路。用TensorRT加速后FP16精度下能到120FPS以上INT8精度下能到200FPS。這里有一個實(shí)際的計算假設(shè)每條產(chǎn)線需要25FPS的檢測幀率對應(yīng)1080p25幀的視頻流T4上用TensorRT加速YOLOv8s 640分辨率FP16精度下單卡可以支持4-5路。如果換成YOLOv8n可以支持8-10路。如果精度要求不高用INT8量化路數(shù)還能翻倍。但I(xiàn)NT8量化有個坑校準(zhǔn)集的選擇。TensorRT的INT8量化需要一批校準(zhǔn)圖片來統(tǒng)計激活值分布。如果你用COCO的圖片做校準(zhǔn)但實(shí)際推理的是工業(yè)圖像量化誤差會很大精度掉得厲害。我的做法是用產(chǎn)線實(shí)際采集的500-1000張圖片做校準(zhǔn)覆蓋不同的光照條件和產(chǎn)品型號。這樣量化后的精度損失可以控制在1-2個百分點(diǎn)以內(nèi)。5.2 推理速度與精度的平衡工業(yè)場景里速度和精度的平衡點(diǎn)取決于產(chǎn)線節(jié)拍。我一般按這個邏輯來選產(chǎn)線節(jié)拍 100件/分鐘用YOLOv8n或YOLOv8s輸入分辨率降到416或320優(yōu)先保速度。產(chǎn)線節(jié)拍 30-100件/分鐘用YOLOv8s或YOLOv8m輸入分辨率640速度和精度兼顧。產(chǎn)線節(jié)拍 30件/分鐘用YOLOv8m或YOLOv8l輸入分辨率可以提到800甚至1024優(yōu)先保精度。輸入分辨率對速度的影響是平方級的。640到320像素數(shù)少了4倍推理速度大概能快3倍。但小缺陷的檢測能力會明顯下降。我實(shí)測過一個15x15像素的缺陷在640分辨率下能穩(wěn)定檢出降到320就經(jīng)常漏了。所以如果缺陷目標(biāo)很小分辨率不能降。5.3 實(shí)際產(chǎn)線部署的工程細(xì)節(jié)部署的時候有幾個工程細(xì)節(jié)特別容易踩坑相機(jī)觸發(fā)與推理同步。產(chǎn)線相機(jī)通常是硬觸發(fā)的每來一個產(chǎn)品拍一張。推理程序要能及時響應(yīng)觸發(fā)信號不能丟幀。我一般用多線程架構(gòu)一個線程負(fù)責(zé)采集圖像放入隊列另一個線程負(fù)責(zé)推理還有一個線程負(fù)責(zé)結(jié)果輸出和通信。隊列長度設(shè)小一點(diǎn)比如2-3避免積壓導(dǎo)致延遲。光照穩(wěn)定性。這是最容易被忽視但影響最大的因素。產(chǎn)線燈光用久了會衰減環(huán)境光會變化這些都會導(dǎo)致圖像分布偏移。我的做法是定期比如每周用標(biāo)準(zhǔn)樣品做一次校準(zhǔn)檢查圖像亮度、對比度是否在范圍內(nèi)。如果偏差超過閾值就觸發(fā)報警讓人來調(diào)光源。結(jié)果通信的實(shí)時性。檢測結(jié)果要傳給PLC或分揀機(jī)構(gòu)通信延遲必須控制在毫秒級。我一般用TCP或共享內(nèi)存不用HTTP這種高開銷的協(xié)議。如果產(chǎn)線速度很快還要考慮結(jié)果緩存和批量發(fā)送。異常處理。推理程序要能處理各種異常相機(jī)斷連、圖像丟幀、模型推理失敗、通信超時。每一種異常都要有對應(yīng)的降級策略。比如相機(jī)斷連時自動切換到上一幀或輸出“未知”狀態(tài)不能讓產(chǎn)線停在那里等。6. 常見問題與排查技巧實(shí)錄6.1 訓(xùn)練階段的高頻問題問題一loss不下降或震蕩嚴(yán)重。最常見的原因是學(xué)習(xí)率設(shè)太大了。YOLO的默認(rèn)學(xué)習(xí)率是0.01但在小樣本fine-tune時這個值往往太大。我一般會降到0.001甚至0.0005。另外如果用了Mosaic增強(qiáng)訓(xùn)練前期loss震蕩是正常的因?yàn)镸osaic拼接的圖片分布和自然圖像差異大??梢韵扔玫蚆osaic概率訓(xùn)幾十個epoch再逐步提高。問題二驗(yàn)證集mAP遠(yuǎn)低于訓(xùn)練集。這是過擬合的典型表現(xiàn)。解決方法按優(yōu)先級排序增加數(shù)據(jù)增強(qiáng)、減小模型規(guī)模比如從m換成s、加Dropout或Weight Decay、凍結(jié)backbone的前幾層。我試過最有效的一招是凍結(jié)backbone只訓(xùn)neck和head在小樣本下能顯著縮小訓(xùn)練集和驗(yàn)證集的差距。問題三某些類別的AP特別低。這通常是類別不平衡導(dǎo)致的。除了用Focal Loss還可以用重采樣策略在DataLoader里對少數(shù)類樣本過采樣讓每個batch里各類別的樣本數(shù)大致均衡。另外檢查一下少數(shù)類的標(biāo)注質(zhì)量有時候是標(biāo)注不一致導(dǎo)致的。6.2 推理階段的高頻問題問題一模型在測試集上表現(xiàn)好但產(chǎn)線上漏檢多。這幾乎肯定是域偏移問題。訓(xùn)練數(shù)據(jù)和產(chǎn)線數(shù)據(jù)的分布不一致可能的原因包括光照不同、相機(jī)不同、產(chǎn)品批次不同、背景不同。解決方法收集產(chǎn)線實(shí)際數(shù)據(jù)做fine-tune或者用域適應(yīng)方法如風(fēng)格遷移把訓(xùn)練數(shù)據(jù)對齊到產(chǎn)線風(fēng)格。問題二推理速度達(dá)不到預(yù)期。先檢查是不是用了TensorRT加速再檢查輸入分辨率是不是設(shè)太大了然后檢查后處理NMS是不是成了瓶頸。NMS在檢測框很多的時候會非常慢可以用GPU版的NMS或者Fast NMS替代。問題三同一張圖多次推理結(jié)果不一致。這通常是隨機(jī)性導(dǎo)致的比如推理時開了數(shù)據(jù)增強(qiáng)TTA或者模型里有Dropout沒關(guān)掉。檢查模型是不是處于eval模式TTA是不是有必要開。6.3 漏檢排查速查表現(xiàn)象可能原因排查方法解決策略特定缺陷類型漏檢該類樣本太少統(tǒng)計各類別樣本數(shù)過采樣Focal Loss小缺陷漏檢分辨率不夠可視化特征圖提高輸入分辨率低對比度缺陷漏檢光照不足檢查圖像直方圖調(diào)整光源或做直方圖均衡密集缺陷漏檢NMS抑制檢查NMS閾值提高NMS閾值或改用Soft-NMS新批次產(chǎn)品漏檢域偏移對比新舊數(shù)據(jù)分布增量訓(xùn)練或域適應(yīng)隨機(jī)漏檢置信度閾值過高分析置信度分布降低閾值人工復(fù)檢6.4 幾個我踩過的坑坑一標(biāo)注質(zhì)量比數(shù)量重要。我見過一個項目團(tuán)隊花了兩個月標(biāo)了5000張圖但標(biāo)注一致性很差同一個缺陷不同人標(biāo)的位置偏差很大。結(jié)果模型學(xué)出來的框忽大忽小置信度也不穩(wěn)定。后來重新制定了標(biāo)注規(guī)范只標(biāo)了2000張但質(zhì)量高模型效果反而更好??佣灰孕糯竽P?。工業(yè)缺陷檢測里YOLOv8n有時候比YOLOv8l效果更好因?yàn)樾∧P筒蝗菀走^擬合小樣本。我做過對比實(shí)驗(yàn)在200張缺陷樣本的數(shù)據(jù)集上n版本的驗(yàn)證集mAP比l版本高了5個百分點(diǎn)??尤郎y試集要獨(dú)立。很多人從訓(xùn)練集里切一部分做驗(yàn)證集這是不對的。驗(yàn)證集應(yīng)該和訓(xùn)練集來自不同的時間段、不同的批次這樣才能真實(shí)反映模型的泛化能力。我一般會留出最近一周的數(shù)據(jù)做測試集前面的數(shù)據(jù)做訓(xùn)練和驗(yàn)證。坑四不要忽略后處理。模型輸出的原始檢測框往往有很多冗余和噪聲。后處理做得好能顯著降低誤報率。我常用的后處理包括按面積過濾、按長寬比過濾、按位置過濾比如產(chǎn)品邊緣的檢測框可能是誤報、按置信度排序后取Top-K。7. 異常檢測與小樣本YOLO的配合打法7.1 什么時候該用異常檢測異常檢測Anomaly Detection的核心思路是只學(xué)良品分布任何偏離良品分布的都視為異常。它的最大優(yōu)勢是不需要缺陷樣本這在冷啟動階段非常有用。但異常檢測的缺點(diǎn)也很明顯它只能告訴你“這里可能有問題”不能告訴你“這是什么缺陷”。而且誤報率通常比較高因?yàn)榱计返淖匀徊▌右部赡鼙慌卸楫惓?。我的?jīng)驗(yàn)是缺陷樣本少于30張時先用異常檢測跑起來同時并行收集缺陷樣本。等缺陷樣本積累到50張以上再訓(xùn)練YOLO做精分類。兩者可以共存異常檢測做粗篩YOLO做精檢。7.2 異常檢測算法的選型工業(yè)異常檢測常用的算法有基于重建的方法如AutoEncoder、VAE學(xué)習(xí)良品的壓縮表示重建誤差大的區(qū)域視為異常。優(yōu)點(diǎn)是簡單缺點(diǎn)是對紋理復(fù)雜的表面效果一般?;谔卣髑度氲姆椒ㄈ鏟aDiM、PatchCore用預(yù)訓(xùn)練網(wǎng)絡(luò)提取特征建模良品特征分布。優(yōu)點(diǎn)是效果好缺點(diǎn)是推理速度較慢?;跉w一化流的方法如FastFlow用歸一化流建模特征分布。速度和精度平衡得比較好。我目前在產(chǎn)線上用得最多的是PatchCore它的檢測精度在MVTec AD數(shù)據(jù)集上表現(xiàn)很好推理速度也能接受。但PatchCore需要保存良品特征庫內(nèi)存占用比較大。如果產(chǎn)線內(nèi)存有限可以考慮FastFlow。7.3 兩級檢測的閾值聯(lián)動異常檢測和YOLO的閾值需要聯(lián)動調(diào)整。我的做法是異常檢測的閾值設(shè)得低一些保證高召回。比如異常分?jǐn)?shù)0.3就標(biāo)記為可疑區(qū)域。YOLO的置信度閾值設(shè)得也低一些比如0.1。最終判定邏輯如果異常檢測標(biāo)記了可疑區(qū)域但YOLO沒有檢測到任何缺陷則推送到人工復(fù)檢。如果YOLO檢測到了缺陷且置信度0.5則直接判定為不良。如果YOLO置信度在0.1-0.5之間也推送到人工復(fù)檢。這個聯(lián)動邏輯能把漏檢率壓到極低同時把人工復(fù)檢的量控制在可接受范圍。我實(shí)測下來人工復(fù)檢率大概在3-5%左右產(chǎn)線能接受。8. 數(shù)據(jù)集的長期運(yùn)營與模型迭代節(jié)奏8.1 數(shù)據(jù)集的版本管理工業(yè)缺陷檢測的數(shù)據(jù)集不是一成不變的它會隨著產(chǎn)線變化、產(chǎn)品迭代、缺陷形態(tài)演變而不斷更新。所以數(shù)據(jù)集需要版本管理。我一般用DVC或Git LFS來管理數(shù)據(jù)集版本每次增量訓(xùn)練都打一個tag記錄數(shù)據(jù)集的變更內(nèi)容。這樣如果新模型出了問題可以快速回滾到舊版本。數(shù)據(jù)集的目錄結(jié)構(gòu)我通常這樣組織dataset/ v1.0/ images/ train/ val/ test/ labels/ train/ val/ test/ dataset.yaml v1.1/ ...每個版本都要有對應(yīng)的模型權(quán)重和評估報告方便追溯。8.2 模型迭代的節(jié)奏模型迭代不能太頻繁也不能太懶。我的建議是每周一次小迭代用新收集的缺陷樣本做增量訓(xùn)練評估后灰度上線。每月一次大迭代重新審視數(shù)據(jù)集清理錯誤標(biāo)注調(diào)整數(shù)據(jù)增強(qiáng)策略可能換模型結(jié)構(gòu)。每季度一次全面評估在獨(dú)立的測試集上做全面評估檢查漏檢率、誤報率、推理速度是否滿足產(chǎn)線要求。迭代的時候要注意A/B測試。新模型不要直接全量替換先在小范圍產(chǎn)線上跑一周對比新舊模型的漏檢率和誤報率。如果新模型沒有明顯優(yōu)勢就不要換。8.3 標(biāo)注團(tuán)隊的培訓(xùn)與質(zhì)量控制標(biāo)注質(zhì)量是模型效果的上限。我見過太多項目模型怎么調(diào)都上不去最后發(fā)現(xiàn)是標(biāo)注有問題。標(biāo)注團(tuán)隊需要定期培訓(xùn)統(tǒng)一標(biāo)注規(guī)范。我一般會做這幾件事制定詳細(xì)的標(biāo)注手冊包含各種缺陷的示例圖、標(biāo)注邊界、最小標(biāo)注尺寸。每周做一次標(biāo)注質(zhì)量抽查隨機(jī)抽100張圖檢查標(biāo)注一致性。用IoU來衡量標(biāo)注一致性如果同一個缺陷兩個人標(biāo)的框IoU低于0.7就說明標(biāo)注規(guī)范有問題需要重新培訓(xùn)。對于有爭議的缺陷組織標(biāo)注團(tuán)隊討論形成共識。實(shí)操心得標(biāo)注團(tuán)隊最好固定人員不要頻繁換人。一個新標(biāo)注員需要至少兩周才能達(dá)到穩(wěn)定的標(biāo)注質(zhì)量。頻繁換人會導(dǎo)致標(biāo)注風(fēng)格不一致模型學(xué)出來的東西也會飄。9. 一些關(guān)于工具鏈和平臺選擇的經(jīng)驗(yàn)9.1 訓(xùn)練平臺怎么選小樣本訓(xùn)練對算力要求不高一張RTX 3090或4090就夠用了。如果團(tuán)隊沒有本地GPU可以用云平臺但要注意數(shù)據(jù)安全——工業(yè)圖像可能涉及商業(yè)機(jī)密不要隨便傳到公有云上。我一般推薦本地訓(xùn)練用Docker把環(huán)境封裝好方便復(fù)現(xiàn)。訓(xùn)練框架用Ultralytics的YOLO庫就夠了它封裝得很好改起來也方便。9.2 部署工具鏈部署這塊TensorRT是首選但它的學(xué)習(xí)曲線比較陡。如果團(tuán)隊沒有TensorRT經(jīng)驗(yàn)可以先用ONNX Runtime速度雖然慢一些但部署簡單。等團(tuán)隊熟悉了再上TensorRT。模型導(dǎo)出的時候要注意opset版本。YOLOv8導(dǎo)出ONNX一般用opset 12或13TensorRT對opset 13的支持比較好。導(dǎo)出后要用onnxsim做一下簡化去掉冗余算子能提升推理速度。9.3 監(jiān)控與報警產(chǎn)線部署后監(jiān)控系統(tǒng)必不可少。我一般會監(jiān)控這幾個指標(biāo)推理延遲超過閾值就報警說明系統(tǒng)可能卡了。檢測率如果連續(xù)一段時間檢測率異常高或異常低說明可能有問題。置信度分布如果置信度分布發(fā)生明顯偏移說明數(shù)據(jù)分布可能變了。硬件狀態(tài)GPU溫度、顯存占用、相機(jī)狀態(tài)。這些指標(biāo)可以推送到Grafana或類似的監(jiān)控面板上方便隨時查看。10. 最后聊幾句實(shí)際產(chǎn)線的心得我在產(chǎn)線上蹲了這么多年最大的體會是工業(yè)缺陷檢測不是純算法問題它是一個系統(tǒng)工程。模型只是其中一環(huán)數(shù)據(jù)、硬件、光照、通信、人工復(fù)檢每一環(huán)都會影響最終效果。小樣本訓(xùn)練和漏檢控制本質(zhì)上是在資源受限的情況下做權(quán)衡。你沒有足夠的缺陷樣本就要用異常檢測兜底你沒有足夠的時間調(diào)模型就要用多級檢測架構(gòu)來補(bǔ)你沒有足夠的算力就要在分辨率和速度之間找平衡。我見過很多團(tuán)隊算法能力很強(qiáng)但產(chǎn)線落地效果一般問題往往出在工程細(xì)節(jié)上。相機(jī)觸發(fā)沒做好丟幀光照不穩(wěn)定圖像分布漂移通信延遲大分揀跟不上。這些問題的解決難度不比調(diào)模型低。所以如果你正在做工業(yè)缺陷檢測的項目我的建議是先把工程鏈路跑通再優(yōu)化模型。一個能穩(wěn)定跑起來的簡單模型比一個效果很好但三天兩頭出問題的復(fù)雜模型有價值得多。另外不要追求零漏檢。零漏檢意味著極高的誤報率產(chǎn)線會被誤報淹沒。找到一個漏檢率和誤報率的平衡點(diǎn)配合人工復(fù)檢才是可持續(xù)的方案。我目前能做到的最好水平是漏檢率0.3%誤報率4%左右人工復(fù)檢率5%。這個水平在大多數(shù)產(chǎn)線上已經(jīng)能跑得很好了。最后分享一個小技巧定期用標(biāo)準(zhǔn)缺陷樣品做一次全鏈路測試。從相機(jī)拍照到最終分揀走一遍完整流程檢查每個環(huán)節(jié)是否正常。這個測試能發(fā)現(xiàn)很多平時注意不到的問題比如光源衰減、相機(jī)偏移、通信延遲。我一般每周做一次花不了多少時間但能避免很多突發(fā)故障。