據(jù)集實戰(zhàn)指南)
簡介本資源面向從事工業(yè)質檢、深度學習目標檢測的開發(fā)者與研究人員提供一套可直接復現(xiàn)的YOLOv7鋼材缺陷檢測方案解決鋼材表面缺陷自動識別與模型訓練問題。壓縮包共166個文件約203.86MB包含31個Python腳本、36個yaml配置、14個ipynb實驗筆記、2個pt權重文件以及jpg圖片、xml與txt標簽、png圖表、sh腳本和Dockerfile等覆蓋訓練、推理、導出與部署環(huán)節(jié)。數(shù)據(jù)集使用labelImg標注圖片為jpg格式標簽同時提供xml與txt兩種格式便于適配不同框架。資源內含已訓練好的檢測模型及PR曲線、loss曲線等評估結果可幫助讀者快速驗證模型性能、理解訓練過程并遷移到自有數(shù)據(jù)。目前已有1288人學習下載適合具備一定深度學習基礎、希望快速搭建鋼材缺陷檢測流程的讀者參考使用。1. 鋼材缺陷檢測為什么選 YOLOv7一份開箱即用的權重與數(shù)據(jù)集產線上鋼板跑得飛快人眼盯久了必然漏檢傳統(tǒng)圖像處理又扛不住光照和氧化皮變化所以鋼材缺陷檢測這件事繞不開目標檢測。這份資源給的就是一條能直接跑通的路YOLOv7 鋼材缺陷檢測模型已經訓練好權重、PR 曲線、loss 曲線都在配套數(shù)據(jù)集用 labelImg 標好jpg 圖片加 xml、txt 雙格式標簽省掉了從零標注和從零訓練這兩件最耗時間的事。適合兩類人一類是想快速驗證鋼材缺陷檢測能不能落地的算法工程師另一類是要拿現(xiàn)成數(shù)據(jù)集和權重做二次訓練、換產線換缺陷類型的人。下面按「資源是什么、怎么跑、坑在哪」拆開講。2. 拆開資源包權重、數(shù)據(jù)集與訓練曲線的對應關系拿到一個檢測項目我第一件事不是急著跑推理而是先把包里的東西和它的用途對上號。鋼材缺陷檢測這類工業(yè)場景權重和數(shù)據(jù)集必須配套否則類別對不上檢測框會亂飛。這一章先把資源結構講清楚再講怎么驗證權重是不是真的能用。2.1 權重文件與訓練產物的識別YOLOv7 訓練完會產出幾類文件用途完全不同。.pt是 PyTorch 權重用來推理和繼續(xù)訓練best.pt是驗證集表現(xiàn)最好的那一版last.pt是最后一輪實際部署優(yōu)先用best.pt。資源里還有events.out.tfevents.*這類 TensorBoard 日志PR 曲線、loss 曲線就是從它里面讀出來的不是單獨的圖片文件得用 TensorBoard 打開看。常見做法是先確認權重對應的類別數(shù)和類別名。YOLOv7 的權重里存了names字典直接加載就能打印出來import torch # 加載訓練好的鋼材缺陷權重 ckpt torch.load(best.pt, map_locationcpu) model ckpt[model] if model in ckpt else ckpt # 打印類別信息確認缺陷類型和數(shù)量 names model.names if hasattr(model, names) else ckpt.get(names) print(類別數(shù):, len(names)) print(類別名:, names)這段代碼的關鍵在map_locationcpu避免在沒有 GPU 的機器上加載時報 CUDA 相關錯誤。names打印出來就是這份權重認識的缺陷類型鋼材場景常見的是夾雜、劃痕、斑塊、麻點這類具體以打印結果為準。如果names是空的說明權重保存方式不同需要從訓練時的data.yaml里找類別定義。2.2 數(shù)據(jù)集目錄結構與標簽格式數(shù)據(jù)集這塊資源里圖片是 jpg標簽給了 xml 和 txt 兩套分別放在兩個文件夾。xml 是 labelImg 直接存的 Pascal VOC 格式txt 是 YOLO 訓練要的歸一化格式兩者內容一致只是坐標表達不同。YOLO 的 txt 每行是類別索引 中心x 中心y 寬 高全部歸一化到 0 到 1 之間。標準目錄一般長這樣steel_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yamldata.yaml是訓練和驗證的入口配置內容大致如下train: ./images/train val: ./images/val nc: 4 names: [inclusion, scratch, patch, pitted]nc是類別數(shù)names順序必須和 txt 里的類別索引嚴格對應索引 0 對應names第一個。這里最容易翻車xml 轉 txt 時如果類別順序和data.yaml不一致訓練 loss 會正常下降但檢測結果全錯位屬于典型的「訓練看著沒問題、用起來全廢」。2.3 用 TensorBoard 讀 PR 曲線和 loss 曲線資源里帶了events.out.tfevents文件說明訓練過程有記錄??辞€不是為了好看是為了判斷這份權重能不能直接用。啟動 TensorBoardtensorboard --logdir ./runs/train --port 6006瀏覽器打開對應端口重點看三樣metrics/mAP_0.5是否收斂到合理區(qū)間、train/box_loss和val/box_loss是否背離、PR 曲線里每個類別的 AP 是否均衡。如果某個缺陷類別 AP 明顯偏低說明這類樣本少或者標注質量差直接拿來檢測會漏。鋼材缺陷里斑塊和劃痕的 AP 通常差異較大看曲線時要有心理預期。提示TensorBoard 日志和權重必須來自同一次訓練混用不同 run 的日志會得出錯誤結論。3. 跑通推理與訓練從單張圖片到自定義數(shù)據(jù)集資源能直接用但「直接用」和「用對」是兩回事。這一章講兩件事怎么用現(xiàn)成權重做推理驗證以及怎么在它的基礎上換數(shù)據(jù)集繼續(xù)訓練。鋼材缺陷檢測的落地多數(shù)時候不是從零訓而是拿這份權重做微調。3.1 用訓練好的權重做單張與批量推理YOLOv7 官方倉庫的detect.py是推理入口。假設權重是best.pt圖片放在inference/imagespython detect.py \ --weights best.pt \ --source inference/images \ --img-size 640 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --device 0參數(shù)逐個說清楚--img-size 640是推理分辨率訓練時用的多少這里就填多少改大了精度可能略升但速度掉--conf-thres 0.25是置信度閾值鋼材缺陷里小目標多閾值設太高會漏檢設太低誤檢多0.25 是個常用起點--iou-thres 0.45控制 NMS 合并重疊缺陷多的時候可以適當調高--device 0指定第一塊 GPU沒有 GPU 就寫cpu但速度會慢很多。推理結果默認存到runs/detect/exp每張圖會畫出框和類別。驗證權重是否可用我一般挑幾張有代表性的缺陷圖看框有沒有框偏、類別有沒有認錯。如果框位置對但類別全錯回到 2.2 檢查類別順序如果框都框不住檢查--img-size是否和訓練一致。3.2 在現(xiàn)有權重上做遷移訓練換產線、換缺陷類型時最省事的做法是拿這份權重當預訓練凍結一部分層再訓。YOLOv7 訓練命令python train.py \ --weights best.pt \ --cfg cfg/training/yolov7.yaml \ --data data/steel.yaml \ --epochs 100 \ --batch-size 16 \ --img-size 640 \ --hyp data/hyp.scratch.p5.yaml \ --device 0--weights best.pt就是加載現(xiàn)成權重做初始化比從頭訓收斂快很多--cfg指定模型結構要和權重匹配YOLOv7 和 YOLOv7-e6 的結構文件不同用錯會報維度不匹配--hyp是超參文件鋼材缺陷樣本通常不多可以適當調低學習率、增強 mosaic 的概率。--batch-size受顯存限制16 是 640 分辨率下的常見值顯存不夠就往下調調到 8 甚至 4 也能訓只是 batch norm 效果會差一些。訓練過程中重點盯val/box_loss如果它先降后升說明過擬合早停或者加數(shù)據(jù)增強。鋼材缺陷數(shù)據(jù)集往往類別不均衡某個缺陷只有幾十張圖這時候要么補樣本要么在hyp里調類別權重。3.3 導出 ONNX 與 TensorRT 做部署準備資源里帶了YOLOv7-Dynamic-Batch-ONNXRUNTIME.ipynb和YOLOv7-Dynamic-Batch-TENSORRT.ipynb說明作者考慮過部署。工業(yè)產線對速度敏感PyTorch 直接推理往往不夠導出 ONNX 再轉 TensorRT 是常見路徑。導出 ONNXpython export.py \ --weights best.pt \ --grid \ --img-size 640 640 \ --batch-size 1 \ --dynamic--grid是 YOLOv7 導出 ONNX 的必要參數(shù)漏了會報錯--dynamic開啟動態(tài) batch方便后面按產線吞吐調 batch--img-size要和訓練一致。導出后用onnxruntime驗證一遍輸出維度確認沒有算子不支持。TensorRT 那步在 notebook 里做核心是設置合適的 workspace 和精度模式FP16 通常能提速且精度損失可接受INT8 需要校準集鋼材缺陷場景要謹慎量化誤差可能讓小缺陷直接消失。4. 避坑與排查鋼材缺陷檢測里最容易翻車的幾件事這一章是我自己踩過和見別人踩過的坑按「現(xiàn)象 → 原因 → 解決」寫鋼材缺陷檢測場景尤其明顯?,F(xiàn)象推理結果框位置正確但類別全亂。原因xml 轉 txt 時類別索引和data.yaml的names順序不一致或者多個標注人員用了不同的類別拼寫。解決寫腳本統(tǒng)一校驗把所有 txt 里的類別索引去重和names逐一對齊拼寫不一致的先歸一化再轉?,F(xiàn)象訓練 loss 正常下降但 mAP 一直很低。原因標簽歸一化坐標算錯常見的是用絕對坐標除以了錯誤的寬高或者 xml 里 xmin、xmax 順序顛倒。解決隨機抽幾張圖用腳本把 txt 框畫回原圖肉眼確認框和缺陷重合這一步比看 loss 有用得多。現(xiàn)象小缺陷漏檢嚴重。原因--img-size設得比訓練小或者--conf-thres設太高。鋼材里麻點、細小劃痕本身就占幾十個像素縮圖后信息丟失。解決推理分辨率不低于訓練分辨率conf 閾值從 0.25 往下試到 0.1同時看 PR 曲線里該類別的召回?,F(xiàn)象換機器后加載權重報 CUDA 錯誤。原因權重保存時綁定了特定 GPU 環(huán)境或者 torch 版本不匹配。解決torch.load加map_locationtorch 版本盡量和訓練時一致跨版本加載失敗就重新導出 ONNX 再推理。現(xiàn)象TensorBoard 打不開或曲線是空的。原因--logdir指到了父目錄但里面多個 run 混在一起或者 events 文件損壞。解決--logdir精確指到單次訓練的 run 目錄確認 events 文件大小不為 0必要時重新訓練一小輪生成新日志。注意鋼材缺陷數(shù)據(jù)集如果來自不同產線光照和背景差異大直接混訓會讓模型兩頭不討好建議先分域驗證再合并。5. 進階技巧用驗證集反推權重是否值得二次訓練最后一章講一個我常用的判斷方法拿到一份現(xiàn)成權重和數(shù)據(jù)集先別急著訓用驗證集跑一遍看每個類別的 AP 和混淆矩陣再決定是微調還是重訓。這一步能省掉大量無效訓練時間。具體做法是拿val集跑test.pypython test.py \ --weights best.pt \ --data data/steel.yaml \ --img-size 640 \ --batch-size 16 \ --task val \ --device 0跑完會輸出每個類別的 P、R、mAP0.5、mAP0.5:0.95。我的判斷習慣是如果多數(shù)類別 mAP0.5 已經過 0.8只有一兩個類別低那就在現(xiàn)有權重上補這類樣本微調epoch 不用多30 到 50 輪足夠如果整體都低說明這份權重和你的數(shù)據(jù)域差太遠不如拿它當預訓練從頭訓或者干脆換更貼近的權重。再進一步可以看混淆矩陣判斷是類別之間互相誤判還是背景被誤檢成缺陷。鋼材場景里斑塊和夾雜容易混如果混淆矩陣顯示這兩類互相串微調時就要針對性加這兩類的難例樣本而不是盲目加數(shù)據(jù)量。還有個細節(jié)驗證時--img-size和--batch-size要和訓練保持一致否則 mAP 會虛高或虛低得不出正確結論。我一般會把驗證結果和 TensorBoard 里的 PR 曲線對照著看兩邊一致才認為這份權重可信。從那以后我每次拿到別人訓好的權重都強制先跑一遍驗證集、畫一遍框、對一遍類別順序再決定要不要用。這套流程幫我避開了不少「看著能用、上線就廢」的坑。希望幫到你。本文還有配套的精品資源點擊獲取