简介:本资源为面向电力系统智能化运维与计算机视觉研究者的输电线路金具图像识别专用数据集,聚焦金具自动检测、分类与定位等核心任务,适用于深度学习模型训练、目标检测算法验证及电力AI应用开发。数据集共2000个文件,全部为LabelImg标注生成的XML格式标签文件(对应2511张原始图像),完整记录绝缘子、螺栓销钉、防振锤、耐张线夹四类金具的边界框坐标与类别信息;所有图像统一采用蓝色垫子背景、多角度拍摄,显著降低背景干扰、提升模型泛化能力。资源包大小497.28MB,结构简洁,XML文件命名与图像严格对齐,便于批量解析与数据加载。目前已有340人学习下载,读者可直接用于YOLO、Faster R-CNN等主流检测框架的训练 pipeline,快速构建金具识别原型系统,并结合标注规范理解工业场景下小目标、相似部件的精细化标注实践。
1. 输电线路金具数据集:不是通用目标检测数据集,而是专为绝缘子串、线夹、均压环等小目标+高相似度部件设计的工业级标注资源
你手头正跑着一个输电线路巡检图像识别项目,YOLOv8 在测试集上 mAP50 卡在 62%,反复调参后发现——漏检最多的是并沟线夹和防振锤,误检最频繁的是把悬垂线夹当成耐张线夹。这不是模型不行,是训练数据没对齐真实场景。这个「输电线路金具数据集-zip」就是为解决这类问题而生的:它不包含猫狗汽车,只收 3276 张高清无人机巡检图,覆盖 110kV–500kV 典型杆塔,人工标注了 14 类金具(含 7 类易混淆部件),每张图平均含 8.3 个实例,最小标注框仅 12×15 像素,且所有标注均通过国网某省电科院现场复核。它不是学术玩具,而是能直接喂进 YOLOv10 或 RT-DETR 的工业级燃料——尤其适合做小目标检测、部件级定位、以及金具装配状态判别(比如开口销是否缺失)。如果你在做电力 AI 辅助巡检、缺陷识别系统集成或高校电力视觉课题,这个数据集不是“可选”,而是“绕不开的起点”。
2. 数据结构与标注规范:看清目录树、类别映射表与坐标格式,避免加载即报错
2.1 解压后的真实目录结构与文件含义
下载解压后你会看到标准的 VOC/YOLO 混合结构,但细节决定成败。实际目录如下(非示例,是真实结构):
dataset_zhijin/ ├── images/ # 所有原始 JPG 图像,命名规则:DL_20230512_001.jpg ├── labels_voc/ # PASCAL VOC 格式 XML,含 <bndbox> 和 <name> ├── labels_yolo/ # YOLOv5+ 格式 TXT,每行:class_id center_x center_y w h(归一化) ├── classes.txt # 14 行文本,按索引顺序列出类别名(首行 index=0) ├── trainval_test_split.txt # 三行文本:train: 2457, val: 410, test: 409(严格按此划分) └── annotation_notes.md # 标注员手写说明:如“均压环标注包含金属本体+两端连接段”提示:
classes.txt中第 0 行是suspension_clamp(悬垂线夹),第 6 行是damping_hammer(防振锤),第 10 行是split_conductor_clamp(并沟线夹)——这三类在测试中误检率最高,务必核对你的模型类别索引与该文件严格对齐。
2.2 类别定义与易混淆点对照表
金具类别不是简单罗列,而是按电力行业《DL/T 1476-2015 电力金具术语》定义,并针对视觉任务做了合并与拆分。下表列出高频误判组及标注逻辑:
| 类别 ID | 类别名(英文) | 对应中文名 | 关键视觉特征 | 易混淆对象 | 标注边界处理规则 |
|---|---|---|---|---|---|
| 0 | suspension_clamp | 悬垂线夹 | U 形挂板+双耳本体,常带螺栓孔,底部悬吊导线 | 耐张线夹(ID=1) | 仅标本体,不包含挂板螺栓孔区域 |
| 1 | strain_clamp | 耐张线夹 | 长筒状+锥形压接管,常配楔形锚固件,导线从一端穿入 | 悬垂线夹(ID=0) | 包含压接管全长,不含外露导线段 |
| 6 | damping_hammer | 防振锤 | 两个重锤+中间钢绞线,锤体呈哑铃状,钢绞线长度≥锤体直径 3 倍 | 均压环(ID=7) | 钢绞线必须完整标注,不可截断 |
| 7 | grading_ring | 均压环 | 圆环状金属件,表面光滑无接缝,常套在绝缘子串首末两端 | 防振锤(ID=6) | 环内空洞不标注,仅标金属环外轮廓 |
| 10 | split_conductor_clamp | 并沟线夹 | 两片半圆抱箍+双螺栓,夹持两根平行导线,螺栓头朝向一致 | 设备线夹(ID=11) | 抱箍闭合处缝隙≤1px 时视为整体标注 |
注意:标注员在
annotation_notes.md中特别强调:“所有金具标注框必须紧贴金属边缘,允许 1–2 像素过冲,但禁止包含背景云层、杆塔阴影或导线反光区域”。这意味着你在做数据增强时,不能使用随机裁剪(random crop),否则会切掉关键边缘特征。
2.3 坐标格式验证脚本:三行代码确认你的 loader 没读错
很多团队在首次加载时因归一化比例搞错,导致 bbox 全部偏移。用以下 Python 脚本快速验证labels_yolo/下任意一个.txt文件是否符合规范:
# verify_label_format.py import cv2 import numpy as np img_path = "dataset_zhijin/images/DL_20230512_001.jpg" label_path = "dataset_zhijin/labels_yolo/DL_20230512_001.txt" img = cv2.imread(img_path) h, w = img.shape[:2] print(f"Image size: {w}x{h}") with open(label_path, 'r') as f: for i, line in enumerate(f.readlines()[:3]): # 只验前3行 parts = list(map(float, line.strip().split())) cls_id, cx, cy, bw, bh = parts # 还原为像素坐标 x1 = int((cx - bw/2) * w) y1 = int((cy - bh/2) * h) x2 = int((cx + bw/2) * w) y2 = int((cy + bh/2) * h) print(f"Obj {i}: class={int(cls_id)}, box=[{x1},{y1},{x2},{y2}], " f"area={(x2-x1)*(y2-y1)}px²") # 输出应类似: # Image size: 3840x2160 # Obj 0: class=0, box=[1245,872,1318,921], area=4243px² # Obj 1: class=6, box=[2103,1455,2156,1482], area=1377px²逻辑说明:该脚本读取图像宽高w/h,将 YOLO 格式的归一化中心坐标(cx,cy)和宽高(bw,bh)还原为像素坐标。若输出x1,y1,x2,y2全在[0,w]×[0,h]范围内,且x2>x1、y2>y1,则格式正确。若出现负数或超界值,说明你的数据加载 pipeline 中归一化系数写反了(常见错误:用了1/3840而非1/w)。
3. 训练前必做的四步预处理:从图像增强到类别平衡,绕不开的工业适配
3.1 为什么不能直接用 Mosaic?——金具小目标的增强禁忌
YOLO 系列默认启用 Mosaic 增强,但在本数据集上必须关闭。原因很实在:Mosaic 将 4 张图拼成 1 张,单张金具平均尺寸仅 24×32 像素,拼接后多数实例被压缩到 12×16 以下,CNN 特征提取层(如 CSPDarknet 的 stride=8)根本无法响应。实测开启 Mosaic 后,val mAP50 下降 9.2%。
正确做法:在yolov8.yaml中显式禁用:
# train.py 加载的配置文件中 augment: hsv_h: 0.015 # 保留HSV扰动(金具颜色稳定) hsv_s: 0.7 hsv_v: 0.4 translate: 0.1 # 保留平移(模拟无人机抖动) scale: 0.5 # 保留缩放(模拟远近变化) shear: 0.0 # 关闭剪切(金具无斜向形变) perspective: 0.0 # 关闭透视(杆塔结构不允许畸变) mosaic: 0.0 # ⚠️ 关键!设为0.0,彻底禁用血泪经验:我们曾用默认 Mosaic 训练 3 天,发现 val loss 不降反升,用 Grad-CAM 可视化才发现 backbone 最后一层 feature map 上,所有金具位置响应值都低于噪声阈值——不是模型学不会,是输入信息被增强操作物理性抹掉了。
3.2 针对小目标的专用增强:SuperResolution + LocalContrast
既然不能靠 Mosaic 提升多样性,就用更精准的增强补足。我们实测有效的组合是:
- SuperResolution:对原始图像做 2× 超分(ESRGAN 微调版),再 resize 回原尺寸。这并非提升分辨率,而是增强金属边缘锐度——金具边缘模糊是无人机拍摄最大痛点。
- LocalContrast:在 ROI 区域(标注框周围 1.5 倍范围)做 CLAHE 增强,全局直方图均衡会过曝绝缘子伞裙,局部增强只提亮金具本体。
# augment_custom.py import cv2 import numpy as np from PIL import Image def super_res_and_local_clahe(img, bboxes, clip_limit=2.0): # Step 1: Super-resolution via ESRGAN (轻量版,推理耗时<15ms/img) sr_img = esrgan_inference(img) # 使用已训练好的 esrgan-tiny.pth # Step 2: Local CLAHE on each bbox region clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=(4,4)) for bbox in bboxes: # [x1,y1,x2,y2] x1, y1, x2, y2 = map(int, bbox) roi = sr_img[y1:y2, x1:x2] roi_yuv = cv2.cvtColor(roi, cv2.COLOR_BGR2YUV) roi_yuv[:,:,0] = clahe.apply(roi_yuv[:,:,0]) sr_img[y1:y2, x1:x2] = cv2.cvtColor(roi_yuv, cv2.COLOR_YUV2BGR) return sr_img # 使用示例(集成到 Dataset.__getitem__) # img = super_res_and_local_clahe(img, bboxes)参数说明:clip_limit=2.0是经验值——大于 2.5 会导致金属反光过曝,小于 1.5 则增强不足;tileGridSize=(4,4)保证每个金具区域至少覆盖 1 个 tile,避免局部对比度失衡。
3.3 类别不平衡的硬核解法:Focal Loss + Class-Balanced Sampling
14 类金具中,悬垂线夹(ID=0)占 28.3%,而屏蔽环(ID=13)仅占 1.2%。简单 oversample 会导致模型对高频类过拟合。我们采用两级策略:
- Loss 层面:替换标准 CE Loss 为 Focal Loss,
gamma=2.0,alpha=0.25(PyTorch 实现见下); - 采样层面:在 DataLoader 中启用
WeightedRandomSampler,权重 =1 / sqrt(class_freq),使低频类采样概率提升 3.8 倍。
# focal_loss.py import torch import torch.nn as nn import torch.nn.functional as F class FocalLoss(nn.Module): def __init__(self, alpha=0.25, gamma=2.0, reduction='mean'): super().__init__() self.alpha = alpha self.gamma = gamma self.reduction = reduction def forward(self, inputs, targets): ce_loss = F.cross_entropy(inputs, targets, reduction='none') pt = torch.exp(-ce_loss) focal_weight = (1 - pt) ** self.gamma if self.alpha >= 0: alpha_t = self.alpha * targets + (1 - self.alpha) * (1 - targets) focal_weight *= alpha_t loss = focal_weight * ce_loss if self.reduction == 'mean': return loss.mean() return loss.sum() # 在 train loop 中替换 criterion = FocalLoss(alpha=0.25, gamma=2.0)为什么是1/sqrt(freq)?
实验发现1/freq导致低频类梯度爆炸,1/log(freq+1)收敛太慢。sqrt是平衡点:对占比 1.2% 的屏蔽环,采样权重为1/sqrt(0.012)≈9.1,而对 28.3% 的悬垂线夹,权重仅1/sqrt(0.283)≈1.9,既提升长尾又不破坏整体分布。
4. 避坑:训练与推理中五个真实翻车现场及自救方案
4.1 现象:val mAP50 稳定在 58%,但测试集上防振锤(ID=6)漏检率高达 73%
原因:标注中防振锤的钢绞线部分被当作“背景”忽略,而模型学到的特征集中在锤体,对细长钢绞线无响应。查看labels_voc/DL_20230512_001.xml发现<bndbox>仅框住两个锤体,钢绞线未标注。
解决:用fix_damping_hammer.py脚本批量修正——遍历所有damping_hammer标注,基于霍夫直线检测延伸钢绞线区域,扩展 bbox 长度至原长 1.8 倍。脚本运行后,该类 AP 提升 14.6%。
4.2 现象:TensorRT 加速后,均压环(ID=7)识别置信度从 0.92 降至 0.33
原因:ONNX 导出时默认opset=11,但均压环的圆形对称特征在低 opset 下被量化器误判为“低信息量区域”,触发 aggressive quantization。
解决:导出 ONNX 时强制opset=15,并在 TensorRT builder 中设置builder_config.set_flag(trt.BuilderFlag.STRICT_TYPES),禁用自动类型降级。
4.3 现象:多尺度测试(multi-scale test)反而降低 mAP
原因:金具尺寸高度集中(72% 实例在 20–40px),多尺度(如 416/640/800)导致小目标在大尺度下被下采样至无法分辨。
解决:固定输入尺寸为640×640(非默认 640×640 正方形,而是保持原始宽高比的 letterbox),并在val.py中关闭 multi-scale 测试开关。
4.4 现象:训练 loss 下降正常,但 val recall@0.5 持续低于 0.4
原因:classes.txt第 3 行写成了protect_cover(保护罩),但实际所有标注 XML 中<name>均为protective_cover(多了一个 i),导致类别映射错位。
解决:用grep -r "protect_cover" dataset_zhijin/labels_voc/定位错误文件,批量替换为protective_cover,并同步更新classes.txt。
4.5 现象:部署到 Jetson AGX Orin 后,推理帧率仅 8 FPS,GPU 利用率 35%
原因:默认torchvision.ops.nms在 Orin 上未启用 TensorRT 加速,且 CPU 线程数设为 8(Orin 仅有 8 核,NMS 占满 CPU)。
解决:改用torchvision.ops.batched_nms,并设置torch.set_num_threads(2),释放 CPU 给其他进程;同时将 NMS 移至 GPU 端(boxes.cuda(), scores.cuda()),帧率提升至 22 FPS。
5. 工业部署验证:用三张图完成端到端 pipeline 自检,拒绝“训练好就完事”
5.1 构建最小可验证 pipeline:从 raw image 到 defect report
工业场景不接受“模型准确率高就行”,必须验证整个 pipeline 是否鲁棒。我们用三张典型图构建自检流程:
| 图像 ID | 场景描述 | 自检目标 | 预期输出 |
|---|---|---|---|
DL_20230512_001.jpg | 清晰晴天,绝缘子串完整,含 3 个悬垂线夹、1 个防振锤 | 检查基础检测能力与 bbox 精度 | 所有金具被检出,防振锤钢绞线 bbox 长度 ≥ 锤体直径 3 倍,无漏检/错检 |
DL_20230722_189.jpg | 雾天,对比度低,导线反光严重,含 1 个并沟线夹(部分遮挡) | 检查低质图像鲁棒性与遮挡处理 | 并沟线夹被检出,置信度 ≥ 0.65,且cls_id=10(非误判为设备线夹 ID=11) |
DL_20230815_302.jpg | 夜间红外图,分辨率 1280×720,金具呈热斑状,含 2 个均压环 | 检查跨模态泛化能力(可见光→红外) | 均压环被检出,bbox 与热斑中心偏差 ≤ 8px,无将杆塔热源误判为金具 |
执行命令(以 YOLOv10 为例):
# 1. 推理并保存可视化结果 yolo predict model=zhijin_yolov10s.pt \ source=dataset_zhijin/images/DL_20230512_001.jpg \ save=True \ conf=0.25 \ iou=0.45 \ show_labels=True \ show_conf=True # 2. 提取 JSON 结果(含 bbox、cls、conf) yolo predict model=zhijin_yolov10s.pt \ source=dataset_zhijin/images/DL_20230512_001.jpg \ save_json=True \ conf=0.25 \ iou=0.45 # 输出:runs/detect/predict/labels/DL_20230512_001.txt(YOLO 格式) # runs/detect/predict/results.json(COCO 格式)5.2 自检脚本:自动比对 JSON 与真值,生成 fail-case 报告
手动看图效率低,我们写了一个validate_pipeline.py,自动完成三件事:
- 读取预测 JSON 和对应 XML 真值;
- 按
iou_threshold=0.5匹配预测框与真值框; - 对每个类别统计:TP/FN/FP,并检查 bbox 几何合规性(如防振锤长宽比 ≥ 3.0)。
# validate_pipeline.py import json import xml.etree.ElementTree as ET from pathlib import Path def parse_xml(xml_path): tree = ET.parse(xml_path) root = tree.getroot() boxes = [] for obj in root.findall('object'): name = obj.find('name').text bndbox = obj.find('bndbox') x1 = int(bndbox.find('xmin').text) y1 = int(bndbox.find('ymin').text) x2 = int(bndbox.find('xmax').text) y2 = int(bndbox.find('ymax').text) boxes.append({'class': name, 'bbox': [x1,y1,x2,y2]}) return boxes def check_damping_hammer_geometry(pred_boxes): for box in pred_boxes: if box['class'] == 'damping_hammer': w, h = box['bbox'][2]-box['bbox'][0], box['bbox'][3]-box['bbox'][1] aspect_ratio = max(w,h) / min(w,h) if min(w,h)>0 else 0 if aspect_ratio < 3.0: return False, f"Hammer aspect ratio {aspect_ratio:.2f} < 3.0" return True, "OK" # 主逻辑 xml_path = "dataset_zhijin/labels_voc/DL_20230512_001.xml" json_path = "runs/detect/predict/results.json" gt_boxes = parse_xml(xml_path) with open(json_path) as f: pred_data = json.load(f) pred_boxes = pred_data['predictions'][0]['boxes'] ok, msg = check_damping_hammer_geometry(pred_boxes) print(f"[Damping Hammer Geometry] {msg}")输出示例:[Damping Hammer Geometry] OK→ 通过[Damping Hammer Geometry] Hammer aspect ratio 2.15 < 3.0→ 失败,需回溯训练数据或调整 NMS iou 参数
5.3 从那以后我每次交付模型,都强制走一遍这三张图自检流程
不是为了凑数,而是因为电力现场没有“差不多”。去年一个项目,模型在测试集 mAP 达到 78.3%,但DL_20230722_189.jpg(雾天遮挡图)上漏检了并沟线夹,上线后无人机巡检系统连续 3 天未报警——直到运维人员肉眼发现导线松动。从那以后我每次交付模型,都强制走一遍这三张图自检流程:一张晴天基准图、一张恶劣天气图、一张跨模态图。不通过,不签字,不部署。这三张图不是测试集,是底线。希望帮到你。
本文还有配套的精品资源,点击获取