系統(tǒng):從數(shù)據(jù)集到RK3588部署)
簡(jiǎn)介這份資源面向電力巡檢與目標(biāo)檢測(cè)方向的開發(fā)者、學(xué)生及科研人員提供一套基于YOLO11與YOLOv8的輸電線路過熱檢測(cè)完整方案可用于課程大作業(yè)、畢業(yè)設(shè)計(jì)或電力智能巡檢原型驗(yàn)證。壓縮包共2000個(gè)文件約407.5MB包含1331個(gè)txt標(biāo)注與說明、194個(gè)Python源碼、93個(gè)yaml配置、356個(gè)md文檔以及少量xml、cpp、sh、pdf等輔助文件覆蓋數(shù)據(jù)處理、模型訓(xùn)練、推理部署全流程。資源內(nèi)含已處理好的2000張輸電線路過熱圖像數(shù)據(jù)類別為overheat并附帶訓(xùn)練與測(cè)試源代碼、已訓(xùn)練好的YOLO11和YOLOv8權(quán)重以及基于PySide的圖形化界面和基于Gradio的Web界面方便直接運(yùn)行與二次開發(fā)。目前已有277人學(xué)習(xí)適合希望快速掌握電力設(shè)備過熱檢測(cè)、對(duì)比兩種YOLO版本性能并落地可視化交互的讀者參考。1. 輸電線路過熱檢測(cè)為什么 yolo11 和 yolov8 要放在同一套系統(tǒng)里輸電線路接頭、線夾、耐張線夾這些部位一旦接觸電阻變大溫度就會(huì)異常升高紅外巡檢時(shí)表現(xiàn)為明顯的亮斑。傳統(tǒng)做法是人工看紅外圖逐張判斷一條 220kV 線路幾百個(gè)桿塔看下來眼睛都花了漏檢率還高。基于 yolo11 和 yolov8 的輸電線路過熱檢測(cè)系統(tǒng)本質(zhì)是把紅外熱成像圖里的過熱區(qū)域當(dāng)成目標(biāo)檢測(cè)問題來做用 yolov8 快速跑通基線、驗(yàn)證數(shù)據(jù)集質(zhì)量再用 yolo11 做精度和部署上的迭代最后落到邊緣設(shè)備上做實(shí)時(shí)告警。這套方案適合三類人一是做電力巡檢方向的大作業(yè)或畢設(shè)需要一套能跑通、能寫進(jìn)論文的完整流程二是想把 YOLO 系列真正部署到 RK3588 這類邊緣盒子上的工程師三是手里已經(jīng)有紅外數(shù)據(jù)集但不確定該用哪個(gè)版本、怎么調(diào)參的從業(yè)者。下面按數(shù)據(jù)集準(zhǔn)備、yolov8 基線、yolo11 迭代、部署驗(yàn)證、避坑的順序講清楚。2. 數(shù)據(jù)集與標(biāo)注紅外過熱區(qū)域怎么變成 YOLO 能吃的格式2.1 紅外過熱檢測(cè)的數(shù)據(jù)特點(diǎn)與類別設(shè)計(jì)輸電線路紅外圖有幾個(gè)和普通可見光數(shù)據(jù)集不一樣的地方。第一背景極其單調(diào)天空和桿塔占了大半畫面目標(biāo)只占很小一塊正負(fù)樣本極度不平衡。第二過熱區(qū)域邊界模糊紅外圖上亮斑是漸變的標(biāo)注時(shí)到底框到哪一圈不同人標(biāo)出來能差十幾個(gè)像素。第三同一張圖里可能有多個(gè)過熱接頭也可能一個(gè)都沒有負(fù)樣本比例高。類別設(shè)計(jì)上我一般不建議一上來就分「一般過熱、嚴(yán)重過熱、危急過熱」三級(jí)。原因是紅外圖的絕對(duì)溫度受環(huán)境溫度、發(fā)射率、拍攝距離影響很大同一溫度在不同季節(jié)可能對(duì)應(yīng)不同等級(jí)模型學(xué)不到穩(wěn)定特征。更穩(wěn)的做法是先做二分類overheat和背景把分級(jí)交給后處理里的溫度閾值去判。等數(shù)據(jù)量上到幾千張、標(biāo)注一致性有保證之后再考慮加overheat_mild、overheat_severe兩個(gè)類。數(shù)據(jù)集目錄按 YOLO 標(biāo)準(zhǔn)結(jié)構(gòu)組織datasets/transmission_ir/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml內(nèi)容path: /home/user/datasets/transmission_ir train: images/train val: images/val test: images/test nc: 1 names: [overheat]這里nc是類別數(shù)二分類就是 1。names的順序必須和標(biāo)注文件里 class_id 對(duì)應(yīng)標(biāo)錯(cuò)了模型會(huì)學(xué)反。劃分比例上輸電線路場(chǎng)景我建議 train:val:test 7:2:1驗(yàn)證集要保證每個(gè)桿塔類型、每種拍攝角度都有覆蓋不能隨機(jī)切完發(fā)現(xiàn)驗(yàn)證集全是晴天拍的。2.2 從 VOC/COCO 轉(zhuǎn) YOLO 格式的腳本與邊界處理很多電力數(shù)據(jù)集原始標(biāo)注是 VOC 的 XML 或者 COCO 的 JSON轉(zhuǎn) YOLO 格式時(shí)最容易翻車的是坐標(biāo)歸一化和越界裁剪。下面這個(gè)腳本處理 VOC 轉(zhuǎn) YOLOimport os import xml.etree.ElementTree as ET from PIL import Image def voc_to_yolo(xml_dir, img_dir, out_dir, classes): os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() img_name root.find(filename).text img_path os.path.join(img_dir, img_name) # 用真實(shí)圖片尺寸不要信 XML 里的 size標(biāo)注工具經(jīng)常寫錯(cuò) w, h Image.open(img_path).size lines [] for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in classes: continue cls_id classes.index(cls_name) bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) # 裁剪到圖像范圍內(nèi)防止標(biāo)注越界導(dǎo)致歸一化后出負(fù)數(shù) x1, y1 max(0, x1), max(0, y1) x2, y2 min(w, x2), min(h, y2) if x2 x1 or y2 y1: continue # 裁剪后無效框直接丟 cx (x1 x2) / 2.0 / w cy (y1 y2) / 2.0 / h bw (x2 - x1) / w bh (y2 - y1) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) out_file os.path.join(out_dir, xml_file.replace(.xml, .txt)) with open(out_file, w) as f: f.write(\n.join(lines)) voc_to_yolo(annotations/xml, images/all, labels/all, [overheat])邏輯說明YOLO 格式要求class_id cx cy w h全部歸一化到 0~1。關(guān)鍵點(diǎn)是圖片寬高必須從真實(shí)圖片讀XML 里的size字段經(jīng)常和實(shí)際不符用錯(cuò)了整批標(biāo)注都會(huì)偏。裁剪那兩行是后悔藥標(biāo)注工具畫框時(shí)手一抖超出邊界很常見不裁的話歸一化后出現(xiàn)負(fù)數(shù)或大于 1訓(xùn)練時(shí) loss 直接 NaN。參數(shù)說明classes列表順序決定 class_id必須和data.yaml的names完全一致。:.6f保留六位小數(shù)YOLO 官方推薦至少六位位數(shù)太少小目標(biāo)坐標(biāo)會(huì)丟精度。2.3 數(shù)據(jù)增強(qiáng)策略紅外圖不能照搬可見光的配方可見光那套 Mosaic、HSV 增強(qiáng)直接搬到紅外圖上會(huì)出問題。HSV 里的 H 色調(diào)對(duì)紅外圖沒意義紅外圖基本是偽彩色或灰度調(diào)色調(diào)等于制造不存在的樣本。我一般這樣配增強(qiáng)方式參數(shù)是否啟用原因mosaic1.0啟用提升小目標(biāo)召回紅外目標(biāo)小fliplr0.5啟用左右翻轉(zhuǎn)符合巡檢視角變化flipud0.0關(guān)閉桿塔上下翻轉(zhuǎn)不符合物理hsv_h0.0關(guān)閉紅外無色調(diào)概念hsv_s0.3弱啟用模擬不同紅外增益hsv_v0.4啟用模擬環(huán)境溫度變化scale0.5啟用模擬不同拍攝距離Mosaic 對(duì)小目標(biāo)幫助很大但要注意紅外圖拼接后亮斑可能被切到邊緣訓(xùn)練后期建議最后 10 個(gè) epoch 關(guān)掉 mosaic讓模型在真實(shí)分布上收斂。這個(gè)技巧在 yolov8 和 yolo11 上都適用。3. yolov8 基線先把環(huán)境配通再談精度3.1 yolov8 環(huán)境配置與最小訓(xùn)練命令yolov8 環(huán)境配置是新手最容易卡住的地方。CUDA 版本、PyTorch 版本、ultralytics 版本三者要對(duì)上。我一般用 conda 隔離conda create -n yolo8 python3.10 -y conda activate yolo8 # 根據(jù)顯卡驅(qū)動(dòng)選 CUDA 版本30 系 40 系一般 cu118 或 cu121 pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics8.1.0裝完先驗(yàn)證python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))輸出True和顯卡型號(hào)才算通。如果顯示False八成是 CUDA 版本和驅(qū)動(dòng)不匹配別急著改代碼先解決環(huán)境。最小訓(xùn)練命令yolo detect train \ datadatasets/transmission_ir/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/ir_detect \ nameyolov8n_baseline參數(shù)說明modelyolov8n.pt是 nano 版本先用小模型跑通流程確認(rèn)數(shù)據(jù)沒問題再換 s/m。imgsz640是輸入尺寸紅外小目標(biāo)如果特別小可以上到 1280但顯存翻倍。batch16在 8G 顯存上跑 640 尺寸基本夠GTX1660Ti 這種 6G 卡建議降到 8。device0指定第一塊 GPU多卡用0,1。3.2 用損失曲線判斷訓(xùn)練是否真的在收斂訓(xùn)練跑起來不代表在收斂。yolov8 訓(xùn)練完會(huì)在runs/ir_detect/yolov8n_baseline/下生成results.csv畫損失曲線import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/ir_detect/yolov8n_baseline/results.csv) df.columns df.columns.str.strip() # 列名有空格必須去 fig, axes plt.subplots(1, 2, figsize(12, 4)) axes[0].plot(df[epoch], df[train/box_loss], labeltrain box) axes[0].plot(df[epoch], df[val/box_loss], labelval box) axes[0].set_xlabel(epoch); axes[0].set_ylabel(box loss); axes[0].legend() axes[1].plot(df[epoch], df[metrics/mAP50(B)], labelmAP50) axes[1].plot(df[epoch], df[metrics/mAP50-95(B)], labelmAP50-95) axes[1].set_xlabel(epoch); axes[1].set_ylabel(mAP); axes[1].legend() plt.tight_layout() plt.savefig(loss_curve.png, dpi150)邏輯說明results.csv的列名帶前后空格不 strip 會(huì) KeyError這是血淚經(jīng)驗(yàn)??辞€重點(diǎn)看三條train box loss 是否穩(wěn)定下降、val box loss 是否跟著降、mAP50 是否在漲。如果 train 降 val 不降甚至漲是過擬合加數(shù)據(jù)或加增強(qiáng)如果兩個(gè)都不降是學(xué)習(xí)率太大或數(shù)據(jù)標(biāo)注有問題。參數(shù)說明metrics/mAP50(B)是 IoU0.5 的 mAP紅外過熱檢測(cè)主要看這個(gè)mAP50-95更嚴(yán)格小目標(biāo)場(chǎng)景一般會(huì)低不少別拿它當(dāng)唯一指標(biāo)。3.3 可視化熱力圖定位模型到底在看哪模型 mAP 高不代表它學(xué)對(duì)了。紅外圖里如果過熱區(qū)域旁邊有個(gè)桿塔螺栓特別亮模型可能學(xué)的是螺栓而不是過熱。用熱力圖驗(yàn)證from ultralytics import YOLO import cv2 import numpy as np model YOLO(runs/ir_detect/yolov8n_baseline/weights/best.pt) img cv2.imread(test_ir.jpg) results model(img, imgsz640) # 取第一個(gè)檢測(cè)框的梯度熱力圖 for r in results: if r.boxes is None or len(r.boxes) 0: continue for box in r.boxes: x1, y1, x2, y2 map(int, box.xyxy[0].tolist()) roi img[y1:y2, x1:x2] gray cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) heatmap cv2.applyColorMap(gray, cv2.COLORMAP_JET) overlay cv2.addWeighted(roi, 0.6, heatmap, 0.4, 0) cv2.imwrite(fheat_{x1}_{y1}.jpg, overlay)邏輯說明這里用 ROI 灰度做偽熱力圖快速看模型關(guān)注區(qū)域和真實(shí)過熱亮斑是否重合。更嚴(yán)謹(jǐn)?shù)淖龇ㄊ?Grad-CAM但對(duì)紅外圖來說過熱區(qū)域本身就是高亮灰度偽彩已經(jīng)夠用。如果發(fā)現(xiàn)模型框的位置和亮斑中心偏了說明標(biāo)注框畫大了回去修標(biāo)注。參數(shù)說明imgsz640要和訓(xùn)練時(shí)一致否則檢測(cè)框坐標(biāo)會(huì)偏。addWeighted的 0.6/0.4 是疊加比例想讓熱力圖更明顯就調(diào)成 0.4/0.6。4. yolo11 迭代結(jié)構(gòu)變化帶來哪些實(shí)際收益4.1 yolo11 網(wǎng)絡(luò)結(jié)構(gòu)里值得關(guān)注的兩個(gè)改動(dòng)yolo11 相比 yolov8在 backbone 和 head 上都有調(diào)整。對(duì)輸電線路過熱檢測(cè)這種小目標(biāo)場(chǎng)景值得關(guān)注兩點(diǎn)。一是 yolo11 在 neck 部分用了更高效的特征融合結(jié)構(gòu)小目標(biāo)的語義信息保留得更好實(shí)測(cè)在 640 輸入下小亮斑召回比 yolov8n 高幾個(gè)點(diǎn)。二是 head 的解耦方式有變化分類和回歸分支的獨(dú)立性更強(qiáng)對(duì)邊界模糊的紅外目標(biāo)回歸框更穩(wěn)。但別指望換個(gè)版本就起飛。yolo11 的收益建立在數(shù)據(jù)集質(zhì)量過關(guān)的基礎(chǔ)上如果標(biāo)注本身框得歪換什么版本都白搭。我一般先用 yolov8 跑出基線 mAP再換 yolo11 同規(guī)模模型對(duì)比漲點(diǎn)超過 2 個(gè)點(diǎn)才值得切。4.2 從 yolov8 遷移到 yolo11 的訓(xùn)練配置差異yolo11 同樣用 ultralytics 框架命令幾乎一樣但有幾個(gè)參數(shù)要注意yolo detect train \ datadatasets/transmission_ir/data.yaml \ modelyolo11n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ optimizerAdamW \ lr00.001 \ warmup_epochs3 \ projectruns/ir_detect \ nameyolo11n_iter參數(shù)說明yolo11 默認(rèn)優(yōu)化器在部分版本里是 auto小數(shù)據(jù)集上 AdamW 比 SGD 收斂更穩(wěn)lr00.001是 AdamW 的常用起點(diǎn)比 SGD 的 0.01 小一個(gè)量級(jí)。warmup_epochs3讓學(xué)習(xí)率在前 3 個(gè) epoch 線性上升避免一開始就大步長(zhǎng)把預(yù)訓(xùn)練權(quán)重沖壞。如果顯存夠batch可以上到 32梯度更穩(wěn)。遷移時(shí)權(quán)重不能直接復(fù)用yolov8 的.pt和 yolo11 的結(jié)構(gòu)不兼容必須用 yolo11 自己的預(yù)訓(xùn)練權(quán)重。數(shù)據(jù)集和data.yaml可以直接復(fù)用這是同一套系統(tǒng)里兩個(gè)版本能共存的基礎(chǔ)。4.3 兩個(gè)版本同框?qū)Ρ萴AP、速度、顯存怎么記對(duì)比要控制變量同一份數(shù)據(jù)、同一個(gè) imgsz、同一個(gè) batch只換模型。記錄表格模型mAP50mAP50-95單圖推理(ms)顯存(G)參數(shù)量(M)yolov8n0.860.528.23.13.2yolov8s0.890.5614.55.411.2yolo11n0.880.557.83.02.6yolo11s0.910.5913.95.29.4以上是典型量級(jí)具體數(shù)值隨數(shù)據(jù)集變化別照抄。推理速度用model.val()里的 speed 字段或者自己寫循環(huán)測(cè) 100 張取平均。顯存用torch.cuda.max_memory_allocated()讀。選型上如果邊緣設(shè)備算力緊張yolo11n 在精度略高于 yolov8n 的同時(shí)參數(shù)量更小是更優(yōu)解如果追求極致精度且算力夠yolo11s 是甜點(diǎn)。5. 部署到 RK3588從 PyTorch 到邊緣盒子的完整鏈路5.1 導(dǎo)出 ONNX 與 RKNN 轉(zhuǎn)換的關(guān)鍵參數(shù)RK3588 部署 yolov8/yolo11標(biāo)準(zhǔn)鏈路是 PyTorch → ONNX → RKNN。導(dǎo)出 ONNXyolo export modelruns/ir_detect/yolo11n_iter/weights/best.pt \ formatonnx imgsz640 opset12 simplifyTrue參數(shù)說明opset12兼容性最好RKNN 工具鏈對(duì)高版本 opset 支持不穩(wěn)。simplifyTrue會(huì)做圖優(yōu)化去掉冗余算子轉(zhuǎn)換成功率更高。導(dǎo)出后檢查輸入輸出名字RKNN 轉(zhuǎn)換時(shí)要對(duì)上。RKNN 轉(zhuǎn)換腳本from rknn.api import RKNN rknn RKNN(verboseTrue) # 均值方差要和訓(xùn)練時(shí)一致YOLO 默認(rèn) 0~1 歸一化 rknn.config(mean_values[[0, 0, 0]], std_values[[255, 255, 255]], target_platformrk3588) rknn.load_onnx(modelbest.onnx) rknn.build(do_quantizationTrue, datasetquant_dataset.txt) rknn.export_rknn(best.rknn)邏輯說明mean_values和std_values決定預(yù)處理YOLO 訓(xùn)練時(shí)輸入是 0~1所以 std 用 255。do_quantizationTrue做 int8 量化能大幅提速但需要quant_dataset.txt里放幾百張代表性圖片做校準(zhǔn)。量化后精度一般掉 1~3 個(gè)點(diǎn)如果掉太多檢查校準(zhǔn)集是否覆蓋了各種光照和角度。參數(shù)說明target_platformrk3588必須寫對(duì)寫錯(cuò)平臺(tái)轉(zhuǎn)換出來的模型跑不了。dataset文件每行一張圖片路徑建議 200~500 張從訓(xùn)練集里均勻采樣。5.2 板端推理與后處理對(duì)齊RK3588 上跑 RKNN 模型后處理要自己寫因?yàn)?RKNN 輸出的是原始特征圖不是檢測(cè)框。yolo11 和 yolov8 的輸出格式類似都是多尺度特征圖需要做解碼import numpy as np def decode_yolo(outputs, conf_thres0.25, iou_thres0.45): # outputs: list of feature maps, shape [1, 4nc, h, w] boxes, scores, class_ids [], [], [] for out in outputs: _, c, h, w out.shape out out.reshape(1, c, h * w).transpose(0, 2, 1)[0] # 前 4 個(gè)是 xywh后面是類別分?jǐn)?shù) xywh out[:, :4] cls_scores out[:, 4:] cls_id np.argmax(cls_scores, axis1) conf np.max(cls_scores, axis1) mask conf conf_thres if not mask.any(): continue # 解碼到原圖坐標(biāo)這里省略 stride 和 anchor 計(jì)算按實(shí)際輸出補(bǔ) boxes.append(xywh[mask]) scores.append(conf[mask]) class_ids.append(cls_id[mask]) # NMS 部分用 cv2.dnn.NMSBoxes 或自己實(shí)現(xiàn) return boxes, scores, class_ids邏輯說明RKNN 輸出的特征圖需要按 stride 還原到原圖坐標(biāo)再拼成 xyxy 格式做 NMS。這段代碼省略了 stride 計(jì)算實(shí)際要按模型輸出的三個(gè)尺度分別處理。后處理對(duì)齊是部署最容易翻車的地方板端框位置偏了九成是解碼時(shí) stride 或歸一化系數(shù)寫錯(cuò)。參數(shù)說明conf_thres0.25是置信度閾值紅外過熱檢測(cè)寧可多報(bào)不可漏報(bào)可以降到 0.2。iou_thres0.45是 NMS 的 IoU 閾值過熱區(qū)域重疊少可以適當(dāng)調(diào)高到 0.5。5.3 邊緣端性能實(shí)測(cè)與調(diào)優(yōu)方向RK3588 上 yolo11n 量化后單幀推理大概在 30~50msyolov8n 差不多。如果達(dá)不到先查是不是跑在 CPU 上RKNN 要顯式指定 NPU 核心。多核 NPU 可以用rknn.init_runtime(core_maskRKNN.NPU_CORE_0_1_2)把三個(gè)核心都用上速度能再提一截。輸入尺寸從 640 降到 416 能提速近一倍但小目標(biāo)召回會(huì)掉紅外過熱檢測(cè)不建議降太多。6. 避坑與排查這套系統(tǒng)最容易翻車的五個(gè)地方6.1 訓(xùn)練 loss 正常但 mAP 一直是 0現(xiàn)象訓(xùn)練日志里 box loss 在降但 mAP50 始終是 0。原因標(biāo)注文件的 class_id 從 1 開始而 YOLO 要求從 0 開始模型把所有目標(biāo)當(dāng)背景。解決檢查labels里第一列必須是 0 到 nc-1用腳本批量掃一遍發(fā)現(xiàn)最大值等于 nc 就整體減 1。6.2 驗(yàn)證集 mAP 很高實(shí)際巡檢圖全漏檢現(xiàn)象val mAP 0.9拿現(xiàn)場(chǎng)新拍的圖測(cè)一個(gè)都沒框出來。原因訓(xùn)練集和驗(yàn)證集來自同一批拍攝分布太像模型沒學(xué)到泛化特征。解決劃分?jǐn)?shù)據(jù)集時(shí)按桿塔或按拍攝日期切不要隨機(jī)切另外檢查現(xiàn)場(chǎng)圖的分辨率和訓(xùn)練圖是否差太多差太多要做 resize 或切圖。6.3 RKNN 量化后精度斷崖式下跌現(xiàn)象ONNX 上 mAP 0.88轉(zhuǎn) RKNN int8 后掉到 0.6。原因校準(zhǔn)集沒覆蓋實(shí)際場(chǎng)景或者量化時(shí)某些層對(duì)數(shù)值敏感。解決校準(zhǔn)集從訓(xùn)練集里按類別和亮度分層采樣至少 300 張如果還不行對(duì)敏感層做混合量化把檢測(cè) head 保留 fp16。6.4 板端推理框位置整體偏移現(xiàn)象框能出來但位置比真實(shí)目標(biāo)偏了幾十像素。原因后處理解碼時(shí) stride 用錯(cuò)或者預(yù)處理 resize 的 padding 沒還原。解決打印第一個(gè)特征圖的輸出尺寸反推 strideletterbox 的 padding 值要在解碼后減掉再除以縮放比例。6.5 顯存夠但訓(xùn)練中途 OOM現(xiàn)象GTX1660Ti 6Gbatch16 跑幾十個(gè) epoch 后突然 OOM。原因驗(yàn)證階段會(huì)額外占顯存加上 dataloader 的緩存累積。解決把batch降到 8開ampTrue混合精度workers從 8 降到 4驗(yàn)證頻率從每 epoch 改成每 5 個(gè) epoch。7. 一個(gè)能落地的技巧用溫度閾值做二次過濾模型輸出的是框但電力巡檢真正要的是「這個(gè)接頭到底過不過熱」。光靠檢測(cè)框置信度不夠因?yàn)榧t外圖里陽光反射、金屬反光也會(huì)形成亮斑模型分不清。我一般加一層溫度閾值過濾如果紅外圖帶溫度矩陣很多紅外相機(jī)導(dǎo)出時(shí)帶 RAW 溫度數(shù)據(jù)取檢測(cè)框內(nèi)的最高溫和環(huán)境溫度比超過 15K 才告警。import numpy as np def temp_filter(box, temp_matrix, ambient_temp, delta15.0): x1, y1, x2, y2 box roi temp_matrix[y1:y2, x1:x2] max_temp np.max(roi) # 相對(duì)溫差比絕對(duì)溫度穩(wěn)不受季節(jié)影響 return (max_temp - ambient_temp) delta, max_temp邏輯說明temp_matrix是紅外圖對(duì)應(yīng)的溫度矩陣單位攝氏度。ambient_temp取畫面里桿塔背景區(qū)域的中位數(shù)溫度。用相對(duì)溫差而不是絕對(duì)溫度是因?yàn)橄奶飙h(huán)境 40 度時(shí)接頭 55 度不算異常冬天環(huán)境 5 度時(shí)接頭 25 度就該查了。delta15.0是經(jīng)驗(yàn)閾值按 DL/T 664 的慣例相對(duì)溫差超過 15K 屬于一般缺陷超過 30K 是嚴(yán)重缺陷可以按需調(diào)。參數(shù)說明temp_matrix要和可見光圖對(duì)齊如果紅外和可見光有視差先做配準(zhǔn)。ambient_temp別用整圖平均畫面里天空占比大會(huì)把均值拉低用桿塔區(qū)域的中位數(shù)更準(zhǔn)。這套系統(tǒng)我從 yolov8 基線跑到 yolo11 迭代再到 RK3588 部署前后踩的坑基本都在上面了。最大的教訓(xùn)是別一上來就追新版本、追改進(jìn)模塊先把數(shù)據(jù)集標(biāo)注一致性做到位把 yolov8 基線跑穩(wěn)后面換 yolo11、上邊緣設(shè)備都是順?biāo)浦鄣氖隆?shù)據(jù)集爛什么模型都救不了。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取