
保姆級教程零基礎(chǔ)訓練你的第一個 YOLOv8 缺陷檢測模型附 5 個產(chǎn)線真實踩坑目標讀者會基本 Python、沒訓過模型的工程師。目標跟著本文一步步走訓出第一個可用的工業(yè)缺陷檢測模型。全文以木料缺齒檢測為例每一步都附上我們項目中真實踩過的坑幫你繞開。0. 先看全貌整個流程五步別被術(shù)語嚇住拍圖 → 標注 → 訓練 → 驗證 → 導出 (攢幾十張) (畫框) (一條命令) (看指標) (一條命令)訓練不需要 GPU百張級數(shù)據(jù)集 yolov8n純 CPU 訓 200 輪約 40 分鐘。1. 環(huán)境準備以 Ubuntu 22.04 為例Windows 的區(qū)別見代碼塊下方說明。先裝 Python 虛擬環(huán)境支持再建環(huán)境# Ubuntu安裝 venv 支持sudoaptupdatesudoaptinstallpython3-venv python3-pip# 創(chuàng)建并激活虛擬環(huán)境python3-mvenv yolo_envsourceyolo_env/bin/activate# 安裝 ultralytics國內(nèi)加 -i 鏡像源加速pipinstallultralytics-ihttps://pypi.tuna.tsinghua.edu.cn/simpleWindows 用戶跳過apt那兩行直接用python -m venv yolo_env創(chuàng)建環(huán)境激活命令換成yolo_env\Scripts\activate其余相同。驗證安裝yolo version# 能打印版本號就 OK有 N 卡想 GPU 訓練的再裝對應 CUDA 版的 PyTorch沒有就跳過CPU 完全夠用。2. 準備圖片拍多少、怎么拍數(shù)量單類缺陷 50 張能跑通150 張左右能談上線。先拍 50 張把流程跑通NG 圖是主角每種缺陷至少 20~30 張OK 圖也要拍 10~20 張正常產(chǎn)品圖不用標注讓模型見過好的是什么樣子這是壓誤檢的關(guān)鍵拍照條件盡量和現(xiàn)場一致同一相機、同一光照、同一角度。實驗室擺拍的光線和產(chǎn)線不一樣訓出來上線就翻車。圖片放到dataset/images_all/目錄格式 jpg/png 都行???1用實驗室擺拍圖代替現(xiàn)場圖。我們早期在實驗室補光擺拍光線均勻背景干凈指標很好上線后現(xiàn)場光照變化大、背景雜亂誤檢明顯偏多只能按現(xiàn)場條件全部重拍。實驗室擺拍可以用來驗證流程跑通但不要進訓練集——模型學的是數(shù)據(jù)分布訓練圖和現(xiàn)場圖差多少上線效果就差多少。3. 標注給缺陷畫框標注工具任選國內(nèi)網(wǎng)絡都能正常使用工具形態(tài)適合誰labelImg本地客戶端pip 安裝首選輸出直接是 YOLO 格式精靈標注助手國產(chǎn)客戶端官網(wǎng)直接下載不想碰命令行makesense.ai在線網(wǎng)頁免安裝臨時標幾十張注意圖片需上傳CVAT自部署網(wǎng)頁版多人協(xié)作再用新手不必以 labelImg 為例走清華鏡像安裝不依賴 GitHubpipinstalllabelImg-ihttps://pypi.tuna.tsinghua.edu.cn/simple labelImg dataset/images_all/操作要點打開后把保存格式切到Y(jié)OLO默認是 PascalVOC 的 XML一定要切W鍵畫框D鍵下一張類別先只建一個比如missing_tooth第一版不要貪多類別。每張圖標完生成同名.txt每行一個框0 0.512 0.384 0.062 0.105 # ↑類別編號(從0開始) 中心x 中心y 寬 高均為0~1歸一化值4. 整理目錄 劃分訓練/驗證集YOLO 要求的目錄結(jié)構(gòu)dataset/ ├── train/images/ ← 訓練圖 ├── train/labels/ ← 訓練標注 txt ├── val/images/ ← 驗證圖 └── val/labels/自動劃分腳本8:2# split_dataset.py — 用法: python split_dataset.py dataset/images_all datasetimportrandom,shutil,sysfrompathlibimportPath src,dstPath(sys.argv[1]),Path(sys.argv[2])images[pforpinsrc.iterdir()ifp.suffix.lower()in(.jpg,.png,.bmp)]random.seed(42)random.shuffle(images)n_valmax(1,int(len(images)*0.2))val_setset(images[:n_val])forsubin(train,val):(dst/sub/images).mkdir(parentsTrue,exist_okTrue)(dst/sub/labels).mkdir(parentsTrue,exist_okTrue)forimginimages:subvalifimginval_setelsetrainshutil.copy(img,dst/sub/images/img.name)labelimg.with_suffix(.txt)iflabel.exists():shutil.copy(label,dst/sub/labels/label.name)# 沒有 txt 的是 OK 圖只復制圖片即可print(ftrain:{len(images)-n_val}張, val:{n_val}張)坑 2train/val 隨手按張劃分。同一根木料連拍的多張圖高度相似隨機劃分會把親兄弟圖分到訓練集和驗證集兩邊驗證等于開卷考試指標虛高上線后對不上。正確做法是按根劃分同一根木料的所有圖整體進一邊。上面的腳本是隨機劃分有連拍場景的話分完務必手動檢查 val 目錄。再寫dataset.yamlpath:/絕對路徑/datasettrain:train/imagesval:val/imagesnc:1names:[missing_tooth]5. 訓練一條命令yolo trainmodelyolov8n.ptdatadataset.yaml\imgsz512epochs200patience100batch8devicecpu逐參數(shù)說明參數(shù)含義建議modelyolov8n.pt從官方預訓練權(quán)重起步必須用.pt見坑 3imgsz512輸入尺寸和部署端保持一致見坑 4epochs200最多訓練輪數(shù)往大設(shè)配合 patience 早停patience100100 輪無提升則停止不用改batch8每批圖片數(shù)內(nèi)存不夠改 4devicecpu訓練設(shè)備有顯卡改0坑 3從頭訓練不用預訓練權(quán)重。幾十張圖從頭訓訓練 loss 降得很漂亮但模型實際是把訓練圖的背景紋理背下來了驗證集上誤檢大量出現(xiàn)。換成yolov8n.pt預訓練權(quán)重后立刻正?!A訓練權(quán)重已經(jīng)學過邊緣、紋理、角點等通用底層特征小數(shù)據(jù)集只需學習缺陷本身的特征。注意modelyolov8n.pt遷移學習和modelyolov8n.yaml隨機初始化從頭訓只差后綴效果天壤之別???4訓練用 640、部署用 512。我們早期版本訓練用 640部署端為了壓節(jié)拍改成 512 后小缺陷置信度整體下滑、開始漏檢——模型按 640 的特征尺度學習輸入突然變小就匹配不上了。后續(xù)版本全部統(tǒng)一為 512 訓練后恢復。原則訓練輸入尺寸跟著部署走。訓練產(chǎn)物在runs/detect/train/weights/best.pt。6. 看結(jié)果三個文件就夠打開runs/detect/train/results.png損失曲線。train loss 持續(xù)下降而 val loss 走平或回升說明開始過擬合下次可減少 epochsval_batch0_pred.jpg驗證集預測可視化肉眼檢查框的位置是否準確results.csv最后幾行指標metrics/recall最重要漏檢率 1 ? 召回率產(chǎn)線優(yōu)先看這個metrics/precision對應誤檢率metrics/mAP50綜合指標0.9 以上較好。坑 5只盯 mAP不數(shù)誤檢/漏檢個數(shù)。mAP 是綜合指標漲兩個點不代表產(chǎn)線關(guān)心的問題有改善。我們后來建了固定的 OK/NG 測試集22 張 OK 標準樣 留存的 NG 圖每版模型跑一遍只數(shù)兩個數(shù)誤檢幾個、漏檢幾個。這兩個數(shù)和客戶驗收口徑一致比曲線直觀。置信度閾值的調(diào)整也在這套測試集上做不再憑感覺定。7. 拿新圖驗證找?guī)讖垱]參與訓練的現(xiàn)場圖跑一遍yolo predictmodelruns/detect/train/weights/best.ptsource你的測試圖目錄結(jié)果在runs/detect/predict/。逐張檢查漏檢和誤檢不理想的圖標注后補進數(shù)據(jù)集重訓——這就是數(shù)據(jù)迭代循環(huán)。8. 導出部署yoloexportmodelruns/detect/train/weights/best.ptformatonnximgsz512得到best.onnx交給部署程序OpenVINO 加載推理的完整過程見本系列部署篇。常見問題yolo命令找不到虛擬環(huán)境沒激活標注了但訓練提示沒有標簽labelImg 保存格式?jīng)]切成 YOLO或 txt 未與圖片同名類別編號錯亂txt 第一列從 0 開始順序?qū)猟ataset.yaml的names路徑報錯Windows 路徑避免中文和空格CPU 訓練看似卡住CPU 跑滿即在正常訓練200 輪約 40 分鐘。小結(jié)五個坑其實是同一條原則的不同體現(xiàn)訓練的每個環(huán)節(jié)都要對齊最終部署和驗收的真實條件——預訓練權(quán)重 → 對齊真實數(shù)據(jù)量幾十張不是幾萬張按根劃分 → 對齊真實的樣本獨立性訓練尺寸 部署尺寸 → 對齊真實輸入現(xiàn)場實拍 → 對齊真實圖像分布數(shù)誤檢/漏檢 → 對齊真實驗收口徑系列文章《YOLOv8 工業(yè)缺陷檢測實戰(zhàn)上48 張缺陷圖起步8 個版本迭代到上線的完整記錄》《YOLOv8 工業(yè)缺陷檢測實戰(zhàn)下小樣本訓練怎么把誤檢/漏檢率壓到產(chǎn)線標準》《YOLOv8 部署到無 GPU 工控機實戰(zhàn)ONNX 導出 OpenVINO 推理 手寫后處理》