
简介本资源为开关柜接头红外过热检测图像数据集面向电力设备巡检、红外测温与工业视觉方向的研究者及算法工程师用于训练和验证红外过热点自动检测模型。数据包含3000余张开关柜接头红外图像均配有VOC格式标注对过热区域进行了框选图像本身保留温度信息便于结合温度阈值做定量分析。压缩包共约2000个文件以5527个xml标注文件和5527个jpg图像文件为主xml提供目标类别与边界框坐标jpg为对应红外原图整体约217.68MB目录结构清晰可直接接入YOLO等主流检测框架。目前已有834人学习下载适合用于红外目标检测、电力设备状态监测等课题的数据集构建与模型训练也可作为算法对比与消融实验的基准数据。1. 开关柜接头红外过热检测3000 张带温度信息的 VOC 数据集到底怎么用变电站巡检走到开关柜跟前最怕的不是看不清而是看出来了却说不清有多热。红外热像仪拍下的接头过热画面如果只存成 JPG温度信息就丢了后期想复现「当时到底几度」只能靠猜。这个标题指向的就是一套把「图像 VOC 标注 温度信息」绑在一起的开关柜接头红外过热检测数据集规模 3000 多张。它解决的核心问题是让红外过热检测从「看图说话」变成「带数值依据的检测任务」。适合做电力设备缺陷识别、红外目标检测、多模态数据融合的从业者也适合想拿真实工业数据跑通 YOLO 或 Faster R-CNN 的算法同学。作物病害图像数据集划分那套按类别分层抽样的思路在这里同样适用只是类别换成了接头过热等级。2. 红外过热检测数据集拆开看VOC 标签和温度信息怎么对齐2.1 VOC 标签在红外图像里长什么样VOC 格式本身不复杂一张图对应一个 XML里面记着文件名、尺寸、目标类别和 bbox 坐标。放到开关柜接头红外场景里关键在类别怎么定。常见做法是分「正常接头」「一般过热」「严重过热」三类也有按温升区间分四类的。XML 里的name字段就是这些类别名bndbox是接头在红外画面里的矩形框。annotation filenameswitchgear_ir_0001.jpg/filename size width640/width height480/height depth3/depth /size object namesevere_overheat/name !-- 类别名对应严重过热 -- bndbox xmin212/xmin ymin156/ymin xmax298/xmax ymax241/ymax /bndbox /object /annotation这段 XML 里filename必须和实际图像文件名完全一致大小写都不能错否则训练时找不到图。name是类别字符串后面转 YOLO 或 COCO 时靠它做映射。bndbox四个值都是像素坐标左上角到右下角不能越界。红外图像常见 640×480 或 384×288尺寸字段要和真实分辨率对齐不然缩放会出问题。2.2 温度信息到底存在哪、怎么读温度信息是这个数据集区别于普通红外图像集的关键。它一般不会塞进 XML 的 bndbox 里而是单独放在一个 CSV 或 JSON 里按图像名和接头 ID 索引。常见字段包括图像文件名、接头编号、最高温、平均温、环境温度、温升、过热等级。字段含义示例image_name图像文件名switchgear_ir_0001.jpgjoint_id接头编号J-03max_temp接头区域最高温78.4avg_temp接头区域平均温71.2ambient_temp环境温度26.0temp_rise温升52.4level过热等级severe读的时候用 pandas 一行就能挂到图像上。注意温度单位要统一有的设备导出的是华氏度直接混用会让阈值全乱。温升 最高温 - 环境温度这个值比绝对温度更能反映缺陷程度因为夏天和冬天同一接头的绝对温度差很多但温升相对稳定。import pandas as pd temp_df pd.read_csv(joint_temperature.csv) # 统一转成摄氏度防止华氏混入 if temp_df[max_temp].max() 150: temp_df[max_temp] (temp_df[max_temp] - 32) / 1.8 temp_df[temp_rise] temp_df[max_temp] - temp_df[ambient_temp] print(temp_df[[image_name, max_temp, temp_rise, level]].head())这段代码先读温度表再用一个简单阈值判断是否混入华氏度最后算温升。参数上150 这个阈值不是绝对的如果设备量程到 200℃就要换判断逻辑最好在数据说明里确认单位。温升列算出来后可以直接用来做分级标签也可以作为回归目标让模型同时预测温度。2.3 3000 张图像怎么划分才不翻车3000 多张听起来不少但按类别一分就紧张了。如果严重过热只有 200 张随机划分很可能验证集里只剩几十张指标波动大。作物病害图像数据集划分常用的分层抽样在这里必须用上按「过热等级 接头类型」做分层保证训练集、验证集、测试集里各类别比例接近。from sklearn.model_selection import train_test_split # df 里每行是一张图level 是过热等级 train_df, temp_df train_test_split( df, test_size0.3, stratifydf[level], random_state42 ) val_df, test_df train_test_split( temp_df, test_size0.5, stratifytemp_df[level], random_state42 ) print(train_df[level].value_counts()) print(val_df[level].value_counts())stratify参数是关键它让每个子集里类别比例和整体一致。random_state固定后结果可复现。划分完一定要打印各类别数量如果某一类在验证集里少于 10 张就要考虑合并类别或补充数据。另外同一接头在不同角度拍的多张图最好整组进同一个子集否则模型可能记住的是接头而不是缺陷。3. 从 VOC 到 YOLO转换脚本、温度挂载和训练配置3.1 VOC 转 YOLO 格式的完整脚本YOLO 用的是归一化后的中心点坐标和宽高和 VOC 的左上右下像素坐标不一样。转换时还要把类别名映射成整数 ID。下面这个脚本同时处理 XML 和温度表输出 YOLO 标签文件和一份带温度的训练索引。import os import xml.etree.ElementTree as ET import pandas as pd classes [normal, mild_overheat, severe_overheat] class_to_id {c: i for i, c in enumerate(classes)} def voc_to_yolo(xml_path, img_w, img_h): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_to_id: continue 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) # 转成中心点 宽高再归一化 cx (xmin xmax) / 2.0 / img_w cy (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{class_to_id[name]} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) return lines # 批量转换 for xml_file in os.listdir(annotations): if not xml_file.endswith(.xml): continue img_name xml_file.replace(.xml, .jpg) # 这里宽高建议从图像实际读取示例用固定值 lines voc_to_yolo(os.path.join(annotations, xml_file), 640, 480) with open(os.path.join(labels, xml_file.replace(.xml, .txt)), w) as f: f.write(\n.join(lines))脚本里classes列表的顺序就是类别 ID必须和训练配置里的names一致。归一化用图像真实宽高示例写死 640×480 只作演示实际要从图像读取否则不同分辨率混在一起会错位。cx、cy、w、h都保留 6 位小数YOLO 对精度不敏感但太小会丢框。转换完随便抽几张用可视化脚本画框确认没偏。3.2 把温度信息挂到训练样本上YOLO 本身只吃图像和框温度信息要挂上去有两种常见做法。一种是把温度作为额外输入通道另一种是先做检测再用温度表做后处理分级。前者改动大后者落地快。我一般先用后处理方式跑通基线。import pandas as pd temp_df pd.read_csv(joint_temperature.csv) temp_df temp_df.set_index(image_name) def get_temp_level(image_name): if image_name not in temp_df.index: return None row temp_df.loc[image_name] # 按温升分级阈值根据现场规程调整 if row[temp_rise] 15: return normal elif row[temp_rise] 40: return mild_overheat else: return severe_overheat # 训练时按 image_name 查温度等级和检测结果比对 print(get_temp_level(switchgear_ir_0001.jpg))temp_rise的阈值 15 和 40 不是通用标准不同电压等级和接头类型要求不一样要按现场规程改。set_index后查询快但要注意图像名重复的情况重复会导致loc返回多行。如果温度表里有缺失返回None训练时要么跳过要么用均值填充别让 NaN 进模型。3.3 YOLO 训练配置里必须改的几个参数用 Ultralytics 的 YOLO 系列训练时数据配置文件里train、val、nc、names是必填。红外图像和可见光差别大学习率、增强策略要调。# data_switchgear.yaml train: ./images/train val: ./images/val nc: 3 names: [normal, mild_overheat, severe_overheat]nc是类别数必须和names长度一致。红外图像对比度低mosaic增强可以保留但hsv_h这类颜色抖动要关掉或调小因为红外伪彩不是真实颜色。学习率初始可以设 0.001batch 根据显存调3000 张图用 16 或 32 都行。训练轮数先跑 100 轮看 mAP 曲线如果验证集 mAP 早早平了就减轮数或加正则。4. 红外过热检测避坑从标注到训练最容易翻车的 5 个点4.1 温度表和图像名对不上现象训练时大量样本查不到温度后处理分级全变None。原因温度表里的文件名带路径或后缀不一致比如 CSV 里是switchgear_ir_0001图像是switchgear_ir_0001.jpg。解决统一去掉扩展名或用os.path.basename对齐转换前先做一次set交集检查对不上的列出来人工核。4.2 红外图像伪彩导致类别混淆现象模型把「一般过热」和「严重过热」频繁搞混混淆矩阵里两类互相错。原因红外伪彩里温度高低对应颜色变化但不同设备调色板不一样同一温度可能显示成红或黄。解决训练前把伪彩图转成灰度或单通道温度矩阵减少颜色干扰或者在标注时严格按温升定级不按肉眼颜色。4.3 bbox 框到背景发热区现象检测框明显偏大把周围发热的背景也框进去。原因红外图像里接头和邻近母排温度接近标注时凭感觉画框。解决标注时对照温度表只框接头本体区域如果温度表给的是区域最高温框要覆盖到最高温像素点。转换后可视化抽查偏大的重新标。4.4 划分后某类样本过少现象验证集里严重过热只有 5 张mAP 忽高忽低。原因随机划分没做分层小类别被分散。解决用stratify按等级分层如果某类总数少于 50考虑合并等级或做过采样。过采样时注意同一接头的图不要重复进验证集。4.5 温度单位混用导致阈值失效现象按温升分级时大量正常接头被标成严重过热。原因部分温度是华氏度没转换直接算温升。解决读表后先检查数值范围超过 150 的基本是华氏统一转摄氏度再算。转换后打印描述性统计确认最高温、平均温在合理区间。5. 用温度回归头把检测和测温绑在一起检测框只能告诉你「哪里热」温度回归头能告诉你「多热」。在 YOLO 的检测头旁边加一个回归分支输入是 bbox 对应的特征输出是温升预测值。这样推理时一张图进去框和温度一起出来后处理分级直接用预测温升不用再查表。import torch import torch.nn as nn class TempHead(nn.Module): def __init__(self, in_channels): super().__init__() self.pool nn.AdaptiveAvgPool2d(1) self.fc nn.Sequential( nn.Linear(in_channels, 64), nn.ReLU(), nn.Linear(64, 1) # 输出温升 ) def forward(self, feat, bboxes): # feat: 特征图, bboxes: 检测框 # 这里简化成全局池化实际应按框做 RoIAlign x self.pool(feat).flatten(1) return self.fc(x)这个头只是示意实际要接在检测框的 RoI 特征上用 RoIAlign 对齐。损失函数用 MSE 或 Huber和检测损失加权求和。训练时温度标签从 CSV 读归一化到 0 到 1 之间推理时再反归一化。验证时看两个指标检测 mAP 和温度 MAE。如果 MAE 大于 5℃说明特征没学好要么加数据要么把温度作为辅助任务先预训练。我自己的习惯是每次拿到带温度的红外数据集先花半天把温度表和图像对齐、单位统一、分层划分跑一遍再开始训练。这一步偷懒后面调参全是玄学。希望帮到你。本文还有配套的精品资源点击获取