:基于YOLOv8的目標檢測方案從數(shù)據(jù)到部署)
產(chǎn)線上一塊鋼板過去表面有沒有麻點、劃傷、氧化皮以前靠老師傅拿眼睛盯。人眼盯久了會疲勞而且同一個缺陷換個時段、換個檢驗員來判結(jié)果可能就不一樣。我最近用YOLOv8做了一套鋼材表面缺陷檢測方案從數(shù)據(jù)集處理、模型訓練一路推到部署推理完整跑通了一遍。這篇文章把整個過程、關(guān)鍵參數(shù)和踩過的坑都整理出來適合剛接觸目標檢測、想拿工業(yè)缺陷場景練手的開發(fā)者也適合已經(jīng)在做檢測、想對比一下方案選址的朋友。我當時接到這個需求時第一反應(yīng)不是急著訓練模型而是先把數(shù)據(jù)從頭到尾捋了一遍。原因很簡單鋼材表面缺陷檢測任務(wù)里模型反而是最不難的部分真正難的是把數(shù)據(jù)洗干凈、把評價指標定對、把部署環(huán)境里的各種意外處理好。下面我就按我實際執(zhí)行的順序來寫。1. 項目初衷與技術(shù)選型1.1 鋼材表面缺陷檢測難在哪先說說這個任務(wù)本身。鋼材表面缺陷檢測本質(zhì)上是目標檢測里的“小目標外觀差異大類別不平衡”三重難題疊在一起。常見缺陷包括裂紋、夾雜、麻點、氧化皮、軋制氧化鐵皮、劃傷這六類形態(tài)完全不同。裂紋是細長線狀稍不留意就被當成背景紋理麻點是密集小坑單個尺寸可能只有幾十個像素氧化皮是成片的不規(guī)則暗色區(qū)域邊緣模糊跟正常的銹蝕還有陰影非常像。這種任務(wù)跟我平時做行人檢測、車輛檢測完全不是一個感受。行人和車輛在圖像里占的比例大、外觀穩(wěn)定即使有遮擋也不至于找不著。鋼材缺陷不一樣很多缺陷放在整幅圖里可能只有整張圖面積的千分之一甚至更少就像在一張A4紙上找一根頭發(fā)絲還要說清楚它是裂紋還是劃傷。再加上鋼廠現(xiàn)場光照暗、粉塵多、鋼板表面反光同一個缺陷在不同工況下拍出來可能完全不像同一個東西。還有一個現(xiàn)實問題缺陷樣本本身是稀缺的。負樣本到處都是正樣本要等缺陷出現(xiàn)才能采到。很多公開數(shù)據(jù)集的圖像是在實驗室條件拍的背景干凈、光照均勻拿這套權(quán)重直接上產(chǎn)線大概率會被真實場景教做人。所以數(shù)據(jù)處理這一環(huán)必須花大力氣。1.2 對比一圈為什么YOLOv8最合適動手之前我其實比較過Faster R-CNN、YOLOv5和YOLOv8。Faster R-CNN精度確實高但推理速度在普通工控機上跑起來不理想產(chǎn)線對一幀的處理時間往往要求在幾十毫秒級別Faster R-CNN很容易卡在邊界。YOLOv5也很成熟社區(qū)資料多但到了后續(xù)導出部署、內(nèi)置增強這些方面還是YOLOv8更省事。我最終選YOLOv8的核心原因有這么幾個。第一YOLOv8是anchor-free設(shè)計少掉了調(diào)anchor這一大堆事情對于鋼材缺陷這種目標尺寸分布特別不規(guī)律的數(shù)據(jù)集省心很多。第二YOLOv8的C2f結(jié)構(gòu)在保持推理速度的同時特征提取更好對小目標的敏感度比舊版有提升。第三官方倉庫直接集成了訓練、驗證、導出、推理一條鏈不需要自己手寫太多膠水代碼。第四也是很重要的一點YOLOv8內(nèi)置的數(shù)據(jù)增強和訓練策略比較完善比如mosaic增強、自動早停這些能少踩不少坑。當然不是說YOLOv8就萬能。如果缺陷實在太小YOLOv8照樣會漏檢這時候需要結(jié)合滑窗或者提高輸入分辨率來補救。但作為第一版方案YOLOv8是穩(wěn)妥的起點。1.3 整體方案怎么規(guī)劃我給自己定了一條完整的執(zhí)行路徑每一步都有明確的輸入和輸出收集數(shù)據(jù)評估數(shù)據(jù)質(zhì)量和類別分布。數(shù)據(jù)清洗修掉錯誤標注和重復圖。把標注格式統(tǒng)一轉(zhuǎn)換成YOLO的txt格式按序列切分訓練集、驗證集和測試集。編寫數(shù)據(jù)集配置文件設(shè)置增強參數(shù)。選擇預(yù)訓練權(quán)重配置超參數(shù)開始訓練。用best.pt做驗證輸出per-class指標和混淆矩陣。針對漏檢誤檢案例迭代補數(shù)據(jù)、改增強、調(diào)分辨率。導出ONNX放到推理環(huán)境里做最終測試。這套流程看起來很常規(guī)但每一步里都有說不完的細節(jié)。下面我按這個順序拆開細講。2. 數(shù)據(jù)集拿到了先別急著訓練2.1 數(shù)據(jù)從哪來質(zhì)量和規(guī)模怎么看我手里的鋼材缺陷數(shù)據(jù)主要來自兩個來源一個公開的鋼材表面缺陷數(shù)據(jù)集另一個是某廠現(xiàn)場抽拍的鋼板表面圖像。公開數(shù)據(jù)集的好處是標注規(guī)范能用來快速驗證流程壞處是圖像背景偏干凈、缺陷形態(tài)相對典型跟產(chǎn)線實際數(shù)據(jù)有g(shù)ap?,F(xiàn)場數(shù)據(jù)更真實但標注成本高格式也亂。拿到數(shù)據(jù)第一步不是數(shù)張數(shù)而是做抽樣檢查。我習慣把每類圖片隨機抽20%出來用標注工具打開快速翻一遍重點看三件事標注框是否緊貼缺陷邊緣有沒有把兩個相鄰缺陷框在一個框里有沒有明顯漏標。這一步花不了太多時間但能避免后面整個訓練過程被錯誤標注帶著走。在規(guī)模上我的經(jīng)驗是每個類至少要有300到500張有效圖。少于此數(shù)量模型很容易過擬合泛化到新工況基本沒有保障。當然如果某些類天然稀少可以先通過數(shù)據(jù)增強硬湊但這只是緩兵之計最終要回到補充真實樣本上。2.2 先把六類缺陷的樣子和分布摸清楚我把這版數(shù)據(jù)里的六類缺陷整理成了一張?zhí)卣鞅矸奖愫竺鎸φ辗治?。缺陷類別常見成因形態(tài)特征裂紋軋制應(yīng)力、材質(zhì)不均細長線狀方向比較規(guī)律有時帶分叉夾雜非金屬夾雜物暴露斑點或小塊狀顏色和基體差別明顯麻點表面腐蝕或氧化密集小坑面積小、邊緣不規(guī)則氧化皮高溫氧化不規(guī)則片狀顏色發(fā)暗邊緣模糊軋制氧化鐵皮軋制過程中壓入鱗片狀顏色偏黑藍有一定厚度感劃傷機械摩擦直線亮痕寬度小、長度長讀這批數(shù)據(jù)時帶著一個任務(wù)去看哪兩類最容易混。我觀察下來氧化皮和麻點經(jīng)?;煲驗槎急憩F(xiàn)為暗色區(qū)域劃傷和裂紋也容易混因為都是長條形。搞清楚這個后面再做類別權(quán)重和增強策略時就有依據(jù)。另一個容易被忽視的工作是統(tǒng)計分析缺陷框的尺寸分布。寫個小腳本統(tǒng)計所有標注框的寬高像素值看看中位數(shù)是多少、最小的是多少。如果大量缺陷框在40像素以下那輸入尺寸就要認真考慮640可能不夠。2.3 清洗數(shù)據(jù)比增強數(shù)據(jù)更重要我見過不少朋友一上來就把增強拉滿各種翻轉(zhuǎn)、旋轉(zhuǎn)、加噪聲結(jié)果訓練出來mAP挺高一測真實場景就垮。原因很簡單原始數(shù)據(jù)本身是臟的增強只會把臟信息放大。我清洗數(shù)據(jù)時主要有幾個操作剔除重復圖像用文件的MD5值去重就能干剔除標錯類別的圖片比如把麻點標成氧化皮剔除嚴重過曝或嚴重欠曝的樣本這類圖即使模型訓出來在真實場景里也是負收益對標注框做合法性檢查確保xmin小于xmax、ymin小于ymax且都落在圖像范圍內(nèi)。清洗完以后我寧愿數(shù)據(jù)集從1200張變成900張也不愿用那300張臟數(shù)據(jù)。后來實際訓練結(jié)果證明這個決策是對的洗過的900張訓練效果明顯好于沒洗的1200張。3. 數(shù)據(jù)集處理的硬核細節(jié)3.1 從XML標注轉(zhuǎn)到Y(jié)OLO txt一條腳本搞定很多標注工具導出的是XML或JSON格式記錄的是目標的左上角和右下角像素坐標。YOLO訓練需要的txt不是這種格式它要求一行一個目標類別id、中心點x坐標、中心點y坐標、寬、高并且全部歸一化到0到1之間。我寫了一個轉(zhuǎn)換腳本把常見的XML標注轉(zhuǎn)成YOLO格式import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, out_dir, class_names): tree ET.parse(xml_path) root tree.getroot() size root.find(size) W float(size.find(width).text) H float(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in class_names: continue box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) assert xmax xmin and ymax ymin, finvalid box in {xml_path} cx (xmin xmax) / 2.0 / W cy (ymin ymax) / 2.0 / H bw (xmax - xmin) / W bh (ymax - ymin) / H lines.append(f{class_names.index(name)} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) img_name os.path.splitext(os.path.basename(xml_path))[0] .txt with open(os.path.join(out_dir, img_name), w) as f: f.write(\n.join(lines)) # 示例用法 class_names [crazing, inclusion, patches, pitted_surface, rolled_in_scale, scratches] os.makedirs(labels/train, exist_okTrue) for xml_file in os.listdir(xmls): if xml_file.endswith(.xml): voc_to_yolo(os.path.join(xmls, xml_file), labels/train, class_names)這里有兩個非常容易踩的坑。第一個是類別id必須從0開始不能從1開始否則訓練時類別數(shù)對不上。第二個是歸一化必須除以圖像的原始寬高而不是除以某次resize之后的寬高。我當時就是忘了除以原圖寬高只算了相對坐標差值結(jié)果訓練loss能降但輸出的框位置完全不對。3.2 訓練集、驗證集、測試集怎么切分切分看似簡單實際上很講究。最忌諱的做法是直接把所有文件路徑丟進一個隨機函數(shù)然后按比例切三份。這樣很容易讓同一現(xiàn)場拍攝的連續(xù)幀同時出現(xiàn)在訓練集和驗證集里模型相當于提前見識過驗證集內(nèi)容最后指標虛高一到新場景就現(xiàn)原形。我通常按序列分組切分。比如現(xiàn)場圖是一卷鋼一個文件夾或者一批圖有一個共同的前綴那就要保證同一來源的圖只出現(xiàn)在一個集合里。先對樣本做分組再按組隨機分配到訓練集、驗證集和測試集比例控制在85%、10%、5%左右。測試集一旦劃定在整個迭代過程中盡量不要動否則你就是在對著測試集調(diào)參指標會失真。代碼上可以用一個簡單的分配邏輯按文件名前綴分組再對組列表打亂然后把組依次填入三個集合。雖然多寫幾行代碼但換來的是可靠指標非常值得。3.3 數(shù)據(jù)增強哪些對缺陷檢測真有用YOLOv8內(nèi)置了一系列增強手段mosaic、平移、縮放、翻轉(zhuǎn)、HSV色域變換都有。默認配置已經(jīng)比較合理但針對鋼材表面這種特殊數(shù)據(jù)我做了兩處關(guān)鍵調(diào)整。第一是HSV增強強度要收一點。鋼板顏色本身是識別氧化皮、麻點的重要線索如果把色相、飽和度調(diào)得太猛氧化皮的顏色就可能變成類似塑料反光的顏色反而加大誤檢。我用的是hsv_h0.01、hsv_s0.5、hsv_v0.3效果比默認值更貼合當前數(shù)據(jù)。第二是翻轉(zhuǎn)方向要謹慎。如果產(chǎn)線相機固定鋼板從左往右走那么左右翻轉(zhuǎn)生成的圖像在現(xiàn)實中根本不會出現(xiàn)這時候把fliplr設(shè)成0或很小值更合理。mosaic增強對多數(shù)目標檢測任務(wù)都有提升但在小缺陷很多的數(shù)據(jù)集上要控制力度。mosaic會把多張小圖拼成一張大圖缺陷能被進一步縮小原來就小的麻點可能直接縮到無法辨認。我建議類別分布比較均衡時用默認mosaic1.0如果小目標占主導嘗試降到0.5以下。cutout這種挖空增強我也試過在鋼材數(shù)據(jù)上不但沒用還會把真實缺陷挖掉不建議使用。3.4 dataset.yaml和目錄結(jié)構(gòu)YOLOv8訓練需要一份數(shù)據(jù)集配置文件指定圖像和標簽的路徑以及類別名。我用的是這樣的目錄結(jié)構(gòu)steel/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/對應(yīng)的dataset.yaml如下path: ./steel train: images/train val: images/val test: images/test names: 0: crazing 1: inclusion 2: patches 3: pitted_surface 4: rolled_in_scale 5: scratches這個文件有兩點必須注意。一個是names的順序必須和txt標注里的數(shù)字id嚴格對應(yīng)一旦開始訓練就不能隨便改改完整個模型輸出對不上。另一個是path建議用絕對路徑或者相對當前命令行的路徑別用會在不同機器上變化的路徑不然換一臺機器訓練時容易排查半天。4. 訓練流程與參數(shù)調(diào)優(yōu)實戰(zhàn)4.1 環(huán)境準備與基礎(chǔ)訓練我的環(huán)境是Python 3.9、PyTorch 2.1、CUDA 12.1安裝YOLOv8直接用pip就行conda create -n steel python3.9 conda activate steel pip install ultralytics torch torchvision opencv-python基礎(chǔ)訓練命令看起來很簡單yolo detect train datasteel.yaml modelyolov8s.pt epochs300 imgsz640 batch16 device0但這行命令背后有幾個參數(shù)要理解清楚。modelyolov8s.pt是預(yù)訓練權(quán)重用它在自己的數(shù)據(jù)上微調(diào)收斂比從零訓練快得多。imgsz640是訓練時輸入網(wǎng)絡(luò)的尺寸如果缺陷框的中位數(shù)尺寸在40像素以下建議直接上960。batch16對8到12GB顯存的顯卡比較合適想算自己顯存夠不夠可以大概估一下16張640x640x3的輸入圖像本身占內(nèi)存才約80MB但梯度、中間特征、優(yōu)化器狀態(tài)會把這個數(shù)放大許多倍實測下來16的批量需要8GB以上顯存。我建議第一次迭代先用yolov8s不要一上來就上l或者x。模型越大對數(shù)據(jù)質(zhì)量的要求越高在數(shù)據(jù)還沒洗干凈的階段大模型只會更快地記住噪聲。4.2 超參數(shù)選擇思路訓練參數(shù)里我重點調(diào)整的是epochs、patience和lr0。YOLOv8默認epochs是100但對工業(yè)缺陷這種需要精雕細琢的任務(wù)100輪往往不夠我直接設(shè)成300。patience設(shè)為50意思是驗證集指標連續(xù)50輪不提升就自動停止既省時間又防過擬合。學習率lr0默認是0.01如果訓練日志顯示loss一開始就劇烈震蕩就降到0.001重新啟動。動量momentum保持默認即可不需要動。還有一個值得關(guān)注的參數(shù)是close_mosaicYOLOv8會在訓練最后10輪自動關(guān)閉mosaic增強讓模型在更接近真實分布的數(shù)據(jù)上做最后精修這個機制對小目標缺陷很友好默認打開就好。4.3 訓練日志怎么看訓練過程會生成results.png和weights目錄里面放著best.pt和last.pt。很多人只看最后一個結(jié)果這是不對的。best.pt是驗證集mAP最高的權(quán)重last.pt是最后一輪的結(jié)果兩者差距有時候很大。我習慣先看train/loss和val/loss兩條曲線如果train/loss一直降但val/loss漲就是過擬合信號可以把epochs降下來或者增大增強。如果val/loss一直在震蕩不收斂優(yōu)先檢查數(shù)據(jù)切分和標注。驗證集指標里mAP50反應(yīng)的是粗略定位質(zhì)量mAP50-95反應(yīng)的是框和真實框的重合度要求。鋼材缺陷這種業(yè)務(wù)我實際更看重mAP50和每類recall因為現(xiàn)場漏檢比框不準更致命。4.4 顯存不足和訓練太慢訓練中經(jīng)常會遇到顯存爆掉的問題解決方案優(yōu)先級我按這個順序來先把batch從16降到8這樣一般能救回來如果還不夠把imgsz從640降到512再不行換yolov8n。注意YOLOv8默認開了amp混合精度這個能省不少顯存別莫名其妙關(guān)掉。訓練太慢的話最大的瓶頸往往是CPU在做數(shù)據(jù)增強尤其是mosaic??梢园褀orkers從默認的8升到16如果CPU核心多的話會有明顯改善。硬盤IO也有影響強烈建議把數(shù)據(jù)集放到NVMe固態(tài)硬盤上而不是機械盤。5. 評估指標與錯誤分析5.1 別只報一個mAP第一輪訓練跑完之后我拿到一份看起來不錯的mAP數(shù)據(jù)但真正有用的信息藏在per-class指標里。當時我的驗證集整體mAP50到了0.78看起來能接受但拆開看后發(fā)現(xiàn)裂紋這一類的AP50只有0.42recall更是低到0.55大量裂紋被漏成背景。這種情況下整體mAP被其他容易分類的缺陷抬高了直接上線肯定會出事。所以我強烈建議每次評估都輸出per-class表格和混淆矩陣。YOLOv8驗證時直接會生成這些結(jié)果在runs/detect/val目錄下可以找到confusion_matrix.png和results.csv。我習慣把驗證結(jié)果按類別整理成一張表比如這個格式類別AP50Recall裂紋0.620.58夾雜0.950.92麻點0.880.85氧化皮0.840.80軋制氧化鐵皮0.780.74劃傷0.820.78這是示例數(shù)據(jù)但這類表才是真正能指導迭代的東西。AP低的那一類就是要優(yōu)先補數(shù)據(jù)、修標注、調(diào)參數(shù)的方向。5.2 漏檢率比mAP更值得關(guān)注我把漏檢樣本單獨抽出來建了一個文件夾每張圖按失敗原因分類??聪聛戆l(fā)現(xiàn)漏檢主要集中在這幾種情況缺陷尺寸太小經(jīng)過640縮放后辨識度急劇下降缺陷對比度低和周圍鋼板表面的灰度差太小缺陷邊緣模糊標注框本身就不確定。針對小目標漏檢我先試過把imgsz從640提到960效果有提升但顯存壓力變大。后來又改成滑窗推理把大圖切成若干小圖分別送進模型推理再把結(jié)果合并回原坐標。這一招在缺陷尺寸極小的情況下非常有效代價是推理時間增加數(shù)倍。折中方案是只對懷疑區(qū)域做滑窗或者用更大模型結(jié)合更高分辨率。如果業(yè)務(wù)允許優(yōu)先采集更多近景圖像從數(shù)據(jù)源頭解決問題。5.3 第二次迭代怎么改第一次迭代后不要急著亂調(diào)參數(shù)。我給自己定了一個規(guī)則每次迭代只改一個變量。先補正好清洗過的數(shù)據(jù)不動增強再單獨調(diào)輸入尺寸再試增強系數(shù)最后才是換模型體積。實際做了兩輪之后我發(fā)現(xiàn)提升最大的一步不是從s換到l而是把標注中的錯誤框修好同時把輸入尺寸從640提到960。這樣做還有一個好處可以回滾。如果某個改動讓指標下降立刻知道是哪個變量導致的不用把整個訓練配置推倒重來。6. 推理部署與工程化落地6.1 導出ONNX并脫離訓練環(huán)境推理訓練結(jié)束后部署端往往不裝PyTorch直接用ONNX模型會更輕量。導出命令如下yolo export modelbest.pt formatonnx imgsz640 dynamicTrue opset12dynamicTrue表示輸入尺寸可以是動態(tài)的方便在推理時傳入任意分辨率。但要注意如果后面要轉(zhuǎn)TensorRT動態(tài)尺寸會增加轉(zhuǎn)換復雜度固定尺寸會更穩(wěn)。我在這版項目里先用ONNX Runtime跑固定成640x640邏輯更簡單。ONNX推理的關(guān)鍵是預(yù)處理必須和訓練時完全一致。我用的核心流程是讀圖、letterbox縮放、RGB通道轉(zhuǎn)換、歸一化、轉(zhuǎn)CHW送入模型、解碼輸出、畫框。其中最容易出錯的是letterbox。直接resize會把圖片橫向拉伸檢測框坐標跟著偏所以在后處理時要把letterbox的縮放比例和填充偏移記下來還原到原圖坐標。6.2 部署環(huán)境最容易出問題的三個點部署中最常遇到的問題我捋了三個。第一是通道順序。訓練時用的是RGBOpenCV默認讀進來是BGR如果忘了轉(zhuǎn)檢測效果會明顯下降而且不會報錯。第二是NMS參數(shù)。推理時置信度閾值如果按默認0.25來很多小缺陷會被過濾掉我在鋼材缺陷場景里通常把置信度閾值調(diào)到0.1到0.15但這樣誤檢會增加得用NMS的IoU閾值來控制重疊框。第三是輸入歸一化。YOLOv8官方推理時會對圖像除以255如果在自己的推理腳本里忘了這一步模型輸出基本等于廢的。我給自己寫了個推理小腳本用OpenCV和ONNX Runtime跑單張圖整體流程大約幾十行代碼。實測下來CPU推理一張640x640的圖大概在幾百毫秒GPU上可以到幾十毫秒基本能滿足產(chǎn)線慢速分檢的需求。6.3 與產(chǎn)線場景對接的注意事項部署后還要面對真實環(huán)境的變量。相機一旦裝好焦距和安裝距離就不要隨便動否則目標尺度變化會直接影響模型表現(xiàn)。光照是最核心的干擾因素鋼廠現(xiàn)場照明變化劇烈模型的誤檢率會跟著變。我的做法是在不同時段、不同燈光下各采集一批負樣本專門測試模型有沒有把陰影和反光當成缺陷。還有輸出坐標的處理。模型輸出的是歸一化坐標必須乘回原圖寬高才能給下游設(shè)備用。如果下游機械臂要根據(jù)缺陷坐標做動作那坐標精度就非常關(guān)鍵此時用mAP50-95這類指標去衡量會更貼合業(yè)務(wù)。7. 踩坑實錄與常見問題速查7.1 我踩過的坑按嚴重程度排第一個大坑是標注格式轉(zhuǎn)換時把xmax和xmin的順序搞反了。訓練過程完全不報錯loss也能下降但模型輸出的框全部偏到圖像邊緣。排查了很久才發(fā)現(xiàn)是轉(zhuǎn)換腳本里的賦值出錯。所以轉(zhuǎn)換完成后一定要做可視化檢查隨機抽幾十張圖把標注框畫出來人工看一眼。第二個坑是類別id和names順序?qū)Σ簧?。我一開始把names的第一個類當成1號實際上YOLO從0號開始結(jié)果訓練日志里分類loss一直不收斂。后來我把txt文件里的id和data.yaml里的順序重新對照了一遍才解決。第三個坑是數(shù)據(jù)增強過猛。我為了追求“泛化能力”把hsv_v調(diào)到了0.8結(jié)果鋼板表面顏色被改得面目全非模型學到的是錯誤的顏色特征檢測率直線下降。后來我才意識到工業(yè)缺陷檢測里很多線索恰恰來自顏色和紋理增強不是越多越好。第四個坑是評估集切分沒有按序列隔開。最開始直接隨機切分訓練集和驗證集里出現(xiàn)了同一卷鋼的連續(xù)幀驗證mAP虛高到0.9但換到新樣本直接掉到0.65。這讓我徹底記住了分組切分比隨機切分靠譜得多。7.2 常見問題速查表問題現(xiàn)象可能原因解決辦法train/loss降但val/loss不降過擬合、標注噪聲大清洗數(shù)據(jù)、增強、增大訓練數(shù)據(jù)、提前早停檢測框整體偏移letterbox后處理錯誤或坐標未還原核對縮放比和填充偏移按原圖尺寸還原坐標小缺陷大量漏檢輸入分辨率不夠、置信度閾值過高提高imgsz、滑窗推理、降低置信度閾值兩類缺陷互相誤檢類別特征重疊、樣本不足補樣本、減少顛覆性增強、做一個專業(yè)分類器模型在真實環(huán)境誤檢多訓練數(shù)據(jù)背景單一、新場景光照不同補邊界樣本、加入真實負樣本、降低增強里的顏色變換導出ONNX后輸出異常NMS已內(nèi)嵌、輸入預(yù)處理不一致重新核對歸一化和通道順序必要時在外部做NMS訓練速度極慢數(shù)據(jù)增強CPU瓶頸、硬盤IO慢調(diào)高workers、數(shù)據(jù)放固態(tài)盤、適當減小imgsz7.3 寫在最后的一點體會跑完整個流程之后我最深的感受是工業(yè)缺陷檢測項目里模型能力的天花板其實很低數(shù)據(jù)質(zhì)量和工作方法才是決定成敗的部分。每一次指標不達標先不要懷疑模型選型先回去看數(shù)據(jù)有沒有臟、切分有沒有問題、指標有沒有看對。把數(shù)據(jù)吃透再談模型調(diào)優(yōu)。另外就是每次迭代只改一個變量把中間模型全部保存下來。我現(xiàn)在回頭看真正讓效果變好的都是那些看起來最笨的步驟人工核對標注、分析漏檢圖、按序列切分數(shù)據(jù)。這些步驟不能省也省不得。最后再分享一個小經(jīng)驗如果條件允許訓練前先用YOLOv8自帶的預(yù)訓練模型跑一遍公開的鋼材表面小數(shù)據(jù)集看看整體流程通不通再切到自己的數(shù)據(jù)。先把流水線跑通再追求精度整個過程會順很多。