☰
电力红外数据集实战:889张VOC+YOLO互感器检测样本训练指南
2026/9/26 5:39:57 网站建设 项目流程

简介:本资源为面向电力场景变电站设备检测的红外图像数据集,适用于从事电力设备智能巡检、红外目标检测算法研究与教学的人员,可解决互感器、避雷器等关键设备标注样本不足的问题。包内共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 张 VOC+YOLO 互感器检测样本怎么用起来

变电站红外巡检最头疼的不是拍不到图,而是拍回来一堆热像图没人标、标了格式不统一、训出来的模型换座站就翻车。这个标题里的「电力场景变电站红外图像电压电流互感器检测数据集 VOC+YOLO 格式 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_ok=True) 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 python=3.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 XML,opencv-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.yaml

data.yaml内容如下,路径写绝对路径最稳,避免相对路径找不到:

path: /home/user/ir_dataset train: images/train val: images/val nc: 7 names: ["pt", "ct", "arrester", "bushing", "connector", "insulator", "body"]

参数说明:nc必须等于names长度,等于 7;names顺序必须和转换脚本里的classes一致,这是最容易翻车的地方。train/val建议按 8:2 划分,889 张大约 711 训练、178 验证。划分时同一设备、同一角度、同一时段的图尽量别跨集,否则验证指标虚高。

3.3 训练命令与关键参数怎么设

一条命令启动训练:

yolo detect train \ data=/home/user/ir_dataset/data.yaml \ model=yolov8s.pt \ epochs=150 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=30 \ device=0 \ project=runs_ir \ name=exp1

逻辑说明:model=yolov8s.pt用官方预训练权重做迁移,小样本必须用预训练,从零训基本没戏。epochs=150配合patience=30,30 轮没提升就早停,省时间。imgsz=640是通用值,如果原图分辨率远大于 640,可考虑 960,但显存要够。batch=16按显存调,爆显存就降到 8 或 4。lr0=0.01是初始学习率,小数据集可以降到 0.005 更稳。device=0指定第一块 GPU。

训练过程中重点看三个指标:box_loss是否稳定下降、mAP50是否在涨、cls_loss有没有异常震荡。如果mAP50卡在很低的值不动,先回去查类别索引和标签格式,八成是标签问题,不是模型问题。

3.4 推理与置信度门限调整

训练完用验证集或单张图跑推理:

yolo detect predict \ model=runs_ir/exp1/weights/best.pt \ source=/home/user/ir_dataset/images/val \ conf=0.25 \ iou=0.45 \ save=True

参数说明:conf=0.25是置信度门限,红外目标对比度低,门限太高会漏检,太低会误检,建议在 0.2~0.35 之间试。iou=0.45是 NMS 的 IoU 阈值,互感器之间如果挨得近,可以适当调高到 0.5 减少误抑制。save=True保存可视化结果,方便肉眼核对漏检和误检。

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_h=0 hsv_s=0 hsv_v=0。重点用亮度、对比度扰动模拟不同测温环境。

4.4 小目标互感器被下采样吃掉

现象:大设备检得挺好,远处的小互感器几乎全漏。

原因:imgsz=640下采样后,原本几十像素的小目标只剩几个像素,特征图里基本消失。

解决:提高输入分辨率到 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 张这个量级,训一次可能就几十分钟,但标签错了返工就是一天。模型调参是玄学,数据干净是科学。把数据这关守住,后面的事才有的谈。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询