简介本资源为面向电力巡检与目标检测方向的YOLO绝缘子缺陷检测数据集适合从事电力设备智能巡检研究的学生、算法工程师及竞赛选手使用可解决绝缘子缺陷样本获取难、标注格式不统一的问题。压缩包共2000个文件约57.16MB包含1000张真实场景高质量图片以及voc格式xml、yolo格式txt等标注文件另附yaml配置文件、Python划分脚本与html教程文档覆盖数据标注、格式转换到模型训练的完整链路。资源已吸引853人学习下载配套训练集、验证集、测试集划分脚本可按需重新切分数据并附Windows与Linux双平台的YOLO环境搭建及训练案例教程帮助读者快速将数据集接入YOLO系列模型并复现训练流程同时理解三种标签格式的对应关系与目录组织方式为后续模型调优与工程落地提供可靠的数据基础。1. 拆开这个绝缘子数据集1000 张图、三套标签和一套能跑通的训练链路电力巡检的兄弟多半遇到过这种场景无人机拍回来几百张绝缘子照片想用 YOLO 训一个缺陷检测模型结果卡在第一步——没有标注好的数据。自己标吧1000 张图用 labelImg 一张张画框眼睛都花了网上找的开源数据集要么是通用 COCO 里挑出来的几张要么格式对不上VOC 的 xml 转 YOLO 的 txt 又得写脚本。这个资源包就是冲着这个痛点来的1000 张真实电力场景的绝缘子图片用 labelImg 标注同时给了 voc(xml)、coco(json)、yolo(txt) 三种格式标签还附了数据集划分脚本和 Linux/Windows 两套环境搭建与训练教程。适合谁刚接触 YOLO 目标检测、手头有电力巡检需求、想快速跑通「数据→训练→推理」全流程的工程师。下面我按自己拆包复现的顺序把这份资源从结构到落地讲清楚。2. 数据集结构与三种标签格式先搞懂目录再动手2.1 目录布局与文件对应关系拿到压缩包解压后第一件事不是急着跑训练而是把目录结构摸清楚。这类数据集常见的组织方式是按格式分文件夹图片和标签分开存放。我拆过的包大致是这样dataset/ ├── images/ # 原始图片1000 张 jpg ├── annotations_voc/ # VOC 格式 xml 标签 ├── annotations_coco/ # COCO 格式 json 标签 ├── labels_yolo/ # YOLO 格式 txt 标签 ├── ImageSets/ # 划分后的 txt 列表 │ ├── train.txt │ ├── val.txt │ └── test.txt └── scripts/ # 划分脚本关键点在于图片只有一份三套标签是同一批标注的不同导出格式。labelImg 本身支持 PascalVOC 和 YOLO 两种保存格式COCO 的 json 一般是 VOC 转出来的。所以三套标签的框坐标本质一致只是表达方式不同。理解这一点后面转换和校验才不会乱。2.2 VOC、COCO、YOLO 三种格式的差异与选用三种格式的核心区别在坐标表示和文件组织格式文件类型坐标表示坐标基准适用场景VOC每图一个 xmlxmin,ymin,xmax,ymax绝对像素labelImg 默认、传统检测框架COCO单个 jsonx,y,width,height绝对像素多任务、实例分割、pycocotools 评估YOLO每图一个 txtcx,cy,w,h归一化 0~1YOLO 系列训练直接读取YOLO 格式的归一化坐标是新手最容易翻车的地方。cx、cy 是框中心点相对图宽图高的比例w、h 是框宽高相对图宽图高的比例全部在 0 到 1 之间。如果你直接把 VOC 的像素坐标塞进 txt训练时 loss 会直接炸掉或者模型完全不收敛。这个包里三套格式都给了省去了自己转的麻烦但用之前一定要抽查几个文件确认坐标范围。2.3 用脚本校验标签一致性在正式划分之前我习惯先写个小脚本抽查标签是否对齐。下面这段代码读取一张图的 YOLO 标签把归一化坐标还原成像素框再和 VOC 的 xml 对比确认两者描述的是同一个目标import os import xml.etree.ElementTree as ET from PIL import Image img_path dataset/images/000001.jpg yolo_path dataset/labels_yolo/000001.txt voc_path dataset/annotations_voc/000001.xml # 读图片尺寸YOLO 归一化坐标需要乘回宽高 w, h Image.open(img_path).size print(f图片尺寸: {w}x{h}) # 解析 YOLO txt with open(yolo_path) as f: for line in f: cls, cx, cy, bw, bh map(float, line.split()) # 还原为像素坐标 xmin (cx - bw / 2) * w ymin (cy - bh / 2) * h xmax (cx bw / 2) * w ymax (cy bh / 2) * h print(fYOLO 还原框: {xmin:.1f},{ymin:.1f},{xmax:.1f},{ymax:.1f}) # 解析 VOC xml tree ET.parse(voc_path) for obj in tree.findall(object): name obj.find(name).text 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) print(fVOC 框 [{name}]: {xmin:.1f},{ymin:.1f},{xmax:.1f},{ymax:.1f})逻辑说明YOLO 的 cx、cy、bw、bh 都是相对整图的归一化值乘以宽高才能和 VOC 的绝对像素坐标对齐。参数上注意map(float, ...)处理的是每行五个值第一个是类别索引。如果两边框的像素坐标差在几个像素以内说明标注一致差得离谱要么是标签没对齐要么是图片被 resize 过而标签没同步更新。这一步花五分钟能省掉后面训练几小时的无效等待。3. 数据集划分脚本train/val/test 怎么切才不翻车3.1 划分脚本的三种模式包里给了三个划分脚本名字就能看出用途训练集、验证集、测试集划分脚本图片标签划分写入新文件夹.py、训练集、验证集划分脚本图片标签划分写入新文件夹.py、split_train_val生成ImageSets下txt文件划分脚本.py。前两个是物理复制文件到新文件夹第三个是只生成 ImageSets 下的 txt 列表文件不移动图片。这两种思路各有适用场景。物理复制的好处是划分结果直观每个子文件夹里图片和标签成对出现适合直接喂给某些要求固定目录结构的训练框架。生成 txt 列表的好处是不占额外磁盘空间YOLO 官方训练脚本就是读 txt 列表的。我一般优先用 txt 列表方式1000 张图虽然不大但养成不复制数据的习惯以后上万张图时磁盘不会爆。3.2 按比例划分并固定随机种子划分最怕的是每次跑结果不一样导致实验无法复现。下面是我改写过的划分脚本核心是固定随机种子并按 8:1:1 切分import os import random random.seed(42) # 固定种子保证每次划分结果一致 img_dir dataset/images label_dir dataset/labels_yolo out_dir dataset/ImageSets os.makedirs(out_dir, exist_okTrue) # 收集所有图片名不含扩展名确保标签存在 names [] for f in os.listdir(img_dir): if f.endswith(.jpg): stem os.path.splitext(f)[0] if os.path.exists(os.path.join(label_dir, stem .txt)): names.append(stem) random.shuffle(names) n len(names) n_train int(n * 0.8) n_val int(n * 0.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(): with open(os.path.join(out_dir, split .txt), w) as f: for stem in items: # 写绝对路径或相对路径按训练脚本要求调整 f.write(os.path.join(img_dir, stem .jpg) \n) print(f{split}: {len(items)} 张)逻辑说明random.seed(42)是复现的关键不固定种子的话每次划分不同模型指标波动你都不知道是数据划分导致的还是模型本身的问题。参数上 8:1:1 是常见起点数据量小的时候可以调成 7:2:1 让验证集多一点。注意写入 txt 的路径要和训练脚本里的读取逻辑匹配有的 YOLO 版本要求图片路径有的要求图片和标签路径成对改之前先看训练脚本怎么读。3.3 划分后的完整性检查划分完别急着训练先做两件事。第一确认 train、val、test 三个列表没有交集否则验证集里出现训练过的图指标虚高。第二确认每个列表里的图片都能找到对应标签。下面这段检查脚本我每次划分后都跑def check_split(txt_path, img_dir, label_dir): with open(txt_path) as f: lines [l.strip() for l in f if l.strip()] stems [os.path.splitext(os.path.basename(l))[0] for l in lines] # 检查重复 assert len(stems) len(set(stems)), f{txt_path} 存在重复 # 检查图片和标签是否都存在 missing [] for s in stems: if not os.path.exists(os.path.join(img_dir, s .jpg)): missing.append(s .jpg) if not os.path.exists(os.path.join(label_dir, s .txt)): missing.append(s .txt) print(f{txt_path}: {len(stems)} 条, 缺失 {len(missing)}) return set(stems) train check_split(dataset/ImageSets/train.txt, img_dir, label_dir) val check_split(dataset/ImageSets/val.txt, img_dir, label_dir) test check_split(dataset/ImageSets/test.txt, img_dir, label_dir) # 检查交集 print(train∩val:, len(train val)) print(train∩test:, len(train test)) print(val∩test:, len(val test))逻辑说明assert那行拦截重复项交集检查拦截数据泄漏。三个交集都应该是 0。如果发现交集不为 0说明划分脚本有 bug 或者手动改过列表。这一步是血泪经验我曾经因为验证集混进训练图模型在验证集上 mAP 0.95一上测试集掉到 0.6排查了半天才发现是划分问题。4. 环境搭建与训练Linux 和 Windows 两条路4.1 Linux 下的环境搭建要点包里给了YOLO环境搭建Linux版本.html和Linux之Ubuntu环境安装教程.html。Linux 下搭 YOLO 环境核心是 CUDA、cuDNN 和 PyTorch 版本三者对齐。常见做法是用 conda 建独立环境避免污染系统 Pythonconda create -n yolo python3.9 -y conda activate yolo # 根据显卡驱动版本选 CUDA 版本这里以 CUDA 11.8 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python lxml逻辑说明python3.9是 YOLOv5/v8 都兼容的版本太新或太旧都可能遇到依赖冲突。--index-url指定 PyTorch 官方 CUDA 源比默认源快且版本明确。装完用python -c import torch; print(torch.cuda.is_available())验证输出 True 才算 GPU 可用。如果输出 False八成是 CUDA 版本和驱动不匹配nvidia-smi看驱动支持的 CUDA 上限别超过它。4.2 Windows 下的环境搭建与 Anaconda 配置Windows 版本教程对应YOLO环境搭建Windows版本.html。Windows 下我强烈建议用 Anaconda因为原生 pip 装 CUDA 相关包容易出玄学问题。步骤和 Linux 类似但有几个 Windows 特有的坑路径里的反斜杠在 Python 字符串里要转义或者统一用正斜杠num_workers设大于 0 有时会卡死Windows 下建议设 0 或 2。conda create -n yolo python3.9 -y conda activate yolo pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics逻辑说明Windows 下ultralytics会自动装依赖但 opencv 有时需要单独pip install opencv-python。验证 GPU 可用性和 Linux 一样。如果遇到DLL load failed通常是 Visual C Redistributable 没装去微软官网下最新的装上。4.3 用案例数据跑通第一次训练环境好了之后别急着上自己的数据先用包里教程的案例跑一遍确认链路通。YOLOv8 的训练命令很简洁yolo detect train \ datadataset.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ projectruns/insulator \ nameexp1逻辑说明datadataset.yaml是数据集配置文件里面写 train、val、test 的 txt 路径和类别名。modelyolov8n.pt用 nano 版本先跑通速度快确认没问题再换 s 或 m。imgsz640是输入尺寸绝缘子缺陷目标通常不大640 够用显存紧张可以降到 416。batch16按显存调8G 显存跑 640 大概能到 16。project和name控制输出目录方便对比不同实验。dataset.yaml 的内容大致是path: /home/user/dataset train: ImageSets/train.txt val: ImageSets/val.txt test: ImageSets/test.txt nc: 1 names: [defect]逻辑说明nc是类别数绝缘子缺陷检测通常就一类「缺陷」如果区分自爆、破损等可以改。names的顺序要和标签里的类别索引对应YOLO 标签第一列是索引0 对应 names[0]。这里最容易翻车的是路径path是根目录train/val 是相对路径写错了会报找不到文件。4.4 训练过程监控与指标解读训练启动后终端会打印每个 epoch 的 loss 和 mAP。重点看三个指标box_loss 持续下降说明框回归在学cls_loss 下降说明分类在学mAP50 上升说明整体检测能力在提升。如果 box_loss 不降反升检查学习率是不是太大或者标签坐标有没有越界。如果 mAP 一直上不去先确认验证集标签格式对不对再考虑加数据增强。训练完在runs/insulator/exp1/weights/下会有best.pt和last.pt。best.pt 是验证集指标最好的权重推理用它。下面这段代码跑单张图推理确认模型真的能检出缺陷from ultralytics import YOLO model YOLO(runs/insulator/exp1/weights/best.pt) results model(dataset/images/000001.jpg, conf0.25) results[0].save(output.jpg) for box in results[0].boxes: print(f类别: {box.cls}, 置信度: {box.conf:.2f}, 坐标: {box.xyxy})逻辑说明conf0.25是置信度门限低于这个值的框不输出。绝缘子缺陷检测里门限调低召回高但误检多调高误检少但漏检多实际部署时按业务容忍度调。box.xyxy是左上右下像素坐标可以直接画到原图上。5. 避坑与排查绝缘子数据集训练常见的五个翻车点5.1 现象训练 loss 为 nan 或直接不收敛原因YOLO 标签坐标越界归一化值大于 1 或小于 0。labelImg 导出 YOLO 格式时如果框画到了图片边界外坐标可能超出 0~1 范围。解决写脚本扫描所有 txt把越界坐标 clamp 到 [0,1]或者直接删掉这些异常标注重新标。我一般用awk快速扫awk {if($20||$21||$30||$31||$40||$41||$50||$51) print FILENAME: $0} dataset/labels_yolo/*.txt5.2 现象验证集 mAP 很高但测试集一塌糊涂原因数据泄漏train 和 val 有重叠图片或者同一张图的不同增强版本同时进了 train 和 val。解决跑 3.3 节的交集检查脚本确保三个集合互斥。另外划分前先按图片去重同一场景连拍的相似图要分到同一个集合否则验证集指标虚高。5.3 现象训练时提示找不到标签文件原因txt 列表里的路径和实际标签路径不匹配。有的脚本写的是图片路径训练框架自动把images替换成labels找标签如果你的目录名不是这个约定就找不到。解决要么改目录名对齐约定要么改训练脚本的路径解析逻辑。最稳的办法是 txt 里直接写图片绝对路径标签路径按规则推导。5.4 现象GPU 显存够但训练报 OOM原因batch或imgsz设太大或者num_workers太多导致内存爆。解决先降 batch 到 8 或 4再降 imgsz 到 416。Windows 下num_workers设 0 能规避多进程卡死。另外检查是不是同时跑了多个训练任务占显存。5.5 现象推理时框位置偏移或框到背景原因训练时的 imgsz 和推理时的 imgsz 不一致或者标签坐标在 resize 时没同步缩放。解决训练和推理用同一个 imgszYOLO 内部会自动处理 letterbox 缩放但如果你自己预处理过图片要确保标签也跟着缩放。推理时conf门限太低也会框到背景适当调高到 0.3~0.5 试试。6. 从跑通到用好置信度门限调优与批量推理技巧模型训完只是开始真正落地时置信度门限的调整比训练本身还磨人。绝缘子缺陷检测有个特点缺陷目标通常只占图片一小块背景是大片天空或杆塔模型容易把纹理误判成缺陷。我一般会先在验证集上跑一遍不同门限的指标画个 P-R 曲线找平衡点。下面这段代码批量推理验证集输出不同 conf 下的检出数量帮你判断门限该设多少from ultralytics import YOLO import os model YOLO(runs/insulator/exp1/weights/best.pt) val_dir dataset/images confs [0.1, 0.25, 0.4, 0.5, 0.6] for conf in confs: total_boxes 0 for f in os.listdir(val_dir): if f.endswith(.jpg): r model(os.path.join(val_dir, f), confconf, verboseFalse) total_boxes len(r[0].boxes) print(fconf{conf}: 总检出框数 {total_boxes})逻辑说明verboseFalse关掉每张图的打印避免刷屏。观察总框数随 conf 的变化如果从 0.25 到 0.4 框数骤降说明很多框置信度在 0.25~0.4 之间这些多半是误检门限可以往 0.4 靠。如果框数很平稳说明模型置信度分布比较集中门限选择不敏感。实际部署时我习惯把门限设得比验证集最优值略高一点宁可漏检几个也不让误检触发告警毕竟巡检工人跑一趟现场的成本远高于漏掉一个可疑框。还有一个技巧是批量推理时把图片尺寸统一。绝缘子图片如果来自不同相机分辨率可能不一致推理前统一 resize 到训练时的 imgsz能避免 letterbox 引入的额外偏移。另外model.predict支持传文件夹路径一次跑完整个目录比循环单张快不少。最后提醒一句这个数据集只有 1000 张训出来的模型泛化能力有限实际项目里我一般会先用它跑通流程再拿现场数据做增量训练效果才稳。从那以后我每次拿到新数据集都强制先跑一遍标签校验和划分检查再开始训练——这个习惯帮我省了太多返工时间。希望帮到你。本文还有配套的精品资源点击获取
