简介本资源为面向电力场景变电站设备检测的红外图像数据集适用于从事电力设备智能巡检、红外目标检测算法研究与教学的人员可解决互感器、避雷器等关键设备标注样本不足的问题。包内共2000个文件以891个txt标注文件、889个xml标注文件和220个jpg红外图像为主同时包含对应的VOC与YOLO双格式标注压缩包约32.75MB便于直接接入主流检测框架训练。数据集共889张图像标注7类设备涵盖TC、TP、Pararraio_230kV、Chave_V_230kV、DISJUNTOR等总框数1715其中TP与TC样本较多Pararraio_69kV等类别相对稀缺适合做类别不均衡实验。目前已有551人学习下载读者可获得完整标注体系、双格式转换基础与真实变电站红外场景样本用于模型训练、对比实验与算法验证。1. 电力场景变电站红外图像互感器检测889 张 VOCYOLO 数据集到底能干什么变电站里最容易被忽视、又最容易出事的设备往往不是那些嗡嗡作响的主变而是挂在构架上的电压互感器和电流互感器。它们长期高负荷运行接头氧化、内部受潮、绝缘老化都会先在表面温度上露出马脚。可见光摄像头拍不出来但红外热像仪能。问题在于靠人眼盯着一帧帧红外图找异常效率低、漏检高一个站几百个测温点巡检班根本看不过来。这就是「电力场景变电站红外图像电压电流互感器检测数据集VOCYOLO格式889张7类别」要解决的事——它把红外图像里的互感器目标框出来喂给 YOLO 这类检测器让模型替人做第一轮筛查。这个数据集的核心价值在于「红外 电力 互感器」三个限定词叠加。通用目标检测数据集里没有红外波段通用红外数据集里没有电力设备语义而电力设备检测的公开数据又大多集中在绝缘子、避雷器上专门针对电压/电流互感器的标注数据非常稀缺。889 张、7 个类别、同时提供 VOC 和 YOLO 两种格式意味着你可以直接拿它跑通一条从数据到模型的完整链路不用从零标注。适合谁做电力智能巡检的算法工程师、想入门工业红外检测的学生、以及需要快速验证 YOLO 在红外域迁移效果的研究者。下面我把这套数据从格式、类别、训练到踩坑按我实际跑过的顺序讲清楚。2. 先搞懂 VOC 与 YOLO 双格式889 张红外图的数据结构拆解拿到一个压缩包第一件事不是急着解压训练而是先搞清楚里面到底装了什么。这个数据集同时给了 VOC 和 YOLO 两种标注格式很多人会疑惑为什么要给两份直接给 YOLO 不就行了实际上VOC 格式是很多标注工具的默认输出保留它意味着你还能回溯原始标注信息、做格式转换验证甚至用 MMDetection 这类框架直接吃 VOC。理解两套格式的差异是后面所有操作的前提。2.1 VOC 的 XML 结构与 YOLO 的 TXT 结构差在哪VOC 格式每张图对应一个同名 XML 文件标注信息写在object节点里包含类别名、边界框的左上角和右下角坐标xmin、ymin、xmax、ymax坐标是绝对像素值。YOLO 格式则是每张图一个同名 TXT每行一个目标格式是类别索引 中心x 中心y 宽 高四个数值全部归一化到 0~1 之间。这个差异决定了你在写数据加载器时要不要做坐标变换。# 解析一张 VOC XML打印出所有目标框 import xml.etree.ElementTree as ET def parse_voc_xml(xml_path): tree ET.parse(xml_path) root tree.getroot() # 图片尺寸归一化时要用 size root.find(size) w int(size.find(width).text) h int(size.find(height).text) objects [] for obj in root.findall(object): name obj.find(name).text bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) objects.append((name, xmin, ymin, xmax, ymax)) return w, h, objects w, h, objs parse_voc_xml(000001.xml) print(f图像尺寸: {w}x{h}, 目标数: {len(objs)}) for o in objs: print(o)这段代码的关键点是先读size拿到图像宽高因为后面转 YOLO 格式时归一化必须用真实尺寸。findall(object)会遍历所有标注目标每个目标的name就是类别名。注意有些 VOC 文件的坐标可能超出图像边界实际转换时要加裁剪保护否则归一化后会出现大于 1 或小于 0 的值YOLO 训练时直接报错。2.2 7 个类别在红外图像里的分布特点7 个类别具体是什么需要你解压后看classes.txt或 XML 里的name字段确认。从电力互感器检测的常见标注习惯推断通常包含电压互感器、电流互感器以及可能按相别或电压等级细分的目标。红外图像的特点是目标边缘模糊、对比度依赖温度差同一设备在不同负载下热斑位置会变。这意味着类别之间的视觉差异可能没有可见光那么明显模型容易在相似设备间混淆。格式单图标注文件坐标类型类别表示适用框架VOCXML绝对像素字符串类别名MMDetection、Faster R-CNNYOLOTXT归一化 0~1整数索引YOLOv5/v8、Darknet提示转换前务必确认classes.txt里的类别顺序YOLO 的类别索引是从 0 开始的整数顺序错了模型学到的全是错的。2.3 用脚本把 VOC 批量转成 YOLO 并校验虽然数据集号称同时提供两种格式但实际拿到的包里有时期次不全或者你想自己重跑一遍转换确保可控。下面这个脚本做三件事读 VOC XML、按类别名映射到索引、写出 YOLO TXT同时做边界裁剪。import os import xml.etree.ElementTree as ET # 类别名到索引的映射必须和 classes.txt 顺序一致 CLASS_MAP {voltage_transformer: 0, current_transformer: 1} # 实际使用时把 7 个类别全部补全 def voc_to_yolo(xml_path, out_txt_path): tree ET.parse(xml_path) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in CLASS_MAP: continue # 跳过未定义类别避免索引错乱 cls_id CLASS_MAP[name] bbox obj.find(bndbox) xmin max(0, int(bbox.find(xmin).text)) ymin max(0, int(bbox.find(ymin).text)) xmax min(w, int(bbox.find(xmax).text)) ymax min(h, int(bbox.find(ymax).text)) # 转成中心点宽高的归一化值 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}) with open(out_txt_path, w) as f: f.write(\n.join(lines)) # 批量处理 for xml_file in os.listdir(Annotations): if xml_file.endswith(.xml): txt_name xml_file.replace(.xml, .txt) voc_to_yolo(os.path.join(Annotations, xml_file), os.path.join(labels, txt_name))参数说明CLASS_MAP必须和你的classes.txt严格对应顺序错一位整个训练就废了。max(0, ...)和min(w, ...)是边界保护红外图像里偶尔有标注越界的情况。归一化保留 6 位小数足够YOLO 官方也是这个精度。转换完建议随机抽 5 张图用可视化脚本画框验证别信脚本不报错就等于对。3. 用 YOLOv8 在 889 张红外图上跑通训练环境、配置与参数数据格式理清之后下一步就是让模型真正跑起来。889 张图在目标检测里属于小数据集红外域又和 COCO 预训练权重的可见光分布差异大所以训练策略要针对性调整。这一章按「环境搭建 → 数据配置 → 启动训练 → 看结果」的顺序走每一步都给可复现的命令和参数解释。3.1 Anaconda 环境与 YOLOv8 安装的最小命令集我一般用 conda 建独立环境避免和系统里的包打架。YOLOv8 现在归到 ultralytics 包里安装比当年的 YOLOv5 简单但 CUDA 版本和 PyTorch 的匹配仍然是翻车高发区。# 创建环境python 版本选 3.9 或 3.10 兼容性最好 conda create -n yolo_ir python3.10 -y conda activate yolo_ir # 先装 PyTorch根据你的 CUDA 版本去官网查对应命令 # 这里以 CUDA 11.8 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 再装 ultralytics pip install ultralytics # 验证 GPU 是否可用 python -c import torch; print(torch.cuda.is_available())最后一行必须输出True如果是False后面训练会默默跑在 CPU 上889 张图能跑到你怀疑人生。常见原因是 PyTorch 装成了 CPU 版或者 CUDA 驱动版本低于 PyTorch 编译版本。用nvidia-smi看驱动支持的 CUDA 上限别超过它。3.2 data.yaml 的写法与 7 类别索引对齐YOLOv8 靠一个data.yaml描述数据路径和类别。这个文件写错训练直接报类别数不匹配或者找不到图片。# data.yaml path: /home/user/ir_dataset # 数据集根目录 train: images/train # 训练图相对路径 val: images/val # 验证图相对路径 nc: 7 # 类别数必须和实际一致 names: # 类别名列表顺序即索引 0: voltage_transformer 1: current_transformer # ... 补齐 7 个nc和names的长度必须一致且names的顺序要和转换脚本里的CLASS_MAP完全对应。我见过有人 VOC 转 YOLO 时类别顺序和data.yaml写反了训练 loss 正常下降但推理出来框全标错类别排查了半天。建议转换后立刻用names的顺序反查一张图的 TXT确认索引对得上。3.3 从预训练权重启动训练命令行与关键参数889 张图不建议从零训练用 COCO 预训练的yolov8n.pt或yolov8s.pt做迁移学习。红外图像和可见光差异大但浅层边缘特征仍然可迁移。yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience30 \ device0 \ projectruns/ir_transformer \ nameexp1参数逐个说epochs150对小数据集够用配合patience30早停防止过拟合imgsz640是 YOLOv8 默认红外图分辨率如果普遍偏小可以降到 512 提速batch16看显存8G 显存跑yolov8s加 640 大概能到 16lr00.01是初始学习率迁移学习可以再低一点到 0.005lrf0.01是最终学习率比例余弦退火用。device0指定第一块 GPU。3.4 训练日志里该盯哪几个指标启动后别干等盯runs/ir_transformer/exp1/results.csv。重点看三个metrics/mAP50、train/box_loss、val/box_loss。mAP50 在 889 张图上如果 50 个 epoch 还上不了 0.5大概率是数据或配置有问题不是模型不行。train/box_loss持续下降但val/box_loss开始上升就是过拟合信号该早停了。红外图像里小目标多的话还要看metrics/mAP50-95这个指标对框的精度更敏感。注意YOLOv8 默认会把验证集结果存成混淆矩阵和 PR 曲线在runs/ir_transformer/exp1/下。混淆矩阵能直接看出哪两个类别在互相误判对红外互感器这种相似目标特别有用。4. 红外图像检测的避坑清单从标注到推理的 5 个真实翻车点这一章是我自己踩过、也看别人踩过的坑按「现象 → 原因 → 解决」写。红外图像和电力场景叠加坑比通用检测多一层。4.1 现象训练 loss 正常但 mAP 极低推理框全偏原因VOC 转 YOLO 时坐标归一化用错了尺寸。有些标注工具写 XML 时size里的宽高和实际图像不一致或者图像被预处理过但 XML 没更新。归一化基准错了框的位置整体偏移。解决转换前用 PIL 或 OpenCV 重新读一遍每张图的实际宽高和 XML 里的size对比不一致的以实际图像为准。批量校验脚本跑一遍把不一致的文件列出来单独处理。4.2 现象模型把电压互感器识别成电流互感器混淆矩阵一片红原因红外图像里两类设备的热分布模式接近加上 889 张图里某些类别样本可能只有几十张类别不平衡导致模型偏向多数类。解决先统计每个类别的标注框数量差距超过 5 倍的做重采样或加类别权重。YOLOv8 可以在data.yaml里不直接设权重但可以通过复制少数类图片到训练集来平衡。另外检查标注本身有没有标错红外图人眼都难分的话模型更难。4.3 现象训练到一半显存爆了报 CUDA out of memory原因batch设太大或者imgsz用了 1280 但显存不够。YOLOv8 默认开启 AMP 混合精度但某些旧显卡对 AMP 支持不好反而更占显存。解决先把batch降到 8 或 4再考虑降imgsz。如果还爆加ampFalse关掉混合精度试试。另外workers设太大会导致数据加载进程占满内存一般设 4 或 8 就够。4.4 现象验证集 mAP 很高但拿现场新图推理效果差原因889 张图可能来自少数几个变电站、几种拍摄角度模型过拟合了这些场景。红外图像的测温范围、调色板映射也会影响模型训练集和现场设备的成像参数不一致。解决训练时做更强的数据增强YOLOv8 自带hsv_h、hsv_s、hsv_v参数红外图可以适当加大亮度扰动模拟不同测温范围。另外把验证集按变电站划分而不是随机划分这样 mAP 更能反映跨站泛化能力。4.5 现象推理时置信度门限设 0.25 漏检多设 0.1 误检多原因红外图像目标边缘模糊模型输出的置信度分布和可见光不同默认门限不一定合适。解决用验证集跑一遍yolo detect val看 PR 曲线选 F1 分数最高的那个置信度作为门限。YOLOv8 推理时用conf0.2左右起步再根据实际漏检/误检权衡调整。别直接用默认值上现场。5. 把 889 张用到极致小样本红外检测的进阶技巧889 张图说多不多说少不少。如果只是跑通一个 baseline上面几章够了。但如果你想让模型真正能上变电站用还得再压榨一下这份数据的价值。我一般会做两件事一是用更强的预训练策略二是把推理链路做扎实。先说预训练。YOLOv8 的 COCO 权重是可见光的直接迁移到红外域浅层还能用深层特征偏差大。一个实用技巧是先用这份数据训练一个粗模型然后把 backbone 冻结只微调 head学习率调低到 0.001跑 30 个 epoch。这样模型能更快适应红外域的纹理分布。另一个技巧是自监督预训练但 889 张图做自监督收益有限不如把精力花在数据增强上。YOLOv8 的mosaic增强默认开启对红外图建议保留但mixup可以关掉因为红外图叠加后热分布会变得不物理。再说推理链路。训练完的.pt模型要部署到巡检系统绕不开后处理。红外图像检测的输出不只是框还要结合测温数据判断是否真的异常。我习惯在推理脚本里加一层逻辑检测到互感器目标后取框内最高温像素和区域平均温超过阈值才报警。这样能把模型的误检再过滤一道。from ultralytics import YOLO import cv2 import numpy as np model YOLO(runs/ir_transformer/exp1/weights/best.pt) img cv2.imread(test_ir.jpg) # 红外图通常是伪彩色转灰度取温度相对值 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) results model(img, conf0.2)[0] for box in results.boxes: x1, y1, x2, y2 map(int, box.xyxy[0]) roi gray[y1:y2, x1:x2] max_temp roi.max() mean_temp roi.mean() # 阈值根据实际测温标定调整 if max_temp - mean_temp 30: print(f异常目标: 类别{int(box.cls)} 温差{max_temp - mean_temp})这段代码的关键是max_temp - mean_temp这个温差指标它比绝对温度更鲁棒因为不同设备的正常温度基线不同。阈值 30 是灰度差实际部署时要根据红外相机的测温标定曲线换算成摄氏度。conf0.2是起点现场再调。最后说验证。别只看 mAP把模型拉到实际变电站拍几十张新图人工核对漏检和误检。我自己的习惯是每次训练完随机抽 20 张验证集图用model.predict画框存下来肉眼过一遍。这一步花不了十分钟但能发现指标看不出的问题比如框偏、类别错、小目标漏。889 张图的数据集不大但用好了足够撑起一个能落地的红外互感器检测原型。希望帮到你。本文还有配套的精品资源点击获取
