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