:數(shù)據(jù)集解析與訓(xùn)練避坑指南)
簡介基于YOLO的軸承生產(chǎn)缺陷檢測數(shù)據(jù)集與配套代碼以568張現(xiàn)場圖片為基礎(chǔ)面向工業(yè)視覺質(zhì)檢、自動化產(chǎn)線缺陷識別場景的開發(fā)者與學(xué)習(xí)者專門解決缺少帶標(biāo)注工業(yè)樣本、難以快速上手YOLO目標(biāo)檢測流程的問題。資源共1772個文件壓縮包約755MB其中包含jpg現(xiàn)場圖片及配套的txt、xml兩類標(biāo)注文件覆蓋三類典型軸承生產(chǎn)缺陷另附2個Python腳本和1個YAML配置用于數(shù)據(jù)集檢查、格式轉(zhuǎn)換或訓(xùn)練環(huán)境適配方便直接接入YOLO系列模型。已有337人學(xué)習(xí)下載。數(shù)據(jù)已預(yù)先完成類別ID劃分與邊界框標(biāo)注省去手動標(biāo)注與格式整理環(huán)節(jié)可立即用于YOLO模型的訓(xùn)練、驗證和檢測效果可視化借助腳本與配置也能快速復(fù)現(xiàn)從數(shù)據(jù)預(yù)處理到模型評估的完整鏈路。對正在構(gòu)建軸承表面缺陷檢測方案或希望系統(tǒng)掌握YOLO數(shù)據(jù)集制作與訓(xùn)練流程的讀者這是一份結(jié)構(gòu)清晰、可直接上手的實戰(zhàn)素材。1. 用YOLO做軸承缺陷檢測568張圖三類缺陷這份資源能幫你少走多少彎路聊軸承缺陷檢測繞不開YOLO上手YOLO繞不開數(shù)據(jù)集。這套資源給的是一個YOLO格式的軸承生產(chǎn)缺陷檢測數(shù)據(jù)集568張圖片三類缺陷圖片和同名txt標(biāo)注已經(jīng)按標(biāo)準(zhǔn)目錄配對好。它最適合兩類人一類是剛接觸工業(yè)視覺、想用一個真實小數(shù)據(jù)集把YOLO訓(xùn)練全流程跑通的開發(fā)者另一類是在軸承檢測項目里做算法選型、需要一份帶標(biāo)注數(shù)據(jù)來驗證訓(xùn)練管線的工程師。先說一個反直覺的結(jié)論568張圖在深度學(xué)習(xí)里不算多但對工業(yè)缺陷檢測來說已經(jīng)足夠暴露大部分問題。數(shù)據(jù)標(biāo)注是否一致、類別是否均衡、小缺陷是否漏標(biāo)、訓(xùn)練參數(shù)是否激進(jìn)都能在這個規(guī)模下看出端倪。把這份資源的每一張標(biāo)注當(dāng)成調(diào)試工具來用比單純追求“更大的數(shù)據(jù)集”更實際。2. 拆這份數(shù)據(jù)集的底細(xì)文件命名、標(biāo)簽格式與類別分布跑訓(xùn)練前最怕的不是模型選錯而是數(shù)據(jù)集拿到手就直接塞給訓(xùn)練腳本。下面按“盤點文件→讀懂單行標(biāo)注→統(tǒng)計類別分布→劃分訓(xùn)練集”四個步驟拆開每一步都能找到對應(yīng)的檢查手段。2.1 先盤點文件圖片、標(biāo)簽、類別清單三者要一一對應(yīng)從項目給出的圖片列表看圖片命名是356.jpg、355.jpg、357.jpg這類純數(shù)字編號。對應(yīng)的YOLO標(biāo)簽通常同名、后綴為.txt放在labels目錄。解壓后第一步我建議做三件事數(shù)圖片數(shù)量、數(shù)標(biāo)簽數(shù)量、檢查重復(fù)文件名。# 在數(shù)據(jù)集根目錄執(zhí)行先看總量 find images -name *.jpg | wc -l find labels -name *.txt | wc -l這里有個容易被忽略的細(xì)節(jié)原始文件列表里359.jpg出現(xiàn)了兩次。重復(fù)文件名在Windows解壓、網(wǎng)盤同步、git管理時都可能產(chǎn)生。如果images目錄里同一張圖有兩份標(biāo)簽文件卻只有一份訓(xùn)練時這張圖會被重復(fù)采樣導(dǎo)致模型對該張圖過擬合如果圖片去重了但標(biāo)簽留了兩份則標(biāo)簽統(tǒng)計數(shù)量虛高。我一般會先把重復(fù)名字拎出來單獨查一下# 找出所有重復(fù)圖片名輸出重復(fù)清單 find images -name *.jpg | xargs -n1 basename | sort | uniq -dsort和uniq -d組合起來能直接列出出現(xiàn)超過一次的文件名比用Python腳本更快速??吹街貜?fù)項不要直接刪先比較文件大小和md5值再決定保留哪一份。另外還要確認(rèn)是否存在classes.txt或data.yaml這個文件定義了三個類別ID的對應(yīng)順序沒有它后面訓(xùn)練時的類別名會亂掉。2.2 讀懂txt單行標(biāo)注類別ID、歸一化坐標(biāo)和邊界框?qū)捀遈OLO的標(biāo)注文件不是直接存像素坐標(biāo)而是存歸一化坐標(biāo)。每一行格式固定為類別ID x_center y_center width height前四列都是相對于圖片寬高的比例值取值范圍通常是0~1只有類別ID是整數(shù)。假設(shè)有一張1280x1024的軸承端面圖其中一個缺陷的邊界框中心是(320, 512)框?qū)?28像素、高64像素那么對應(yīng)txt里的一行是1 0.250000 0.500000 0.100000 0.062500這個例子中五列分別表示類別ID為1、框中心x比例0.25、框中心y比例0.5、框?qū)挶壤?.1、框高比例0.0625。讀標(biāo)簽時最需要警惕兩類錯誤一類是坐標(biāo)沒有歸一化直接寫成像素值訓(xùn)練時邊界框會超出圖片范圍另一類是五個數(shù)字的順序?qū)戝e把x_center和width對調(diào)訓(xùn)練不報錯但丟失效果極差。在開始訓(xùn)練前我通常會把每張圖對應(yīng)的txt打開至少看三行確認(rèn)里邊的類別ID確實是0、1、2而不是1、2、3。如果編碼是從1開始把所有類別ID統(tǒng)一減1否則data.yaml里的nc和names會全部錯位。還有一個值得注意的細(xì)節(jié)檢查一下標(biāo)簽里有沒有0.000000或1.000000這類邊緣值。如果坐標(biāo)落在圖片邊界上有可能是標(biāo)注時手滑拖出了畫面這類框在增強時容易被裁剪掉導(dǎo)致訓(xùn)練數(shù)據(jù)白白丟失一部分。2.3 用Python統(tǒng)計類別分布和框大小先判斷數(shù)據(jù)是否可訓(xùn)工業(yè)缺陷檢測里三類缺陷數(shù)量往往不對稱。某個缺陷占一半以上另外兩類加起來都不到30%。568張圖本身不多這種不平衡會被進(jìn)一步放大。所以我在拿到數(shù)據(jù)集后的第一件事是寫一個統(tǒng)計腳本把每個類別的樣本數(shù)、每張圖的平均框數(shù)、平均框尺寸算出來。import glob from collections import Counter labels glob.glob(labels/*.txt) cls_counter Counter() box_counter 0 total_w 0.0 total_h 0.0 for lb in labels: with open(lb, r, encodingutf-8) as f: for line in f: parts line.strip().split() if len(parts) 5: continue cls_counter[int(parts[0])] 1 box_counter 1 total_w float(parts[3]) total_h float(parts[4]) print(類別分布:, dict(cls_counter)) print(總標(biāo)注框數(shù):, box_counter) if box_counter: print(平均框尺寸占比: {:.3f} x {:.3f}.format(total_w / box_counter, total_h / box_counter))腳本邏輯并不復(fù)雜讀取labels目錄下所有txt文件逐行解析五列內(nèi)容把第一列作為類別ID計入Counter把寬高比例累加后求平均。輸出結(jié)果里如果某一類樣本數(shù)只有幾十個、平均框?qū)挼陀?.05就是一個預(yù)警信號。前者說明樣本太少需要復(fù)制增強后者說明缺陷目標(biāo)偏小需要提高輸入分辨率或使用SAHI切片推理。類別ID對應(yīng)的業(yè)務(wù)含義需要和數(shù)據(jù)集自帶的class定義對應(yīng)。一個典型的三類缺陷映射可能長這樣類別ID常見缺陷類型訓(xùn)練檢查項0表面裂紋確認(rèn)裂紋框是否貼緊缺陷1劃痕劃痕常為長條檢查錨框長寬比2邊緣毛刺邊緣缺陷容易漏檢單獨看AP實際類別名以壓縮包內(nèi)classes.txt或README中寫明的為準(zhǔn)。這里給出的是最常見的映射方案不是從該數(shù)據(jù)集硬性推出的。確認(rèn)好類別后把統(tǒng)計腳本的輸出和這張表對照就能知道訓(xùn)練前需不需要做類別重平衡。2.4 劃分train/val不要直接隨機切按類別做分層抽樣很多教程會讓你直接執(zhí)行一個隨機劃分腳本把圖片按比例分成兩份。在小數(shù)據(jù)集上這種隨機劃分很容易導(dǎo)致val集中缺少某類缺陷。比如某個類別總共只有30張隨機分15%出來可能只有3張到val另外還有可能一張都分不到。驗證集里缺類mAP計算時該類的AP算作0產(chǎn)生誤導(dǎo)性的結(jié)果。我建議按類別分層抽樣先把所有包含類別A、B、C的圖片分別列出來再按各自類別數(shù)量的一定比例抽取val。用Python實現(xiàn)時最簡潔的方式是使用scikit-learn里的train_test_split或者直接寫一個簡單的分層腳本import glob import random from collections import defaultdict random.seed(42) img_files glob.glob(images/*.jpg) by_cls defaultdict(list) for img in img_files: lb img.replace(images, labels).replace(.jpg, .txt) if not os.path.exists(lb): continue with open(lb, r, encodingutf-8) as f: cls_set set(line.split()[0] for line in f if line.strip()) by_cls[tuple(sorted(cls_set))].append(img) val_imgs set() for cls_key, imgs in by_cls.items(): val_count max(1, int(len(imgs) * 0.15)) val_imgs.update(random.sample(imgs, val_count)) print(val圖片數(shù):, len(val_imgs))這段腳本的核心邏輯是先把圖片按“包含哪些類別”分組再從每個分組中按15%抽到val。這樣即使一張圖同時含三類缺陷也不會被重復(fù)分進(jìn)val。最終train和val的目錄可以用一個shutil.move循環(huán)完成。這里提醒一句不要在腳本里把jpg的替換寫成大寫.JPG不同平臺導(dǎo)出的圖片后綴大小寫不統(tǒng)一會導(dǎo)致標(biāo)簽匹配失敗。3. 用這份數(shù)據(jù)把YOLO訓(xùn)練跑通目錄編排、訓(xùn)練命令和首輪評估數(shù)據(jù)盤點結(jié)束接下來就是落地訓(xùn)練。這里推薦的流程以YOLOv8為準(zhǔn)因為它的自定義數(shù)據(jù)集接口比Darknet更干凈適合快速驗證如果你執(zhí)意要用Darknet數(shù)據(jù)結(jié)構(gòu)是一樣的但配置文件和anchor計算要額外處理。YOLOv8的訓(xùn)練流程分四步編排目錄、寫data.yaml、跑訓(xùn)練命令、解讀首輪輸出。3.1 目錄編排images和labels同級train和val分開YOLOv8要求數(shù)據(jù)集根目錄下必須有images和labels兩個同級目錄每個目錄下再按train和val分開。很多人習(xí)慣把圖片放在data/img、標(biāo)簽放在data/label訓(xùn)練腳本找不到標(biāo)簽浪費一整個下午查路徑。標(biāo)準(zhǔn)結(jié)構(gòu)如下bearing_defect/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ ├── data.yaml └── classes.txt這里的目錄名不能改寫成image、label或者annotations除非你愿意修改訓(xùn)練腳本里的路徑拼接邏輯。特別需要注意的是train和val的圖片目錄與標(biāo)簽?zāi)夸洷仨氁灰粚?yīng)images/train里的每一張圖必須在labels/train里有同名txt。不能把A目錄下的圖配到B目錄下的標(biāo)簽即使路徑能對上數(shù)量訓(xùn)練腳本也會因為找不到同名文件而把圖丟棄。劃分時我一般把val控制在總樣本量的15%~20%。568張圖的情況下train可以放460張左右val放100張左右。如果某個類別在val里的樣本數(shù)少于5張說明劃分比例可能有問題需要回到2.4里的分層抽樣調(diào)整。3.2 寫data.yamlnc和names決定模型知道自己在檢測什么data.yaml是YOLO訓(xùn)練的數(shù)據(jù)入口。它至少需要四個字段path或數(shù)據(jù)根目錄、train相對路徑、val相對路徑、nc和names。一個可用的配置如下# data.yaml path: /home/user/bearing_defect train: images/train val: images/val nc: 3 names: 0: crack 1: scratch 2: burr這里nc是類別總數(shù)names是類別名。這看起來簡單但卻是訓(xùn)練配置里最容易出錯的字段。如果標(biāo)簽里實際出現(xiàn)了類別ID3而nc仍然填3訓(xùn)練腳本會把ID3的行當(dāng)作無效標(biāo)注扔掉表現(xiàn)為loss下降正常但mAP上不去。如果names的下標(biāo)寫成了1、2、3和標(biāo)簽ID差一位推理時類別名會全部錯位部署到界面時顯示的缺陷類型完全不對。類別名建議用英文小寫。工業(yè)軟件里經(jīng)常用中文顯示缺陷名稱但訓(xùn)練配置里使用中文會在Windows環(huán)境出現(xiàn)編碼問題轉(zhuǎn)TensorRT時還要額外處理字符映射。正確做法是訓(xùn)練時用crack、scratch、burr這樣的英文名在業(yè)務(wù)界面里再做一次中文翻譯。3.3 YOLOv8訓(xùn)練命令參數(shù)不是越大越好準(zhǔn)備就緒后在終端或PyCharm里運行訓(xùn)練命令。以yolov8s為預(yù)訓(xùn)練權(quán)重命令如下yolo train datadata.yaml modelyolov8s.pt epochs300 imgsz640 batch16 patience30 projectruns/bearing_defect nameexp1參數(shù)選擇有明確的業(yè)務(wù)邏輯。modelyolov8s.pt選s而不是n是因為工業(yè)缺陷目標(biāo)普遍偏小s模型的頸部網(wǎng)絡(luò)能保留更多細(xì)節(jié)epochs300看起來多但配合patience30實際可能在120輪左右就停止屬于“給足預(yù)算但允許早?!钡膶懛āmgsz640是第一輪驗證用的分辨率如果后續(xù)發(fā)現(xiàn)小缺陷漏檢再提高到768或1024。batch16在12G顯存上比較穩(wěn)妥8G卡建議降到8。這里最容易被誤解的是patience。它代表多少個epoch沒有改善就停止訓(xùn)練而不是最多訓(xùn)練多少輪。小數(shù)據(jù)集的loss曲線震蕩嚴(yán)重如果patience設(shè)成10模型可能在上升期被截斷設(shè)到30到50更合理。訓(xùn)練過程中不要隨手改參數(shù)重啟先讓它跑完一個完整輪次再看曲線。如果不想用命令行在PyCharm里直接運行Python腳本也是一樣的核心調(diào)用是from ultralytics import YOLO model YOLO(yolov8s.pt) model.train(datadata.yaml, epochs300, imgsz640, batch16, patience30)不管是命令行還是腳本邏輯完全一致只是寫法不同。第一次跑的時候建議開啟verboseTrue讓控制臺打印出每個epoch的完整信息方便后面排查問題。3.4 首輪輸出怎么讀先別盯總mAP看單類AP和預(yù)測圖訓(xùn)練啟動后控制臺先打印模型結(jié)構(gòu)、參數(shù)量、FLOPs然后進(jìn)入epoch迭代。第一個epoch結(jié)束時終端會出現(xiàn)val指標(biāo)包括mAP50和mAP50-95。在568張圖的小數(shù)據(jù)集上第一次迭代的mAP可能只有0.2甚至更低這是正常的模型還沒有充分學(xué)習(xí)。真正要盯的是后面幾十個epoch里mAP是否持續(xù)上升。訓(xùn)練結(jié)束后進(jìn)入runs/bearing_defect/exp1/目錄重點看兩個文件。第一是results.png里面有box_loss、cls_loss、mAP曲線。如果box_loss一直在降但mAP50在某個位置不再變化優(yōu)先懷疑某個類別的標(biāo)注噪音。第二是val_batch0_pred.jpg這類可視化圖看預(yù)測框是緊貼缺陷邊緣還是把金屬紋理反光也框了進(jìn)來。后者在軸承表面高反光場景非常常見僅靠mAP看不出來。相比DarknetYOLOv8訓(xùn)練自定義數(shù)據(jù)集時少了一個麻煩anchor自動學(xué)習(xí)。Darknet需要預(yù)先計算anchor尺寸輸入圖片為640分辨率時用錯anchor就會導(dǎo)致很多候選框根本不覆蓋小缺陷。YOLOv8的anchor是自動調(diào)整的但代價是更依賴數(shù)據(jù)本身的標(biāo)注質(zhì)量。如果val圖上一個框都沒畫出來先回標(biāo)簽格式和目錄里去查不要先懷疑模型結(jié)構(gòu)。3.5 小數(shù)據(jù)集的過擬合信號loss下降、單類AP異常工業(yè)場景里過擬合不是單純“mAP低”而是訓(xùn)練集mAP很高、val mAP波動大甚至反向下降。在results.png中這種信號的典型表現(xiàn)是box_loss在train側(cè)降到0.02以下但val側(cè)box_loss重新抬頭兩個曲線分叉。原因是網(wǎng)絡(luò)開始記住568張圖里某些獨特的金屬紋理而不是學(xué)習(xí)缺陷本身的共性。對這種過擬合最有效的手段不是縮小模型而是加強數(shù)據(jù)增強和正則化??梢栽谟?xùn)練命令中增加增強參數(shù)比如hsv_h0.015, hsv_s0.7, hsv_v0.4, degrees10.0, translate0.1, scale0.5讓模型每次看到的是同一缺陷的不同光照和角度版本。軸承檢測還有一個特殊的有效手段隨機裁剪。把圖像增強里的mosaic1.0和mixup0.2打開模型對非缺陷背景的過擬合會明顯緩解。這個內(nèi)容不需要修改代碼YOLOv8把這些開放成了訓(xùn)練參數(shù)。4. 軸承缺陷數(shù)據(jù)集的常見問題排查五個坑現(xiàn)象原因與解決下面五條是從實際項目中反復(fù)踩出來、驗證過的通用問題直接對號入座就行。4.1 圖片與標(biāo)簽數(shù)量不一致訓(xùn)練報“found no labels”現(xiàn)象數(shù)據(jù)目錄配置好后運行訓(xùn)練腳本終端提示找不到標(biāo)簽或者labels里的txt數(shù)量明顯少于images里的圖片數(shù)量每個epoch幾秒鐘就結(jié)束val階段沒有任何預(yù)測輸出。原因大部分情況是解壓工具丟文件或者文件名沒有嚴(yán)格同名。YOLO慣例是0001.jpg對應(yīng)0001.txt如果圖片是.jpg標(biāo)簽寫了.jpeg.xml或者圖片是png而標(biāo)簽是txt數(shù)量就會對不上。還有一個隱藏原因某些網(wǎng)盤在Windows下解壓會把長文件名截斷后綴變成奇怪的縮寫標(biāo)簽文件無法被識別。解決先不要改訓(xùn)練腳本用清單比對腳本把問題文件找出來。import os from pathlib import Path img_dir Path(images) label_dir Path(labels) imgs {p.stem: p for p in img_dir.rglob(*) if p.suffix.lower() in (.jpg, .jpeg, .png)} labels {p.stem: p for p in label_dir.rglob(*.txt)} missing_label [str(p) for name, p in imgs.items() if name not in labels] missing_image [str(p) for name, p in labels.items() if name not in imgs] print(缺標(biāo)簽圖片數(shù):, len(missing_label)) print(缺圖片標(biāo)簽數(shù):, len(missing_image))這段腳本用stem作為關(guān)聯(lián)鍵把圖片和標(biāo)簽分別裝進(jìn)兩個字典然后對比缺失項。它比直接數(shù)文件數(shù)量更可靠因為它能發(fā)現(xiàn)同名但放在錯誤子目錄的情況。輸出的清單里如果缺的是標(biāo)簽回到標(biāo)注工具重新導(dǎo)出如果缺的是圖片檢查是不是被誤移動到backup目錄。4.2 標(biāo)簽里出現(xiàn)第四類nc參數(shù)錯位導(dǎo)致誤檢現(xiàn)象訓(xùn)練時loss能正常下降推理時在無缺陷區(qū)域頻繁輸出高置信度框而且框的位置與軸承邊緣紋理高度相關(guān)。查看類別統(tǒng)計時發(fā)現(xiàn)出現(xiàn)了標(biāo)簽ID大于等于3的標(biāo)注。原因項目在標(biāo)注時把“背景”或“正?!币矘?biāo)成了一個類別導(dǎo)出YOLO格式時背景成了類別0三類缺陷順延成1、2、3。data.yaml里nc仍然填3類別3的標(biāo)注被訓(xùn)練腳本忽略模型實際看到的有效類別只剩兩個背景紋理被迫承擔(dān)了第三個類別的預(yù)測任務(wù)。解決先統(tǒng)計一下標(biāo)簽里的最大類別ID。如果確實出現(xiàn)了3而且第4類是背景正確的做法是刪除該類別對應(yīng)的所有標(biāo)簽行而不是把nc改成4。因為軸承缺陷檢測場景下無法窮舉所有正常紋理把背景當(dāng)成一個類別訓(xùn)練在線推理時必然會出現(xiàn)大量假陽性。# 找出含類別ID大于2的標(biāo)簽文件 grep -rlE ^[3-9] labels/ | head -n 20用grep快速定位含異常ID的文件然后單獨處理。如果異常ID是標(biāo)注失誤直接修改對應(yīng)行如果是一個獨立類別要回到標(biāo)注工具確認(rèn)這個類別是否有足夠樣本支撐訓(xùn)練。實話說在568張圖這個規(guī)模下不建議用四類數(shù)據(jù)硬訓(xùn)去掉背景類、聚焦三類缺陷更容易拿到可交付的模型。4.3 劃痕類缺陷漏檢嚴(yán)重mAP50不低產(chǎn)線實測打不到現(xiàn)象驗證集mAP50達(dá)到了0.85以上但拿現(xiàn)場拍的新圖測試細(xì)小的劃痕和淺裂紋基本漏檢偶爾框出來的也是斷斷續(xù)續(xù)的片段。放大預(yù)測圖后發(fā)現(xiàn)預(yù)測框比缺陷本身大很多。原因劃痕是典型的長條形小目標(biāo)寬高比常有1:10甚至更極端。YOLO默認(rèn)輸出層會對特征圖做下采樣640分辨率輸入時一個寬度占比不到3%的小劃痕在下采樣后的特征圖上可能只剩1到2個像素特征強度不夠。另外如果標(biāo)注框貼著劃痕的包圍盒但長寬比極端模型回歸難度也高。解決優(yōu)先把imgsz提高到768或1024這一步對長條形缺陷的提升通常比換模型更明顯。接著在訓(xùn)練參數(shù)中開啟更強的增強尤其是degrees15和scale0.5讓模型見到不同旋轉(zhuǎn)角度和不同尺度的劃痕。還有一招是把該類別單獨復(fù)制一份做拼接增強比如把多個小劃痕圖拼成一張訓(xùn)練圖變相增加該類別在每張圖里的出現(xiàn)頻率。如果實測階段仍然漏檢把檢測置信度閾值從默認(rèn)的0.25適當(dāng)降低到0.1再看漏檢情況。閾值降低會增加誤檢但可以用來區(qū)分“模型學(xué)到了但沒有自信”和“模型根本沒學(xué)到”。這一步在生產(chǎn)環(huán)境里要謹(jǐn)慎閾值的最終值要結(jié)合誤檢成本來確定。4.4 正常軸承圖片混進(jìn)訓(xùn)練集模型開始學(xué)會漏檢現(xiàn)象訓(xùn)練loss表現(xiàn)正常推理時對沒有缺陷的軸承也輸出高置信度框誤檢率居高不下?lián)Q個場景真實缺陷反而被漏檢。原因無標(biāo)注圖片放在了images目錄里訓(xùn)練腳本會把它們當(dāng)作負(fù)樣本背景。這類圖片數(shù)量一旦偏多模型學(xué)到的傾向是“盡量輸出空框”。更有問題的是如果一張圖里有缺陷但漏標(biāo)了訓(xùn)練腳本會認(rèn)為該區(qū)域的紋理屬于背景直接壓制模型對同類缺陷的響應(yīng)。解決把正常件、無標(biāo)注圖、漏標(biāo)注圖全部從訓(xùn)練目錄里請出去。正常件如果確實要參與訓(xùn)練要么單獨加一個normal類別要么不在訓(xùn)練集里出現(xiàn)、只作為推理階段的負(fù)樣本測試集。在軸承產(chǎn)線上無缺陷樣本往往比缺陷樣本容易獲取得多正確用法是留一批正常圖專門做閾值調(diào)參和誤檢率統(tǒng)計而不是混在訓(xùn)練數(shù)據(jù)里讓模型“自己悟”。4.5 顯存不足、PyCharm里訓(xùn)練中斷batch、workers、cache順序排查現(xiàn)象訓(xùn)練跑到第幾十個epoch時突然報CUDA out of memory或者整個IDE卡死重啟后訓(xùn)練進(jìn)度丟失。部分時候現(xiàn)象表現(xiàn)為CPU吃掉絕大部分核GPU利用率卻只有零頭。原因8G或12G顯存的機器上imgsz640、batch16、yolov8s理論上能跑但疊加了Mosaic增強、緩存、過多的數(shù)據(jù)加載線程后顯存和內(nèi)存會同時飆升。尤其是PyCharm這類IDE里跑訓(xùn)練解釋器自帶的內(nèi)存分配和調(diào)試器會額外吃掉一部分資源問題更容易復(fù)現(xiàn)。解決依次調(diào)整三個參數(shù)。第一是batch8顯存占用大約減半第二是顯式設(shè)置cacheFalse關(guān)閉數(shù)據(jù)緩存第三是workers2降低數(shù)據(jù)加載線程數(shù)。如果這三個都改了還崩把imgsz降到480試試。已經(jīng)中斷的時候weights目錄下通常有l(wèi)ast.pt直接在訓(xùn)練命令末尾加resumeTrue就能從最近一次保存的權(quán)重繼續(xù)不用從頭開始。需要說明的是resume依賴YOLOv8內(nèi)部斷點機制如果中斷前沒正常保存就不要強求繼續(xù)直接檢查日志定位原因更實際。5. 從mAP到產(chǎn)線可用三類缺陷的驗證順序和部署參數(shù)邊界訓(xùn)練收尾后離產(chǎn)線還差兩步驗證順序和部署參數(shù)。先說驗證順序。我拿到一個訓(xùn)練好的模型不會直接看總mAP而是按三個步驟執(zhí)行。第一步打開results.png看三類缺陷各自的AP曲線找到明顯短板的那一類第二步用該類的真實圖像做預(yù)測可視化區(qū)分是漏檢、誤檢還是定位偏移第三步截取一段生產(chǎn)現(xiàn)場視頻按10秒一段統(tǒng)計誤檢次數(shù)。這套順序能在不寫復(fù)雜代碼的情況下把模型的主要失效模式定位出來。部署時最常被問到的問題是T4上用TensorRT跑640分辨率YOLO能支持多少路1080p 25fps的視頻流。這類問題的答案不能靠嘴說必須實測。我的做法是先用batch1測單路純推理時間然后把總幀率除以單路幀率再乘一個0.7的安全系數(shù)。真正容易翻車的地方有三個一是只測了模型推理時間沒有算視頻解碼和前后處理二是沒有考慮多個推理進(jìn)程共享顯存時的峰值三是int8量化之后小缺陷的AP可能比fp16掉得更明顯。對軸承這類小目標(biāo)缺陷場景建議量化后逐個類別重新跑一次AP再決定用int8還是fp16。如果某一類缺陷的AP掉了超過3個百分點就退回fp16。自從我做過一次“只測推理時間就定方案”的蠢事以后每次拿到新的軸承缺陷模型都會強制走一遍“逐類AP→誤檢視頻測試→三檔量化對比”的流程確認(rèn)所有參數(shù)后才去談路數(shù)。這個習(xí)慣救過我很多次希望幫到你。本文還有配套的精品資源點擊獲取