资讯动态

基于YOLOv5与PyQt5的输电线路绝缘子缺陷检测系统实战

发布时间:2026/9/15 2:36:49 来源:尧图企业网站定制
简介面向计算机、电子信息工程、数学等专业的大学生毕业设计或课程设计场景这是一套基于YOLOv5与PyQt5的电线绝缘子缺陷检测可视化系统高分项目资源。压缩包共178个文件大小约47.06MB内容以Python源码py/pyc、模型配置yaml、预训练权重pt为核心并配套图片样本、txt/xml标注文件、shell环境脚本和Dockerfile配置能够支撑从模型训练、权重调用到PyQt5界面推理展示的完整流程。此外还加入ipynb交互式教程与mp4演示视频方便按步骤理解系统运行效果与二次开发思路。整体适合已有一定Python和深度学习基础、正在开展毕业设计或课程项目的读者可作为系统搭建、功能扩展、说明文档编写及代码排错的参考资料帮助快速落地绝缘子缺陷检测可视化应用。目前已有398人学习浏览内容丰富度较高。1. 为什么输电线路绝缘子缺陷检测要把 YOLOv5 和 PyQt5 绑在一起绝缘子缺陷检测做到今天真正的门槛早就不在模型选型上而在于能不能把推理结果送到一个能点、能看、能调的界面里。YOLOv5 是输电线路巡检场景下的默认答案公开权重好找、训练代码成熟、无人机照片上单帧推理延迟低绝缘子的缺陷类别无非是破损、污闪、异物几种单阶段检测器完全接得住。PyQt5 负责补上另一半——选图、调阈值、看实时画面、导出带标注的结果全部变成鼠标操作。这套「模型做推理、界面做交互」的结构在电网内网演示工具和本科毕设里几乎是标准模板适合手上有模型但没有界面或者想把命令行 demo 升级成可交付桌面程序的人。2. 训练 YOLOv5 绝缘子缺陷检测模型数据集、超参数和收敛判断2.1 自建绝缘子缺陷数据集的标注口径训练前先定类别常见的四类划分如下顺序一旦定下来就不能改因为 YOLO 的 label 是类别序号label id类别名覆盖范围0normal正常绝缘子串1broken瓷瓶破损、缺角、断串2flash污闪、灼烧、放电痕迹3foreign异物悬挂、鸟巢、风筝线标注时注意一个容易返工的细节正常类别标「整串绝缘子」一个框而缺陷类别只框缺陷本体不要把整串框进去。如果缺陷框把整串盖住模型会学成「看见绝缘子就报 broken」在界面里表现为全屏误检。另一个常见错误是漏标——无人机照片里常常一串挨着一串漏掉某一串就等于把它当负样本最终正常类召回率会莫名下降。数据量方面每类建议不少于 400 张原图。缺陷类样本少时不要硬凑用增强补旋转 ±30°、亮度偏移 0.51.5 倍、高斯模糊、随机裁剪。增强脚本用 OpenCV 写几十行就行注意增强后要同步改标注框坐标别只增强图像不动标签。2.2 datasets.yaml 与最小可跑训练命令YOLOv5 训练自己的数据集核心是写对 data 文件。最小配置# datasets/insulator/data.yaml train: datasets/insulator/images/train val: datasets/insulator/images/val nc: 4 names: [normal, broken, flash, foreign]路径建议写绝对路径或相对yolov5目录的路径Windows 下注意反斜杠转义问题统一用/分隔符最稳。标注文件用 LabelImg 导出 YOLO 格式即可每个 txt 与图片同名行格式为class x_center y_center w h坐标是归一化的。训练命令cd yolov5 pip install -r requirements.txt python train.py --data datasets/insulator/data.yaml \ --weights yolov5s.pt --img 640 --batch 16 \ --epochs 150 --device 0 --name insulator_v5s权重文件建议从 YOLOv5 官网的 release 下载.pt文件如果网络条件差国内镜像站也能找到环境配置阶段最容易翻车的是 PyTorch 与 CUDA 版本不匹配torch.cuda.is_available()返回 False 就说明版本对不上。--cache参数会把图像预加载进内存Windows 16G 内存以下不建议开。2.3 影响绝缘子检出率的关键超参数调整默认超参在data/hyps/hyp.scratch-low.yaml里对绝缘子场景最值得动的是下面几项参数推荐值作用imgsz640 / 1280输入分辨率小目标场景直接决定上限batch越大越好受显存限制8G 显存建议 16lr00.01初始学习率loss 震荡时降到 0.005hsv_h / s0.015 / 0.7色相与饱和度增强照片风格迁移时有用mosaic1.0四图拼接小目标样本多的场景保持开启绝缘子缺陷有个典型问题无人机原图是 5000×3000 级别的分辨率但缺陷区域只有几十个像素直接缩到 640 会把细节抹掉。常见做法是切图训练——把原图切成 640×640 的瓦片瓦片之间留 10% 重叠缺陷目标在瓦片里占比就正常了。另一个思路是--img 1280加--multi-scale显存不够就选 s 模型。2.4 训练完成后必须检查的三个输出文件训练结束后去runs/train/insulator_v5s/目录重点看三样东西weights/best.pt验证集 mAP 最高的权重部署只用它weights/last.pt最后一轮权重续训时--resume用results.png包含 loss、precision、recall、mAP0.5 的曲线一眼看收敛趋势还要翻一下confusion_matrix.png。绝缘子场景最常见的错误是 normal 被误检成 broken如果混淆矩阵里这个格子数字很大先别急着调模型回数据集里看是不是标注口径出了问题——很多项目其实是把「带污渍的正常串」标成了 broken模型学到的根本不是缺陷是颜色差异。另一个判断mAP0.5 超过 0.85 但界面里仍然误检成片问题多半在推理阶段的置信度阈值而不是模型本身。3. PyQt5 界面与 YOLOv5 推理的异步集成3.1 为什么不能把 model(frame) 直接丢进主线程PyQt5 的事件循环跑在主线程任何超过 50ms 的耗时操作都会让界面转圈、拖拽无响应。YOLOv5 在 CPU 上一帧推理要几百毫秒GPU 上也有几十毫秒如果直接在setPixmap之前同步调用检测整个窗口就冻结了——用户拖动窗口时看到白块以为是程序死了其实卡在推理循环里。正确做法是让推理跑在独立 QThread 中主线程只接收信号、刷新界面。3.2 QThread pyqtSignal 回传检测结果的线程模型一个稳定的推理线程写法import os os.environ[QT_OPENGL] software # 必须在导入 PyQt5 之前设置 from PyQt5.QtCore import QThread, pyqtSignal, QMutex import numpy as np class DetectWorker(QThread): result_ready pyqtSignal(object, object) # (原图ndarray, 检测结果ndarray) def __init__(self, detector, parentNone): super().__init__(parent) self.detector detector self._mutex QMutex() self._frame None self._running True def submit(self, frame): self._mutex.lock() self._frame frame.copy() self._mutex.unlock() def run(self): while self._running: self._mutex.lock() frame self._frame self._mutex.unlock() if frame is None: self.msleep(5) continue boxes self.detector.detect(frame) self.result_ready.emit(frame, boxes)这里用QMutex保护共享帧而不是直接传队列原因是视频流场景下读帧线程和推理线程节奏不同锁加最新帧即可丢帧比排队更有意义——人眼分辨不出 25fps 和 18fps 的差别但能明显感受到延迟。result_ready信号在主线程里连接槽函数去刷界面Qt 的跨线程信号队列机制保证槽在接收者所在线程执行。3.3 在 PyQt5 里显示检测画面的三种方式界面显示检测图常见有三种做法方式适用场景缺点QLabel.setPixmap单图检测、结果预览缩放模糊QGraphicsView需要拖拽缩放大图的场景代码量大QLabel QPixmap 按比例缩放视频流实时预览无缩放交互推荐第三种配合 OpenCV 画框。核心是把 BGR 的 ndarray 转成 QPixmapimport cv2 from PyQt5.QtGui import QImage, QPixmap def frame_to_pixmap(frame_bgr): rgb cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB) h, w, ch rgb.shape img QImage(rgb.data, w, h, ch * w, QImage.Format_RGB888) return QPixmap.fromImage(img.copy())注意必须调用img.copy()。rgb.data指向 numpy 的缓冲区函数返回后局部变量析构QImage 会变成野指针界面上就是乱码色块。ch * w是每行字节数BGR 三通道就是3 * w漏掉这个参数图片会斜切。3.4 OpenGL 导致 PyQt5 界面无显示的处理这是 PyQt5 开发里出现率特别高的坑程序能跑、进程存在、日志正常但窗口不出现或白屏常见于远程桌面和没有 GPU 驱动的虚拟机。原因是 Qt5 默认走 OpenGL 渲染通道远程会话里没有硬件加速直接黑屏。处理顺序在 import PyQt5 之前设置环境变量os.environ[QT_OPENGL] software或者在创建QApplication之前调用QApplication.setAttribute(Qt.AA_UseSoftwareOpenGL)如果仍然无效锁定版本pip install PyQt55.15.9 PyQt5-Qt55.15.2部分 pyqt5-qt5 5.15.19 版本在特定显卡驱动上有回归问题顺便说一句 PySide6 和 PyQt5 的区别两者 API 基本同构上述 QThread 写法直接迁移如果项目需要 LGPL 协议或想用 Qt6选 PySide6毕设和内部工具用 PyQt5 更顺手资料也更多。4. 从图片检测到视频流检测一个可落地的调用链4.1 服务层封装把 YOLOv5 推理隔离成稳定接口界面层不要直接碰模型隔离出一个服务类后续换 torchscript、换 onnx 都只改这一处class InsulatorDetector: def __init__(self, weights: str, device: str 0): import torch self.model torch.hub.load( yolov5, custom, pathweights, sourcelocal) self.model.conf 0.25 # 置信度阈值界面可调 self.model.iou 0.45 # NMS 的 IoU 阈值 self.model.classes None # 只检测指定类别时填 [0,1,2] def detect(self, frame_bgr, img_size640): results self.model(frame_bgr, sizeimg_size) return results.xyxy[0].cpu().numpy()返回的数组每行是x1 y1 x2 y2 confidence class_idUI 层拿到后画框即可。加载权重建议用sourcelocal加绝对路径避免torch.hub联网拉权重时卡在网络请求上。4.2 图片、视频流共用的推理主循环视频检测的关键是「读帧」与「推理」节奏分离。相机或视频文件读取是 I/O 操作推理是计算操作两者天然不同步直接逐帧推理会导致界面越跑越卡def process_video(self, path: str, worker: DetectWorker): cap cv2.VideoCapture(path) fps cap.get(cv2.CAP_PROP_FPS) interval max(1, int(fps // 15)) # 每秒最多处理15帧 idx 0 while cap.isOpened(): ok, frame cap.read() if not ok: break idx 1 if idx % interval ! 0: continue worker.submit(frame) # 异步提交读帧不阻塞 cap.release()interval表示每隔几帧取一帧送入推理剩余帧直接丢弃。杆塔巡检视频通常场景变化慢15fps 的推理密度足够CPU 推理也能跟上。摄像头实时流把VideoCapture(path)换成VideoCapture(0)即可其他逻辑不变。4.3 conf-thres 与 iou-thres 在界面端实时调节界面里放两个滑动条连接信号直接改模型属性调完立即生效不需要重启程序conf_slider QSlider() conf_slider.setRange(5, 95) conf_slider.valueChanged.connect(self.on_conf_changed) def on_conf_changed(self, val): conf val / 100 self.detector.model.conf conf self.statusBar().showMessage(f置信度阈值: {conf:.2f})两个参数的推荐起点场景confiou说明巡检原图批量检测0.300.45优先控制误报缺陷类样本少、必须查全0.150.45低阈值出框多人工二次确认实时视频流0.250.50允许相邻帧重叠框合并调参时最容易困惑的是 iou 调高到 0.9 之后同一串绝缘子冒出十几个框——这不是模型抽风是 NMS 阈值太高没做抑制两个高度重叠的框同时通过了。这时候先把 iou 拉回 0.45误检成片的问题也一并解决。5. 打包发布与界面验收的几个关键技巧5.1 PyInstaller 打包后模型路径失效的通用解开发环境跑得好好的打包成 exe 后报找不到best.pt这是资源路径问题。PyInstaller 打包后程序解压到临时目录__file__指向的不是原目录。通用解是把权重作为数据文件打进包再用sys._MEIPASS读取pyinstaller -w -F --add-data weights/best.pt;weights main.pyimport sys, os def resource_path(rel): base getattr(sys, _MEIPASS, os.path.dirname(os.path.abspath(__file__))) return os.path.join(base, rel) weights resource_path(weights/best.pt)--add-data在 Windows 下分隔符是分号Linux 下是冒号跨平台脚本里要注意。打包后模型加载失败时先加--collect-all torch让 PyInstaller 收集 torch 的 C 扩展这是最常见的缺文件原因。5.2 用测试集快速验证界面检测正确性界面做完不要只用几张演示图验收。从验证集抽 50 张没参与训练的图片批量跑一遍检测把结果保存到annotated/目录逐张翻看。统计口径就两条漏检数GT 有框、程序没出框和误检数程序出框、GT 没框。如果误检集中在 normal 类别回到 2.4 检查混淆矩阵如果漏检集中在 small 目标回 2.3 改 imgsz 或切图。界面本身只要保证「保存结果」的目录结构不崩溃验收就完成大半。5.3 两个高频踩坑点第一个是-w参数吞掉控制台后程序闪退没有任何提示。开发阶段先用python main.py跑通再打包打包后闪退就临时去掉-w看回显。第二个坑是--windowed模式下print到 stdout 在 Windows 上会抛异常导致静默退出解决方法是启动时把输出重定向到文件sys.stdout open(app.log, w, encodingutf-8)放在QApplication实例化之前之后所有日志进文件不再干扰 Qt 的窗口进程排查问题也有据可查。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价