缺陷檢測小樣本訓(xùn)練與漏檢控制:YOLOv8實戰(zhàn)全鏈路指南)
1. 工業(yè)缺陷檢測的底層邏輯與方案選型1.1 為什么工業(yè)缺陷檢測和常規(guī)目標(biāo)檢測完全不是一回事做過COCO數(shù)據(jù)集上YOLO訓(xùn)練的人第一次進工廠產(chǎn)線做缺陷檢測大概率會被現(xiàn)實打臉。我當(dāng)年從通用目標(biāo)檢測轉(zhuǎn)到工業(yè)質(zhì)檢前三個月基本都在踩坑。核心原因在于工業(yè)缺陷檢測和常規(guī)目標(biāo)檢測在問題定義上就有本質(zhì)區(qū)別。常規(guī)目標(biāo)檢測面對的是貓、狗、車、人這類語義明確、邊界清晰的物體COCO80類別里每一類都有大量標(biāo)注樣本模型見過幾千張貓的圖片后對貓的形態(tài)有充分認知。但工業(yè)缺陷是什么是劃痕、臟污、氣泡、缺料、毛刺、色差、裂紋——這些缺陷的形態(tài)千變?nèi)f化同一種缺陷在不同光照、不同角度、不同批次物料上呈現(xiàn)的視覺特征可能完全不同。更致命的是產(chǎn)線上良品率通常在95%以上意味著缺陷樣本天然稀少你能收集到的缺陷圖片可能只有幾十張甚至幾張。這就引出了工業(yè)缺陷檢測的兩大核心難題小樣本訓(xùn)練和漏檢控制。前者解決樣本不夠怎么訓(xùn)的問題后者解決訓(xùn)完了怎么保證不漏的問題。這兩個問題不解決模型在實驗室里mAP再高上了產(chǎn)線也是廢鐵。我見過太多團隊拿著幾百張缺陷圖直接套YOLO官方訓(xùn)練腳本結(jié)果模型要么過擬合到死記硬背那幾張圖要么把正常紋理波動全判成缺陷誤檢率飆到30%以上。所以這篇文章我想把從數(shù)據(jù)準(zhǔn)備到模型部署的完整鏈路拆開講重點說清楚小樣本場景下每一步該怎么調(diào)整以及漏檢控制到底該在哪些環(huán)節(jié)下手。1.2 小樣本場景下的技術(shù)路線選擇面對小樣本業(yè)界主要有三條路線數(shù)據(jù)增強路線、遷移學(xué)習(xí)路線、異常檢測路線。這三條路不是互斥的實際項目中往往是組合使用但側(cè)重點不同。數(shù)據(jù)增強路線是最直觀的。既然缺陷樣本少那就通過旋轉(zhuǎn)、翻轉(zhuǎn)、裁剪、色彩抖動、Cutout、MixUp、Mosaic等手段把少量樣本撐成大量樣本。YOLO系列自帶的Mosaic增強本身就是一種強力的小樣本擴充手段它把四張圖拼成一張讓模型在一張圖里看到更多上下文。但數(shù)據(jù)增強有個天花板它只能改變已有缺陷的呈現(xiàn)方式不能創(chuàng)造新的缺陷形態(tài)。如果你的缺陷類型本身就沒覆蓋全增強再多也是白搭。遷移學(xué)習(xí)路線是主流做法。用COCO預(yù)訓(xùn)練權(quán)重做初始化然后在自己的小樣本數(shù)據(jù)集上微調(diào)。這里的關(guān)鍵是凍結(jié)策略和學(xué)習(xí)率調(diào)度。我的經(jīng)驗是如果缺陷樣本少于200張凍結(jié)Backbone的前80%層只訓(xùn)練Neck和Head學(xué)習(xí)率設(shè)到預(yù)訓(xùn)練階段的1/10甚至1/100。如果樣本在200到1000張之間可以解凍Backbone的后半部分用余弦退火調(diào)度學(xué)習(xí)率。樣本超過1000張才考慮全網(wǎng)絡(luò)微調(diào)。異常檢測路線是近兩年工業(yè)界越來越重視的方向。它的核心思想是不直接學(xué)習(xí)缺陷長什么樣而是學(xué)習(xí)正常長什么樣然后任何偏離正常分布的區(qū)域都判為異常。這條路線對缺陷樣本數(shù)量的要求極低理論上只需要正常樣本就能訓(xùn)練。但它的缺點是解釋性差你很難告訴產(chǎn)線工人這個區(qū)域為什么被判為異常而且對閾值極其敏感。實際項目中我通常把異常檢測作為YOLO的補充YOLO負責(zé)檢出已知類型的缺陷異常檢測負責(zé)兜底未知類型的異常。提示不要迷信單一方案。我做過的一個PCB板缺陷檢測項目最終方案是YOLOv8負責(zé)檢測劃痕和缺孔兩類已知缺陷PatchCore異常檢測負責(zé)兜底其他未知異常兩者結(jié)果做加權(quán)融合漏檢率從單模型的4.2%降到了1.1%。1.3 YOLO版本選型與工業(yè)場景適配YOLO系列迭代到v8、v9、v10甚至v11每個版本在工業(yè)場景下的表現(xiàn)差異很大。我實測下來的結(jié)論是YOLOv8在工業(yè)缺陷檢測中綜合表現(xiàn)最穩(wěn)原因有三。第一YOLOv8的Anchor-Free設(shè)計對不規(guī)則形狀的缺陷更友好。工業(yè)缺陷很多是細長劃痕、不規(guī)則臟污Anchor-Based的YOLOv5需要精心設(shè)計Anchor尺寸而YOLOv8直接預(yù)測中心點和寬高省去了Anchor聚類的麻煩。第二YOLOv8的C2f模塊和解耦頭在保持精度的同時參數(shù)量可控640分辨率下推理速度在T4上能跑到120FPS以上滿足大多數(shù)產(chǎn)線節(jié)拍。第三Ultralytics的工程化做得最好從訓(xùn)練到導(dǎo)出ONNX到TensorRT部署一條龍腳本齊全省去了大量造輪子的時間。YOLOv9的GELAN結(jié)構(gòu)理論上精度更高但參數(shù)量上去了T4上640分辨率推理掉到80FPS左右對于多路視頻流場景壓力較大。YOLOv10的NMS-Free設(shè)計確實降低了后處理延遲但工業(yè)場景下缺陷目標(biāo)通常不多NMS耗時占比很小收益不明顯。所以我的建議是除非你有明確的精度瓶頸且算力充裕否則YOLOv8是工業(yè)缺陷檢測的默認選擇。至于Efficient Head YOLO這類改進核心思路是輕量化檢測頭減少Head部分的參數(shù)量和計算量。在缺陷類型少比如只有3到5類的場景下標(biāo)準(zhǔn)Head確實有冗余換成Efficient Head能提速10%到15%精度損失通常在0.5%mAP以內(nèi)。但要注意如果你的缺陷類型超過10類或者缺陷尺度差異極大輕量化Head可能會掉點。2. 小樣本訓(xùn)練的核心細節(jié)與實操要點2.1 數(shù)據(jù)集的構(gòu)建與標(biāo)注規(guī)范小樣本訓(xùn)練的第一道坎不是模型是數(shù)據(jù)。我見過太多項目死在數(shù)據(jù)上標(biāo)注不一致、漏標(biāo)、錯標(biāo)、類別定義模糊。工業(yè)缺陷檢測的數(shù)據(jù)集構(gòu)建有幾個鐵律。類別定義必須可操作化。不要用臟污這種模糊詞要定義清楚面積大于多少像素、灰度差異超過多少、形狀是點狀還是片狀。我通常會和產(chǎn)線質(zhì)檢員一起坐下來把缺陷樣本投到大屏上逐張討論這個算不算缺陷這個算哪一類形成一份書面的判定標(biāo)準(zhǔn)。這份標(biāo)準(zhǔn)后來會成為標(biāo)注團隊的培訓(xùn)材料也是模型上線后處理爭議的依據(jù)。標(biāo)注一致性比標(biāo)注精度更重要。小樣本場景下標(biāo)注噪聲的破壞力被放大。100張圖里如果有5張標(biāo)錯了模型很容易學(xué)到錯誤模式。我的做法是所有標(biāo)注圖至少經(jīng)過兩輪獨立標(biāo)注不一致的樣本拿出來集體討論。對于邊界模糊的缺陷寧可標(biāo)大不標(biāo)小因為漏檢的代價遠高于誤檢。負樣本不能省。很多人只標(biāo)缺陷圖不標(biāo)正常圖。但模型需要學(xué)習(xí)什么是正常才能區(qū)分什么是異常。我的經(jīng)驗配比是缺陷圖與正常圖的比例控制在1:2到1:5之間。正常圖不需要標(biāo)注但必須參與訓(xùn)練作為背景負樣本。數(shù)據(jù)劃分要按批次或按時間劃分。不要隨機劃分訓(xùn)練集和驗證集因為同一批次的圖片高度相似隨機劃分會導(dǎo)致驗證集泄漏。正確做法是按生產(chǎn)批次、按日期、按光照條件劃分確保驗證集能反映真實產(chǎn)線的分布變化。2.2 數(shù)據(jù)增強策略的取舍與參數(shù)設(shè)置YOLO自帶的增強參數(shù)很多但工業(yè)缺陷檢測不能無腦開滿。我逐項說一下我的設(shè)置邏輯。Mosaic增強默認開啟概率設(shè)0.5到0.8。Mosaic能顯著提升小樣本下的泛化能力但它有個副作用會把缺陷目標(biāo)縮小到原圖的1/4對于本身就很小的缺陷比如幾個像素的臟點縮小后可能就看不見了。所以如果你的缺陷目標(biāo)普遍小于32x32像素Mosaic概率要降到0.3以下或者改用Mosaic9但配合更大的輸入分辨率。MixUp增強工業(yè)場景下我通常關(guān)閉。MixUp把兩張圖線性疊加會產(chǎn)生半透明的鬼影缺陷這在真實產(chǎn)線中不存在容易讓模型學(xué)到虛假特征。除非你的缺陷本身就是半透明類型的比如某些薄膜材料的瑕疵否則不建議開。HSV增強色調(diào)、飽和度、亮度抖動。工業(yè)產(chǎn)線的光照相對穩(wěn)定但不同批次的物料顏色可能有差異。我的設(shè)置是H0.015S0.7V0.4。色調(diào)抖動要小因為很多缺陷是靠顏色區(qū)分的比如發(fā)黃、發(fā)黑色調(diào)抖大了會把缺陷特征抖沒。旋轉(zhuǎn)與翻轉(zhuǎn)工業(yè)缺陷通常沒有方向性所以上下翻轉(zhuǎn)、左右翻轉(zhuǎn)都可以開。但旋轉(zhuǎn)要謹慎如果產(chǎn)線上物料方向固定旋轉(zhuǎn)增強會讓模型學(xué)到不存在的姿態(tài)。我的做法是翻轉(zhuǎn)全開旋轉(zhuǎn)限制在正負10度以內(nèi)。隨機擦除Random Erasing這個增強對小樣本很有用它隨機遮擋圖像的一部分強迫模型不依賴單一區(qū)域做判斷。但要注意遮擋面積不能太大否則可能把缺陷本身遮掉。我通常設(shè)遮擋面積比例為0.02到0.1。注意所有增強參數(shù)沒有萬能值必須用驗證集做消融實驗。我的習(xí)慣是每調(diào)整一組參數(shù)跑一次短訓(xùn)練50到100epoch看驗證集mAP和漏檢率的變化記錄在表格里對比。2.3 損失函數(shù)的選擇與調(diào)參YOLO的損失函數(shù)由三部分組成分類損失、定位損失、置信度損失。小樣本場景下這三部分的權(quán)重需要重新平衡。分類損失YOLOv8默認用BCEWithLogitsLoss。如果類別極度不平衡比如某類缺陷只有5個樣本可以換成Focal Loss讓模型更關(guān)注難分類樣本。但Focal Loss的alpha和gamma需要調(diào)我的經(jīng)驗是alpha0.25gamma1.5到2.0之間。注意gamma太大會導(dǎo)致訓(xùn)練不穩(wěn)定損失值震蕩。定位損失YOLOv8默認用CIoU Loss。對于細長劃痕這類缺陷CIoU對長寬比的懲罰不夠可以換成EIoU或SIoU。我實測下來SIoU在劃痕檢測上比CIoU的mAP高1.5到2個點。另外NWDNormalized Wasserstein Distance損失在小目標(biāo)檢測上表現(xiàn)很好如果你的缺陷目標(biāo)普遍很小可以嘗試用NWD替換CIoU。NWD的核心思想是把邊界框建模成高斯分布用Wasserstein距離衡量相似度對尺度變化更魯棒。置信度損失這部分通常不需要大改但要注意正負樣本比例。小樣本場景下正樣本缺陷極少負樣本背景極多容易導(dǎo)致模型傾向于預(yù)測背景。我的做法是在數(shù)據(jù)加載階段對含缺陷的圖片做過采樣讓每個batch里至少有一半圖片包含缺陷。損失權(quán)重YOLOv8默認box7.5cls0.5dfl1.5。小樣本場景下我通常把cls權(quán)重提到1.0到1.5因為分類錯誤在缺陷檢測中代價很高。box權(quán)重保持7.5或略降到5.0避免定位損失主導(dǎo)訓(xùn)練。2.4 訓(xùn)練超參數(shù)的實戰(zhàn)配置小樣本訓(xùn)練的超參數(shù)和常規(guī)訓(xùn)練差異很大我直接給一套我常用的配置基于YOLOv8單卡T4或RTX3060都能跑。# 訓(xùn)練配置 epochs: 300 batch: 16 imgsz: 640 workers: 8 optimizer: AdamW lr0: 0.001 lrf: 0.01 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 5 warmup_momentum: 0.8 warmup_bias_lr: 0.1 box: 7.5 cls: 1.0 dfl: 1.5 patience: 50 freeze: 10幾個關(guān)鍵點解釋一下。lr00.001小樣本微調(diào)初始學(xué)習(xí)率不能大否則預(yù)訓(xùn)練權(quán)重會被破壞。lrf0.01最終學(xué)習(xí)率是初始的1%配合余弦退火讓訓(xùn)練后期穩(wěn)定收斂。freeze10凍結(jié)Backbone前10層這是YOLOv8的層編號10層大約覆蓋了Backbone的前80%。patience5050個epoch驗證集指標(biāo)不提升就早停防止過擬合。如果樣本少于100張我會把freeze設(shè)到15lr0降到0.0005epochs加到500。如果樣本在500張左右freeze設(shè)到5lr0用0.001。如果樣本超過2000張可以freeze0全網(wǎng)絡(luò)微調(diào)lr0用0.01。學(xué)習(xí)率調(diào)度余弦退火是默認選擇但小樣本場景下我有時會用OneCycleLR它先升后降能幫助模型跳出局部最優(yōu)。OneCycleLR的max_lr設(shè)到lr0的3到5倍pct_start設(shè)0.3。EMA指數(shù)移動平均一定要開它對小樣本訓(xùn)練的穩(wěn)定性提升很明顯。YOLOv8默認開EMAdecay0.9999。如果訓(xùn)練過程中l(wèi)oss震蕩厲害可以把decay降到0.999。3. 漏檢控制的完整實操鏈路3.1 漏檢的根因分析與控制點定位漏檢控制不是單一環(huán)節(jié)的事它貫穿數(shù)據(jù)、訓(xùn)練、后處理、部署全鏈路。我先把漏檢的根因拆開然后逐個說控制方法。漏檢的根因主要有五類樣本層面訓(xùn)練集沒有覆蓋某些缺陷形態(tài)或光照條件模型層面模型容量不足或訓(xùn)練不充分導(dǎo)致對某些缺陷的特征提取能力弱后處理層面置信度閾值設(shè)太高把低置信度的真缺陷過濾掉了部署層面量化或TensorRT加速導(dǎo)致精度損失小目標(biāo)缺陷被漏掉數(shù)據(jù)漂移層面產(chǎn)線換了物料批次或光照模型沒適應(yīng)新分布。對應(yīng)的控制點數(shù)據(jù)層面做困難樣本挖掘和分布覆蓋檢查模型層面做損失函數(shù)加權(quán)和多尺度訓(xùn)練后處理層面做自適應(yīng)閾值和NMS參數(shù)調(diào)優(yōu)部署層面做量化校準(zhǔn)和精度對齊驗證數(shù)據(jù)漂移層面做在線監(jiān)控和增量學(xué)習(xí)。3.2 困難樣本挖掘與重訓(xùn)練策略困難樣本挖掘Hard Example Mining是小樣本場景下提升召回率最有效的手段之一。具體做法是用初始模型在驗證集和產(chǎn)線實拍圖上跑推理把漏檢的、置信度低的、誤檢的樣本收集起來人工復(fù)核后加入訓(xùn)練集重新訓(xùn)練。這個過程迭代2到3輪漏檢率通常能降30%到50%。我具體說一下操作流程。第一輪訓(xùn)練完成后用模型對所有可用圖片包括訓(xùn)練集、驗證集、產(chǎn)線未標(biāo)注圖做推理導(dǎo)出每張圖的檢測結(jié)果。然后寫腳本篩選真實標(biāo)注存在但模型沒檢出的漏檢模型檢出但置信度低于0.3的低置信度模型檢出但和真實標(biāo)注IoU低于0.3的定位錯誤。把這些圖片挑出來人工確認后重新標(biāo)注加入訓(xùn)練集。這里有個技巧不要只加漏檢樣本還要加對應(yīng)的正常樣本。比如模型把某種正常紋理誤判為缺陷你不僅要加缺陷樣本還要加這種正常紋理的樣本作為負樣本讓模型學(xué)會區(qū)分。重訓(xùn)練時學(xué)習(xí)率要比上一輪低通常用上一輪最終學(xué)習(xí)率的1/2到1/5。如果上一輪用了freeze這一輪可以解凍更多層。我的經(jīng)驗是每輪困難樣本挖掘后解凍層數(shù)增加5層直到全網(wǎng)絡(luò)微調(diào)。3.3 后處理參數(shù)調(diào)優(yōu)與自適應(yīng)閾值YOLO的后處理有兩個關(guān)鍵參數(shù)置信度閾值conf_thres和NMS的IoU閾值iou_thres。這兩個參數(shù)直接決定漏檢和誤檢的平衡。conf_thres默認0.25但在工業(yè)缺陷檢測中我通常降到0.1甚至0.05。原因很簡單漏檢的代價遠高于誤檢。一個漏檢的缺陷流到客戶手里可能是批量召回一個誤檢的缺陷被人工復(fù)核排除只損失一點工時。所以寧可誤檢不可漏檢。但conf_thres降太低會導(dǎo)致大量誤檢產(chǎn)線工人會抱怨狼來了。解決辦法是分級處理conf高于0.5的缺陷直接報警停機conf在0.1到0.5之間的缺陷標(biāo)記為疑似推給人工復(fù)核conf低于0.1的忽略。這樣既控制了漏檢又不會讓工人被誤檢淹沒。iou_thres默認0.7對于密集缺陷場景比如PCB板上多個相鄰的焊點缺陷0.7會導(dǎo)致相鄰缺陷被NMS合并造成漏檢。我的做法是如果缺陷目標(biāo)密集iou_thres降到0.5到0.6如果缺陷目標(biāo)稀疏保持0.7。自適應(yīng)閾值是更高級的做法。核心思想是根據(jù)圖像的整體質(zhì)量動態(tài)調(diào)整conf_thres。比如圖像對比度低、光照暗時模型置信度普遍偏低此時應(yīng)該降低conf_thres圖像清晰、光照好時可以提高conf_thres。實現(xiàn)方式可以是計算圖像的拉普拉斯方差衡量清晰度和平均亮度用這兩個指標(biāo)查表得到conf_thres的調(diào)整系數(shù)。3.4 多尺度推理與TTA增強多尺度推理Multi-Scale Inference是提升召回率的有效手段。YOLO訓(xùn)練時通常固定輸入640但推理時可以用640、800、1024三個尺度分別推理然后把結(jié)果做NMS融合。小目標(biāo)缺陷在大尺度下更容易被檢出大目標(biāo)缺陷在小尺度下也不會漏。我實測過單尺度640推理的漏檢率是3.8%三尺度融合后降到2.1%代價是推理時間增加2.5倍。如果產(chǎn)線節(jié)拍允許這個代價是值得的。如果節(jié)拍緊張可以只用640和800兩個尺度漏檢率降到2.6%推理時間增加1.6倍。TTATest Time Augmentation是另一種增強手段。對同一張圖做水平翻轉(zhuǎn)、垂直翻轉(zhuǎn)、多尺度縮放分別推理后融合結(jié)果。TTA通常能提升1到2個點mAP但推理時間成倍增加。工業(yè)場景下我通常只在離線復(fù)檢環(huán)節(jié)用TTA在線檢測不用。提示多尺度和TTA的融合策略很重要。不要簡單地把所有檢測框堆在一起做NMS而是先按尺度分組每組內(nèi)部做NMS然后組間再做一次NMS。這樣可以避免不同尺度的框互相抑制。3.5 模型量化與TensorRT部署的精度對齊模型部署到產(chǎn)線通常要用TensorRT加速。但FP16或INT8量化會帶來精度損失小目標(biāo)缺陷尤其容易在量化后漏檢。我踩過的坑是PyTorch模型驗證集mAP 0.85轉(zhuǎn)成TensorRT INT8后mAP掉到0.78漏檢率翻倍。解決辦法是量化校準(zhǔn)。TensorRT的INT8量化需要一個校準(zhǔn)集用真實產(chǎn)線圖片做校準(zhǔn)而不是用隨機噪聲或COCO圖片。校準(zhǔn)集數(shù)量建議500到1000張覆蓋各種光照和缺陷類型。校準(zhǔn)算法用EntropyCalibrator2它比MinMax校準(zhǔn)更穩(wěn)定。如果INT8量化后精度損失仍然不可接受可以退而求其次用FP16。FP16的精度損失通常很小mAP掉0.5個點以內(nèi)推理速度比FP32快1.5到2倍。T4顯卡上YOLOv8n 640分辨率FP16推理能到200FPS以上FP32只有120FPS左右。精度對齊驗證是部署前必須做的。用同一批測試圖片分別跑PyTorch模型和TensorRT模型逐張對比檢測結(jié)果。如果某張圖的檢測框差異超過5%就要排查是量化問題還是預(yù)處理/后處理不一致。常見的不一致包括歸一化參數(shù)不同、letterbox填充方式不同、NMS實現(xiàn)不同。3.6 產(chǎn)線在線監(jiān)控與增量學(xué)習(xí)機制模型上線不是終點而是起點。產(chǎn)線的物料批次、光照條件、相機狀態(tài)都會變化模型性能會隨時間衰減。必須建立在線監(jiān)控和增量學(xué)習(xí)機制。在線監(jiān)控的核心指標(biāo)是日漏檢率和日誤檢率。漏檢率怎么算產(chǎn)線上通常有抽檢環(huán)節(jié)抽檢發(fā)現(xiàn)的不良品如果模型沒報警就是漏檢。誤檢率則是模型報警但人工復(fù)核為正常的比例。這兩個指標(biāo)每天統(tǒng)計畫趨勢圖。如果漏檢率連續(xù)3天上升或者單日漏檢率超過閾值比如2%就觸發(fā)告警。增量學(xué)習(xí)的流程是每天收集產(chǎn)線上的誤檢和漏檢樣本人工復(fù)核后加入訓(xùn)練集。每周做一次增量訓(xùn)練用新數(shù)據(jù)微調(diào)模型。增量訓(xùn)練的學(xué)習(xí)率要低1e-4到1e-5epochs要少20到50避免災(zāi)難性遺忘。如果新數(shù)據(jù)量較大超過500張可以混合舊數(shù)據(jù)一起訓(xùn)練舊數(shù)據(jù)和新數(shù)據(jù)的比例控制在1:1到1:2。我做過的一個項目產(chǎn)線運行6個月通過增量學(xué)習(xí)迭代了12次漏檢率從初始的5.2%降到了0.8%而且模型對新的物料批次適應(yīng)良好。4. 常見問題與排查技巧實錄4.1 訓(xùn)練不收斂或loss震蕩的排查小樣本訓(xùn)練最常見的問題是loss震蕩或不收斂。我按排查順序列一下。第一步檢查數(shù)據(jù)標(biāo)注。用可視化腳本把標(biāo)注框畫到圖片上逐張看。我遇到過標(biāo)注框坐標(biāo)超出圖片邊界的也遇到過類別標(biāo)簽寫錯的。這些低級錯誤會導(dǎo)致loss異常。第二步檢查學(xué)習(xí)率。lr00.001對于小樣本微調(diào)通常沒問題但如果你的預(yù)訓(xùn)練權(quán)重不是COCO的而是自己數(shù)據(jù)集訓(xùn)的可能需要更低。可以跑一個LR Finder找到loss下降最快的學(xué)習(xí)率。第三步檢查batch size。小樣本場景下batch size不能太小否則BN層的統(tǒng)計量不準(zhǔn)。如果顯存不夠可以用梯度累積accumulate4等效于batch size翻4倍。第四步檢查損失權(quán)重。如果cls loss遠大于box loss說明分類太難可以降低cls權(quán)重或增加分類樣本。如果box loss震蕩可能是定位損失對某些異常框懲罰過大可以檢查是否有標(biāo)注框?qū)捀邽?的情況。第五步檢查EMA。如果開了EMA但loss震蕩嘗試關(guān)閉EMA看是否改善。有些小樣本場景下EMA反而會拖慢收斂。4.2 驗證集mAP高但產(chǎn)線漏檢率高的原因這是最讓人頭疼的問題實驗室指標(biāo)漂亮上線就拉胯。原因通常有四個。數(shù)據(jù)分布不一致。驗證集是從訓(xùn)練集同分布劃分的但產(chǎn)線圖片的光照、角度、背景可能完全不同。解決辦法是驗證集必須包含產(chǎn)線實拍圖而且要和訓(xùn)練集按批次劃分。標(biāo)注標(biāo)準(zhǔn)不一致。訓(xùn)練集的標(biāo)注可能比產(chǎn)線實際要求寬松。比如訓(xùn)練時把輕微色差標(biāo)為缺陷但產(chǎn)線質(zhì)檢員認為輕微色差可接受。這會導(dǎo)致模型在產(chǎn)線上把可接受的色差判為缺陷而真正的嚴重缺陷反而因為特征相似被漏掉。后處理參數(shù)不匹配。訓(xùn)練時的conf_thres和產(chǎn)線部署時的conf_thres可能不同。訓(xùn)練時用0.25產(chǎn)線為了降誤檢調(diào)到0.5漏檢率自然上升。量化精度損失。前面說過INT8量化可能導(dǎo)致小目標(biāo)漏檢。解決辦法是做量化校準(zhǔn)和精度對齊驗證。4.3 缺陷目標(biāo)極小時的檢測技巧工業(yè)缺陷經(jīng)常只有幾個像素大小比如LCD屏的微小亮點、芯片表面的微劃痕。YOLO在640分辨率下8倍下采樣的特征圖是80x80每個格子對應(yīng)原圖8x8像素。如果缺陷只有3x3像素在特征圖上還不到一個格子很容易被漏掉。解決辦法有四個。提高輸入分辨率從640提到1280特征圖變成160x160每個格子對應(yīng)8x8像素小缺陷更容易被檢出。代價是推理速度降到1/4。修改網(wǎng)絡(luò)結(jié)構(gòu)去掉P5層增加P2層4倍下采樣讓網(wǎng)絡(luò)在更高分辨率特征圖上做檢測。YOLOv8可以通過修改yaml配置文件實現(xiàn)。切片推理把大圖切成小圖分別推理等效于提高分辨率但要注意切片邊界的缺陷可能被切掉。NWD損失前面提過NWD對小目標(biāo)的定位更魯棒。我做過一個芯片劃痕檢測項目缺陷寬度只有2到3像素。640分辨率下漏檢率15%1280分辨率降到6%加上P2層降到3.5%切片推理加NWD損失最終降到1.8%。4.4 多路視頻流場景下的性能優(yōu)化產(chǎn)線通常有多路相機T4顯卡要同時處理多路視頻流。熱詞里有人問T4 1080p25幀每秒用TensorRT YOLO 640分辨率檢測可以支持多少路我實測的數(shù)據(jù)是YOLOv8n FP16 TensorRT640分辨率單路1080p25幀的推理耗時約8msT4理論算力可以支持12到15路。但實際要考慮視頻解碼、預(yù)處理、后處理的耗時以及內(nèi)存帶寬瓶頸穩(wěn)妥的支持路數(shù)是8到10路。如果路數(shù)不夠優(yōu)化方向有降低推理分辨率到480或320速度提升1.5到2倍跳幀推理每2幀推理一次中間幀用跟蹤算法補模型剪枝去掉冗余通道YOLOv8n剪枝30%后速度提升20%精度掉1個點以內(nèi)多流并行用TensorRT的Multi-Stream或CUDA Stream讓多路推理重疊執(zhí)行。4.5 常見問題速查表問題現(xiàn)象可能原因排查方法解決方案訓(xùn)練loss不下降學(xué)習(xí)率過大/過小跑LR Finder調(diào)整lr0到0.0005-0.001驗證集mAP高但產(chǎn)線漏檢數(shù)據(jù)分布不一致對比訓(xùn)練集和產(chǎn)線圖按批次劃分驗證集加產(chǎn)線實拍圖小目標(biāo)漏檢嚴重分辨率不足可視化特征圖提高分辨率加P2層用NWD損失誤檢率高conf_thres太低統(tǒng)計誤檢樣本分級處理提高conf_thresTensorRT精度掉點量化損失逐張對比PyTorch和TRT結(jié)果用真實數(shù)據(jù)做量化校準(zhǔn)多路視頻流卡頓推理耗時超節(jié)拍測單路推理耗時降分辨率跳幀模型剪枝模型上線后性能衰減數(shù)據(jù)漂移監(jiān)控日漏檢率增量學(xué)習(xí)每周微調(diào)4.6 幾個我踩過的坑和獨家技巧坑一用COCO預(yù)訓(xùn)練權(quán)重直接微調(diào)但輸入分辨率不匹配。COCO預(yù)訓(xùn)練是640分辨率如果你的產(chǎn)線圖是1280x1024直接resize到640會丟失小缺陷。正確做法是保持長邊1280短邊letterbox填充到1280訓(xùn)練時imgsz1280。但這樣顯存占用大可以用梯度累積。坑二標(biāo)注時用矩形框標(biāo)劃痕但劃痕是斜的。矩形框會包含大量背景模型學(xué)到的特征不純。解決辦法是用旋轉(zhuǎn)框標(biāo)注OBBYOLOv8支持OBB任務(wù)。或者用實例分割YOLOv8-seg可以輸出缺陷的像素級掩碼對不規(guī)則缺陷更友好??尤炞C集指標(biāo)用mAP但產(chǎn)線只關(guān)心漏檢率。mAP是綜合指標(biāo)漏檢率是召回率相關(guān)。優(yōu)化mAP不一定優(yōu)化漏檢率。我的做法是自定義評估指標(biāo)重點看Recallconf_thres0.1這個指標(biāo)直接反映漏檢情況。技巧一用DeepSeek或GPT輔助生成缺陷描述。把缺陷圖片喂給多模態(tài)大模型讓它描述缺陷的視覺特征然后把這些描述作為文本提示結(jié)合CLIP做零樣本分類可以輔助發(fā)現(xiàn)未知類型的缺陷。技巧二用趨勢圖監(jiān)控模型性能。每天統(tǒng)計漏檢率、誤檢率、平均置信度畫趨勢圖。如果平均置信度連續(xù)下降說明模型對當(dāng)前數(shù)據(jù)分布不適應(yīng)需要增量學(xué)習(xí)。技巧三保存困難樣本的原始圖片和推理結(jié)果。每次增量學(xué)習(xí)時把這些困難樣本按時間排序看模型是否在重復(fù)犯同樣的錯誤。如果同一個缺陷形態(tài)反復(fù)漏檢說明數(shù)據(jù)增強或損失函數(shù)需要調(diào)整。技巧四用YOLO的驗證集預(yù)測結(jié)果做可視化對比。YOLOv8訓(xùn)練完會自動生成驗證集的預(yù)測圖把這些圖和真實標(biāo)注并排看能直觀發(fā)現(xiàn)模型在哪里漏檢、哪里誤檢。我通常會把預(yù)測圖按漏檢數(shù)量排序優(yōu)先分析漏檢最多的圖片。技巧五部署前做端到端延遲測試。不要只測模型推理耗時要測從相機取圖到輸出檢測結(jié)果的完整鏈路耗時。我遇到過模型推理只要8ms但圖像解碼和預(yù)處理花了20ms導(dǎo)致整體節(jié)拍不達標(biāo)。優(yōu)化預(yù)處理用GPU解碼、用CUDA做歸一化能省下大量時間。技巧六用ONNX Runtime做中間驗證。PyTorch轉(zhuǎn)TensorRT之前先轉(zhuǎn)ONNX用ONNX Runtime跑一遍對比PyTorch和ONNX的輸出。如果ONNX和PyTorch不一致說明導(dǎo)出有問題如果ONNX和PyTorch一致但TensorRT不一致說明是量化問題。這樣能快速定位精度損失的環(huán)節(jié)。技巧七多模型融合兜底。YOLO負責(zé)已知缺陷PatchCore負責(zé)未知異常兩者結(jié)果做加權(quán)融合。融合策略可以是YOLO置信度高于0.5的直接輸出YOLO置信度在0.1到0.5之間的如果PatchCore也判為異常則輸出YOLO沒檢出但PatchCore判為異常的標(biāo)記為疑似未知缺陷推人工復(fù)核。這套策略在我做的項目中把未知缺陷的漏檢率從12%降到了3%以下。技巧八定期做模型回歸測試。每次增量學(xué)習(xí)后用固定的回歸測試集包含歷史所有缺陷類型跑一遍確保新模型沒有遺忘舊知識。如果某個舊缺陷類型的召回率下降超過5%說明發(fā)生了災(zāi)難性遺忘需要調(diào)整增量學(xué)習(xí)的策略比如混合更多舊數(shù)據(jù)或者用EWCElastic Weight Consolidation等防遺忘算法。技巧九用TensorRT的DLA加速。如果用的是Jetson系列邊緣設(shè)備可以把部分層放到DLA深度學(xué)習(xí)加速器上跑釋放GPU算力。但DLA對某些算子不支持需要測試兼容性。我的經(jīng)驗是YOLOv8的Backbone可以放DLANeck和Head放GPU整體速度提升30%左右。技巧十監(jiān)控GPU溫度和功耗。產(chǎn)線環(huán)境溫度可能較高T4長時間滿載運行會降頻。如果發(fā)現(xiàn)推理速度突然下降先查GPU溫度。解決辦法是加裝散熱風(fēng)扇或者限制功耗上限nvidia-smi -pl 50犧牲一點性能換穩(wěn)定性。這些經(jīng)驗都是我在實際項目中一張圖一張圖標(biāo)出來、一行代碼一行代碼調(diào)出來的。工業(yè)缺陷檢測沒有銀彈小樣本和漏檢控制都是需要持續(xù)迭代的工程問題。模型上線只是開始后面的數(shù)據(jù)閉環(huán)和增量學(xué)習(xí)才是保證長期效果的關(guān)鍵。