简介这是一套面向电力巡检与输电线路智能检测方向的YOLO目标检测数据集适用于算法工程师、高校学生及科研人员开展电力金具识别模型的训练与验证。数据均来自真实场景覆盖多种拍摄条件标注由labelimg完成标注框质量较高并同步提供voc、coco和yolo三种格式标签可直接接入YOLO系列检测框架。资源包共2000个文件以1985个xml标注文件为主另含少量txt说明、html教程与py脚本压缩包约819.31MB。随包附赠数据集划分脚本与YOLO环境搭建、训练案例教程支持按需自行划分训练集、验证集与测试集便于快速复现训练流程并排查常见问题。目前已有210人学习下载适合需要真实电力金具数据、希望省去标注与格式转换环节的读者参考使用。1. 输电线路金具检测数据集10000 张图、三套标签和一套能跑通的训练流程输电线路巡检这个场景做视觉的人多半都碰过。无人机拍回来的图里防震锤、悬垂线夹、耐张线夹、间隔棒、均压环这些金具尺寸小、背景杂、遮挡多自己从零标一万张光是拉框就能耗掉一两个月。这份资源解决的就是这个前置成本10000 张真实场景的输电线路电力金具图片用 labelImg 标注同时给了 VOCxml、COCOjson、YOLOtxt三种格式标签分目录存放另外配了数据集划分脚本、Linux 和 Windows 两套环境搭建文档、以及按案例改自己数据集的训练教程。适合两类人一类是想快速验证 YOLO 系列模型在电力巡检上效果的算法同学另一类是手上有巡检图但缺标注、想拿现成数据先把训练链路跑通的工程同学。下面按「数据长什么样 → 怎么划分 → 怎么训练 → 坑在哪」的顺序拆开讲。2. 三种标签格式的对应关系VOC、COCO、YOLO 到底差在哪拿到一个数据集第一件事不是急着 train而是先搞清楚标签格式。这份资源把三种格式都给了很多人反而不知道该用哪套。先把三者的坐标逻辑讲透后面划分和训练才不会翻车。2.1 三种格式的坐标定义与目录结构VOC 格式是每张图对应一个同名 xml坐标是绝对像素值xmin/ymin/xmax/ymax直接对应左上角和右下角!-- VOC 格式绝对像素坐标 -- annotation filename000001.jpg/filename size width1920/width height1080/height /size object namedamper/name !-- 类别名如防震锤 -- bndbox xmin512/xmin !-- 左上角 x像素 -- ymin330/ymin !-- 左上角 y像素 -- xmax640/xmax !-- 右下角 x像素 -- ymax455/ymax !-- 右下角 y像素 -- /bndbox /object /annotationCOCO 格式是一个大的 json所有图片和标注都塞在images、annotations、categories三个数组里坐标同样是绝对像素但多了id做关联{ images: [{id: 1, file_name: 000001.jpg, width: 1920, height: 1080}], annotations: [ { id: 1, image_id: 1, category_id: 1, bbox: [512, 330, 128, 125], // [x, y, w, h]绝对像素 area: 16000, iscrowd: 0 } ], categories: [{id: 1, name: damper}] }YOLO 格式是每张图一个同名 txt坐标是归一化后的中心点加宽高值都在 0 到 1 之间# YOLO 格式class_id cx cy w h全部归一化到 0~1 0 0.6000 0.3630 0.0667 0.1157三者的换算关系是理解重点。VOC 转 YOLO 时cx (xmin xmax) / 2 / widthw (xmax - xmin) / widthy 方向同理。COCO 的bbox是[x, y, w, h]转 YOLO 时cx (x w/2) / img_w。搞混这套换算是后面训练 loss 不降的头号原因。格式文件形态坐标类型典型用途VOC每图一个 xml绝对像素labelImg 默认输出、老项目COCO单个 json绝对像素mmdetection、pycocotools 评估YOLO每图一个 txt归一化中心点YOLOv5/v8 直接训练2.2 用划分脚本把数据切成 train/val/test资源里给了三个划分脚本名字分别是「训练集、验证集、测试集划分脚本」「训练集、验证集划分脚本」「split_train_val 生成 ImageSets 下 txt 文件划分脚本」。前两个是把图片和标签一起复制到新文件夹第三个是生成 ImageSets 下的 txt 索引文件。我一般先用第三个生成索引再用索引去搬文件这样可复现。import os import random import shutil # 原始数据目录图片和标签同名放在 images / labels 下 IMG_DIR images LBL_DIR labels OUT_DIR dataset_split RATIO (0.8, 0.1, 0.1) # train / val / test 比例 random.seed(42) # 固定种子保证每次划分一致 names [os.path.splitext(f)[0] for f in os.listdir(IMG_DIR) if f.endswith(.jpg)] random.shuffle(names) n len(names) n_train int(n * RATIO[0]) n_val int(n * RATIO[1]) splits { train: names[:n_train], val: names[n_train:n_train n_val], test: names[n_train n_val:] } for split, items in splits.items(): img_out os.path.join(OUT_DIR, split, images) lbl_out os.path.join(OUT_DIR, split, labels) os.makedirs(img_out, exist_okTrue) os.makedirs(lbl_out, exist_okTrue) for name in items: shutil.copy(os.path.join(IMG_DIR, name .jpg), os.path.join(img_out, name .jpg)) shutil.copy(os.path.join(LBL_DIR, name .txt), os.path.join(lbl_out, name .txt)) print(split, len(items))这段脚本的关键参数有三个。RATIO控制切分比例电力金具这种小目标场景验证集别低于 10%否则 mAP 抖动会很大。random.seed(42)是后悔药不固定种子的话每次划分结果不同实验没法对比。shutil.copy是复制不是移动原始数据保留一份划分错了还能重来。跑完检查一下三个子目录的图片数和标签数是否一一对应数量对不上说明有图缺标得先排查。提示划分前先确认图片和标签同名。labelImg 导出的 xml 和图片同名转成 YOLO txt 后也要保持同名否则脚本会报 FileNotFoundError。3. 从零跑通 YOLO 训练环境搭建与配置文件改动数据划分好接下来是训练。资源里给了 Linux 和 Windows 两套环境搭建文档还有按案例改自己数据集的训练教程。这一章把环境搭建的关键点和配置文件改动讲清楚照着做基本能跑通。3.1 Linux 与 Windows 环境搭建的差异点两个平台的核心差异在 CUDA 和 PyTorch 的版本匹配上。Windows 下装 CUDA 驱动相对省事但路径和编码容易出问题LinuxUbuntu下更稳适合长时间训练。资源里的 Ubuntu 安装教程覆盖了基础环境这里补几个实操要点。# 以 Ubuntu 为例先确认显卡驱动和 CUDA 版本 nvidia-smi # 看驱动版本和最高支持的 CUDA 版本 nvcc --version # 看已安装的 CUDA 版本 # 创建独立环境避免污染系统 Python conda create -n yolo python3.9 -y conda activate yolo # 安装 PyTorchcu118 要和 nvidia-smi 显示的版本匹配 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 验证 GPU 是否可用 python -c import torch; print(torch.cuda.is_available())nvidia-smi右上角显示的 CUDA Version 是驱动支持的最高版本不是已安装版本别搞混。torch.cuda.is_available()返回 False 是最常见的翻车点九成是 PyTorch 的 CUDA 版本和驱动不匹配重装对应版本即可。Windows 下额外注意路径里别带中文和空格否则 dataloader 读图会报编码错误用 PyCharm 的话把 conda 环境解释器指到刚建的yolo环境别用 base。3.2 改配置文件data.yaml 与模型选择YOLOv5/v8 训练前要改的核心文件是data.yaml它告诉模型去哪找图、有几类、类名是什么。# data.yaml数据集配置 path: /home/user/dataset_split # 数据集根目录 train: train/images # 训练集图片相对路径 val: val/images # 验证集图片相对路径 test: test/images # 测试集图片相对路径 nc: 6 # 类别数按实际金具类别改 names: # 类别名顺序必须和标签里的 class_id 对应 - damper # 防震锤 - suspension_clamp # 悬垂线夹 - tension_clamp # 耐张线夹 - spacer # 间隔棒 - grading_ring # 均压环 - insulator # 绝缘子nc和names必须和标签里的 class_id 严格对应。如果标签里 class_id 是 0 到 5names 就得按这个顺序写六行写反了模型学出来的类别全是错的。path用绝对路径最稳相对路径在不同工作目录下启动训练容易找不到文件。# 以 YOLOv8 为例启动训练 yolo detect train \ datadata.yaml \ modelyolov8s.pt \ # 小目标多s 起步显存够再上 m epochs100 \ imgsz640 \ # 金具尺寸小可尝试 1280 提升小目标召回 batch16 \ projectruns/train \ namegoldenware_v1imgsz是金具检测的关键参数。输电线路金具在整图里占比小640 下小目标容易漏显存允许的话上到 1280mAP 通常有明显提升。batch根据显存调OOM 就减半。model从yolov8s.pt起步预训练权重能加速收敛别从零训。3.3 训练过程看什么指标训练启动后重点盯三个东西box_loss、cls_loss、mAP50。box_loss不降说明坐标换算或标签有问题回去查归一化是否正确cls_loss不降多半是nc和names对不上mAP50在验证集上波动大检查验证集是不是太小或者和训练集分布差异过大。资源里的训练教程是按案例改数据集核心就是改data.yaml和类别数其余超参可以先沿用。注意训练前先用几十张图跑 1 个 epoch 做冒烟测试确认数据能读、loss 能降再上全量。直接上 10000 张跑一晚上发现标签错了血泪经验。4. 避坑与排查标签、路径、显存这三类问题最常见数据集和训练流程里翻车点集中在标签格式、路径配置和显存三块。下面五条是我实际踩过或见别人踩过的按「现象 → 原因 → 解决」写对照排查能省不少时间。4.1 现象训练 loss 一直是 nan 或 0原因标签坐标没归一化或者 VOC 转 YOLO 时算错了。YOLO 要求坐标在 0 到 1 之间如果直接把像素值写进 txt模型算 loss 时数值爆炸。解决写个校验脚本遍历所有 txt检查每行后四个值是否都小于等于 1。发现大于 1 的回去重新转换确认除以了图片的宽高。import os # 校验 YOLO 标签是否归一化 def check_labels(lbl_dir): bad [] for f in os.listdir(lbl_dir): if not f.endswith(.txt): continue with open(os.path.join(lbl_dir, f)) as fp: for i, line in enumerate(fp): parts line.strip().split() if len(parts) ! 5: bad.append((f, i, 字段数不对)) continue vals [float(x) for x in parts[1:]] if any(v 1 or v 0 for v in vals): bad.append((f, i, 坐标越界)) return bad print(check_labels(labels))4.2 现象报 FileNotFoundError 或找不到图片原因data.yaml里的path和train/val路径拼接后对不上实际目录或者图片和标签不同名。解决把path改成绝对路径train写成相对path的子路径。再确认 images 和 labels 下文件名一一对应缺标签的图要么补标要么删掉。4.3 现象CUDA out of memory原因batch或imgsz设太大显存不够。解决先把batch减半还不行就降imgsz。金具检测想保小目标优先保imgsz降batch用梯度累积补回来。4.4 现象mAP 很低但 loss 正常下降原因类别名和 class_id 顺序错位或者验证集和训练集分布差异过大。解决抽查几张验证集图片用训练好的模型推理看框出来的类别名对不对。顺序错了就改names分布问题就重新划分保证随机性。4.5 现象Windows 下 dataloader 报编码错误原因路径含中文或者 num_workers 在多进程下读图出问题。解决路径全改英文把workers设为 0 先跑通确认没问题再调大。5. 进阶技巧用 COCO 格式做评估与跨框架迁移三种格式里YOLO 格式训练最方便但要做严谨评估或换框架COCO 格式更通用。这一章讲两个进阶用法用 COCO 格式跑 pycocotools 评估以及把数据迁移到 mmdetection 这类框架。先说评估。YOLO 训练完自带的验证用的是它自己的 mAP 计算逻辑如果想和论文或其他框架对比用 COCO 的评估标准更公平。资源里给了 COCO json直接拿来用from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval # 加载真值和预测结果 coco_gt COCO(annotations/instances_val.json) coco_dt coco_gt.loadRes(predictions.json) # 模型输出转成 COCO 格式 # 按 COCO 标准评估 e COCOeval(coco_gt, coco_dt, iouTypebbox) e.evaluate() e.accumulate() e.summarize() # 输出 AP、AP50、AP75、APs、APm、APlsummarize()输出的APs是小目标 AP金具检测重点看这个。如果APs明显低于APm说明小目标召回不够回去把imgsz调大或加数据增强。predictions.json的格式是[{image_id: 1, category_id: 1, bbox: [x, y, w, h], score: 0.9}]注意 bbox 是绝对像素的[x, y, w, h]和 YOLO 的归一化中心点不一样转换时别搞反。再说迁移到 mmdetection。mmdetection 吃 COCO 格式把 json 和图片按它的目录规范放好改一下 config 里的num_classes和data_root就能训。常见做法是先用 YOLO 快速验证数据质量确认标签没问题再迁到 mmdetection 做对比实验。迁移时最容易错的是类别 idCOCO 的category_id从 1 开始mmdetection 内部会映射到 0 开始config 里的classes顺序要和 json 里的categories一致。用途推荐格式关键参数YOLO 快速训练YOLO txtnc、names、imgsz标准评估对比COCO jsoniouType、APsmmdetection 迁移COCO jsonnum_classes、data_root最后说一个我自己的习惯每次拿到新数据集先抽 20 张图可视化标签用脚本把框画到图上肉眼确认框的位置和类别对不对。这一步花五分钟能挡掉后面几小时的无效训练。从那以后我每次开训前都强制走一遍可视化再没出现过标签错位跑一晚上的情况。希望帮到你。本文还有配套的精品资源点击获取