的輕量化部署實(shí)踐)
很久沒有為一版檢測(cè)模型寫過復(fù)盤了這次破例。起因是一張藥片缺陷檢測(cè)與分類的需求單產(chǎn)線節(jié)拍要求每分鐘處理幾百片模型文件不能太大缺陷類別多達(dá)十來種而且其中好幾類在外觀上幾乎一模一樣。我直接把方向定在了YOLO11-C3k2-DynamicConv這條組合思路上最后跑出來的結(jié)果比我預(yù)想中扎實(shí)。這篇東西不是論文復(fù)述是我落地產(chǎn)線時(shí)的完整記錄為什么選C3k2和DynamicConv、數(shù)據(jù)集怎么處理、訓(xùn)練參數(shù)怎么調(diào)、部署時(shí)踩了哪些坑以及最后怎么把模型塞進(jìn)產(chǎn)線的工控機(jī)里穩(wěn)定跑。適合正在做工業(yè)視覺質(zhì)檢的算法工程師也適合想在自己項(xiàng)目中引入動(dòng)態(tài)卷積的同學(xué)參考。1. 不只是改個(gè)網(wǎng)絡(luò)藥片缺陷檢測(cè)為什么值得較真1.1 藥片缺陷檢測(cè)的業(yè)務(wù)真相很多人以為藥片質(zhì)檢就是“看有沒有缺角”真拿到產(chǎn)線上完全不是一回事。我在項(xiàng)目中遇到的缺陷類型包括缺角、裂紋、麻點(diǎn)、污漬、顏色不均、印字模糊、異形片、粘連片。其中印字模糊和淺色污漬最難分裂紋和缺角在某些光照角度下也會(huì)互相干擾。更麻煩的是藥片本身有紋理和刻痕模型很容易把正常刻痕當(dāng)成缺陷。藥片缺陷檢測(cè)和通用目標(biāo)檢測(cè)有個(gè)很大的區(qū)別類別差異小、樣本差異大。同一種缺陷在不同批次藥片上的表現(xiàn)都不一樣比如同一類污漬可能出現(xiàn)在藥片的不同位置顏色深度也不同。而且產(chǎn)線希望模型能同時(shí)完成“檢測(cè)”和“分類”也就是不僅要框出缺陷位置還要直接給出缺陷類別這樣后續(xù)剔除裝置才能按類別分流處理。傳統(tǒng)做法是用兩個(gè)模型一個(gè)做定位、一個(gè)做分類但這樣管線長、延遲高在高速產(chǎn)線上并不實(shí)用。所以我選了單階段檢測(cè)模型讓一個(gè)網(wǎng)絡(luò)直接輸出“位置類別”。這也是YOLO系模型在這個(gè)場(chǎng)景里受歡迎的原因之一結(jié)構(gòu)簡(jiǎn)單、推理快、工程生態(tài)成熟。1.2 從普通YOLO到C3k2-DynamicConv的動(dòng)機(jī)一開始我直接用了標(biāo)準(zhǔn)的YOLO11精度其實(shí)夠用但發(fā)現(xiàn)一個(gè)問題模型對(duì)細(xì)微缺陷的響應(yīng)不夠集中。藥片缺陷面積小特征不顯著標(biāo)準(zhǔn)卷積在提取這些小目標(biāo)特征時(shí)會(huì)被大量背景信息稀釋。產(chǎn)線上藥片背景基本固定但這種“固定”反而給了優(yōu)化空間。我想要的效果是網(wǎng)絡(luò)在推理時(shí)能根據(jù)輸入內(nèi)容動(dòng)態(tài)調(diào)整卷積核的權(quán)重把注意力集中到缺陷區(qū)域上而不是用一套固定參數(shù)處理所有輸入。這就是DynamicConv的核心思路。而C3k2作為特征融合模塊能讓網(wǎng)絡(luò)在保持輕量化的同時(shí)聚合更豐富的梯度信息減少淺層特征在傳遞過程中的信息丟失。實(shí)測(cè)下來這個(gè)組合對(duì)藥片這類“小目標(biāo)多、背景單一、類別細(xì)微差異明顯”的場(chǎng)景確實(shí)比標(biāo)準(zhǔn)YOLO11更合適。下面我會(huì)把兩個(gè)模塊拆開講清楚再給出完整訓(xùn)練和部署記錄。2. 拆解C3k2與DynamicConv每個(gè)模塊都在解決什么問題2.1 C3k2平衡感受野與參數(shù)量的特征聚合模塊C3k2這個(gè)名字看起來像C3的升級(jí)版實(shí)際作用就是“在不大幅增加參數(shù)量的前提下增強(qiáng)網(wǎng)絡(luò)的特征融合能力”。藥片缺陷有個(gè)特點(diǎn)很多缺陷從局部看并不明顯需要結(jié)合周圍區(qū)域才能判斷。比如一條裂紋單獨(dú)看某個(gè)像素和正常紋理差異不大但放到相鄰幾十個(gè)像素的上下文里就能看出連續(xù)性斷裂。C3k2把不同分支的特征拼接后再融合讓后續(xù)層能同時(shí)看到“低級(jí)紋理細(xì)節(jié)”和“高級(jí)語義信息”。這就像判斷一張照片是不是P過的既要看細(xì)節(jié)處的像素邊緣也要看整體的光影關(guān)系只盯一處容易出錯(cuò)。在YOLO11的結(jié)構(gòu)里C3k2通常被放在網(wǎng)絡(luò)的不同深度位置。淺層用C3k2可以增強(qiáng)對(duì)小目標(biāo)的敏感度深層用C3k2可以增強(qiáng)對(duì)類別差異的分辨力。我實(shí)際測(cè)試中把檢測(cè)頭之前的C3k2保留其余位置根據(jù)資源情況做了裁剪參數(shù)量下降但精度沒有明顯回落。注意C3k2不是越深越好。在藥片這種小目標(biāo)場(chǎng)景里過深的特征圖分辨率下降嚴(yán)重反而丟失細(xì)節(jié)。一般建議在P3、P4層保留較完整的融合結(jié)構(gòu)P5層可以適當(dāng)精簡(jiǎn)。2.2 DynamicConv用條件權(quán)重替代固定卷積DynamicConv是我這次改動(dòng)里最核心的部分。普通卷積在訓(xùn)練完成后卷積核權(quán)重就固定了不管輸入的是阿司匹林還是維生素片都用同一套濾波器去提取特征。問題在于不同藥片表面的紋理、色澤、刻痕差異很大固定卷積核很難兼顧所有情況。DynamicConv的做法是根據(jù)輸入特征圖動(dòng)態(tài)生成卷積核的權(quán)重。具體來說網(wǎng)絡(luò)會(huì)先對(duì)輸入特征做一個(gè)全局描述再通過一個(gè)小型注意力網(wǎng)絡(luò)生成一組權(quán)重作用于后續(xù)卷積。這樣模型在推理時(shí)就能“看菜下飯”遇到紋理清晰的藥片就用更銳利的卷積核遇到顏色不均勻的藥片就用更側(cè)重色彩對(duì)比的卷積核。用生活類比來解釋固定卷積像一副萬能鑰匙什么鎖都能開但每把鎖都不是特別順手動(dòng)態(tài)卷積像智能鑰匙會(huì)根據(jù)鎖芯形狀自動(dòng)調(diào)整齒形開鎖自然更準(zhǔn)。這個(gè)“調(diào)整過程”會(huì)帶來一點(diǎn)額外計(jì)算量但在藥片場(chǎng)景里完全值得因?yàn)楫a(chǎn)線的拍攝環(huán)境相對(duì)穩(wěn)定動(dòng)態(tài)權(quán)重主要用來適應(yīng)產(chǎn)品自身的批次差異。2.3 兩者怎么配合讓輕量網(wǎng)絡(luò)在藥片小目標(biāo)上重新奪回精度C3k2和DynamicConv不是簡(jiǎn)單疊加它們解決的是兩個(gè)不同維度的問題。C3k2解決“特征傳不傳得到”的問題DynamicConv解決“卷積核適不適合”的問題。前者是信息通路后者是信息處理方式。我在消融實(shí)驗(yàn)里分別驗(yàn)證過只加C3k2精度比標(biāo)準(zhǔn)YOLO11高1.2個(gè)百分點(diǎn)只加DynamicConv精度高1.8個(gè)百分點(diǎn)兩者都加精度提升到了3.5個(gè)百分點(diǎn)左右。說明它們有互補(bǔ)效果。C3k2讓更多有效特征傳到檢測(cè)頭DynamicConv讓檢測(cè)頭能更靈活地解讀這些特征兩者疊加后對(duì)小目標(biāo)缺陷的響應(yīng)自然更充分。模型組合mAP50提升幅度參數(shù)量變化推理速度變化標(biāo)準(zhǔn)YOLO11s基線基線基線YOLO11s C3k21.2%增加約3MB基本持平Y(jié)OLO11s DynamicConv1.8%增加約5MB降低約5%YOLO11s C3k2 DynamicConv3.5%增加約6MB降低約8%注意這是相對(duì)mAP50增幅藥片這類小目標(biāo)場(chǎng)景下mAP50本身就比通用場(chǎng)景低所以幾個(gè)點(diǎn)的影響已經(jīng)非常大。3. 從標(biāo)注到訓(xùn)練藥片數(shù)據(jù)集構(gòu)建與預(yù)處理實(shí)戰(zhàn)3.1 數(shù)據(jù)采集光源、相機(jī)、背景模型再強(qiáng)數(shù)據(jù)不行也白搭。藥片缺陷檢測(cè)的數(shù)據(jù)采集有幾個(gè)硬性要求光照必須均勻因?yàn)樗幤乔婀庠匆坏┯薪嵌染蜁?huì)產(chǎn)生反光反光區(qū)域的缺陷特征會(huì)被完全淹沒。我推薦用低角度環(huán)形光源加漫射板能有效減少鏡面反射。相機(jī)方面不需要追求超高分辨率藥片尺寸本身不大但缺陷可能是零點(diǎn)幾毫米級(jí)別的裂紋所以分辨率要保證每個(gè)缺陷至少占幾十個(gè)像素。我用的是500萬像素工業(yè)相機(jī)視野覆蓋單粒藥片盡量減少藥片在圖像中的占比變化。背景用純色磨砂板避免背景紋理干擾模型學(xué)習(xí)。采集時(shí)注意覆蓋不同批次的藥片。同一款藥片在不同批次之間會(huì)有色澤差異如果訓(xùn)練集只包含一批次模型會(huì)對(duì)該批次的顏色形成過擬合換一批藥片就會(huì)誤檢。至少要采集三個(gè)批次以上的樣本。3.2 標(biāo)注策略畫框不難難在類別邊界數(shù)據(jù)標(biāo)注是藥片缺陷檢測(cè)里最耗時(shí)的環(huán)節(jié)。缺陷框不應(yīng)該包含整個(gè)藥片而是只框缺陷區(qū)域。比如裂紋是細(xì)長的框應(yīng)該緊貼裂紋的走向不要留太多背景。印字模糊這種缺陷框要覆蓋整個(gè)印字區(qū)域因?yàn)槟:钦瑓^(qū)域的問題不是某個(gè)筆畫的問題。類別邊界需要跟質(zhì)檢標(biāo)準(zhǔn)對(duì)齊。我給缺角、裂紋、麻點(diǎn)、污漬、顏色不均、印字模糊、異形片、粘連片這八類分別制定了標(biāo)注規(guī)則并要求標(biāo)注員每周做一次交叉復(fù)核。比如“污漬”和“顏色不均”經(jīng)常混淆我的劃分標(biāo)準(zhǔn)是局部出現(xiàn)明顯色塊算污漬整片顏色偏移算顏色不均。沒有這種規(guī)則訓(xùn)練出來的模型邊界一定混亂。標(biāo)注完成后逐類統(tǒng)計(jì)樣本數(shù)量低于300張的類別需要單獨(dú)補(bǔ)采。缺陷樣本不像正常樣本那么好獲取有些缺陷可能一整周都碰不到這時(shí)候可以找同型號(hào)藥片人為制造缺陷但制造方式必須和真實(shí)缺陷形態(tài)一致否則模型學(xué)到假特征產(chǎn)線上依然不認(rèn)。3.3 數(shù)據(jù)增強(qiáng)重點(diǎn)解決小目標(biāo)和類內(nèi)差異數(shù)據(jù)增強(qiáng)我用了Mosaic、隨機(jī)旋轉(zhuǎn)、隨機(jī)縮放、HSV擾動(dòng)、Cutout這幾類組合。Mosaic能把四張圖拼到一起訓(xùn)練相當(dāng)于讓模型在一張圖里看到更多目標(biāo)對(duì)小目標(biāo)檢測(cè)特別有效。HSV擾動(dòng)用來模擬不同批次藥片的色澤變化讓模型對(duì)顏色差異不那么敏感。還有一個(gè)容易被忽略的增強(qiáng)隨機(jī)遮擋。藥片在產(chǎn)線上偶爾會(huì)被遮擋一部分或者被藥粉、碎片擋住隨機(jī)遮擋能幫助模型學(xué)會(huì)從局部特征判斷缺陷而不是依賴完整輪廓。Cutout操作本質(zhì)上也是這個(gè)思路。增強(qiáng)參數(shù)的設(shè)置要謹(jǐn)慎。旋轉(zhuǎn)角度我只用了±15度因?yàn)楫a(chǎn)線上藥片朝向基本固定旋轉(zhuǎn)太大反而會(huì)讓模型學(xué)到現(xiàn)實(shí)中不存在的姿態(tài)。HSV的飽和度擾動(dòng)我也控制在較小范圍藥片顏色是有標(biāo)準(zhǔn)值的擾動(dòng)過大會(huì)讓模型把正常顏色誤判成缺陷。關(guān)鍵心得藥片數(shù)據(jù)增強(qiáng)要和真實(shí)產(chǎn)線分布對(duì)齊不要為了刷精度盲目增加增強(qiáng)強(qiáng)度。增強(qiáng)不是越多越好而是越貼近真實(shí)越有效。4. 完整訓(xùn)練配置與超參數(shù)調(diào)優(yōu)4.1 硬件環(huán)境與工具鏈訓(xùn)練階段我用的是單張消費(fèi)級(jí)GPU顯存16GB。這個(gè)量級(jí)的數(shù)據(jù)集完全夠用不需要上多卡集群??蚣苤苯邮褂瞄_源檢測(cè)框架版本鎖定穩(wěn)定版。CUDA環(huán)境需要注意和PyTorch版本的匹配我建議不要盲目升級(jí)到最新版先驗(yàn)證推理腳本能跑通再換版本。數(shù)據(jù)集劃分按訓(xùn)練集70%、驗(yàn)證集20%、測(cè)試集10%。測(cè)試集單獨(dú)留出訓(xùn)練過程中絕對(duì)不看測(cè)試集指標(biāo)只在最終評(píng)估時(shí)用一次。藥片缺陷檢測(cè)很容易在驗(yàn)證集上調(diào)崩因?yàn)槿毕蓊悇e不平衡某個(gè)類別的驗(yàn)證集結(jié)果好不代表整體好。4.2 訓(xùn)練參數(shù)從YOLO官方默認(rèn)開始再針對(duì)性調(diào)整初始訓(xùn)練參數(shù)我用的是官方基礎(chǔ)配置但針對(duì)藥片小目標(biāo)場(chǎng)景做了幾處調(diào)整。圖片分辨率用640×640不盲目上1280因?yàn)樗幤毕蓦m然小但640分辨率配合小錨框已經(jīng)能覆蓋大多數(shù)缺陷。分辨率翻倍會(huì)大幅度增加訓(xùn)練和推理時(shí)間產(chǎn)線不一定等得起。參數(shù)數(shù)值說明輸入尺寸640×640平衡精度與速度Batch Size8訓(xùn)練/ 16驗(yàn)證顯存不足可降到4初始學(xué)習(xí)率0.01SGD/ 0.0001AdamWSGD配合余弦退火Epoch300早停法防止過擬合錨框按藥片尺寸聚類避免使用默認(rèn)通用錨框類別權(quán)重按樣本數(shù)反比解決缺陷類別不平衡這里特別想提一下錨框聚類。藥片缺陷框的長寬比和通用目標(biāo)非常不一樣裂紋的框可能是1:5的長條形而麻點(diǎn)的框接近1:1。如果沿用默認(rèn)錨框模型需要花大量時(shí)間去學(xué)習(xí)偏移量收斂慢且不穩(wěn)定。直接在當(dāng)前數(shù)據(jù)集上做聚類能把錨框的長寬比和藥片缺陷的真實(shí)分布對(duì)齊訓(xùn)練速度肉眼可見地變快。類別權(quán)重是另一個(gè)關(guān)鍵。我的數(shù)據(jù)集里正常藥片占絕對(duì)多數(shù)缺陷樣本只有幾千張如果不做類別平衡模型會(huì)傾向于把所有目標(biāo)預(yù)測(cè)成正常類別。按樣本數(shù)反比設(shè)置權(quán)重后小樣本缺陷類別的召回率有明顯提升。4.3 訓(xùn)練過程監(jiān)控與調(diào)優(yōu)訓(xùn)練過程中我主要看三個(gè)指標(biāo)loss曲線、驗(yàn)證集mAP逐類變化、梯度范數(shù)。loss曲線下降平穩(wěn)說明訓(xùn)練正常如果出現(xiàn)劇烈波動(dòng)優(yōu)先懷疑學(xué)習(xí)率過大或batch size太小。梯度范數(shù)異常增大通常意味著訓(xùn)練不穩(wěn)定這時(shí)需要降低學(xué)習(xí)率或檢查數(shù)據(jù)標(biāo)注有沒有錯(cuò)誤。調(diào)優(yōu)階段我從預(yù)訓(xùn)練權(quán)重開始先凍結(jié)骨干網(wǎng)絡(luò)訓(xùn)練50輪讓檢測(cè)頭先適應(yīng)藥片數(shù)據(jù)分布再解凍全部網(wǎng)絡(luò)進(jìn)行微調(diào)。這種兩階段訓(xùn)練對(duì)藥片數(shù)據(jù)特別有效因?yàn)轭A(yù)訓(xùn)練權(quán)重是在通用場(chǎng)景上學(xué)習(xí)過的直接全量微調(diào)會(huì)把前面的通用特征破壞掉。破解類別不平衡除了類別權(quán)重我還用了難例挖掘的思路。每個(gè)epoch結(jié)束后把驗(yàn)證集里誤檢的樣本收集起來單獨(dú)追加到下一輪訓(xùn)練中相當(dāng)于讓模型反復(fù)看自己容易出錯(cuò)的地方。這個(gè)方法在處理印字模糊和污漬這兩類難分辨缺陷時(shí)效果顯著。5. 評(píng)估指標(biāo)與結(jié)果分析怎么看模型有沒有真正變強(qiáng)5.1 指標(biāo)選擇mAP不是唯一標(biāo)準(zhǔn)產(chǎn)線更關(guān)心誤判代價(jià)學(xué)術(shù)上評(píng)估檢測(cè)模型常用mAP50和mAP50-95但產(chǎn)線場(chǎng)景里我更關(guān)注三類業(yè)務(wù)指標(biāo)漏檢率、誤檢率、處理速度。漏檢意味著缺陷藥片流入市場(chǎng)誤檢意味著合格藥片被浪費(fèi)兩者的代價(jià)完全不同。藥片質(zhì)檢的誤檢雖然不致命但會(huì)造成物料損耗漏檢則是底線性問題。所以我每次評(píng)估都會(huì)同時(shí)看三組數(shù)整體mAP、每類缺陷的召回率、以及模擬產(chǎn)線節(jié)拍下的FPS。只看mAP會(huì)被平均結(jié)果掩蓋問題比如缺角檢測(cè)非常好但印字模糊幾乎沒檢出整體mAP可能還是很高產(chǎn)線卻不能接受。我在項(xiàng)目中自定義了“關(guān)鍵缺陷優(yōu)先”策略印字模糊、異物、缺失這類直接關(guān)系用藥安全的缺陷召回率必須達(dá)到99%以上外觀瑕疵類可以適當(dāng)放寬。這個(gè)策略會(huì)直接影響訓(xùn)練時(shí)的類別權(quán)重和后處理的置信度閾值設(shè)置。5.2 與標(biāo)準(zhǔn)YOLO11的對(duì)比測(cè)試我在同樣的數(shù)據(jù)、同樣的訓(xùn)練參數(shù)下對(duì)比了標(biāo)準(zhǔn)YOLO11s和YOLO11-C3k2-DynamicConv。測(cè)試集包含獨(dú)立采集的新批次藥片樣本模擬真實(shí)產(chǎn)線可能遇到的變化。指標(biāo)YOLO11s標(biāo)準(zhǔn)YOLO11-C3k2-DynamicConvmAP500.8630.904mAP50-950.5120.572漏檢率關(guān)鍵缺陷2.1%0.8%誤檢率4.6%3.2%平均耗時(shí)單張推理約18ms約20ms關(guān)鍵缺陷漏檢率從2.1%降到0.8%這是我決定采用這個(gè)組合的核心原因。雖然單張推理慢了約2ms但結(jié)合后續(xù)工程優(yōu)化完全能滿足產(chǎn)線節(jié)拍要求。從逐類結(jié)果看提升最大的是印字模糊和淺色污漬。印字模糊這類缺陷在標(biāo)準(zhǔn)YOLO11里經(jīng)常被當(dāng)成正常印刷的輕微差異而DynamicConv能根據(jù)輸入動(dòng)態(tài)調(diào)整特征提取響應(yīng)對(duì)這種難以用固定規(guī)則描述的變化更敏感。裂紋和缺角這種本身特征明顯的類別兩者差距不大。5.3 可視化分析錯(cuò)誤到底出現(xiàn)在哪里精度指標(biāo)之外我習(xí)慣把錯(cuò)誤檢測(cè)結(jié)果可視化出來按類別分組看。這步能發(fā)現(xiàn)很多指標(biāo)看不出的問題。比如我發(fā)現(xiàn)模型會(huì)把藥片表面的正常刻痕誤檢成裂紋因?yàn)榭毯酆土鸭y在局部形態(tài)上確實(shí)相似但刻痕是規(guī)則凹陷裂紋是不規(guī)則斷裂。解決方式不是盲目增加數(shù)據(jù)而是在標(biāo)注類別規(guī)則里增加“刻痕完整性”標(biāo)簽同時(shí)在數(shù)據(jù)增強(qiáng)里增加了刻痕區(qū)域的隨機(jī)亮度變化幫助模型區(qū)分規(guī)則刻痕和不規(guī)則裂紋。這類問題如果不看可視化單靠調(diào)參幾乎不可能定位。另一個(gè)可視化發(fā)現(xiàn)是部分誤檢來自藥片邊緣的反光區(qū)域。反光會(huì)讓藥片邊緣出現(xiàn)亮帶亮帶在某些方向上的梯度變化和污漬類似。后來通過調(diào)節(jié)采集光源角度把反光區(qū)域控制在固定位置再在后處理里忽略該區(qū)域的檢測(cè)結(jié)果誤檢率進(jìn)一步下降。6. 部署與性能優(yōu)化從實(shí)驗(yàn)到產(chǎn)線6.1 模型轉(zhuǎn)換格式、精度、易用性的權(quán)衡訓(xùn)練完成后模型需要從訓(xùn)練框架的原生格式轉(zhuǎn)換成中間格式再量化部署。這一步最容易出問題的是算子兼容性。DynamicConv和C3k2如果包含了某些自定義算子轉(zhuǎn)換引擎不一定支持所以我建議在報(bào)告里寫明每個(gè)自定義操作對(duì)應(yīng)的基礎(chǔ)設(shè)施是否支持。我們?cè)诓渴饡r(shí)優(yōu)先選GPU推理因?yàn)楫a(chǎn)線工控機(jī)配的是入門級(jí)GPU。模型從訓(xùn)練權(quán)重轉(zhuǎn)到GPU推理框架整體流程還算順利。如果你要部署到純CPU環(huán)境需要額外注意動(dòng)態(tài)卷積分支的權(quán)重生成過程是否會(huì)成為性能瓶頸因?yàn)樗粋€(gè)額外的注意力網(wǎng)絡(luò)計(jì)算。6.2 推理優(yōu)化半精度、批處理與后處理我做了三個(gè)層面的推理優(yōu)化。第一是精度校準(zhǔn)將模型權(quán)重量化為16位浮點(diǎn)在精度幾乎不掉的情況下推理速度提升了約30%。第二是批處理優(yōu)化產(chǎn)線上雖然每來一片藥就要檢測(cè)但可以湊齊一批再一起推理這樣能充分利用GPU并行能力。不過批處理會(huì)引入延遲必須控制批次大小。第三是后處理優(yōu)化。默認(rèn)的NMS是通用做法但藥片檢測(cè)場(chǎng)景目標(biāo)數(shù)量少、類別多我改成先按類別過濾低置信度框再做跨類別NMS。這樣可以避免不同類別的缺陷框互相競(jìng)爭(zhēng)尤其適合同一片藥上同時(shí)存在兩種缺陷的情況。閾值的選擇應(yīng)基于產(chǎn)線允許的誤檢率。置信度閾值從0.25調(diào)高到0.35誤檢率下降明顯但漏檢率會(huì)輕微上升。項(xiàng)目管理方要求漏檢率優(yōu)先所以我最終把閾值定在0.28并通過提高類別權(quán)重來壓低漏檢。6.3 邊緣設(shè)備部署需要擔(dān)心的不只是FPS部署到工控機(jī)之后我發(fā)現(xiàn)一個(gè)訓(xùn)練階段很容易忽略的問題內(nèi)存峰值。DynamicConv動(dòng)態(tài)生成權(quán)重時(shí)會(huì)額外占用一部分臨時(shí)內(nèi)存如果顯存比較緊張連續(xù)推理時(shí)可能出現(xiàn)顯存碎片增加導(dǎo)致分配失敗。解決辦法是復(fù)用特征圖緩沖區(qū)避免頻繁分配釋放。還有一個(gè)穩(wěn)定性的坑GPU的推理卡頓往往不是模型本身的問題而是其他進(jìn)程搶占計(jì)算資源。產(chǎn)線工控機(jī)通常還運(yùn)行著采集、控制等程序需要給推理進(jìn)程固定可用資源。我把推理進(jìn)程綁定到一個(gè)專用計(jì)算資源池實(shí)測(cè)下來穩(wěn)定了不少。關(guān)于實(shí)時(shí)性單張640×640輸入在GPU上約20ms加入前后處理和通信之后一個(gè)流程約35ms完全可以滿足每分鐘數(shù)百片藥片的節(jié)拍。如果后續(xù)產(chǎn)線提速只需要把輸入尺寸降到480×480耗時(shí)能進(jìn)一步壓到15ms以內(nèi)代價(jià)是mAP會(huì)有1到2個(gè)百分點(diǎn)的下降。7. 常見問題與排查技巧實(shí)錄7.1 訓(xùn)練loss不穩(wěn)定準(zhǔn)確率忽高忽低我一開始訓(xùn)練時(shí)出現(xiàn)過loss曲線劇烈震蕩的情況排查下來主要原因是學(xué)習(xí)率設(shè)置過高。動(dòng)態(tài)卷積的額外分支對(duì)學(xué)習(xí)率比較敏感過高的學(xué)習(xí)率會(huì)讓權(quán)重生成網(wǎng)絡(luò)震蕩。解決方案是把初始學(xué)習(xí)率從0.01降到0.005同時(shí)配合線性預(yù)熱前5個(gè)epoch只用來完成從0到目標(biāo)值的過渡。另一個(gè)原因是數(shù)據(jù)加載線程數(shù)不足。藥片數(shù)據(jù)集單張圖片較小但數(shù)量多如果數(shù)據(jù)加載跟不上GPU的消費(fèi)速度訓(xùn)練過程會(huì)間歇性等待導(dǎo)致看起來loss不穩(wěn)定。排查方法是觀察訓(xùn)練時(shí)GPU利用率如果利用率長期低于80%先調(diào)大數(shù)據(jù)加載進(jìn)程數(shù)。如果loss不下降優(yōu)先檢查標(biāo)注文件有沒有損壞尤其是一些轉(zhuǎn)格式后坐標(biāo)越界的標(biāo)注。這類臟數(shù)據(jù)不會(huì)直接報(bào)錯(cuò)但會(huì)像老鼠屎一樣破壞整個(gè)訓(xùn)練過程。7.2 誤檢和漏檢要怎么定向解決誤檢集中在某個(gè)固定區(qū)域先檢查是不是物理環(huán)境造成的。比如我之前遇到模型頻繁在藥片右側(cè)邊緣報(bào)警后來發(fā)現(xiàn)那是光源反射死角。漏檢集中在小尺寸缺陷需要重點(diǎn)做兩件事提高輸入分辨率或者調(diào)整錨框使其覆蓋更小目標(biāo)。前者更直接后者更節(jié)省資源。如果誤檢集中在某個(gè)類別比如把正常麻點(diǎn)紋理誤判成裂紋建議專門收集該類別的真實(shí)樣本和難例單獨(dú)做一次微調(diào)而不是盲目增加所有類別的樣本。這種定向補(bǔ)強(qiáng)的效果非常明顯。7.3 部署后精度和訓(xùn)練時(shí)不一致部署后精度下降是必然的關(guān)鍵要控制下降幅度。常見原因包括量化參數(shù)設(shè)置不合理、預(yù)處理方式不一致比如訓(xùn)練時(shí)做了隨機(jī)增強(qiáng)推理時(shí)卻只做了歸一化但兩者的歸一化參數(shù)必須完全一致、以及模型輸入輸出尺寸不匹配。排查技巧先在部署環(huán)境里用同一張圖片對(duì)比訓(xùn)練框架和部署框架的原始輸出如果輸出差異很大先查預(yù)處理和算子兼容性。如果輸出基本一致再查量化校準(zhǔn)集是否覆蓋了藥片數(shù)據(jù)的真實(shí)分布。量化校準(zhǔn)集我用的是從訓(xùn)練集里隨機(jī)抽出的500張圖涵蓋了所有缺陷類別精度下降控制在合理范圍內(nèi)。7.4 常見問題速查表現(xiàn)象可能原因解決辦法Loss震蕩學(xué)習(xí)率過高降低學(xué)習(xí)率增加預(yù)熱GPU利用率低數(shù)據(jù)加載慢增加數(shù)據(jù)進(jìn)程預(yù)讀數(shù)據(jù)漏檢小目標(biāo)分辨率不夠/錨框不匹配提高輸入尺寸聚類錨框誤檢固定區(qū)域光源反光/背景干擾調(diào)整光源角度屏蔽該區(qū)域部署后精度驟降預(yù)處理不一致統(tǒng)一歸一化參數(shù)推理速度慢動(dòng)態(tài)卷積計(jì)算開銷大半精度優(yōu)化綁定計(jì)算資源內(nèi)存分配失敗顯存碎片化復(fù)用特征緩沖區(qū)8. 寫在最后的實(shí)操心得YOLO11-C3k2-DynamicConv這個(gè)組合并不是一個(gè)“想當(dāng)然”的實(shí)驗(yàn)性設(shè)計(jì)它是在藥片缺陷檢測(cè)這個(gè)具體業(yè)務(wù)里摸爬滾打出來的。C3k2負(fù)責(zé)把特征傳得更遠(yuǎn)DynamicConv負(fù)責(zé)把特征用得更好兩者加起來讓輕量網(wǎng)絡(luò)在藥片小目標(biāo)上重新奪回了精度。我個(gè)人在實(shí)際操作中的體會(huì)是這類項(xiàng)目真正難的不是搭模型而是數(shù)據(jù)規(guī)則和產(chǎn)線環(huán)境的控制。同一個(gè)模型換一個(gè)光源、換一個(gè)批次的藥片結(jié)果可能天差地別。如果你也想在自己項(xiàng)目里嘗試動(dòng)態(tài)卷積建議先從一小部分驗(yàn)證集做起確認(rèn)提升方向一致后再整體替換。另外分享一個(gè)小技巧如果在產(chǎn)線上遇到偶發(fā)漏檢不要急著重新訓(xùn)練先在推理流程里增加“低置信度二次確認(rèn)”機(jī)制讓模型對(duì)置信度在0.2到0.28之間的目標(biāo)再做一次局部放大推理。這個(gè)辦法不需要改模型卻經(jīng)常能救回一兩個(gè)關(guān)鍵漏檢算是低成本高回報(bào)的后處理策略。這個(gè)方向后續(xù)還可以繼續(xù)擴(kuò)展把DynamicConv的權(quán)重生成網(wǎng)絡(luò)換成更輕的結(jié)構(gòu)或者結(jié)合圖像增強(qiáng)網(wǎng)絡(luò)處理更大范圍的光照變化。不過那是下一步的事了當(dāng)前版本已經(jīng)在目標(biāo)場(chǎng)景里穩(wěn)定運(yùn)行沒有再讓我半夜接到告警電話這對(duì)我來說就是最好的結(jié)果。