简介:这是一套面向电力视觉检测与智能巡检场景的数据集资源,聚焦变电站红外图像中电流互感器(TC)、电压互感器(TP)等关键设备的检测识别,适合从事目标检测、YOLO系列模型训练或电力设备自动巡检研究的学习者与算法工程师。压缩包共2000个文件,主要包含txt格式的YOLO标注、xml格式的VOC标注以及jpg红外图像文件,整体大小32.75MB,目录结构清晰,可被常见检测框架直接读取。数据覆盖7个类别,具体包括Chave_H_230kV、Chave_V_230kV、DISJUNTOR、Pararraio_69kV、Pararraio_230kV、TC、TP,累计标注框1715个,并提供889张标注图像,适合用于模型训练、验证和迁移学习。所有标注由labelImg工具完成,便于核对标签或按需扩充。目前已有551人学习,可作为电力场景红外目标检测实验与项目落地的数据基础。
1. 电力场景红外数据集:为什么互感器检测比可见光难一个量级
变电站红外巡检图里,电压互感器和电流互感器是最常见的检测对象,也是最容易让通用目标检测模型翻车的一类目标。可见光下轮廓清晰的互感器,到了红外图像里只剩温度分布形成的亮度块,没有纹理、没有颜色、边缘模糊,同类设备之间还可能互相遮挡。电力场景变电站红外图像电压电流互感器检测数据集把889张真实红外图、7类目标和VOC、YOLO双格式标注打包在一起,专门解决做电力巡检检测时「有场景、没数据」的窘境。做算法落地的人不用再从零开始攒数据、标数据,可以直接训练和评估检测模型。这篇笔记把数据集构成、格式转换、训练配置和踩坑经验一次讲清楚。
2. 数据的真实构成:889张图、7个类别与两种标注格式的关系
拿到压缩包不能当普通目标检测数据处理。电力红外场景有几个特殊点:图像是灰度热力图映射成伪彩、目标排布密集、不同变电站的设备外形差异大。动手训练之前,先把数据集的三个基本面想清楚:两种标注格式各自怎么用、7个类别怎么划分、889张的规模在电力场景下意味着什么。
2.1 VOC和YOLO双格式并存:同一个检测项目为什么要两份标注
VOC和YOLO两种标注格式,核心区别在坐标表达。VOC的XML文件用绝对像素坐标描述目标框,xmin、ymin、xmax、ymax四个整数直接对应原图位置,人可以读、可以改,标注工具普遍支持导入导出。YOLO的TXT文件是归一化相对坐标,每行五个值,第一个是类别索引,后面四个依次是中心点x、中心点y、宽w、高h,全部在0到1之间。训练框架直接消费这种紧凑格式,不需要加载时再做坐标换算。
双格式并存不是冗余,而是工程上的后悔药。我的习惯是XML永远作为标注母版保留,训练前再统一转成目标框架需要的格式。原因很直接:XML里的绝对坐标信息完整,任何时刻都能重新生成其他格式;而TXT一旦转换过程出错(比如除以了错误的分母),原始坐标信息就丢了,再想恢复只能重新标注。VOC格式还可以随时可视化检查,YOLO的TXT满屏小数,肉眼几乎不可能发现某个框坐标错乱。
先看两张图各自的标注长什么样:
# 查看一张图的VOC标注内容 cat Annotations/IMG_0001.xml# 查看对应YOLO标注文件 cat labels/IMG_0001.txtXML里是完整的object节点列表,每个节点包含类别名和bndbox坐标;TXT里则是一行一个目标,稀疏的小数串全靠顺序解释含义。从VOC转YOLO的数学关系是:
cx = (xmin + xmax) / 2 / W cy = (ymin + ymax) / 2 / H w = (xmax - xmin) / W h = (ymax - ymin) / H
其中W和H是图像的真实像素宽度和高度。数学上很简单,但工程上有两个细节容易出错:一是XML里的坐标可能经过了标注工具的缩放,二是图像读取库返回的宽高顺序不同,这两个问题在第5章避坑部分展开。
| 对比项 | VOC XML | YOLO TXT |
|---|---|---|
| 坐标形式 | 绝对像素坐标 | 归一化相对坐标 |
| 可读性 | 人类可读可编辑 | 适合程序消费 |
| 附加属性 | 支持difficult等标记 | 只有类别索引和框 |
| 工程定位 | 标注母版,长期保留 | 训练输入,按需生成 |
2.2 7个类别对应的红外特征与可见光差异
在红外图像里,互感器和背景的区分几乎不靠边缘轮廓,而是靠发热规律。电流互感器在负载电流通过时内部导体发热明显,红外特征通常是沿设备轴向出现一条亮温带;电压互感器正常运行温度相对稳定,热特征更多体现在瓷套和油箱部位的温度梯度。7个类别如果是按设备类型加相位划分,常见的形式是A相电压互感器、B相电压互感器、C相电压互感器、A相电流互感器、B相电流互感器、C相电流互感器,以及第7类组合式互感器或关联的独立设备。
这种类别划分对模型训练有直接影响:同一类型不同相位的设备,红外外观高度相似;不同类别之间反而可能因为安装位置接近、热辐射互相影响而难以区分。模型真正要学习的是热分布的几何模式,而不是伪彩颜色本身——伪彩映射是固定的,换了调色板整张图都变,模型如果依赖颜色特征就会翻车。这也是红外数据集和可见光数据集在增强策略上的本质区别。
红外图像还有一个和可见光很不一样的特点:动态范围。可见光图是8bit(0到255灰度),红外相机输出通常是14bit或16bit的原始热辐射数据,再映射到8bit显示。数据集里的JPG和PNG已经是映射后的8bit图像,映射方式和相机增益、环境温度补偿直接相关。同一台设备在夏天和冬天、白天和夜间的红外表现差异很大,模型训练时要注意数据是否覆盖了这些工况。如果889张图像来自同一季节或同一时段,模型在极端温度下的泛化能力就要打折扣。
红外巡检图还有一个不可忽视的特点:拍摄距离和角度受限。巡检机器人的机位通常在固定高度和角度,互感器的红外图像多数是侧视或俯视视角,和可见光监控的俯拍视角差异很大。这意味着模型学到的视角特征在换机位后就失真,训练数据如果想覆盖多机位,需要在数据采集阶段刻意变换机位。
2.3 889张的规模在电力视觉任务里够用吗
889张图对通用检测数据集来说规模很小,但对电力巡检这类封闭场景是可用的起点。变电站的设备品类固定、拍摄机位固定、背景相对单一,模型需要学习的模式复杂度远低于开放世界检测。经验判断是:如果在这889张上训练后mAP@0.5达不到0.85以上,先不要急着追加数据,更大的概率是标注质量或训练配置出了问题。
小数据集的连带效应有三个值得提前知道。第一,模型容易过拟合,训练损失一路走低、验证损失反弹是常态。第二,验证集指标波动大,随机划分的训练集和验证集里,某些类别可能只有十几个验证实例,一个框的错判就能让指标跳几个点。第三,类别不平衡被放大,7个类别里的高频类别可能占了一半以上标注实例,低频类别几乎学不到。面对这三个问题,不能指望加训练轮次,要靠合理划分、交叉验证和针对性的数据增强。
用一个简单命令统计类别分布:
# 统计YOLO标注中每个类别的实例数量 awk '{print $1}' labels/*.txt | sort | uniq -c | sort -rn这个命令的输出会告诉你7个类别在全部标注中出现的次数。做这一步的意义是提前预判类别不平衡的程度,不平衡问题不是靠训练技巧能彻底解决的,最有效的还是在数据层面做均衡。
3. 把VOC+YOLO标注变成可训练数据:转换与校验的完整流程
数据集的正确打开方式不是解压后直接开训,而是先做一次格式审计。红外数据集的审计重点在坐标一致性和文件匹配度上:红外相机的分辨率、调色映射、ROI设置都可能影响图像的最终尺寸,标注坐标如果基于另一个尺寸生成,检测框就会偏移。这一章讲清楚从目录组织、转换脚本到校验检查点的完整流程。
3.1 目录结构与标注文件的对应关系
数据集解压后,常见的组织方式有两套。VOC风格的目录通常是JPEGImages放图、Annotations放XML、ImageSets/Main放训练验证集划分文件;YOLO风格的目录是images放图、labels放TXT。两者并存时最怕文件名对不上:某张jpg存在但对应xml或txt缺失,或者文件名前缀一致但扩展名大小写不同。
我训练前必做的一步是写文件清单核对脚本,把图像文件名集合和标注文件名集合做差集,手工核对有图无标注或有标注无图的条目。这一步不需要什么复杂工具,但能避免训练框架在数据加载阶段才报错。900张级别的遍历很快,差集输出到文本文件几秒钟就能扫完。写差集脚本时注意一个问题:有些数据集按文件名前缀区分train/val,前缀截取规则错了会把所有文件判成缺失,先打印前10个文件名人工确认一下。
3.2 写一个转换脚本统一训练格式
如果你决定用YOLO系框架训练,而手头的标注是VOC格式,或者想重新生成TXT(比如修复之前转换的错误),写一个稳健的转换脚本是必要的。下面是我常用的一段转换逻辑,兼容处理了坐标越界和文件名匹配问题:
import os import xml.etree.ElementTree as ET import cv2 def voc2yolo(xml_path, img_dir, out_dir, class_names): # 解析VOC标注XML文件 tree = ET.parse(xml_path) root = tree.getroot() # 用XML里的filename定位图像文件 img_name = root.findtext('filename') img_path = os.path.join(img_dir, img_name) # 读取图像真实尺寸,OpenCV返回的shape是(H, W, C) img = cv2.imread(img_path) if img is None: print(f'图像读取失败: {img_path}') return False H, W = img.shape[:2] lines = [] for obj in root.findall('object'): name = obj.findtext('name') if name not in class_names: print(f'未知类别: {name},跳过该目标') continue cls_id = class_names.index(name) box = obj.find('bndbox') xmin = float(box.findtext('xmin')) ymin = float(box.findtext('ymin')) xmax = float(box.findtext('xmax')) ymax = float(box.findtext('ymax')) # 归一化后用clip裁剪,防止坐标蹿出[0,1]区间 cx = min(max(((xmin + xmax) / 2) / W, 0.0), 1.0) cy = min(max(((ymin + ymax) / 2) / H, 0.0), 1.0) w = min(max((xmax - xmin) / W, 0.0), 1.0) h = min(max((ymax - ymin) / H, 0.0), 1.0) lines.append(f'{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}') # 输出TXT文件名与图像同名,放在out_dir下 out_path = os.path.join(out_dir, os.path.splitext(img_name)[0] + '.txt') with open(out_path, 'w') as f: f.write('\n'.join(lines)) return True这段脚本的逻辑是:解析XML定位图像文件,用OpenCV读取原始宽高,逐个object节点解析坐标,归一化后做越界裁剪,最后写TXT。几个参数的含义:xml_path是单个VOC标注文件路径;img_dir是图像目录;out_dir是TXT输出目录;class_names是类别名列表,顺序决定类别id,这个顺序必须和第4章数据集配置文件里的names保持一致。
调用方式可以写一个遍历脚本,对Annotations目录下所有XML循环执行。需要注意的一个细节是XML里的filename字段可能写死成jpg,但实际图像是png;这里最好以图像目录下真实存在的文件为准,不要盲信XML里的字符串。
提示:转换脚本中的class_names顺序就是训练阶段的类别id,后续改了顺序,所有已生成的TXT都要重新转换,否则类别标签全部错位。
3.3 数据校验的四个检查点
转换完成后不要急着开训,我用四个检查点把关。一是文件数量对齐,图像目录和TXT目录的文件数要完全一致。二是坐标范围检查,写一段脚本读所有TXT,确认每行数值都在0到1之间,没有负数或大于1的越界值。
三是人工抽查,随机选20张图,用OpenCV把标注框画到原图上另存,用看图工具过一遍,确认框的位置和大小符合直觉。这一步最不能省,红外伪彩图上人眼辨别设备需要一点经验,但框完全偏离目标区域的情况还是一眼能看出来。
四是类别分布检查,用2.3节提到的awk命令统计各类别实例数量,对照7个类别的业务重要性判断是否需要做增强。如果我画出来的框普遍偏移,优先怀疑XML坐标参考系和图像尺寸不一致,而不是怀疑脚本写错了——脚本里的除法逻辑很简单,出错概率远低于数据本身的质量问题。四种检查全部通过后,数据集才算真正进入可训练状态。
4. 用YOLO训练红外互感器检测模型:最小可跑通的配置
这一章给一套能在889张红外图上直接跑通的最小配置。框架选择以YOLO系为例,因为双格式数据集中YOLO格式可以直接输入,训练命令短,参数调起来直观。如果你用的是其他检测框架,原理相同,配置文件写法按框架调整。
4.1 YOLO训练前的数据集配置文件
第一步是写数据集yaml。下面是一个最小可跑通的配置:
path: /data/infrared_transformer # 数据集根目录 train: images/train # 训练图像目录 val: images/val # 验证图像目录 nc: 7 # 类别数,和标注类别索引对应 names: 0: PT_A 1: PT_B 2: PT_C 3: CT_A 4: CT_B 5: CT_C 6: COMBO这个文件里最容易被忽略的是names顺序。yaml里的names顺序必须和3.2节转换脚本里的class_names顺序完全一致。如果转换脚本里写的是['PT_A','PT_B',...],这里就不允许改成按字母排序,否则TXT文件里类别索引对应的实际类别就错位了。模型训练时不会报错,因为类别只是索引,但推理出来的框全部标错类别名。
4.2 关键训练参数的设置逻辑
红外小数据集训练YOLO,参数设置逻辑和通用场景不太一样。批量大小batch不要一味求大,889张图用batch=16时一个epoch只有约55个step,模型还没充分收敛就容易过拟合。我的一套经验参数:
yolo train data=infrared.yaml model=yolov8n.pt epochs=150 batch=16 imgsz=640 patience=30model选择yolov8n.pt而不是更大的s或m版本,原因有二:红外图像目标形态简单,小模型的容量足够拟合;889张的小数据集撑不起大模型的训练,参数越多过拟合越快。epochs设150配合patience=30早停,验证集指标连续30个epoch不提升就停止,避免浪费时间。imgsz=640是分辨率和显存的折中方案,如果红外原图是640x512或更低,训练时会等比缩放补到640。
数据增强参数在小数据集上需要单独调。yolo默认开启mosaic拼接,在红外小数据集上有利有弊:好处是四张图拼一张,等效扩充样本量;坏处是红外图像目标本来就小,mosaic拼接后目标更小,而且变电站背景相似,模型容易学到拼接缝这种伪特征。我通常这样调整:
yolo train data=infrared.yaml model=yolov8n.pt epochs=150 batch=16 imgsz=640 \ mosaic=0.3 close_mosaic=10 copy_paste=0.2mosaic=0.3保留较低概率的拼接增强,close_mosaic=10表示最后10个epoch关闭mosaic回归真实数据分布,让模型在收敛阶段看到的是正常构图。copy_paste=0.2把同类目标复制粘贴到同图其他位置,这个操作对设备类目标效果好,因为设备是可分离的刚性物体,复制过去不会破坏语义。
注意:patience早停对小数据集是把双刃剑。验证集太小导致指标抖动剧烈时,早停可能提前终止一个本来还能涨的模型。遇到这种情况建议先关掉patience跑一轮完整训练,看最终指标再决定要不要调回去。
4.3 训练日志怎么看、过拟合怎么判断
训练时界面输出的指标很多,重点盯三个:train/box_loss、val/box_loss和metrics/mAP50。判断过拟合不能只看训练损失,要看训练损失和验证损失的剪刀差。红外小数据集上典型的过拟合过程是:训练损失一路降到很低,验证损失在某个epoch开始反弹,mAP50随之停滞甚至走低。此时优先减少模型规模或加大增强强度,而不是继续增加epochs。
因为验证集小,mAP50曲线会很抖。只看最后一个epoch的指标容易误判,要看连续10轮的平均趋势。这也是我偏好用交叉验证来评估模型的原因——889张图拆成5折,每一折约711张训练、178张验证,五次训练取指标的均值和标准差,这个评估结果比单次划分可信得多。时间成本高一点,但最终判断模型好坏时省下的时间远多于多跑的几次训练。
红外图像预处理的一致性也会影响训练效果。训练YOLO时默认会把图像归一化到0到1,伪彩映射方式已固化在图像像素里,不需要额外处理。但如果你的图像是16bit灰度图,需要在数据加载阶段转成8bit,并且要保证训练和部署时使用相同的缩放方式。16bit到8bit的映射如果不一样,模型学到的特征分布和实际推理时的输入分布就对不上,这个点属于部署期容易踩的坑。
5. 避坑与排查:红外互感器检测里五个绕不开的坑
这一章写我处理电力红外检测数据时反复遇到的五个坑。每条都是现象、原因、解决的完整链路。这些坑不会同时出现在每一次实验里,但任何一个都足以让模型指标好看而实际不可用。
5.1 标注框偏移:VOC转YOLO坐标归一化的翻车现场
现象:训练完成后推理,检测框总是整体偏离目标位置,偏移方向还随目标在画面中的位置变化。 原因:最常见的是XML里的坐标经过了标注工具缩放,但转换脚本里读取的却是原始图像的宽和高。比如标注工具导出XML前把图从1280压缩到640,XML里的坐标对应的是640尺寸的像素,而脚本里读的图像可能是1280原始图,归一化后所有框的坐标比例都错了。 解决:转换前先抽取几张图,打印XML原始坐标和图像实际尺寸,人工比对确认坐标参考系一致。另一个更稳的做法是在标注阶段锁定图像分辨率,所有图像统一缩放到同一个尺寸后再标注,这样XML坐标的参考系就永远是统一的。
5.2 类别不平衡:7个类别里高频类占了大半
现象:训练完只有一两个类别的召回率正常,其余类别检测结果一塌糊涂,但整体mAP还说得过去。 原因:不同类别的标注实例数量差异大。电力巡检的拍摄习惯决定了某些设备出镜率高,对应类别的实例数可能占了总量一半以上,低频类别被模型忽略了。 解决:先做实例数统计,对低频类别做针对性增强。过采样不是简单复制,要配合亮度扰动、翻转、小角度旋转,否则模型会对固定的增强样本过拟合。也可以调整YOLO的类别损失权重,把低频类别的权重调高,让模型在训练时更关注这些类。补数据时优先补低频类,而不是继续堆高频类的图像。
5.3 红外图像细节少导致mAP虚高
现象:训练集和验证集都来自同一个变电站,mAP刷到0.9以上,模型换到另一个变电站实测精度直接掉到0.5。 原因:同一变电站的背景高度一致,模型学到了设备支架、墙体、树木这些背景特征来辅助判断,而不是真正学会识别互感器。红外图像纹理少、目标特征弱,模型更容易走捷径去学背景,这是黑匣子模型在低信息量数据上的典型表现。 解决:训练时加大对背景的扰动,随机裁剪、亮度抖动、模糊增强都有效果。验证时按拍摄时间或变电站分组,用不同时段的图像做验证,比随机划分更能反映真实泛化能力。如果数据集中只有一个变电站的图像,至少按拍摄时间分组来评估。
5.4 训练集与验证集划分不当导致的数据泄漏
现象:验证集指标极高,训练曲线验证损失几乎不上升,实际部署效果却很差。 原因:随机划分时同一个设备的多个角度、多个时段的图像被同时分到训练集和验证集,模型等于提前看过了答案。 解决:按设备单体分组划分。先解析文件名中的设备标识,把属于同一个设备的所有图像放在同一组,然后按组做训练集和验证集划分。这样验证集的每一张图对应的设备在训练阶段都没出现过,指标才反映出真实泛化能力。数据量小时这个做法会牺牲一部分训练数据,但换来的是可靠的评估结果。
5.5 换设备部署时分辨率不一致带来的精度下跌
现象:训练用图像是640x512,部署现场相机输出800x600,模型精度明显下跌。 原因:红外图像在插值缩放时,热分布边缘的锐利度变化比可见光明显,目标原本模糊的边界变得更难判断。不同相机的测温范围、增益设置不同,伪彩映射差异也会造成分布偏移。 解决:训练阶段开多尺度训练,YOLO的scale参数随机缩放输入图像,相当于模拟不同分辨率的红外相机。同时用对比度扰动、非线性增益模拟来增强模型对伪彩映射差异的鲁棒性,让模型不依赖特定色调映射方式。部署时如果有可能,尽量让相机输出分辨率和训练数据一致。
6. 让模型在变电站场景真正落地:小样本扩充与迁移验证技巧
889张数据集的边界很清晰:作为起点完全够用,作为终点还差得远。要让模型在多个变电站之间通用,主要靠两个方向上做扎实——小样本扩充和跨域迁移验证。
小样本扩充方面,我实测效果最好的组合是:多尺度裁剪加MixUp,叠加少量复制粘贴增强。红外数据不能用通用颜色增强来凑,HSV扰动对伪彩图像的意义不大,要做非线性亮度映射——相当于模拟相机增益变化——这才能逼着模型去学结构特征而不是颜色分布。扩充的倍数不用贪,1.5到2倍就够了,盲目扩到5倍以上反而会让模型记住增强pattern,掉进新的过拟合坑里。
跨域迁移验证是检验数据集质量的秤砣。模型在一个变电站的数据上训练好,直接去推理另一个变电站的红外图,看这两类互感器召回率的变化。如果掉得厉害,先别急着怀疑数据量,大概率是训练时把背景特征也学了进去。我现在的习惯是每个模型版本都建一个验证记录,包含目标变电站的指标数据、失败案例截图、以及对比上一版的改动说明。下次迭代时翻记录就能知道这个版本到底在哪个环节有进步、在哪个场景又退步了,不用从头测一遍。
这个数据集真正值钱的地方不是889张图本身,而是把红外互感器检测从数据采集、格式转换到训练部署的完整链路走了一遍。后续你往这个方向补数据时,也会清楚该补什么——是补拍摄角度、补季节温度工况、还是补设备型号差异。带着这个判断去做数据建设,比盲目堆量踏实得多。希望帮到你。
本文还有配套的精品资源,点击获取