:訓練配置、評估指標與避坑指南)
簡介基于YOLOv5算法實現(xiàn)的絕緣子及絕緣子缺陷識別檢測系統(tǒng)面向電力巡檢、計算機視覺學習者與深度學習開發(fā)者解決輸電線路中絕緣子目標檢測與缺陷定位的實際問題。資源包含完整Python源碼、訓練好的模型文件、多種評估指標曲線及詳細使用說明迭代200輪后模型擬合較好可識別“絕緣子”與“絕緣子缺陷”兩類目標。包體共78個文件涵蓋py源碼與pyc編譯文件、yaml配置、pt權重、jpg/png示例圖像、txt說明、sh腳本及dockerfile等壓縮包約41.2MB結構清晰便于直接部署和二次訓練。目前已有702人學習下載。資源覆蓋從數(shù)據(jù)準備、模型訓練到評估推理的完整流程訓練曲線、召回率、精確率與mAP等指標齊全適合用于畢業(yè)設計、課程項目或工程實踐參考能夠幫助使用者快速搭建檢測環(huán)境并理解YOLOv5在電力場景下的應用細節(jié)。1. 這套基于 YOLOv5 的絕緣子缺陷識別資源能幫你省掉三周調(diào)參時間我剛拆完這套基于 YOLOv5 實現(xiàn)的絕緣子及絕緣子缺陷檢測 Python 源碼包先說結論對于做計算機視覺大作業(yè)、電網(wǎng)巡檢項目預研或深度學習入門的從業(yè)者這是一套少見的完整閉環(huán)資源不是那種只有 train.py 的殘缺代碼。它的核心價值在于直接從絕緣子檢測的預訓練模型起步迭代 200 次就能收斂同時附帶 precision-recall 曲線、mAP、召回率等全套評估指標曲線能直觀看到模型擬合過程。yolov5s.pt 權重、模型文件、推理腳本和評估指標曲線都在壓縮包里解壓后按照使用說明.txt 的操作步驟就能把訓練跑起來特別適合剛接觸深度學習和 YOLOv5 的人群。本文我會把訓練配置、數(shù)據(jù)集格式、評估指標讀法、踩坑記錄全部拆一遍照著做基本能把這套絕緣子缺陷檢測系統(tǒng)復現(xiàn)出來并快速出結果。2. 拆解代碼包結構官方的 YOLOv5 骨架針對兩類目標微調(diào)過的權重2.1 壓縮包內(nèi)部目錄每個文件夾里裝了什么先把壓縮包解開看下代碼分布。資源包的核心目錄結構和常見 YOLOv5 項目一致只是針對絕緣子場景做了定制訓練。按功能可以分成三組訓練與推理腳本、模型配置、訓練產(chǎn)出物。工程根目錄下有train.py、detect.py、test.py、sotabench.py四個主要腳本。train.py負責訓練主流程detect.py負責對圖片或視頻做推理test.py用于在測試集上輸出 mAP 等指標sotabench.py是給 SOTA Bench 平臺提交結果用的輔助腳本。onnx.py是 YOLOv5 早期版本自帶的 ONNX 導出工具requirements.txt是 Python 依賴清單。真正有參考價值的訓練產(chǎn)物全在runs/exp_insulator_defect里面這個目錄是 YOLOv5 訓練過程中自動生成的實驗記錄文件夾。weights目錄里存放的是訓練好的模型權重包含yolov5s.pt和訓練完成后的最佳權重在 YOLOv5 中末尾帶_best后綴或位于runs/exp_insulator_defect/weights/best.pt的模型用于最終推理。utils目錄是通用工具腳本models目錄定義網(wǎng)絡結構。data目錄存放數(shù)據(jù)集配置文件這個包中因為數(shù)據(jù)集體積問題沒有放進壓縮包需要自己準備好數(shù)據(jù)路徑。inference目錄存測試圖片。以下是代碼包的核心文件定位標注了每個文件在本次絕緣子缺陷檢測場景中的用途路徑類型功能yolov5_code/train.py訓練入口用--data insulator.yaml指定絕緣子數(shù)據(jù)集啟動訓練yolov5_code/models/yolov5s.yaml網(wǎng)絡結構定義 yolov5s 的 depth_multiple 和 width_multipleyolov5_code/runs/exp_insulator_defect/訓練記錄包含opt.yaml訓練超參數(shù)、results.txt指標曲線數(shù)據(jù)yolov5_code/runs/exp_insulator_defect/weights/best.pt訓練產(chǎn)物200 輪訓練收斂后的最佳權重yolov5_code/runs/exp_insulator_defect/labels.png數(shù)據(jù)可視化標注框中心點與尺寸分布用于檢查標注質量yolov5_code/detect.py推理腳本加載模型后對測試圖進行檢測畫框2.2 網(wǎng)路骨架為什么選 yolov5s 而不是 yolov5m 或 yolov5l這套資源選擇yolov5s.pt作為初始權重我認為考慮目標尺寸和算力兩方面的性價比。絕緣子在航拍巡檢圖中屬于中小目標但單個目標的尺寸通常幾十到上百像素不等而且絕緣子串具有長條狀特征。yolov5s 的 Base C3 結構和 PANet 特征融合對這類目標的檢測是有優(yōu)勢的??茨P团渲梦募牟町惾绻阋陌姹究梢哉{(diào)整depth_multiple和width_multiple兩個參數(shù)。在models/yolov5s.yaml中默認是depth_multiple: 0.33、width_multiple: 0.50。如果換用 yolov5m 則改成0.67和0.75yolov5l 則更寬。這個資源在 200 輪迭代內(nèi)能擬合原因在于初始權重yolov5s.pt是在 COCO 數(shù)據(jù)集上預訓練的對通用物體已有特征提取能力微調(diào)時只需要調(diào)整后面幾層的分類頭。下面我從train.py中抽了幾行實際訓練相關的關鍵調(diào)用方便你看懂訓練參數(shù)入口是怎么組織起來的# train.py 核心邏輯YOLOv5官方結構 parser.add_argument(--weights, typestr, defaultweights/yolov5s.pt, helpinitial weights path) parser.add_argument(--data, typestr, defaultdata/insulator.yaml, helpdataset.yaml path) parser.add_argument(--epochs, typeint, default200) parser.add_argument(--batch-size, typeint, default16) parser.add_argument(--img-size, nargs, typeint, default[640, 640], helptrain,val sizes)--weights指定預訓練權重--data指定數(shù)據(jù)配置文件--epochs 200表示訓練 200 輪--batch-size 16在消費級顯卡上比較合適--img-size 640表示輸入圖片縮放尺寸。這套資源在runs/exp_insulator_defect/opt.yaml中可以回看當時的完整訓練參數(shù)這個文件由訓練過程自動生成配合使用說明.txt 一起看就能完全還原訓練環(huán)境。2.3 數(shù)據(jù)標注為什么圖里必須既有絕緣子又有缺陷需要強調(diào)一個決定訓練成敗的事識別 2 類目標分別對應標簽中的 class 0 和 class 1。標簽文件是 YOLO 格式的 txt每行對應一個目標框格式為class x_center y_center width height坐標值是歸一化到 0~1 的浮點數(shù)。舉個例子一張 1280×720 的巡檢圖片如果絕緣子缺陷框左上角是 (100, 200)、右下角是 (300, 400)對應的標簽行寫法如下1 0.15625 0.41667 0.15625 0.27778這個結果用框寬除以圖片總寬 1280 得到 200 / 1280 0.15625高度 200 / 720 ≈ 0.27778。類別1表示絕緣子缺陷0代表絕緣子標簽文件與圖片文件同名存放后綴不同放在同一級 titles 目錄下。資源中的圖片以訓練圖train_batch0.jpg、train_batch1.jpg、train_batch2.jpg等形式記錄在 runs 目錄里可以直觀看到數(shù)據(jù)增強后的標注框效果。3. 把訓練跑通train.py 參數(shù)逐項設置200 輪迭代的收斂判斷方法3.1 數(shù)據(jù)配置文件把兩個類別告訴 YOLOv5YOLOv5 要求你為數(shù)據(jù)集單獨寫一個 yaml 配置文件。資源包里的數(shù)據(jù)目錄因為體積原因沒有附帶原始訓練圖需要把自己的數(shù)據(jù)集按結構放好。下面是data/insulator.yaml的標準寫法直接照抄即可。# 絕緣子缺陷檢測數(shù)據(jù)集配置文件 train: ./datasets/insulator/images/train # 訓練圖片路徑 val: ./datasets/insulator/images/val # 驗證圖片路徑 nc: 2 # 類別數(shù)量絕緣子 絕緣子缺陷 names: [insulator, insulator_defect] # 類別名列表順序與標簽txt中的類ID對應nc必須寫成 2否則訓練時分類層輸出維度與標簽文件不匹配。names數(shù)組的索引位置就是標簽文件里的 class 數(shù)字寫成insulator_defect而非defect的原因是讓你在分析結果時能跟results.txt中的類別指標對應上。訓練時把當前目錄切到y(tǒng)olov5_code執(zhí)行以下命令python train.py --data data/insulator.yaml --weights weights/yolov5s.pt --epochs 200 --batch-size 16 --img-size 640 --device 0 --project runs --name exp_insulator_defect--device 0表示用第一塊 GPU如果用的是 CPU 訓練則改成--device cpu并準備做好等一夜的心理準備。--project runs指定輸出目錄--name exp_insulator_defect會將訓練產(chǎn)出放至runs/exp_insulator_defect/壓縮包里的推理結果圖和權重就來自這次實驗。如果你的顯存只有 6Gbatch-size 降到 8否則會遇到 CUDA out of memory 直接中斷。3.2 訓練曲線里看什么如何判斷 200 輪是否真的收斂訓練完成后重點看runs/exp_insulator_defect中results.txt的內(nèi)容。很多人打開這個文件只看最后的 mAP其實里面有十列數(shù)據(jù)每列依次代表 epoch、訓練 loss、驗證 loss、精確率、召回率、mAP.5、mAP.5:.95、val box loss 等。在前幾張 loss 圖上你會直觀看到損失值從一兩百的峰值快速下降大約在 80 輪以后曲線變得平緩這說明模型已經(jīng)進入收斂區(qū)間。正常情況下 200 輪訓練后損失曲線尾部呈接近水平線的小幅波動不必再加大迭代輪次。以下是從results.txt中往年的兩行示例用于說明指標列的順序和讀法Epoch GPU_mem box_loss obj_loss cls_loss Instances Size 119 11.6G 0.042 0.048 0.012 53 640 155 11.6G 0.036 0.041 0.010 14 640GPU_mem是訓練中顯存占用量box_loss是邊框回歸損失obj_loss是目標置信度損失cls_loss是分類損失。復現(xiàn)時如果 200 輪后box_loss還在 0.03 以上說明學習率規(guī)劃或數(shù)據(jù)增強策略有問題常見是數(shù)據(jù)量太少。如果cls_loss接近 0.01 以下說明分類任務基本解決了剩下的誤差主要來自定位偏移。3.3 超參數(shù)與數(shù)據(jù)增強hyp.yaml 中直接影響絕緣子檢測的項資源里每輪訓練會記錄到runs/exp_insulator_defect/hyp.yaml。這個文件在 YOLOv5 訓練中控制數(shù)據(jù)增強強度。對于絕緣子這種長條目標其中三個參數(shù)影響最大我也實際驗證過相應作用參數(shù)默認值對絕緣子檢測的實際影響hsv_h0.015色調(diào)偏移絕緣子多為褐紅色偏移太大會讓顏色失真導致誤檢fliplr0.5水平翻轉概率航拍絕緣子左右翻轉不影響語義可以保持degrees0.0旋轉角度絕緣子串在圖像中可能是任意朝向設置 10~15 度可提升姿態(tài)泛化性# hyp.yaml 局部示例以YOLOv5官方推薦值為基準 hsv_h: 0.015 # image HSV-Hue augmentation (fraction) hsv_s: 0.7 # image HSV-Saturation augmentation (fraction) hsv_v: 0.4 # image HSV-Value augmentation (fraction) degrees: 0.0 # image rotation (/- deg) translate: 0.1 # image translation (/- fraction) scale: 0.5 # image scale (/- gain)degrees原本是 0表示不旋轉。實際拍回來的巡檢照片里絕緣子不一定總是正立狀態(tài)拍攝航線角度不同會導致目標旋轉把degrees調(diào)到 10 可以提升模型對旋轉姿態(tài)的魯棒性。scale是尺度擾動默認 0.5 對絕緣子這種多尺度目標比較合適不要超過 0.8否則小目標容易在縮放中丟失。這里提示一句改動超參數(shù)后要對同一個驗證集重新評估不要只看訓練集 loss這是調(diào)參階段必須有的意識。4. 評估指標曲線從 precision-recall_curve.png 里讀出模型真實能力4.1 曲線圖有哪些不同圖片對應什么評估維度資源包runs/exp_insulator_defect里有precision-recall_curve.png、train_batch0.jpg、test_batch0_pred.jpg等可視化產(chǎn)出。precision-recall_curve.png是核心的評估圖橫軸是召回率 Recall預測到的真實目標比例縱軸是精確率 Precision預測結果中正確的比例。曲線越靠近右上角越好test_batch0_pred.jpg是模型在測試集上的預測框可視化train_batch0.jpg是訓練集的標注和增強效果圖。逐列對照看這幾個文件能形成完整判斷。labels.png展示了標注框的中心點坐標分布和寬高分布如果中心點集中在圖像中心周圍且寬高分布比較散說明標注數(shù)據(jù)分布合理如果全部擠在一個角落說明標注工具出問題了這個圖值得重視。train_batch1.jpg、train_batch2.jpg是多張訓練圖拼接的增強結果主要用來檢查數(shù)據(jù)增強策略是否破壞了目標語義例如絕緣子的結構是否因馬賽克增強而變得不可辨識。4.2 mAP 指標兩種計算口徑0.5 和 0.5:0.95 的區(qū)別YOLOv5 的評估結果中會同時輸出mAP.5和mAP.5:.95兩個指標。mAP.5是 IoU 閾值取 0.5 時的平均精度均值這個指標對定位要求寬松主要用來快速判斷模型是否學會了目標類別。mAP.5:.95則是從 0.5 到 0.95 每隔 0.05 取一次 IoU 閾值做平均對目標定位精度很敏感。絕緣子缺陷檢測中缺陷類別因為標注框小、錯位容忍度低兩個指標差距會明顯如果mAP.5:.95比mAP.5低 15 個百分點以上說明定位精度不足常見原因是標注框邊緣貼得不夠緊。Class Images Instances P R mAP.5 mAP.5:.95 all 200 340 0.912 0.871 0.931 0.812 insulator 200 210 0.945 0.918 0.958 0.834 insulator_defect 200 130 0.871 0.802 0.897 0.771上表是一組模擬的自測結果列含義分別是類別名、驗證圖片數(shù)、目標實例數(shù)、精確率、召回率、mAP0.5、mAP0.5:0.95。insulator_defect行的各項指標普遍低于insulator這說明缺陷樣本數(shù)量不如正常絕緣子多模型對缺陷形態(tài)的擬合不如完整絕緣子充分。要補齊短板需要專門擴充缺陷樣本或調(diào)整類別權重通常做法是運行test.py --weights best.pt --data data/insulator.yaml重新驗證。4.3 從 test_batch0_gt.jpg 和 test_batch0_pred.jpg 對比人工檢查漏檢量化指標曲線之外人工看預測圖和真值圖的差異是必要的環(huán)節(jié)。test_batch0_gt.jpg展示測試集原始標注Ground Truthtest_batch0_pred.jpg展示模型預測結果。兩圖并列可以快速發(fā)現(xiàn)模型漏檢或誤檢的系統(tǒng)性規(guī)律。實際操作中我建議把這兩張圖放大對比注意三類細節(jié)一是缺陷框的位置是否完全覆蓋缺陷區(qū)域還是只覆蓋了一半二是相鄰絕緣子片之間的缺陷是否被誤檢成一個更大的框三是背景中的塔材或電線是否出現(xiàn)誤檢。這些規(guī)律類錯誤在指標曲線上不會直接體現(xiàn)但對后續(xù)實拍場景決策很重要。迭代 200 次的模型已基本擬合如果仍然存在系統(tǒng)性漏檢優(yōu)先懷疑訓練集中缺陷樣本的多樣性不足而不是盲目增加迭代輪數(shù)。5. 避坑絕緣子缺陷檢測最容易踩中的五個坑5.1 類別 ID 寫反導致召回率直接掉到 0.3 以下現(xiàn)象訓練時 loss 正常下降但results.txt里某個類別的召回率始終在 0.3 左右徘徊另一個類別則異常偏高。原因標注工具導出的標簽文件中絕緣子和缺陷的類別 ID 與insulator.yaml里names列表順序不一致比如原標注中 0 是缺陷、1 是絕緣子而配置里 0 是絕緣子、1 是缺陷類別語義整體錯位。解決檢查任意標簽文件中的數(shù)字與對應圖片框的語義把 yaml 中names順序或標簽文件全部修正再重新訓練。這是我最早復現(xiàn)類似資源時踩過的坑僅靠曲線圖很難察覺必須逐類看 P、R 值。5.2 顯存溢出batch-size 設太高直接 OOM現(xiàn)象訓練跑到第 20 輪時進程退出報錯為 CUDA out of memory。原因--img-size 640加上默認--batch-size 16在 6G 顯存顯卡上超出了可用顯存模型參數(shù)和特征圖占用太大。解決降低--batch-size到 8 或 4同時可開啟梯度累積例如保持 batch-size 8 但訓練兩個批次后再更新一次梯度等效于 batch-size 16 的優(yōu)化效果。命令參考如下python train.py --data data/insulator.yaml --weights weights/yolov5s.pt --epochs 200 --batch-size 8 --img-size 640 --device 0 --nbs 64--nbs 64是 YOLOv5 中的名義批次大小權重更新頻率由它和實際 batch-size 自動計算得出。這個參數(shù)在顯存不足時尤其常用既保持原有優(yōu)化動態(tài)又不讓顯存滿載。5.3 訓練集缺陷樣本太少mAP 虛高但實戰(zhàn)翻車現(xiàn)象訓練集上 mAP.5 達到 0.95 以上但換成另一批天氣和角度不同的實拍圖模型表現(xiàn)明顯變差。原因訓練集中絕緣子缺陷樣本多為同一時間段拍攝特征高度趨同模型學到的是場景背景特征而非缺陷本身的紋理特征指標看起來不錯實際泛化性差。解決將缺陷樣本按拍攝時間、天氣、角度分段至少保證三個不同場景段的圖片都有缺陷樣本重新驗證 mAP 尤其是兩個類別的 mAP 差值。絕緣子缺陷檢測的瓶頸經(jīng)常在樣本多樣性上。5.4 驗證集與訓練集圖片泄露結果曲線無法評估真實性能現(xiàn)象test_batch0_pred.jpg可視化看起來精度極高但提交到實際場景后效果下滑。原因切分數(shù)據(jù)時直接從同一段視頻連續(xù)幀中抽幀前后幀相似度太高導致驗證集與訓練集存在大量重復或近重復圖片。解決按視頻片段劃分同一鏡頭下的幀全部進入同一個子集不要隨機劃分單幀。后續(xù)所有資源包實驗對比都建立在這個劃分之上。5.5 detect 階段置信度閾值默認 0.25太低會把背景誤檢為缺陷現(xiàn)象用detect.py跑一批巡檢視頻時絕緣子正常的地方頻繁出現(xiàn)誤報缺陷。原因模型對絕緣子缺陷的置信度輸出本來就偏低--conf-thres 0.25的默認閾值把這些低置信度噪聲全部放了出來。解決推理時提高置信度到 0.4如果漏檢增多再回調(diào)到 0.35同時用--iou-thres 0.45控制重復框抑制。巡檢場景安全優(yōu)先時寧可漏檢不要誤報否則后臺告警會被無效事件淹沒。bash python detect.py --weights runs/exp_insulator_defect/weights/best.pt --source ./inference --conf-thres 0.4 --iou-thres 0.45這條命令在后續(xù)大量實驗里成了固定開局。--source 可以接圖片文件、視頻文件或目錄--conf-thres 是置信度過濾閾值只保留高于 0.4 的框--iou-thres 是 NMS 的交并比閾值用于剔除同一目標上重復的檢測框。 ## 6. 推理與導出進階把 best.pt 權重用到實際巡檢場景中的兩種方式 ### 6.1 用 detect.py 跑批量目錄并輸出帶標簽的圖片 訓練完成后真正要落地的是 detect.py 的推理能力。下面命令用于對 inference 目錄下全部圖片執(zhí)行檢測并保存結果到 runs/detect/expN 文件夾。 bash python detect.py --weights runs/exp_insulator_defect/weights/best.pt --source ./inference --img-size 640 --save-txt --save-conf --project runs/detect --name exp_insulator_defect--save-txt會把每個檢測框坐標寫入同名前綴的 txt 文件格式與訓練標簽一致--save-conf在 txt 中追加置信度分數(shù)方便后續(xù)做統(tǒng)計報表。--project和--name控制輸出位置避免多個實驗的結果互相覆蓋。實際應用時如果巡檢圖片數(shù)量很大建議把--source指向視頻文件檢測速度在普通 GPU 上可以做到每幀幾十毫秒。6.2 用 ONNX 導出繞開 PyTorch 環(huán)境onnx.py 的用法現(xiàn)場部署常用做法是把模型導出成 ONNX 格式用 ONNX Runtime 或 TensorRT 加載。打開onnx.py查看核心參數(shù)典型調(diào)用命令如下。python onnx.py --weights runs/exp_insulator_defect/weights/best.pt --img-size 640 640導出后得到best.onnx文件。ONNX 格式不依賴 PyTorch 環(huán)境可以用onnxruntime庫加載做 CPU 推理適合部署到只有 CPU 的工控機。實際部署中遇到過 ONNX 輸出解析問題舊版 YOLOv5 的 ONNX 輸出是一個三維張量需要在后處理中自己解析框坐標、置信度和類別新版輸出則拆成三個獨立輸出。導出的模型先用 Python 腳本對同一張圖比對 ONNX 與 PyTorch 的檢測結果再投入現(xiàn)場使用避免后處理解析出錯導致框偏移。6.3 一個值得養(yǎng)成的習慣每次復現(xiàn)都先跑一次官方預訓練模型最后分享一個我現(xiàn)在做檢測項目時的固定步驟。拿到任何 YOLOv5 源碼包我先不急著用自己的數(shù)據(jù)訓練而是先用包內(nèi)置的yolov5s.pt權重跑一遍官方自帶的測試樣例確認環(huán)境、路徑、依賴全部正常。然后才把數(shù)據(jù)換成絕緣子數(shù)據(jù)集先訓練 5 輪確認 loss 下降方向正確再正式跑完整 200 輪同時保存results.txt和曲線圖用于歸檔對比。這個習慣幫我避免了不少盲目調(diào)參的彎路希望你也能用上。希望幫到你。本文還有配套的精品資源點擊獲取