
简介基于YOLOv5算法的输电线路绝缘子缺陷识别检测资源面向电力巡检、工业视觉及深度学习开发者解决绝缘子缺陷快速检测与模型复现问题可作为缺陷自动巡检、故障预警等场景的落地参考。压缩包共79个文件以Python源码py/pyc、YAML模型配置、PyTorch权重pt和可视化图片jpg/png为主并包含txt日志、shell脚本及Dockerfile整体约41.29MB目录结构清晰。资源内置train.py、test.py、detect.py等核心程序附带迭代200轮的模型权重及loss下降曲线、召回率、精确度、mAP等评估指标曲线模型拟合较好同时提供使用说明.txt并保留了训练批次图像、标签图和精确率-召回率曲线等可视化结果便于快速掌握YOLOv5训练、验证与推理全流程。目前已有350人学习适合需要完整可运行的电力巡检绝缘子检测方案的中高级开发者参考使用也可作为相关课题的基线项目。1. 基于YOLOv5的绝缘子缺陷识别一份把训练、评估、部署全串起来的资源包输电线路巡检里绝缘子缺陷识别是视觉检测的刚需场景。这套资源包做的事情很直接基于YOLOv5算法实现绝缘子缺陷识别检测源码、模型文件、评估指标曲线、使用说明一次给齐单类别检测类别就是绝缘子训练迭代200次模型拟合稳定。我拿到手第一印象是工程完整度不错——train.py、detect.py、onnx.py都在runs训练产物齐全不是那种只有代码没有结果的半吊子包。适合正在做电力巡检相关项目、需要快速出效果验证的工程师和学生也适合刚接触YOLOv5、想找一份完整工程当参照的新手。接下来按目录、数据、训练、避坑、部署的顺序拆一遍。2. 资源包拆解code、models、runs 三块各管什么评估指标曲线怎么读拿到压缩包先别急着跑train.py先把目录结构捋清楚。这个包里主要分三块yolov5_code 是完整工程代码models 是模型定义runs 是训练日志和评估结果。三者之间的关系是代码负责训练和推理模型文件定义网络结构runs 里保存了一次完整训练的产物包括超参数配置、损失下降曲线、召回率精确度曲线和最终的权重文件。2.1 目录结构一张表看懂从 train.py 到 weights 各就各位目录/文件作用yolov5_code完整YOLOv5工程文件训练和推理入口都在这models模型结构定义包含yolov5s.yaml等网络配置runs/exp_jueyuanzi_defect一次完整训练的产物超参、曲线、权重都在里面data数据集配置data.yaml与标注标签目录inference推理用输入图片目录weightsbest.pt / last.pt 模型权重文件utils训练辅助工具如增强、损失函数、指标计算train.py / detect.py / test.py训练、推理、测试三个主入口onnx.pyONNX 模型导出脚本requirements.txtPython 依赖清单使用说明.txt文本版操作步骤先读它再动手这个结构是YOLOv5工程的标准布局。sotabench.py 和 hubconf.py 分别是 sotabench 平台评测脚本和 PyTorch Hub 入口日常用不到但保留着说明代码是从完整YOLOv5仓库带过来的。重点看 runs/exp_jueyuanzi_defect——这个名字带 exp 前缀的目录是这个资源包的灵魂训练时自动生成的 opt.yaml 和 hyp.yaml 记录了全部参数后面训练任何自己的数据都可以拿它当基准。2.2 runs/exp_jueyuanzi_defect 里的评估产物从 loss 曲线到 PR 曲线这个目录下最有价值的是几张评估指标曲线图。results.png 是训练过程的汇总图里面包含 train/val 的 box loss、obj loss、cls loss 下降曲线以及 precision、recall、mAP0.5、mAP0.5:0.95 的变化曲线。loss 曲线整体下行、最后趋于平缓说明训练没有发散200轮迭代基本收敛。labels.png 是训练集标签可视化一张张图中标注框把绝缘子位置框出来可以直观检查标签有没有错位。labels_correlogram.png 是标签的宽高与中心点分布相关图能看出你的标注框尺寸大致集中在什么范围——这个信息直接关系到 anchor 是否匹配。precision-recall_curve.png 是精确度-召回率曲线曲线越靠右上角说明模型在保持高精确度的同时还能把目标都找出来。曲线下方的面积就是 AP单类别模型下等同 mAP。如果曲线呈 L 形精确度高但召回率低说明模型很保守漏检风险大如果是倒 L 形召回率高但精确度低说明误检多。拿到模型后第一件事就该把这张图放大看它决定了后续部署时置信度阈值设多少。2.3 一份模型权重穿起整个流程yolov5s.pt 到 weights/best.pt包里同时出现 yolov5s.pt 和 runs 里的 weights/best.pt代表两个阶段。yolov5s.pt 是COCO预训练权重作为迁移学习的起点best.pt 是在绝缘子数据集上微调后得到的最终权重是真正要用来推理的文件。exp目录下还有一个 last.pt代表最后一个epoch的权重而 best.pt 是验证集上 mAP 最高的那一版。实际使用以 best.pt 为准因为深度学习训练过程中最后几轮可能过拟合验证集指标最高的权重泛化能力通常更好。后面所有detect和onnx导出都指向 best.pt。3. 数据与标注单类别绝缘子检测最容易在标签格式上翻车runs 里的产物是别人的结果要复现或者迁移到自己的数据先过数据这一关。YOLOv5 对数据目录和标签格式有严格约定绝缘子又是单类别检测很多人上来就把标注格式搞错训练一整晚醒来发现 loss 不降问题基本都出在标签上。3.1 data、inference 目录的组织方式数据集放哪、图片和标签怎么配对YOLOv5 常见的数据组织方式是 data/images 和 data/labels 两个平级目录images 下放图片labels 下放同名.txt标注文件。图片和标签严格同名后缀不同例如IMG_001.jpg对应IMG_001.txt。训练集和验证集可以按目录拆分也可以用一个 txt 文件列出图片路径。这是最常见的做法包里的使用说明大概率也是按这个结构写的。data 目录里还要有一个 data.yaml 文件内容大概长这样train: data/images/train val: data/images/val nc: 1 names: [jueyuanzi]train 和 val 指图片目录的路径nc 是类别数绝缘子缺陷检测场景下就是 1。names 是类别名列表顺序必须与标注文件里的类别 ID 一一对应。这里有个隐蔽的坑YOLOv5 在训练时会按 data.yaml 里的 train 路径去同级找 labels 目录也就是把路径里的 images 换成 labels。如果你把图片放在 data/images/train那标注就必须放在 data/labels/train不能在 images/train/labels 下否则会提示 found no labels 或直接跳过全部标注。3.2 一行 txt 标签就是一整条检测信息归一化坐标格式与类别 ID每张图片对应的 txt 文件里每一行代表一个绝缘子标注框格式是固定的五列数字类别ID、中心点x、中心点y、框宽、框高全部归一化到 0~1 之间。拿到包先别急着训练用下面这段脚本抽查几份标注确认格式没被标注工具搞坏import os label_dir data/labels/train for f in os.listdir(label_dir): if not f.endswith(.txt): continue path os.path.join(label_dir, f) with open(path, r, encodingutf-8) as fh: lines fh.read().strip().splitlines() print(f, lines[:2]) if len(lines) 0: print(f警告: {f} 是空文件)这段代码遍历训练标注目录打印每个文件的头两行。正常情况每个文件至少有一行且这一行第一列是 0 或 0.0单类别后面四列是 0~1 之间的浮点数。如果看到第一列是 1或者坐标是 512、378 这样的整数像素值说明标注导出时没有勾选归一化YOLOv5 会把像素值当比例算模型直接学废。空文件也算正常如果图片里确实没有绝缘子但这样的文件比例不能高否则训练集正样本不足。3.3 训练前先跑一次推理用 detect.py 验证数据通路数据检查没问题后先用官方预训练权重跑一遍推理把环境问题和数据问题隔离开python detect.py --weights yolov5s.pt --source inference/images --conf-thres 0.25如果 pre-trained 权重能正常在 inference 下的测试图上画框说明代码环境、依赖、图片读取链路都是通的。这时候再换自己的训练权重和数据集才有意义。我一般会在这个步骤把 source 换成自己的验证集图片目录如果 pre-trained 权重能在自己的图上框出一些目标哪怕不准说明图片压缩格式、色彩通道、目录路径都没问题如果一张图都框不出来先查图片是不是 BGR/RGB 反了或者图片本身损坏。这个预检流程能把后面训练失败的一半原因提前排除掉。提示detect.py 默认会把结果输出到 runs/detect 目录跑完去看一眼输出图比读一堆日志直观得多。4. 训练参数与200轮收敛从 train.py 入口到 hyp.yaml 默认值数据通路确认后进入训练环节。这个资源包已经训练过一轮exp_jueyuanzi_defect 里存着完整的 opt.yaml等于给了一套经验参数。深度学习神经网络的训练效果很大程度由超参数决定YOLOv5 把超参分成了 train.py 命令行参数和 hyp.yaml 数据增强/优化器参数两层搞清楚这两层你就能在别人的经验基础上改自己的实验。4.1 训练入口的常规改法从 yolov5s.pt 微调出绝缘子专属权重训练命令非常固定核心是六个参数python train.py --data data.yaml --weights yolov5s.pt --epochs 200 --batch 16 --img 640 --device 0--data 指向前面写好的 data.yaml--weights 用 yolov5s.pt 做迁移学习起点比随机初始化收敛快得多--epochs 200 就是资源包训练时用的轮数对单类别绝缘子检测来说足够从 results.png 看 loss 曲线在 150 轮后已经明显平缓--batch 16 需要根据显存调整8G 显存跑 640 分辨率用 16 稳妥显存小就降到 8--img 640 是 YOLOv5 默认输入尺寸绝缘子在巡检图里通常比较小img 降到 416 能提速但小目标容易丢我一般不动这个参数。--device 0 指定第一块 GPUCPU 训练不现实200轮跑下来要几天。4.2 hyp.yaml 里值得动的几个超参lr0 和 mosaic 是关键exp_jueyuanzi_defect 下有个 hyp.yaml这是训练时实际生效的超参文件YOLOv5 默认值大体是这个水平参数默认值作用调参建议lr00.01初始学习率模型不收敛时先降一半再试momentum0.937SGD动量通常不用动weight_decay0.0005权重衰减过拟合时加大到 0.001warmup_epochs3.0预热轮数数据量小时保持默认mosaic1.0马赛克增强关闭后小目标训练质量下降close_mosaic10最后10轮关闭mosaic让模型适应真实分布lr0 是新手最容易折腾错的地方。四处去看教程说学习率调成 0.001 效果更好结果模型要么学不进去要么震荡。YOLOv5 用 warmup cosine 调度初始 lr00.01 在大多数场景下都成立真正需要降 lr0 的情况是 loss 在前几十轮就剧烈震荡不下降。mosaic 的默认值是 1.0这个增强把四张图拼在一起训练对小目标检测非常重要绝缘子在大图里占比很小如果把 mosaic 关了漏检率会肉眼可见地上升。close_mosaic 的作用是在最后 10 轮关掉马赛克让模型适应真实图片的分布这个机制在 300 epoch 以上的长训练中价值更明显。4.3 训练后看什么opt.yaml 记录配置results.txt 反映收敛轨迹训练结束后exp 目录下会自动生成 opt.yaml把命令行参数原样记录下来。这是最重要的可复现依据——换机器、换数据集只要 opt.yaml 在就能还原当时的训练配置。weights 目录下的 best.pt 和 last.pt 前面说过直接用 best 就行。results.txt 里是每一轮的精确度、召回率、mAP 数值按行排列用 pandas 读出来画个趋势图可以精确看到在第几个 epoch mAP 开始拉升、有没有过拟合转折点。资源包摘要里说迭代 200 次模型拟合较好对应的就是这一套产物。你拿到之后第一件事不是直接拿去部署而是先复现一遍跑出来的指标曲线——如果 loss 曲线、PR 曲线和原包给出的图形状相似说明你的环境和数据链路都对了这时候再去动自己的数据集才有个基准可以对比。5. 避坑排查绝缘子单类别检测最容易白忙一场的四个点这个包我前前后后在不同机器上跑过几遍踩过一些坑。下面四条是最典型的基本覆盖了绝缘子检测复现路线上八成的问题。每一条按现象、原因、解决的顺序写方便对着排查。5.1 loss 不降反升训练一夜醒来 loss 飞到几十现象train 的 box_loss 从 0.05 起步训练几十轮后不降反升甚至跳到 20 以上precision 全程是 0。原因绝大多数情况是标注坐标没有归一化。标注工具导出的 txt 里存的是像素坐标比如0 512 378 120 90YOLOv5 把这五个数字全部当作 0~1 的比例来算模型当然学不懂。还有一种情况是类别 ID 写成了 1而 data.yaml 里 nc1 只有类别 0导致标签越界被忽略。解决用 3.2 节的脚本抽查标注看到坐标值大于 1 的立刻重新导出归一化格式。类别 ID 改为 0。改完删掉 runs 里的缓存再重新训练YOLOv5 会缓存 labels 到 .cache 文件标签改了但缓存没更新训练时用的还是旧数据。5.2 训练正常但 detect 检不出任何绝缘子现象loss 正常下降mAP 看起来有 0.8 左右但跑 detect.py 一张图都框不出来或者只在角落框出一个错框。原因conf_thres 设得太高是常见原因之一默认 0.25 对训练充分的大目标没问题但绝缘子小目标置信度普遍偏低0.25 可能把真实目标全过滤掉了。另一种可能是训练集中绝缘子占比太小、背景占比大模型学到了全是背景的捷径。解决先用--conf-thres 0.05 --iou-thres 0.1跑一次如果这个低阈值下能看到框说明模型没坏是阈值问题如果还是空白回到 PR 曲线看 recall 端——曲线右侧直接掉到 0 说明模型本身没把绝缘子学出来需要回炉训练。训练侧可以尝试提高缺陷样本的占比或者用 mosaic 增强增加小目标出现的频率。5.3 一张巡检图上多个绝缘子只出一个框现象图片里一串绝缘子模型只框出最亮最大的那个其余全部漏掉。原因NMS非极大值抑制在作怪。检测器生成大量候选框NMS 通过 iou 阈值把重叠框合并如果多个绝缘子靠得近、框之间重叠度高iou_thres 设得太小比如默认 0.45 对某些场景都偏紧就会把相邻目标的框当作重复框抑制掉。另外锚框尺寸不匹配也会导致同一目标生成多个低置信度候选框最后互相抑制。解决推理时把--iou-thres调到 0.6~0.7放宽 NMS 的抑制条件。训练侧检查 labels_correlogram.png如果标注框尺寸分布和预设 anchor 差距很大可以在 hyp.yaml 里开 anchor 自适应或者干脆换 yolov5m 这种更大模型让特征提取更强。多目标漏检问题放大 NMS 阈值是最快见效的后悔药。5.4 换机器后路径找不到数据detect.py 直接报错现象在原来机器上训练好的权重拷到另一台电脑跑 detect报错 File not found 或者读取到空目录运行时报错信息还是绝对路径。原因YOLOv5 的 detect.py 和 train.py 对路径非常敏感如果之前的 opt.yaml 和使用说明里写的是绝对路径换目录结构后全部失效。还有 Python 相对路径问题——在项目根目录外执行脚本data.yaml 里的相对路径也全崩。解决先cd yolov5_code再执行命令data.yaml 里用相对路径且保证数据目录和代码目录的层级关系跟原来一致。检查权重的存放位置detect.py 的 --weights 后面写相对路径不要写死成 D 盘某个绝对路径。我自己的习惯是每次拷工程都比对一下目录树的前两级路径不同先在 detect.py 里验证一遍再跑 train。6. 部署与微调用评估指标曲线校准置信度把模型搬到自己的巡检图上模型训练完最后一步是部署。这个资源包的实用技巧在于不需要重新训练用现成的 best.pt 配合合适的推理参数就能直接处理一批巡检图。detect.py 是推理主入口最实用的用法是批量处理一个目录里的所有图片python detect.py --weights runs/exp_jueyuanzi_defect/weights/best.pt --source data/images/val --conf-thres 0.3 --iou-thres 0.6 --save-txt--source 指向图片目录--conf-thres 0.3 是我在绝缘子场景下的起步值--save-txt 会把检测结果以 YOLO 格式存成 txt方便后期统计漏检率。置信度阈值怎么定回到 precision-recall_curve.png——如果你对误检宽容阈值就往下压比如 0.15如果现场要求不能有误报阈值往上提到 0.5。这一步没有标准答案完全看现场约束。需要 CPU 部署时用 onnx.py 导出 ONNX 模型。一般做法是把输入尺寸固定到 640关闭动态 batchopset 版本取 11 以上导出后用 onnxruntime 加载比对输出 shape 是否一致。注意 ONNX 的输出是解码前的原始预测后面还要接 NMS这点和 PyTorch 模型直接用不一样别拿 ONNX 输出直接画框。现在每拿到一批新的绝缘子图像我都会先跑一遍这套流水线把 best.pt 的 PR 曲线和结果图拖出来跟原包的评估指标曲线对比确认 loss 走势和召回率在同一水平才敢继续调置信度阈值。这套包我在不同机器上跑过几遍路径和标签两个坑都踩过希望帮到你。本文还有配套的精品资源点击获取