
简介这份输电线路红外过热检测图像数据集面向电力巡检、计算机视觉及红外检测方向的研究者与工程师旨在解决线路设备过热缺陷难以高效标注与训练的问题。数据集涵盖2300余张红外图像的VOC格式标注其中过热缺陷样本既包含图像融合形成的合成缺陷也包含真实工况下的实际缺陷均由LabelImg完成标注标签格式为标准XML可直接接入Faster R-CNN、YOLO等主流目标检测框架。压缩包共2000个XML标签文件大小约36.3MB文件命名保留原始视频帧来源信息便于按需筛选图像并回溯对应视频帧也有助于按来源划分训练集与测试集。目前已有564人学习下载既可用于模型训练、算法验证也可作为高校电力视觉课程的教学实验数据合成缺陷与真实缺陷的混合标注能帮助模型适应不同红外成像条件下的过热表现提升泛化能力整体是一份紧凑、规范且实用的专业数据集。1. 输电线路红外过热检测2000张标注图里藏着两类缺陷先分清再动手做过输电线路红外巡检的工程师都知道真正耗时间的不是飞完一条线而是回来翻几万帧热像图找发热点。项目现场一般用无人机或手持红外设备扫线夹、耐张管、绝缘子串回传数据后靠人工一帧帧看眼睛盯久了连正常设备都觉得在发热。这个“输电线路红外过热检测图像数据集”给的就是这条流水线的中间环节2000多张带VOC标签的红外图像标注了过热缺陷而且缺陷本身分成两类——图像融合产生的伪缺陷和真实发热缺陷。这意味着它不只是拿来训练一个目标检测模型更逼着你处理一个工程上天天遇到、但公开数据集很少正视的问题怎么让模型分清“算法融合出来的假热点”和“真要派人去检修的真热点”。适合谁正在做电力巡检视觉方案、手头缺红外标注数据、或者想验证检测模型抗干扰能力的团队这份数据可以直接顶上。2. 红外图像和两类过热缺陷先搞懂“融合假象”和“真实发热”在图像上的本质区别2.1 红外热像图的数据特点不是普通灰度图是温度场的量化输电线路红外检测用的热像仪输出的是辐射温度矩阵。常见设备如FLIR、海康微影、大疆热成像原始数据通常是16位每个像素对应一个温度值。公开数据集为了压缩体积和方便用常规深度学习框架一般转成8位灰度图或伪彩图。这里有个重要差别8位灰度图丢掉了绝对温度只保留相对温差。同一个线夹早上拍和下午拍灰度分布完全不同,因为环境温度变了。红外图像另一个特点是噪声结构特殊。热像仪有固定图案噪声FPN、坏点还有大气衰减造成的边缘模糊。输电线路场景里导线、铁塔在天空背景下呈现高对比但天空的云层温度、地面植被的反射都会混进图像。检测模型如果只学纹理特征很容易把高温背景当成缺陷。这个数据集既然叫“红外过热检测”样本的成像质量决定了方案选型。我拿到任何红外数据集第一步不是看标注框而是看图像的动态范围和噪声水平。动态范围太窄比如所有像素挤在200-255之间说明预处理做过分段线性拉伸这时候你要么恢复原始映射要么统一用同样的拉伸参数否则训练和推理的预处理不一致性能必然波动。2.2 融合缺陷 vs 真实缺陷为什么必须分开对待标题里最值得琢磨的是“其中过热缺陷包含图像融合形成的缺陷和真实缺陷”。结合电力巡检的实际情况这里的“图像融合”指的是红外与可见光图像的配准融合。项目方为了给运维人员提供直观对比常把红外图叠在可见光图上。融合算法如小波变换、拉普拉斯金字塔、基于深度学习的语义融合都会在边缘错位、运动目标、视角差异大的区域产生伪影。这些伪影在亮度上和真实过热点很像容易被检测模型误判。所以这个数据集的标注不会只有一个“过热缺陷”类。合理的猜测是融合缺陷样本标了一类真实缺陷标了另一类或者用扩展属性区分。检测模型如果只学“有过热特征就报警”会把融合算法的边缘伪影当成故障误报率直接爆表。真正的工程需求是模型输出中要么过滤融合缺陷要么单独标出一类让后端的告警系统决定是否派工单。从训练策略上说这两类样本不能简单混在一起。我一般建议先做一个三分类检测背景、真实过热缺陷、融合伪缺陷。推理阶段只对真实过热缺陷触发告警。如果你想二分类缺陷/正常那意味着你得在标注时把所有融合缺陷区域处理成背景或者干脆不用融合图训练。这个数据集的标注者把它们独立标出来本身就是为分类消融做的准备。2.3 VOC标签结构一个xml文件里到底存了什么VOC格式是目标检测最常见的标注格式之一整个数据集围绕Anotation、JPEGImage两个目录组织。每个xml文件对应一张红外图像先看一个典型结构annotation folderJPEGImages/folder filenameinfrared_0001.jpg/filename path/data/infrared_0001.jpg/path source databaseUnknown/database /source size width640/width height512/height depth3/depth /size segmented0/segmented object namereal_defect/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin120/xmin ymin80/ymin xmax190/xmax ymax150/ymax /bndbox /object /annotation这段xml的读法是size里是三通道红外图转伪彩图后保存为jpgbndbox给了缺陷的边界框name是类别名。注意depth为3而不是1说明图像已经转成三通道形式,大概率是伪彩图或者灰度图复制三通道。truncated和difficult是VOC标准字段truncated表示目标被图像边界截断difficult表示难以识别。这两个字段在做数据划分时值得关注difficult1的样本如果进测试集评估mAP时会带来噪声一般建议过滤掉。解析xml这一步没有技术难度但有个习惯必须养成拿脚本统计一遍所有xml确认类别数量、每类样本数、标签框尺寸分布。别急着训练。你至少要知道这个数据集里融合缺陷和真实缺陷的比例是多少。如果融合缺陷只有几十个框那它只能当辅助训练样本不能单独作为一类训练否则类别不均衡会把模型带偏。3. 把VOC数据集变成YOLO可训练的格式目录、脚本和三个边界问题3.1 目录结构先想好怎么组织别等训练时报错再改VOC原始组织方式通常是这样下载下来解压后你会看到VOC2008/ ├── Annotations/ # xml标签 ├── JPEGImages/ # 红外图像jpg或png ├── ImageSets/ │ ├── Main/ # train.txt, val.txt 等 │ └── 其他子目录有的包没有大多数检测框架YOLOv5/v8、MMDetection不能直接消费VOC格式需要转成各自的格式。在动手转换前第一步是做数据划分。VOC的方式是ImageSets/Main里放txt文件每行一个不带扩展名的文件名比如infrared_0001 infrared_0002 infrared_0003划分要避免一个坑同一个设备的红外图往往来自同一段连续拍摄直接随机划分会导致训练集和验证集高度相似验证集mAP虚高。正确做法是按拍摄批次划分。这个数据集没有提供设备ID信息退而求其次的做法是按文件名前缀分组前缀相同的图像必须进同一个集合。先看一眼文件名如果是infrared_0001.jpg这种纯序号命名那只能随机划分但要在心里打个折扣——这个mAP可能略乐观。3.2 写VOC转YOLO脚本注意坐标归一化和difficult字段YOLO的标注格式是纯文本class_id x_center y_center width height所有坐标相对于图像宽高归一化范围0~1。转换脚本是数据流水线里最必须的一步同时也是翻车最多的一步。多数时候问题出在坐标归一化时忘记除以宽度而不是高度或者xml里xmin大于xmax导致负宽度。import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, out_txt_path, class_names): 将单个VOC xml转换为YOLO格式txt class_names: 类别名列表, 如 [real_defect, fusion_defect] tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.iter(object): # 过滤difficult样本, 避免训练时引入噪声 difficult int(obj.find(difficult).text) if difficult 1: continue name obj.find(name).text if name not in class_names: continue class_id class_names.index(name) bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) # 防御性检查: 有些标注框可能越界, 裁剪到图像范围内 xmin max(0.0, min(xmin, img_w - 1)) xmax max(0.0, min(xmax, img_w - 1)) ymin max(0.0, min(ymin, img_h - 1)) ymax max(0.0, min(ymax, img_h - 1)) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h box_w (xmax - xmin) / img_w box_h (ymax - ymin) / img_h # 过滤掉尺寸过小的标注: 面积小于图像0.01%的目标对训练无意义 if box_w * box_h 0.0001: continue lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) with open(out_txt_path, w) as f: f.write(\n.join(lines))逻辑说明脚本核心就是把xml里的绝对坐标xmin, ymin, xmax, ymax换算成YOLO要求的归一化中心点坐标和宽高。代码里做了三道保险第一跳过difficult样本这类目标本身标注质量差进训练集只会让loss震荡进验证集会拉低mAP第二把坐标裁剪到图像范围内因为有些标注工具的框会超出图像边界不裁剪会出现中心点坐标大于1或宽高超过1的非法输入第三过滤面积过小的框infrared场景中一个只有20x20像素的标注框在640分辨率下完全没有学习价值。参数说明class_names的顺序决定了模型输出的类别编号这个顺序一旦确定就不要改否则训练好的模型输出类别和实际含义对不上。比如固定用[real_defect, fusion_defect]那么推理时类别0是真实缺陷类别1是融合伪缺陷。box_w * box_h 0.0001这个阈值按图像分辨率调整640x512的图对应约33个像素如果你觉得过滤太狠改成0.00001也行但太小面积的目标训练时会被当成噪声。3.3 自动扫描数据集的边界问题类别均衡、图像后缀和损坏文件写完转换脚本后跑一遍全量扫描不要只看输出文件生成了没有。我习惯检查三个维度第一类别数量分布。统计labels目录下每个class_id出现次数。如果fusion_defect类别的样本数不足real_defect的20%后续训练中要针对少数类做过采样或者用focal loss否则模型会偏向多数类。第二图像后缀兼容性。纯红外数据集的原始文件可能是.tif或16位.png但VOC数据集转出来通常是.jpg或8位.png。运行训练前用一行代码确认所有图像能被OpenCV正常读入python -c import cv2, glob for img in glob.glob(JPEGImages/*.jpg): m cv2.imread(img) assert m is not None, img assert m.shape[2] 3, img print(imread ok:, len(glob.glob(JPEGImages/*.jpg))) 如果个别文件读不出来多半是文件头损坏或保存时色彩空间异常直接剔除并同步删掉对应的xml和txt标签。不要留着让训练跑到一半爆一个AssertionError。第三图像路径一致性。VOC xml里的path字段经常和实际部署路径不一致训练框架一般不会读这个字段YOLO按txt里列出的相对路径找图像但MMDetection的VOCDataset会校验。转换完后跑一次find命令确认labels目录里每个txt名称都能在JPEGImages里找到对应图找不到就输出警告。4. 训练检测模型YOLOv8最小配置、红外数据增强和融合缺陷的消融思路4.1 模型选型为什么骨架选择YOLOv8而不是更老版本2024年后再做目标检测除非有硬件限制或必须用TensorRT老版本否则不要再用YOLOv5或更早的Darknet框架。YOLOv8的anchor-free头在检测小目标红外热斑在整幅图里往往很小上表现更稳定而且官方仓库自带VOC标签转换和评估脚本减少造轮子的时间。如果你有GPU且能忍受更慢的推理YOLO11或RT-DETR也可以但要处理更多部署细节。输电线路红外检测任务有一个特殊性单张图里目标数量少通常只有1~3个缺陷但图像分辨率可以很高如640x512也有1280x1024的原始图。训练时不要直接resize到640x640这样会丢掉大量细节。先用保留宽高比的letterbox缩放到640或800能减少红外热斑的形变。4.2 训练配置文件与超参选择先用一个最小可跑的YOLOv8配置起手以下是数据配置文件# infrared_yolo.yaml path: ./ir_dataset train: images/train val: images/val test: images/test nc: 2 names: [real_defect, fusion_defect]训练命令yolo detect train \ --data infrared_yolo.yaml \ --model yolov8s.pt \ --epochs 100 \ --imgsz 800 \ --batch 16 \ --patience 20 \ --mosaic 0.2 \ --augment \ --device 0关键参数说明--mosaic从默认的1.0降低到0.2甚至关闭是红外小目标训练的关键技巧。mosaic把四张图拼在一起缩放会让原本就小的热斑目标缩得更小正样本特征被破坏。如果你发现训练集loss降不下去先怀疑mosaic。--imgsz 800比640多一些细节但显存占用相应增加你的图像如果是640x512原生分辨率800是合理的选择如果原图是1024级别直接设960。--patience 20防止过拟合——前20个epoch验证集mAP没有提升就早停省时间。这类数据集的正常训练周期没那么玄。2000张图、2个类别显卡用RTX 3090或4090级别100个epoch大约一到两小时跑完。如果loss曲线在前30个epoch完全不动大概率是标签文件生成出了问题回头查第3章的脚本。4.3 红外图的数据增强不要照搬ImageNet那套通用目标检测的数据增强随机裁剪、HSV扰动、随机翻转对红外图像有一些水土不服。红外图没有颜色信息伪彩图除外HSV扰动实际上是在折腾调色板映射而不是物理温度变化。更合理的增强策略是模拟温度漂移# infrared_aug.py import albumentations as A import numpy as np def get_infrared_aug(p0.5): transforms A.Compose([ # 模拟环境温度变化: 整图加一个随机偏置等价于温度整体升降 A.RandomBrightnessContrast(brightness_limit0.15, contrast_limit0.2, p0.5), # 模拟大气衰减导致的边缘模糊 A.GaussianBlur(blur_limit(3, 5), p0.3), # 模拟热像仪固定图案噪声 A.GaussNoise(var_limit(20.0, 40.0), p0.4), # 小目标场景用随机仿射旋转不要太大10度以内 A.Affine(scale(0.9, 1.1), translate_percent(-0.1, 0.1), rotate(-10, 10), p0.5), ], bbox_paramsA.BboxParams(formatyolo, label_fields[class_labels])) return transforms这段代码给训练管线加的是“域随机化”。RandomBrightnessContrast模拟的是不同时间、不同环境温度下拍摄的红外图整体亮度偏移这是户外巡检数据最常见的差异来源GaussianBlur对应长焦镜头的大气扰动和失焦红外相机的对焦往往不如可见光相机可靠GaussNoise模拟传感器噪声让模型不至于过度依赖几个孤立的高温像素点Affine控制在10度以内因为铁塔和导线的结构有强方向性旋转过大反而会让模型学到错误的空间先验。使用肉眼下看一眼标注框在增强后是否仍然对齐。BboxParams(formatyolo)要求输入坐标是归一化格式和3.2节生成的txt一致。融合缺陷样本的另一个用法是训练一个独立的“伪缺陷判别器”。在训练主检测器之外把fusion_defect类别单独抽出来训练一个二分类网络是真实缺陷还是融合缺陷主检测器输出的候选框送进这个二分类器做二次过滤。这种两段式方案在误报率控制上比单模型调阈值更稳——因为融合缺陷和真实缺陷在红外特征上高度相似单模型很难用一个置信度阈值同时压低假阳性和保住召回率。5. 避坑记录红外过热检测数据集最容易翻车的5个地方5.1 现象把红外图当普通灰度图训练mAP一直上不去原因红外图像不是自然图像。VOC数据集里的jpg虽然读出来是三通道但如果是“灰度图复制三通道”那么三个通道完全一样卷积核那么多数量的参数都在学重复信息模型容量被浪费。更麻烦的是如果图像是伪彩图比如铁红/彩虹调色板模型的底层特征会误把颜色映射关系当语义特征。解决用YOLO训练时把图像强制转成单通道再复制三通道或者用convert_imagegray之类的预处理让模型只从亮度布局学特征。实测后者训练更稳定推理也更快。5.2 现象融合缺陷样本太少模型把融合伪影当成真缺陷原因类别不均衡。数据集只有2000多张图如果fusion_defect的实例数远少于real_defect模型只能见到两三成融合缺陷样本自然学不会区分。解决不要硬训两个类。把标签合并成一个defect类训练完后再用规则过滤融合缺陷——融合伪影通常在可见光和红外图的边缘错位区域可以统计候选框周围梯度方向一致性来排除。或者反向操作把真实缺陷中特征明显的样本抽出来作为“强正样本”融合缺陷全部作为背景模型知道真实缺陷长什么样就够了。5.3 现象验证集mAP不错但部署到无人机视频流时误报率飙升原因训练集来自相对规范的红外图固定调色板、固定融合算法而推理时图像来自不同相机或不同融合参数红外图像对成像参数极其敏感——灰度映射范围一变整个图像分布就平移了。解决训练时做域随机化在预处理里随机改变灰度映射的斜率和截距让模型面对各种对比度都能抓到结构特征。另一个习惯是部署前采集一段现场视频跑一遍模型统计误报类别分布大多数误报会集中在融合伪影上这时可以压低对应类别的输出权重。5.4 现象标注框中心定位不准导致loss不稳原因红外热斑是柔和的高斯状亮斑没有清晰边缘不同标注者框的位置可能有几十个像素的偏差。尤其是在导线和线夹区域热扩散让缺陷看起来比实际金属部件大。解决训练时关闭mosaic和mixup——这两种增强方式会拼接多个目标如果标注框本身偏移几个像素拼接后目标边界更加混乱。同时把box_loss_gain调低一些从7.5调到5左右减少边界框精度的权重把重心放在分类正确率上。5.5 现象图像是16位原始数据直接用常规深度学习框架读不了原因很多红外热像仪保存的是16位单通道温度数据而VOC标签里的depth如果是3那表示数据集已经做过一次转换。如果你的原始数据是16位想并入这个VOC数据集一起训练不要直接把16位图塞进网络模型从来不关心温度的绝对数值只关心相对温差。正确做法是做一个裁剪到感兴趣温度区间比如20℃~150℃的线性映射转成8位灰度图再参与训练。这个温度区间如何选最稳的是统计每张图的温度直方图取5%~95%分位数之间的范围。6. 进阶用法给检测模型加一个“温度熔断”后处理数据集里既然标了真实过热缺陷我可以顺手教大家一个部署时提高告警准确率的技巧用温度信息做后处理熔断。红外图像如果有绝对温度值哪怕只是灰度值对应的大致温度范围真实过热缺陷对应的灰度均值一定显著高于周围背景而融合缺陷往往不具备这个特性。def temperature_fuse_filter(pred_boxes, grayscale_img, temp_range(30, 150)): 对检测结果做温度熔断: 候选框内平均灰度需高于全图灰度背景的某个比例, 否则视为融合伪缺陷 grayscale_img: uint8灰度图, 对应cmap映射前的红外亮度 keep [] for box in pred_boxes: x1, y1, x2, y2, conf, cls box region grayscale_img[y1:y2, x1:x2] if region.size 25: # 框太小, 无法判断温度统计量 continue # 背景取框周围向外扩1倍的环形区域 bx1 max(0, int(x1 - (x2 - x1) * 0.5)) by1 max(0, int(y1 - (y2 - y1) * 0.5)) bx2 min(grayscale_img.shape[1], int(x2 (x2 - x1) * 0.5)) by2 min(grayscale_img.shape[0], int(y2 (y2 - y1) * 0.5)) bg_region grayscale_img[by1:by2, bx1:bx2] # 用中位数而非均值, 避免框内融入了导线这类高亮背景 fg_med np.median(region) bg_med np.median(bg_region) if fg_med bg_med * 1.15: # 亮度高15%以上才可能是真实过热 keep.append(box) return keep这个函数的核心逻辑是计算候选框内的灰度中位数和周围背景的中位数真实过热缺陷因为热扩散区域内的亮度会显著高于周边而融合缺陷是图像拼接的产物灰度差异往往来自可见光纹理亮度和背景之间没有稳定的温差规律。1.15这个系数需要根据你那张图的灰度和温度映射关系调如果灰度范围是0~255对应-20℃~200℃15%的灰度差大约是33℃对过热缺陷来说已经算保守了。我自己拿到红外数据集现在形成习惯的顺序是先标一遍类别比例再验证温度映射关系最后才决定训练策略。如果是用来做算法比赛可以只关注mAP但如果要落地到巡检流程里宁可牺牲一点召回率也要把误报压下因为误报意味着维护人员白跑一次塔位。这个数据集的“融合缺陷”标签放在整个流程里看就是帮你做这一步的。希望帮到你。本文还有配套的精品资源点击获取