简介本资源为面向电力场景变电站设备检测的红外图像数据集适用于从事电力设备智能巡检、红外目标检测算法研究与教学的人员可解决互感器、避雷器等关键设备标注样本不足的问题。包内共2000个文件以891个txt与889个xml标注文件为主另有220个jpg红外图像压缩包约32.75MB采用Pascal VOC与YOLO双格式xml与txt一一对应方便直接接入主流检测框架训练。数据集含889张图像、1715个标注框覆盖7个类别包括Chave_H_230kV、Chave_V_230kV、DISJUNTOR、Pararraio_69kV、Pararraio_230kV、TC与TP其中TC与TP框数较多适合开展电压电流互感器识别实验。目前已有551人学习下载可作为电力红外检测模型训练、算法对比与课程实践的现成数据基础。1. 电力红外数据集落地889 张 VOCYOLO 互感器检测样本怎么用起来变电站红外巡检最头疼的不是拍不到图而是拍回来一堆热像图没人标、标了格式不统一、训出来的模型换座站就翻车。这个标题里的「电力场景变电站红外图像电压电流互感器检测数据集 VOCYOLO 格式 889 张 7 类别」本质是一份已经标好的红外目标检测语料889 张变电站热像图覆盖电压互感器、电流互感器等 7 类设备同时给了 VOC 的 XML 和 YOLO 的 TXT 两套标注。它解决的是从零标注成本高、类别定义混乱的问题适合做电力设备智能巡检、红外缺陷初筛、边缘盒子部署的工程师也适合想拿真实工业红外数据练 YOLO 全流程的人。下面按「先看懂数据 → 再跑通训练 → 再避坑 → 最后调优」的顺序讲透。2. 拆开这份红外互感器数据集7 类别、双格式与两点校正拿到一个压缩包第一件事不是急着解压训练而是先搞清楚里面装了什么、标注逻辑对不对、红外图像本身有什么特殊性。这一章把数据集的构成、VOC 与 YOLO 的差异、以及红外图像预处理里绕不开的「两点校正」讲清楚后面训练才不会白跑。2.1 889 张、7 类别到底指什么从标题能确定的信息是图像总数 889 张类别数 7。电力变电站红外场景里这 7 类通常围绕互感器及其关联设备展开常见组合是电压互感器PT、电流互感器CT再带上避雷器、套管、母线接头、绝缘子、设备本体等。具体类别名必须以数据集自带的classes.txt或data.yaml为准不要凭经验猜——这是血泪经验类别名对不上训练时标签全乱。889 张这个量级属于「小样本工业数据集」。它不足以从零训一个 backbone但足够做迁移学习微调。判断它值不值得投入看三点类别是否均衡、单类实例数是否过少、图像是否有重复或近似帧。如果某一类只有二三十个框那这一类基本要靠数据增强硬撑。红外图像和可见光最大的区别是它反映的是温度分布不是纹理。互感器在红外里往往是一个高亮热区边缘模糊、对比度低和背景的灰度差可能很小。这直接决定了后面增强策略不能用常规的可见光那套。2.2 VOC 与 YOLO 两套标注的对应关系VOC 格式每张图配一个 XML框用xmin/ymin/xmax/ymax绝对像素坐标YOLO 格式每张图配一个 TXT每行是class_id cx cy w h全部归一化到 0~1。两者描述的是同一批框只是坐标系和存储方式不同。转换时最容易错的就是归一化和类别索引。下面这段脚本把 VOC 的 XML 批量转成 YOLO 的 TXT同时生成类别映射文件可以直接抄import os import xml.etree.ElementTree as ET # 类别列表必须与数据集实际类别顺序一致顺序错标签全错 classes [pt, ct, arrester, bushing, connector, insulator, body] class_to_id {c: i for i, c in enumerate(classes)} def convert(xml_dir, out_dir, img_w, img_h): os.makedirs(out_dir, exist_okTrue) for name in os.listdir(xml_dir): if not name.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, name)) root tree.getroot() # 优先读 XML 里记录的真实尺寸读不到再用传入值兜底 size root.find(size) w int(size.find(width).text) if size is not None else img_w h int(size.find(height).text) if size is not None else img_h lines [] for obj in root.iter(object): cls obj.find(name).text.strip() if cls 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 / w cy (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{class_to_id[cls]} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) with open(os.path.join(out_dir, name.replace(.xml, .txt)), w) as f: f.write(\n.join(lines)) convert(./Annotations, ./labels, 640, 512)逻辑说明先建立类别到 id 的映射遍历 XML 时用图像真实宽高做归一化而不是硬编码 640。参数上classes的顺序决定class_id必须和训练时data.yaml的names完全一致cx/cy/w/h保留 6 位小数足够YOLO 读取时对精度不敏感。如果 XML 里size缺失才用传入的img_w/img_h兜底否则一律以 XML 为准。2.3 红外图像两点校正为什么影响标注质量红外探测器存在非均匀性同一温度在黑体上不同像元输出不一致表现为图像上的固定条纹或暗斑。两点校正就是用高温黑体和低温黑体两个参考点对每个像元做线性拟合把原始响应拉回一致。数据集里的图如果没做过校正你会看到某些区域整体偏亮或偏暗标注框看着没问题但模型学到的是「位置偏亮」而不是「设备发热」。常见做法是如果数据集已给的是校正后图像直接训练即可如果拿到的是原始热像建议先做一遍非均匀性校正再标注或再训练。判断是否需要校正看图像有没有明显的竖条纹、固定暗斑、边缘发灰。有的话先校正别硬训否则模型泛化会很差。3. 用 YOLOv8 跑通 889 张互感器数据环境、配置与训练数据看懂了接下来是把它真正喂进模型。这一章按「环境搭建 → 数据组织 → 配置 → 训练 → 看结果」走一遍命令和参数都给到能直接改的程度。YOLOv8 是当前小样本工业检测里比较稳的选择环境用 Anaconda 隔离避免和系统 Python 打架。3.1 Anaconda 环境与 YOLO 依赖安装先建一个独立环境Python 版本选 3.9 或 3.10太新容易和 torch 版本对不上。下面命令按顺序执行conda create -n ir_yolo python3.10 -y conda activate ir_yolo # 安装 PyTorch具体 CUDA 版本按自己显卡驱动选这里以 cu118 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python lxml tqdm逻辑说明conda create建隔离环境-y免交互torch 的 index-url 决定 CUDA 版本装错会出现「torch.cuda.is_available() 为 False」。ultralytics自带 YOLOv8 训练推理接口lxml用于解析 VOC XMLopencv-python用于读图和可视化。装完先跑一句python -c import torch; print(torch.cuda.is_available())输出 True 再往下走。3.2 目录结构与 data.yaml 配置YOLO 训练对目录结构有约定推荐这样组织ir_dataset/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml内容如下路径写绝对路径最稳避免相对路径找不到path: /home/user/ir_dataset train: images/train val: images/val nc: 7 names: [pt, ct, arrester, bushing, connector, insulator, body]参数说明nc必须等于names长度等于 7names顺序必须和转换脚本里的classes一致这是最容易翻车的地方。train/val建议按 8:2 划分889 张大约 711 训练、178 验证。划分时同一设备、同一角度、同一时段的图尽量别跨集否则验证指标虚高。3.3 训练命令与关键参数怎么设一条命令启动训练yolo detect train \ data/home/user/ir_dataset/data.yaml \ modelyolov8s.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ patience30 \ device0 \ projectruns_ir \ nameexp1逻辑说明modelyolov8s.pt用官方预训练权重做迁移小样本必须用预训练从零训基本没戏。epochs150配合patience3030 轮没提升就早停省时间。imgsz640是通用值如果原图分辨率远大于 640可考虑 960但显存要够。batch16按显存调爆显存就降到 8 或 4。lr00.01是初始学习率小数据集可以降到 0.005 更稳。device0指定第一块 GPU。训练过程中重点看三个指标box_loss是否稳定下降、mAP50是否在涨、cls_loss有没有异常震荡。如果mAP50卡在很低的值不动先回去查类别索引和标签格式八成是标签问题不是模型问题。3.4 推理与置信度门限调整训练完用验证集或单张图跑推理yolo detect predict \ modelruns_ir/exp1/weights/best.pt \ source/home/user/ir_dataset/images/val \ conf0.25 \ iou0.45 \ saveTrue参数说明conf0.25是置信度门限红外目标对比度低门限太高会漏检太低会误检建议在 0.2~0.35 之间试。iou0.45是 NMS 的 IoU 阈值互感器之间如果挨得近可以适当调高到 0.5 减少误抑制。saveTrue保存可视化结果方便肉眼核对漏检和误检。4. 红外小样本训练的避坑清单从标签到增强的 5 个翻车点这一章是踩坑记录每条按「现象 → 原因 → 解决」写。889 张、7 类别的红外数据坑基本集中在标签、增强、评估三块提前知道能省很多返工。4.1 训练 loss 正常但 mAP 极低现象训练时box_loss一路下降看着挺正常但mAP50只有零点零几几乎不涨。原因最常见是类别索引错位。VOC 转 YOLO 时classes顺序和data.yaml的names不一致导致模型学的「第 0 类」和评估时的「第 0 类」不是同一个东西。其次是标签归一化用了错误的宽高比如把 640 当成所有图的宽。解决写一个校验脚本统计每个class_id的框数量和 XML 里各类别数量对比对不上就回去改映射。归一化一律以图像真实尺寸为准别硬编码。4.2 验证集指标虚高换座站就崩现象验证集mAP50能到 0.9 以上但拿另一座变电站的图一测漏检误检一大堆。原因训练集和验证集划分时同一设备、同一角度、同一时段的图被分到了两边模型其实在「背题」。红外图像同一设备不同时段热分布差异大这种泄漏特别隐蔽。解决按设备编号或拍摄时段做分组划分同一组只进训练或只进验证。宁可验证集小一点也要保证它和训练集在设备、角度上有区分度。4.3 常规增强把红外目标增强没了现象开了 mosaic、mixup、HSV 增强后训练反而变差模型对热区不敏感。原因HSV 增强改的是色调饱和度红外图像根本没有色彩信息纯属噪声mosaic 拼接如果拼进大量背景小目标热区会被稀释。解决红外场景关掉 HSV 增强保留翻转、缩放、mosaic 但降低概率。可以在data.yaml同级用augment参数控制或直接在训练命令里加hsv_h0 hsv_s0 hsv_v0。重点用亮度、对比度扰动模拟不同测温环境。4.4 小目标互感器被下采样吃掉现象大设备检得挺好远处的小互感器几乎全漏。原因imgsz640下采样后原本几十像素的小目标只剩几个像素特征图里基本消失。解决提高输入分辨率到 960 或 1280或改用 P2 小目标检测头。代价是显存和速度边缘部署要权衡。也可以先把大图切块再训切块时保证目标完整。4.5 置信度门限一刀切导致误检漏检并存现象调高conf漏检调低conf误检怎么都不对。原因不同类别、不同距离的目标置信度分布不一样用一个全局门限必然顾此失彼。解决按类别分别设门限或先看 PR 曲线找每类的平衡点。部署时对高误报类别单独提高门限对易漏类别单独降低。这一步没有银弹只能靠验证集统计。5. 把 889 张用到极致类别均衡、混淆矩阵与部署前验证数据量小就得在「用尽」上下功夫。这一章讲三个具体技巧怎么处理类别不均衡、怎么看混淆矩阵定位问题、以及部署前怎么做一轮靠谱的验证。最后用我自己的习惯收尾。5.1 类别不均衡时的采样与加权先统计每类实例数如果最多和最少差 5 倍以上就得处理。常见做法有两种一是对少样本类做定向增强只对包含该类的图做翻转、缩放、亮度扰动复制到训练集二是在损失里给少样本类更高权重。YOLOv8 不直接暴露类别权重但可以通过复制少样本图实现近似过采样。import os, shutil, random # 统计每类实例数找出需要过采样的类别 def count_instances(label_dir): counter {} for name in os.listdir(label_dir): with open(os.path.join(label_dir, name)) as f: for line in f: cid int(line.split()[0]) counter[cid] counter.get(cid, 0) 1 return counter cnt count_instances(./labels/train) print(cnt) # 对实例数低于阈值的类别复制其所在图到训练集文件名加后缀避免覆盖 threshold 100 for name in os.listdir(./labels/train): with open(os.path.join(./labels/train, name)) as f: ids [int(l.split()[0]) for l in f if l.strip()] if any(cnt.get(i, 0) threshold for i in ids): shutil.copy(f./images/train/{name.replace(.txt, .jpg)}, f./images/train/dup_{name.replace(.txt, .jpg)}) shutil.copy(f./labels/train/{name}, f./labels/train/dup_{name})逻辑说明先统计训练集每类实例数对包含稀有类的图做复制文件名加dup_前缀。参数threshold按实际分布定一般取中位数的 1/3。注意复制后要同步复制图和标签且验证集不能参与过采样否则评估失真。5.2 混淆矩阵告诉你模型到底在混什么训练完 YOLOv8 会在runs_ir/exp1/下生成confusion_matrix.png。重点看两件事对角线是否够亮以及非对角线里哪两类互相混。互感器检测里电压互感器和电流互感器外形接近、热分布也接近很容易互相误判。如果发现 PT 和 CT 大量互混说明特征区分度不够。可以做的检查标注是否把两类标反了在数据里补充两类同时出现、角度有区分度的图或者干脆合并成一个「互感器」大类先保证检出再在业务层用其他手段细分。合并类别是工程上很务实的选择别死磕。5.3 部署前的一轮验证该怎么做模型训完不等于能用。部署前至少做三件事一是拿一批完全没参与训练的现场图跑一遍统计漏检率和误检率二是测推理速度看目标硬件上能不能达到业务帧率三是测极端情况比如设备刚停机温度均匀、或者环境温度很高时模型会不会失效。验证时建议固定一套评估脚本每次换模型都跑同一批图输出每类的 precision、recall 和 F1。这样模型迭代才有可比性不然每次都是「感觉好像好了一点」。验证项关注指标合格参考检出能力每类 recall关键类不低于 0.85误报控制每类 precision不低于 0.8推理速度单帧耗时满足业务帧率极端场景漏检率不出现整类失效5.4 我自己的习惯我现在拿到任何一份工业红外数据集第一件事不是训模型而是花半小时把标签统计、类别分布、图像质量过一遍写个校验脚本存下来。889 张这个量级训一次可能就几十分钟但标签错了返工就是一天。模型调参是玄学数据干净是科学。把数据这关守住后面的事才有的谈。希望帮到你。本文还有配套的精品资源点击获取