☰
基于YOLOv5的绝缘子缺陷检测实战:训练配置、评估指标与避坑指南
2026/10/25 15:49:22 网站建设 项目流程

简介:基于YOLOv5算法实现的绝缘子及绝缘子缺陷识别检测系统,面向电力巡检、计算机视觉学习者与深度学习开发者,解决输电线路中绝缘子目标检测与缺陷定位的实际问题。资源包含完整Python源码、训练好的模型文件、多种评估指标曲线及详细使用说明,迭代200轮后模型拟合较好,可识别“绝缘子”与“绝缘子缺陷”两类目标。包体共78个文件,涵盖py源码与pyc编译文件、yaml配置、pt权重、jpg/png示例图像、txt说明、sh脚本及dockerfile等,压缩包约41.2MB,结构清晰便于直接部署和二次训练。目前已有702人学习下载。资源覆盖从数据准备、模型训练到评估推理的完整流程,训练曲线、召回率、精确率与mAP等指标齐全,适合用于毕业设计、课程项目或工程实践参考,能够帮助使用者快速搭建检测环境并理解YOLOv5在电力场景下的应用细节。

1. 这套基于 YOLOv5 的绝缘子缺陷识别资源,能帮你省掉三周调参时间

我刚拆完这套基于 YOLOv5 实现的绝缘子及绝缘子缺陷检测 Python 源码包,先说结论:对于做计算机视觉大作业、电网巡检项目预研或深度学习入门的从业者,这是一套少见的完整闭环资源,不是那种只有 train.py 的残缺代码。它的核心价值在于直接从绝缘子检测的预训练模型起步,迭代 200 次就能收敛,同时附带 precision-recall 曲线、mAP、召回率等全套评估指标曲线,能直观看到模型拟合过程。yolov5s.pt 权重、模型文件、推理脚本和评估指标曲线都在压缩包里,解压后按照使用说明.txt 的操作步骤就能把训练跑起来,特别适合刚接触深度学习和 YOLOv5 的人群。本文我会把训练配置、数据集格式、评估指标读法、踩坑记录全部拆一遍,照着做基本能把这套绝缘子缺陷检测系统复现出来并快速出结果。

2. 拆解代码包结构:官方的 YOLOv5 骨架,针对两类目标微调过的权重

2.1 压缩包内部目录:每个文件夹里装了什么

先把压缩包解开,看下代码分布。资源包的核心目录结构和常见 YOLOv5 项目一致,只是针对绝缘子场景做了定制训练。按功能可以分成三组:训练与推理脚本、模型配置、训练产出物。

工程根目录下有train.py、detect.py、test.py、sotabench.py四个主要脚本。train.py负责训练主流程,detect.py负责对图片或视频做推理,test.py用于在测试集上输出 mAP 等指标,sotabench.py是给 SOTA Bench 平台提交结果用的辅助脚本。onnx.py是 YOLOv5 早期版本自带的 ONNX 导出工具,requirements.txt是 Python 依赖清单。真正有参考价值的训练产物全在runs/exp_insulator_defect里面,这个目录是 YOLOv5 训练过程中自动生成的实验记录文件夹。

weights目录里存放的是训练好的模型权重,包含yolov5s.pt和训练完成后的最佳权重,在 YOLOv5 中末尾带_best后缀或位于runs/exp_insulator_defect/weights/best.pt的模型用于最终推理。utils目录是通用工具脚本,models目录定义网络结构。data目录存放数据集配置文件(这个包中因为数据集体积问题没有放进压缩包,需要自己准备好数据路径)。inference目录存测试图片。

以下是代码包的核心文件定位,标注了每个文件在本次绝缘子缺陷检测场景中的用途:

路径类型功能
yolov5_code/train.py训练入口用--data insulator.yaml指定绝缘子数据集,启动训练
yolov5_code/models/yolov5s.yaml网络结构定义 yolov5s 的 depth_multiple 和 width_multiple
yolov5_code/runs/exp_insulator_defect/训练记录包含opt.yaml(训练超参数)、results.txt(指标曲线数据)
yolov5_code/runs/exp_insulator_defect/weights/best.pt训练产物200 轮训练收敛后的最佳权重
yolov5_code/runs/exp_insulator_defect/labels.png数据可视化标注框中心点与尺寸分布,用于检查标注质量
yolov5_code/detect.py推理脚本加载模型后对测试图进行检测画框

2.2 网路骨架:为什么选 yolov5s 而不是 yolov5m 或 yolov5l

这套资源选择yolov5s.pt作为初始权重,我认为考虑目标尺寸和算力两方面的性价比。绝缘子在航拍巡检图中属于中小目标,但单个目标的尺寸通常几十到上百像素不等,而且绝缘子串具有长条状特征。yolov5s 的 Base C3 结构和 PANet 特征融合对这类目标的检测是有优势的。

看模型配置文件的差异,如果你要改版本,可以调整depth_multiple和width_multiple两个参数。在models/yolov5s.yaml中默认是depth_multiple: 0.33、width_multiple: 0.50。如果换用 yolov5m 则改成0.67和0.75,yolov5l 则更宽。这个资源在 200 轮迭代内能拟合,原因在于初始权重yolov5s.pt是在 COCO 数据集上预训练的,对通用物体已有特征提取能力,微调时只需要调整后面几层的分类头。

下面我从train.py中抽了几行实际训练相关的关键调用,方便你看懂训练参数入口是怎么组织起来的:

# train.py 核心逻辑(YOLOv5官方结构) parser.add_argument('--weights', type=str, default='weights/yolov5s.pt', help='initial weights path') parser.add_argument('--data', type=str, default='data/insulator.yaml', help='dataset.yaml path') parser.add_argument('--epochs', type=int, default=200) parser.add_argument('--batch-size', type=int, default=16) parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='train,val sizes')

--weights指定预训练权重,--data指定数据配置文件,--epochs 200表示训练 200 轮,--batch-size 16在消费级显卡上比较合适,--img-size 640表示输入图片缩放尺寸。这套资源在runs/exp_insulator_defect/opt.yaml中可以回看当时的完整训练参数,这个文件由训练过程自动生成,配合使用说明.txt 一起看就能完全还原训练环境。

2.3 数据标注:为什么图里必须既有绝缘子又有缺陷

需要强调一个决定训练成败的事:识别 2 类目标分别对应标签中的 class 0 和 class 1。标签文件是 YOLO 格式的 txt,每行对应一个目标框,格式为class x_center y_center width height,坐标值是归一化到 0~1 的浮点数。

举个例子,一张 1280×720 的巡检图片,如果绝缘子缺陷框左上角是 (100, 200)、右下角是 (300, 400),对应的标签行写法如下:

1 0.15625 0.41667 0.15625 0.27778

这个结果用框宽除以图片总宽 1280 得到 200 / 1280 = 0.15625,高度 200 / 720 ≈ 0.27778。类别1表示绝缘子缺陷,0代表绝缘子,标签文件与图片文件同名存放,后缀不同,放在同一级 titles 目录下。资源中的图片以训练图train_batch0.jpg、train_batch1.jpg、train_batch2.jpg等形式记录在 runs 目录里,可以直观看到数据增强后的标注框效果。

3. 把训练跑通:train.py 参数逐项设置,200 轮迭代的收敛判断方法

3.1 数据配置文件:把两个类别告诉 YOLOv5

YOLOv5 要求你为数据集单独写一个 yaml 配置文件。资源包里的数据目录因为体积原因没有附带原始训练图,需要把自己的数据集按结构放好。下面是data/insulator.yaml的标准写法,直接照抄即可。

# 绝缘子缺陷检测数据集配置文件 train: ./datasets/insulator/images/train # 训练图片路径 val: ./datasets/insulator/images/val # 验证图片路径 nc: 2 # 类别数量:绝缘子 + 绝缘子缺陷 names: ['insulator', 'insulator_defect'] # 类别名列表,顺序与标签txt中的类ID对应

nc必须写成 2,否则训练时分类层输出维度与标签文件不匹配。names数组的索引位置就是标签文件里的 class 数字,写成insulator_defect而非defect的原因是让你在分析结果时能跟results.txt中的类别指标对应上。训练时把当前目录切到yolov5_code,执行以下命令:

python train.py --data data/insulator.yaml --weights weights/yolov5s.pt --epochs 200 --batch-size 16 --img-size 640 --device 0 --project runs --name exp_insulator_defect

--device 0表示用第一块 GPU,如果用的是 CPU 训练则改成--device cpu并准备做好等一夜的心理准备。--project runs指定输出目录,--name exp_insulator_defect会将训练产出放至runs/exp_insulator_defect/,压缩包里的推理结果图和权重就来自这次实验。如果你的显存只有 6G,batch-size 降到 8,否则会遇到 CUDA out of memory 直接中断。

3.2 训练曲线里看什么:如何判断 200 轮是否真的收敛

训练完成后,重点看runs/exp_insulator_defect中results.txt的内容。很多人打开这个文件只看最后的 mAP,其实里面有十列数据,每列依次代表 epoch、训练 loss、验证 loss、精确率、召回率、mAP@.5、mAP@.5:.95、val box loss 等。在前几张 loss 图上你会直观看到损失值从一两百的峰值快速下降,大约在 80 轮以后曲线变得平缓,这说明模型已经进入收敛区间。正常情况下 200 轮训练后,损失曲线尾部呈接近水平线的小幅波动,不必再加大迭代轮次。

以下是从results.txt中往年的两行示例,用于说明指标列的顺序和读法:

Epoch GPU_mem box_loss obj_loss cls_loss Instances Size 119 11.6G 0.042 0.048 0.012 53 640 155 11.6G 0.036 0.041 0.010 14 640

GPU_mem是训练中显存占用量,box_loss是边框回归损失,obj_loss是目标置信度损失,cls_loss是分类损失。复现时如果 200 轮后box_loss还在 0.03 以上,说明学习率规划或数据增强策略有问题,常见是数据量太少。如果cls_loss接近 0.01 以下,说明分类任务基本解决了,剩下的误差主要来自定位偏移。

3.3 超参数与数据增强:hyp.yaml 中直接影响绝缘子检测的项

资源里每轮训练会记录到runs/exp_insulator_defect/hyp.yaml。这个文件在 YOLOv5 训练中控制数据增强强度。对于绝缘子这种长条目标,其中三个参数影响最大,我也实际验证过相应作用:

参数默认值对绝缘子检测的实际影响
hsv_h0.015色调偏移,绝缘子多为褐红色,偏移太大会让颜色失真导致误检
fliplr0.5水平翻转概率,航拍绝缘子左右翻转不影响语义,可以保持
degrees0.0旋转角度,绝缘子串在图像中可能是任意朝向,设置 10~15 度可提升姿态泛化性
# hyp.yaml 局部示例(以YOLOv5官方推荐值为基准) hsv_h: 0.015 # image HSV-Hue augmentation (fraction) hsv_s: 0.7 # image HSV-Saturation augmentation (fraction) hsv_v: 0.4 # image HSV-Value augmentation (fraction) degrees: 0.0 # image rotation (+/- deg) translate: 0.1 # image translation (+/- fraction) scale: 0.5 # image scale (+/- gain)

degrees原本是 0,表示不旋转。实际拍回来的巡检照片里绝缘子不一定总是正立状态,拍摄航线角度不同会导致目标旋转,把degrees调到 10 可以提升模型对旋转姿态的鲁棒性。scale是尺度扰动,默认 0.5 对绝缘子这种多尺度目标比较合适,不要超过 0.8,否则小目标容易在缩放中丢失。这里提示一句:改动超参数后要对同一个验证集重新评估,不要只看训练集 loss,这是调参阶段必须有的意识。

4. 评估指标曲线:从 precision-recall_curve.png 里读出模型真实能力

4.1 曲线图有哪些:不同图片对应什么评估维度

资源包runs/exp_insulator_defect里有precision-recall_curve.png、train_batch0.jpg、test_batch0_pred.jpg等可视化产出。precision-recall_curve.png是核心的评估图,横轴是召回率 Recall(预测到的真实目标比例),纵轴是精确率 Precision(预测结果中正确的比例)。曲线越靠近右上角越好,test_batch0_pred.jpg是模型在测试集上的预测框可视化,train_batch0.jpg是训练集的标注和增强效果图。

逐列对照看这几个文件能形成完整判断。

labels.png展示了标注框的中心点坐标分布和宽高分布,如果中心点集中在图像中心周围且宽高分布比较散,说明标注数据分布合理;如果全部挤在一个角落,说明标注工具出问题了,这个图值得重视。train_batch1.jpg、train_batch2.jpg是多张训练图拼接的增强结果,主要用来检查数据增强策略是否破坏了目标语义,例如绝缘子的结构是否因马赛克增强而变得不可辨识。

4.2 mAP 指标两种计算口径:0.5 和 0.5:0.95 的区别

YOLOv5 的评估结果中会同时输出mAP@.5和mAP@.5:.95两个指标。mAP@.5是 IoU 阈值取 0.5 时的平均精度均值,这个指标对定位要求宽松,主要用来快速判断模型是否学会了目标类别。mAP@.5:.95则是从 0.5 到 0.95 每隔 0.05 取一次 IoU 阈值做平均,对目标定位精度很敏感。绝缘子缺陷检测中缺陷类别因为标注框小、错位容忍度低,两个指标差距会明显,如果mAP@.5:.95比mAP@.5低 15 个百分点以上,说明定位精度不足,常见原因是标注框边缘贴得不够紧。

Class Images Instances P R mAP@.5 mAP@.5:.95 all 200 340 0.912 0.871 0.931 0.812 insulator 200 210 0.945 0.918 0.958 0.834 insulator_defect 200 130 0.871 0.802 0.897 0.771

上表是一组模拟的自测结果,列含义分别是类别名、验证图片数、目标实例数、精确率、召回率、mAP@0.5、mAP@0.5:0.95。insulator_defect行的各项指标普遍低于insulator,这说明缺陷样本数量不如正常绝缘子多,模型对缺陷形态的拟合不如完整绝缘子充分。要补齐短板需要专门扩充缺陷样本或调整类别权重,通常做法是运行test.py --weights best.pt --data data/insulator.yaml重新验证。

4.3 从 test_batch0_gt.jpg 和 test_batch0_pred.jpg 对比人工检查漏检

量化指标曲线之外,人工看预测图和真值图的差异是必要的环节。test_batch0_gt.jpg展示测试集原始标注(Ground Truth),test_batch0_pred.jpg展示模型预测结果。两图并列可以快速发现模型漏检或误检的系统性规律。

实际操作中我建议把这两张图放大对比,注意三类细节:一是缺陷框的位置是否完全覆盖缺陷区域,还是只覆盖了一半;二是相邻绝缘子片之间的缺陷是否被误检成一个更大的框;三是背景中的塔材或电线是否出现误检。这些规律类错误在指标曲线上不会直接体现,但对后续实拍场景决策很重要。迭代 200 次的模型已基本拟合,如果仍然存在系统性漏检,优先怀疑训练集中缺陷样本的多样性不足,而不是盲目增加迭代轮数。

5. 避坑:绝缘子缺陷检测最容易踩中的五个坑

5.1 类别 ID 写反,导致召回率直接掉到 0.3 以下

现象:训练时 loss 正常下降,但results.txt里某个类别的召回率始终在 0.3 左右徘徊,另一个类别则异常偏高。原因:标注工具导出的标签文件中绝缘子和缺陷的类别 ID 与insulator.yaml里names列表顺序不一致,比如原标注中 0 是缺陷、1 是绝缘子,而配置里 0 是绝缘子、1 是缺陷,类别语义整体错位。解决:检查任意标签文件中的数字与对应图片框的语义,把 yaml 中names顺序或标签文件全部修正,再重新训练。这是我最早复现类似资源时踩过的坑,仅靠曲线图很难察觉,必须逐类看 P、R 值。

5.2 显存溢出:batch-size 设太高直接 OOM

现象:训练跑到第 20 轮时进程退出,报错为 CUDA out of memory。原因:--img-size 640加上默认--batch-size 16在 6G 显存显卡上超出了可用显存,模型参数和特征图占用太大。解决:降低--batch-size到 8 或 4,同时可开启梯度累积,例如保持 batch-size 8 但训练两个批次后再更新一次梯度,等效于 batch-size 16 的优化效果。命令参考如下:

python train.py --data data/insulator.yaml --weights weights/yolov5s.pt --epochs 200 --batch-size 8 --img-size 640 --device 0 --nbs 64

--nbs 64是 YOLOv5 中的名义批次大小,权重更新频率由它和实际 batch-size 自动计算得出。这个参数在显存不足时尤其常用,既保持原有优化动态,又不让显存满载。

5.3 训练集缺陷样本太少,mAP 虚高但实战翻车

现象:训练集上 mAP@.5 达到 0.95 以上,但换成另一批天气和角度不同的实拍图,模型表现明显变差。原因:训练集中绝缘子缺陷样本多为同一时间段拍摄,特征高度趋同,模型学到的是场景背景特征而非缺陷本身的纹理特征,指标看起来不错实际泛化性差。解决:将缺陷样本按拍摄时间、天气、角度分段,至少保证三个不同场景段的图片都有缺陷样本,重新验证 mAP 尤其是两个类别的 mAP 差值。绝缘子缺陷检测的瓶颈经常在样本多样性上。

5.4 验证集与训练集图片泄露:结果曲线无法评估真实性能

现象:test_batch0_pred.jpg可视化看起来精度极高,但提交到实际场景后效果下滑。原因:切分数据时直接从同一段视频连续帧中抽帧,前后帧相似度太高,导致验证集与训练集存在大量重复或近重复图片。解决:按视频片段划分,同一镜头下的帧全部进入同一个子集,不要随机划分单帧。后续所有资源包实验对比都建立在这个划分之上。

5.5 detect 阶段置信度阈值默认 0.25,太低会把背景误检为缺陷

现象:用detect.py跑一批巡检视频时,绝缘子正常的地方频繁出现误报缺陷。原因:模型对绝缘子缺陷的置信度输出本来就偏低,--conf-thres 0.25的默认阈值把这些低置信度噪声全部放了出来。解决:推理时提高置信度到 0.4,如果漏检增多再回调到 0.35,同时用--iou-thres 0.45控制重复框抑制。巡检场景安全优先时,宁可漏检不要误报,否则后台告警会被无效事件淹没。```bash python detect.py --weights runs/exp_insulator_defect/weights/best.pt --source ./inference --conf-thres 0.4 --iou-thres 0.45

这条命令在后续大量实验里成了固定开局。`--source` 可以接图片文件、视频文件或目录,`--conf-thres` 是置信度过滤阈值,只保留高于 0.4 的框,`--iou-thres` 是 NMS 的交并比阈值,用于剔除同一目标上重复的检测框。 ## 6. 推理与导出进阶:把 best.pt 权重用到实际巡检场景中的两种方式 ### 6.1 用 detect.py 跑批量目录并输出带标签的图片 训练完成后真正要落地的是 `detect.py` 的推理能力。下面命令用于对 `inference` 目录下全部图片执行检测,并保存结果到 `runs/detect/expN` 文件夹。 ```bash python detect.py --weights runs/exp_insulator_defect/weights/best.pt --source ./inference --img-size 640 --save-txt --save-conf --project runs/detect --name exp_insulator_defect

--save-txt会把每个检测框坐标写入同名前缀的 txt 文件,格式与训练标签一致;--save-conf在 txt 中追加置信度分数,方便后续做统计报表。--project和--name控制输出位置,避免多个实验的结果互相覆盖。实际应用时如果巡检图片数量很大,建议把--source指向视频文件,检测速度在普通 GPU 上可以做到每帧几十毫秒。

6.2 用 ONNX 导出绕开 PyTorch 环境:onnx.py 的用法

现场部署常用做法是把模型导出成 ONNX 格式,用 ONNX Runtime 或 TensorRT 加载。打开onnx.py查看核心参数,典型调用命令如下。

python onnx.py --weights runs/exp_insulator_defect/weights/best.pt --img-size 640 640

导出后得到best.onnx文件。ONNX 格式不依赖 PyTorch 环境,可以用onnxruntime库加载做 CPU 推理,适合部署到只有 CPU 的工控机。实际部署中遇到过 ONNX 输出解析问题,旧版 YOLOv5 的 ONNX 输出是一个三维张量,需要在后处理中自己解析框坐标、置信度和类别;新版输出则拆成三个独立输出。导出的模型先用 Python 脚本对同一张图比对 ONNX 与 PyTorch 的检测结果,再投入现场使用,避免后处理解析出错导致框偏移。

6.3 一个值得养成的习惯:每次复现都先跑一次官方预训练模型

最后分享一个我现在做检测项目时的固定步骤。拿到任何 YOLOv5 源码包,我先不急着用自己的数据训练,而是先用包内置的yolov5s.pt权重跑一遍官方自带的测试样例,确认环境、路径、依赖全部正常。然后才把数据换成绝缘子数据集,先训练 5 轮确认 loss 下降方向正确,再正式跑完整 200 轮,同时保存results.txt和曲线图用于归档对比。这个习惯帮我避免了不少盲目调参的弯路,希望你也能用上。希望帮到你。

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

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

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

立即咨询