巡檢實(shí)戰(zhàn):YOLOv11電力缺陷檢測(cè)從訓(xùn)練到Jetson部署全流程)
簡介這份PDF文檔面向電力巡檢、無人機(jī)視覺與目標(biāo)檢測(cè)方向的學(xué)習(xí)者與工程人員圍繞YOLOv11在電力設(shè)備缺陷檢測(cè)中的落地應(yīng)用展開幫助讀者理解如何用單階段檢測(cè)算法替代低效的人工巡檢。全文共28頁支持目錄章節(jié)跳轉(zhuǎn)與閱讀器左側(cè)大綱快速定位內(nèi)容完整、圖表清晰。文檔從電力設(shè)備缺陷檢測(cè)現(xiàn)狀與挑戰(zhàn)切入依次講解YOLOv11網(wǎng)絡(luò)架構(gòu)、訓(xùn)練方法、無人機(jī)與算法的結(jié)合架構(gòu)、數(shù)據(jù)采集與預(yù)處理、模型訓(xùn)練評(píng)估部署并給出實(shí)驗(yàn)結(jié)果對(duì)比與真實(shí)案例研究最后展望多模態(tài)融合與智能電網(wǎng)等趨勢(shì)。資源包為1個(gè)PDF文件大小約2.01MB已有98人學(xué)習(xí)。讀者可借此系統(tǒng)掌握從數(shù)據(jù)集準(zhǔn)備、模型訓(xùn)練到部署推理的完整流程理解精度、召回率、mAP等評(píng)估指標(biāo)的實(shí)際含義并獲得可遷移到安防、工業(yè)檢測(cè)等場景的排錯(cuò)與優(yōu)化思路。1. 無人機(jī)巡檢遇上 YOLOv11電力設(shè)備缺陷檢測(cè)到底能落地到什么程度電力巡檢這活兒干過的人都知道苦。一座 220kV 變電站絕緣子、避雷器、金具、導(dǎo)線接頭加起來上千個(gè)點(diǎn)位老師傅扛著望遠(yuǎn)鏡逐個(gè)看一天下來眼睛發(fā)花漏檢率還下不來。無人機(jī)掛載可見光相機(jī)繞飛一圈半小時(shí)拍回幾百張圖問題從拍不到變成了看不完。YOLOv11 在這里的價(jià)值不是把 mAP 從 52 刷到 54 的學(xué)術(shù)游戲而是讓邊緣盒子在 Jetson 上實(shí)時(shí)吐出缺陷框把人工從逐張翻圖變成只復(fù)核告警。這套方案適合兩類人一類是手里已經(jīng)攢了幾千張巡檢圖、想跑通檢測(cè)閉環(huán)的電力 AI 工程師另一類是剛接觸目標(biāo)檢測(cè)、想拿電力場景練手的學(xué)生或轉(zhuǎn)行者。它不要求你有 GPU 集群一臺(tái)帶 RTX 3060 的機(jī)器加一塊 Jetson Orin Nano 就能把訓(xùn)練和部署全走通。但我要先把丑話說前面電力缺陷檢測(cè)的難點(diǎn)從來不在模型結(jié)構(gòu)而在數(shù)據(jù)的長尾分布和小目標(biāo)的像素占比。YOLOv11 的 C3k2 模塊和 SPFF 結(jié)構(gòu)確實(shí)比 v8 更省參數(shù)可如果你的絕緣子破損樣本只有幾十張換什么 backbone 都是玄學(xué)。下面按數(shù)據(jù)怎么整 → 模型怎么改 → 訓(xùn)練怎么調(diào) → 部署怎么快 → 坑怎么避的順序拆開講每一步都給能直接抄的命令和參數(shù)。2. 電力缺陷數(shù)據(jù)集的構(gòu)建與 YOLO 格式轉(zhuǎn)換2.1 巡檢圖像里到底有哪些缺陷類別值得標(biāo)先別急著打開 labelImg。電力設(shè)備缺陷按電壓等級(jí)和部件類型分常見且視覺上可辨的大致是這幾類絕緣子自爆玻璃絕緣子傘裙碎裂、絕緣子污閃痕跡、金具銹蝕、導(dǎo)線斷股、防震錘滑移、均壓環(huán)變形、鳥巢異物。我一般建議第一版只做 4 到 6 類類別太多會(huì)讓本就不均衡的樣本雪上加霜。這里有個(gè)血淚經(jīng)驗(yàn)污閃和正常積灰在可見光下極難區(qū)分標(biāo)注一致性很差三個(gè)人標(biāo)同一張圖能給出三種結(jié)果。如果你的數(shù)據(jù)來源是常規(guī)可見光巡檢建議先把污閃砍掉等有了紅外數(shù)據(jù)再補(bǔ)。同理銹蝕要定義清楚是表面浮銹還是結(jié)構(gòu)性銹穿否則模型學(xué)到的邊界是模糊的。類別確定后標(biāo)注規(guī)范要寫死框必須緊貼缺陷區(qū)域外沿絕緣子自爆只框破損的那一片傘裙而不是整串絕緣子。整串框會(huì)讓缺陷在框內(nèi)占比不到 5%模型根本學(xué)不到。2.2 從 VOC/COCO 轉(zhuǎn)成 YOLO txt 的腳本與四個(gè)邊界坑現(xiàn)場拿到的標(biāo)注格式五花八門XMLVOC和 JSONCOCO最常見。YOLO 要的是每張圖一個(gè) txt每行class_id cx cy w h全部歸一化到 0-1。下面這個(gè)腳本處理 VOC 轉(zhuǎn) YOLO我用了好幾年import xml.etree.ElementTree as ET import os from pathlib import Path # 類別映射順序必須和訓(xùn)練時(shí)的 data.yaml 完全一致 CLASS_MAP {insulator_broken: 0, rust: 1, birdnest: 2, damper_slip: 3} def voc_to_yolo(xml_path, img_w, img_h, out_dir): tree ET.parse(xml_path) root tree.getroot() # 坑1size 字段有時(shí)缺失或?qū)戝e(cuò)優(yōu)先用實(shí)際讀圖的尺寸 size root.find(size) if size is not None: w int(size.find(width).text) h int(size.find(height).text) else: w, h img_w, img_h lines [] for obj in root.iter(object): name obj.find(name).text.strip() if name not in CLASS_MAP: continue # 坑2未在映射表里的類別直接跳過別硬塞成背景 cls_id CLASS_MAP[name] bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 坑3坐標(biāo)越界要裁剪標(biāo)注員手抖是常態(tài) xmin, xmax max(0, xmin), min(w, xmax) ymin, ymax max(0, ymin), min(h, ymax) if xmax xmin or ymax ymin: continue # 坑4寬高為0的廢框必須丟否則訓(xùn)練直接 NaN cx (xmin xmax) / 2.0 / w cy (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) out_path Path(out_dir) / (Path(xml_path).stem .txt) out_path.write_text(\n.join(lines), encodingutf-8)邏輯說明腳本先讀 XML 的 size 字段拿圖像尺寸但現(xiàn)場 XML 經(jīng)常缺這個(gè)字段所以留了img_w, img_h兜底實(shí)際用時(shí)用 OpenCV 讀圖尺寸傳進(jìn)來更穩(wěn)。四個(gè)坑分別是尺寸缺失、類別越界、坐標(biāo)越界、廢框每一個(gè)都會(huì)讓訓(xùn)練在幾十輪后突然 loss 變 NaN排查起來極其痛苦。參數(shù)說明CLASS_MAP的 id 從 0 開始連續(xù)必須和data.yaml的names列表索引嚴(yán)格對(duì)應(yīng)錯(cuò)一位模型就全學(xué)歪。歸一化保留 6 位小數(shù)足夠再多是浪費(fèi)。2.3 小目標(biāo)樣本的過采樣與數(shù)據(jù)劃分電力缺陷里絕緣子自爆、防震錘滑移這類目標(biāo)在原圖 4000×3000 里可能只有 60×40 像素。直接縮到 640 訓(xùn)練目標(biāo)只剩 10 像素YOLOv11 的 P3 特征圖也救不回來。常見做法是切圖把大圖按 1280×1280 滑窗切重疊 200 像素切完再縮到 640等效放大了目標(biāo)。切圖后樣本量會(huì)翻幾倍但要注意同一張?jiān)瓐D切出的子圖不能跨 train/val 劃分否則驗(yàn)證集泄漏mAP 虛高得離譜。我一般按原圖文件名分組劃分8:1:1用腳本先分原圖再切。過采樣只對(duì)稀有類別做且只在訓(xùn)練集做。簡單復(fù)制會(huì)讓模型過擬合到那幾張圖更好的做法是 mosaic 增強(qiáng)時(shí)提高稀有類樣本被選中的概率YOLOv11 的 dataloader 里可以通過自定義 sampler 實(shí)現(xiàn)或者干脆在數(shù)據(jù)集層面把稀有類樣本復(fù)制 2 到 3 倍配合強(qiáng)增強(qiáng)。3. YOLOv11 模型選型、改進(jìn)與訓(xùn)練參數(shù)配置3.1 n/s/m/l/x 五個(gè)規(guī)格在電力場景怎么選YOLOv11 官方給了 n、s、m、l、x 五檔。電力巡檢部署端通常是 Jetson Orin Nano 或 Orin NX算力 20 到 100 TOPS。我的實(shí)測(cè)經(jīng)驗(yàn)是Orin Nano 上跑 yolo11s 的 TensorRT FP16640 輸入能到 40 FPS 以上夠用yolo11m 掉到 20 FPS 左右如果無人機(jī)是實(shí)時(shí)圖傳回地面站處理20 FPS 也能接受但邊緣端直接推理就偏緊。選型原則很簡單先看部署端算力再看數(shù)據(jù)量。樣本少于 5000 張用 n 或 s大模型必然過擬合樣本過萬且缺陷形態(tài)復(fù)雜再上 m 或 l。x 我基本不推薦參數(shù)量帶來的收益在電力這種類別少、形態(tài)固定的場景里非常有限推理還慢。3.2 針對(duì)小目標(biāo)和遮擋的幾處有效改進(jìn)YOLOv11 原生結(jié)構(gòu)對(duì)小目標(biāo)已經(jīng)比 v8 友好但電力場景還能再壓榨。三個(gè)我驗(yàn)證過有正收益的改動(dòng)第一加一個(gè) P2 檢測(cè)頭。原版從 P380×80開始檢測(cè)加 P2160×160能顯著提升 10 到 20 像素目標(biāo)的召回。代價(jià)是計(jì)算量漲約 15%Orin Nano 上 FPS 掉 5 左右值不值看你的目標(biāo)尺寸分布。第二替換 Neck 里的上采樣為 CARAFE。內(nèi)容感知重組上采樣比最近鄰插值在邊緣保留上更好絕緣子傘裙這種細(xì)長結(jié)構(gòu)受益明顯。實(shí)現(xiàn)上把nn.Upsample換成 CARAFE 模塊即可參數(shù)量增加可忽略。第三引入注意力但要克制。網(wǎng)上流行的各種注意力模塊在電力數(shù)據(jù)集上我試過 CBAM、ECA、SimAM只有 SimAM 穩(wěn)定有 0.5 到 1 個(gè)點(diǎn)的提升其他要么無感要么掉點(diǎn)。別迷信改進(jìn)即漲點(diǎn)很多模塊在 COCO 上有效是因?yàn)?COCO 類別多、場景雜電力場景單一反而容易過擬合。3.3 訓(xùn)練命令、超參與早停策略環(huán)境配置用 ultralytics 官方包最省事pip install ultralytics8.3.0 yolo detect train \ modelyolo11s.pt \ data/data/power_defect/data.yaml \ epochs300 \ imgsz640 \ batch16 \ device0 \ workers8 \ optimizerSGD \ lr00.01 \ lrf0.01 \ momentum0.937 \ weight_decay0.0005 \ warmup_epochs3 \ cos_lrTrue \ close_mosaic20 \ patience50 \ project/runs/power \ nameyolo11s_v1邏輯說明close_mosaic20表示最后 20 輪關(guān)閉 mosaic 增強(qiáng)讓模型在真實(shí)分布上收斂這一步對(duì)電力小目標(biāo)很關(guān)鍵不關(guān)的話最終 mAP 會(huì)虛高但實(shí)際推理漏檢多。cos_lrTrue余弦退火比階梯下降更平滑。patience50早停電力數(shù)據(jù)集小過擬合來得快。參數(shù)說明lr00.01是 SGD 的常規(guī)起點(diǎn)如果你換 AdamW改成 0.001。batch16在 12G 顯存上跑 640 輸入剛好顯存不夠就降到 8 并開ampTrue默認(rèn)開。imgsz640是平衡速度和精度的甜點(diǎn)若小目標(biāo)多且部署端扛得住可以上 960但 FPS 會(huì)腰斬。訓(xùn)練過程中重點(diǎn)盯三個(gè)指標(biāo)metrics/mAP50-95看整體metrics/mAP50看召回趨勢(shì)val/box_loss看是否過擬合。如果 box_loss 在訓(xùn)練集持續(xù)降但驗(yàn)證集 30 輪不降直接停加數(shù)據(jù)比調(diào)參有用。4. 推理、部署與 Jetson 端加速4.1 保存推理結(jié)果與批量預(yù)測(cè)的正確姿勢(shì)巡檢場景經(jīng)常需要把檢測(cè)結(jié)果存下來做報(bào)告YOLOv11 的predict支持直接保存帶框圖和 txtfrom ultralytics import YOLO model YOLO(/runs/power/yolo11s_v1/weights/best.pt) results model.predict( source/data/inspection_imgs, imgsz640, conf0.25, iou0.45, saveTrue, save_txtTrue, save_confTrue, project/runs/infer, namebatch_01, streamTrue # 大目錄必須開否則一次性加載爆內(nèi)存 ) for r in results: boxes r.boxes # 每張圖的缺陷數(shù)和類別分布可直接落庫 print(r.path, len(boxes))邏輯說明streamTrue是處理上千張巡檢圖的關(guān)鍵不開的話 ultralytics 會(huì)把所有圖預(yù)加載進(jìn)內(nèi)存幾萬張直接 OOM。save_txtTrue輸出的 txt 每行是class cx cy w h conf注意這里是歸一化坐標(biāo)要還原像素得乘圖像寬高。參數(shù)說明conf0.25是召回和誤報(bào)的平衡點(diǎn)電力場景寧可誤報(bào)不可漏報(bào)可以降到 0.15但后處理要加規(guī)則過濾比如缺陷框面積占比過小的丟棄。iou0.45控制 NMS 重疊閾值絕緣子串上多個(gè)相鄰缺陷容易被誤合并可以適當(dāng)調(diào)高到 0.5。4.2 導(dǎo)出 ONNX 與 TensorRT 引擎Jetson 上直接跑 PyTorch 權(quán)重是浪費(fèi)算力必須轉(zhuǎn) TensorRT。先導(dǎo) ONNXyolo export model/runs/power/yolo11s_v1/weights/best.pt \ formatonnx \ imgsz640 \ opset12 \ simplifyTrue \ dynamicFalse然后在 Jetson 上用 trtexec 轉(zhuǎn)引擎/usr/src/tensorrt/bin/trtexec \ --onnxyolo11s_v1.onnx \ --saveEngineyolo11s_v1_fp16.engine \ --fp16 \ --workspace4096 \ --minShapesimages:1x3x640x640 \ --optShapesimages:1x3x640x640 \ --maxShapesimages:1x3x640x640邏輯說明dynamicFalse固定輸入尺寸能讓 TensorRT 做更激進(jìn)的優(yōu)化電力巡檢圖尺寸統(tǒng)一沒必要?jiǎng)討B(tài)。--fp16在 Orin 系列上幾乎無損速度翻倍。--workspace4096給 4G 顯存做優(yōu)化空間Orin Nano 8G 版夠用。參數(shù)說明opset 選 12 是兼容性最好的選太高某些 TensorRT 版本不認(rèn)。如果導(dǎo)出時(shí)報(bào) unsupported op多半是自定義模塊沒注冊(cè)先把改進(jìn)模塊的 forward 寫成標(biāo)準(zhǔn)算子組合。4.3 Jetson 上的推理封裝與延遲實(shí)測(cè)TensorRT 引擎跑起來后前處理letterbox和后處理NMS如果用 Python 寫往往比推理本身還慢。我的做法是前處理用 CUDA kernel 或 OpenCV CUDA 模塊后處理用 TensorRT 的 EfficientNMS 插件。純 Python 后處理在 Orin Nano 上單幀要 15ms 以上換插件后降到 3ms 以內(nèi)。實(shí)測(cè)數(shù)據(jù)供參考Orin Nano 8Gyolo11s FP16640 輸入純推理 12ms加前后處理端到端 22ms約 45 FPS。如果加 P2 檢測(cè)頭端到端漲到 30ms33 FPS。這個(gè)數(shù)字決定了你的無人機(jī)是能實(shí)時(shí)告警還是只能事后分析。5. 避坑與排查電力缺陷檢測(cè)里最容易翻車的五件事5.1 驗(yàn)證集 mAP 很高但現(xiàn)場漏檢嚴(yán)重現(xiàn)象訓(xùn)練完 mAP50 到 0.92拿去現(xiàn)場跑絕緣子自爆漏了一半。原因通常是數(shù)據(jù)劃分時(shí)同一基桿塔的圖同時(shí)進(jìn)了訓(xùn)練和驗(yàn)證集模型記住了背景而不是缺陷。解決按桿塔編號(hào)或拍攝批次分組劃分確保驗(yàn)證集的桿塔在訓(xùn)練集里沒出現(xiàn)過。這個(gè)坑我踩過兩次第二次損失了一周返工。5.2 訓(xùn)練幾十輪后 loss 突然變 NaN現(xiàn)象前 40 輪正常第 41 輪 box_loss 變 NaN訓(xùn)練中斷。原因九成是標(biāo)注里有寬或高為 0 的廢框或者坐標(biāo)越界。解決訓(xùn)練前跑一遍數(shù)據(jù)校驗(yàn)?zāi)_本檢查每個(gè) txt 的每行是否滿足0cx1、0w1不滿足的直接剔除或修正。別指望模型自己扛住臟數(shù)據(jù)。5.3 邊緣端 FPS 遠(yuǎn)低于預(yù)期現(xiàn)象PC 上測(cè) 80 FPS部署到 Jetson 只有 15 FPS。原因通常是沒轉(zhuǎn) TensorRT或者前處理用了 PIL 而不是 OpenCV CUDA或者 batch 設(shè)成了大于 1 但實(shí)際單幀推理。解決確認(rèn)引擎是 FP16、前處理走 GPU、batch1。另外檢查 Jetson 是否處于最大功耗模式sudo nvpmodel -m 0和sudo jetson_clocks必須開默認(rèn)模式算力只釋放一半。5.4 小目標(biāo)召回始終上不去現(xiàn)象大缺陷檢測(cè)很準(zhǔn)絕緣子自爆、防震錘滑移這類小目標(biāo)召回不到 60%。原因輸入分辨率不夠目標(biāo)縮到 640 后像素太少。解決切圖訓(xùn)練或把 imgsz 提到 960/1280或加 P2 檢測(cè)頭。三者可以疊加但要注意推理延遲。優(yōu)先切圖性價(jià)比最高。5.5 類別不均衡導(dǎo)致稀有類被忽略現(xiàn)象鳥巢異物樣本只有 80 張訓(xùn)練后模型幾乎不預(yù)測(cè)這一類。原因損失被多數(shù)類主導(dǎo)。解決在data.yaml里給稀有類配更高的cls損失權(quán)重或用 focal loss 替換默認(rèn) BCE。ultralytics 不直接暴露類別權(quán)重需要改 loss 計(jì)算部分或者用過采樣把稀有類補(bǔ)到 500 張以上。我一般選后者改動(dòng)小、見效快。6. 把模型真正用起來從告警到復(fù)核的閉環(huán)技巧模型訓(xùn)完只是開始電力巡檢要的是告警可信、復(fù)核省力。我最后落地的做法是給檢測(cè)結(jié)果加一層規(guī)則后處理把純模型輸出變成帶置信分級(jí)的告警。具體來說對(duì)每個(gè)缺陷框計(jì)算三個(gè)特征類別置信度、框內(nèi)像素方差判斷是否模糊、與同類歷史告警的位置重合度。三個(gè)特征加權(quán)得到一個(gè)綜合分高于 0.8 直接推送到復(fù)核隊(duì)列頂部0.5 到 0.8 進(jìn)普通隊(duì)列低于 0.5 只存檔不告警。這套規(guī)則讓復(fù)核工作量降了約 60%因?yàn)榇罅康椭眯诺恼`報(bào)被自動(dòng)降級(jí)了。規(guī)則閾值不是拍腦袋定的是拿一批已人工確認(rèn)的歷史告警跑出來的用精確率和召回率的權(quán)衡曲線選點(diǎn)。另一個(gè)技巧是用連續(xù)幀做時(shí)序確認(rèn)。無人機(jī)巡檢同一基桿塔會(huì)拍多張不同角度的圖如果同一位置在 3 張以上圖里都被檢出同類缺陷置信度直接拉滿。單幀誤報(bào)在時(shí)序上很難重復(fù)出現(xiàn)這個(gè)過濾極其有效。實(shí)現(xiàn)上把檢測(cè)框按 GPS 和拍攝角度聚類同簇內(nèi)統(tǒng)計(jì)類別頻次即可。驗(yàn)證方法上我習(xí)慣留一個(gè)黃金集200 張人工逐框確認(rèn)過的圖每次模型更新都跑一遍看漏檢和誤報(bào)的具體案例而不是只看 mAP 數(shù)字。mAP 漲了但黃金集上某個(gè)桿塔的缺陷漏了這個(gè)更新就不能上。數(shù)字會(huì)騙人具體案例不會(huì)。最后說個(gè)習(xí)慣每次現(xiàn)場部署前我一定帶一臺(tái)筆記本到變電站用同型號(hào)無人機(jī)拍 50 張新圖當(dāng)場推理看實(shí)際光照和電磁干擾下的表現(xiàn)。實(shí)驗(yàn)室里 mAP 再高現(xiàn)場陰天逆光一拍該漏還是漏。這個(gè)習(xí)慣幫我攔下過三次實(shí)驗(yàn)室滿分、現(xiàn)場翻車的模型。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取