python3GUI--智慧交通分析平台:By:PyQt5+YOLOv8(详细介绍)
文章目录一前言二效果预览1.目标识别与检测2.可视化展示1.车流量统计2. 目标类别占比3. 拥堵情况展示4.目标数量可视化3.控制台4.核心内容区1.目标检测参数2.帧转QPixmap3.数据管理5.项目结构三反馈问题1.监控连不上2.右下角有几个按钮显示不全3.把fa改成fa5s了因为它一直显示我下的包里没有那个字体重下更新也没用4.OMP: An error has been encountered at line 1 of internal MIME data: Premature end of document.:四问题回答1. 系统主要用的什么技术2. 车辆检测模型用的哪个我能换成我自己训练的模型么3. 怎样运行本项目只会YOLOv8不会PyQt5能上手本项目吗4. 系统是如何实现测距的原理是什么5. 界面上的可视化图表是怎么实现的如何实现的数据更新五总结关键字#PyQt5 #YOLOv8 #智慧交通分析平台 #智能交通 #目标检测 #车辆检测 #行人检测 #OpenCV #Pyecharts #数据可视化 #RTSP视频流 #RTMP视频流 #实时监控 #多线程 #QThread #交通流量统计 #拥堵检测 #GPU加速 #深度学习 #计算机视觉 #目标跟踪 #车速检测 #单目测距 #ROI区域 #QtWebChannel #QWebEngineView #视频分析 #AI交通 #Python项目 #实时视频处理平台规定gif最大5M所以压缩了一下见谅PyQt5YOLOv8智慧交通分析平台YOLOv8智慧交通分析平台v1.1一前言本次使用PyQt5YOLOv8开发一款“智慧交通分析平台”使用YOLOv8检测监控画面中的车辆和行人将检测到的画面进行绘制、标注、统计最后展示到画面中央主屏右侧操作区域可以控制绘制结果。二效果预览最新版已经支持自定义ROI形状包括多边形、矩形、圆形欢迎体验另外最新版加入了“中心点”控制显隐开关。1.目标识别与检测本系统使用YOLOv8对目标进行识别与检测YOLOv8是Ultralytics公司推出的最新一代实时目标检测算法基于YOLOYou Only Look Once系列架构改进具有更高的检测精度和更快的推理速度。它支持目标检测、实例分割和图像分类任务采用灵活的Backbone和Neck设计并优化了训练策略与损失函数兼容多种部署环境如ONNX、TensorRT等适合工业级应用。YOLOv8提供多种预训练模型从轻量级YOLOv8n到高性能YOLOv8x平衡速度与精度是计算机视觉领域的先进工具之一。本次使用YOLOv8版本对车辆和行人进行识别车辆的类型包括小汽车、摩托车、自行车、卡车行人就是马路上行走的人系统采用队列对读取到的视频流帧进行处理标注分析好之后使用信号的方式发射给PyQt5的前端前端设置槽函数接收、处理、展示数据。2.可视化展示本系统使用pyecharts对上游数据进行可视化展示Pyecharts 是基于 Python 的数据可视化库依托强大的 ECharts百度开源 JavaScript 图表库构建提供丰富的交互式图表类型如折线图、柱状图、散点图、地图等。它支持链式调用和简洁的 API 设计可轻松生成动态、可缩放的可视化结果并兼容 Jupyter Notebook、Web 页面及 Flask/Django 等框架。Pyecharts 支持多种数据格式如 Pandas、NumPy允许自定义样式和主题适用于数据分析、商业报表和实时大屏展示是 Python 生态中高效、美观的可视化工具之一。图片取自网络仅用于echarts图效果展示不包含在本系统中。展示的维度包括1.车流量统计把时间作为横轴纵轴是具体的数值采用折线堆叠图展示可视化分析结果2. 目标类别占比对检测到的目标类别以及数量采用圆环饼图进行可视化展示图例中为全部目标物体3. 拥堵情况展示对于当前道路的拥堵情况采用算法动态计算当前道路的拥堵情况采用水球图展示当前道路拥堵情况具体来说是使用echarts图配合QWebEngineView来展示存储在内存中的html代码这里分享我遇到的一个坑就是如何设置QWebEngineView隐藏右击菜单直接重写QWebEngineView实现其中的contextMenuEvent方法忽略这个事件代码我贴在下面啦classNoContextMenuWebEngineView(QWebEngineView):def__init__(self,parentNone):super().__init__(parent)defcontextMenuEvent(self,event:QContextMenuEvent):# 忽略右键点击事件彻底禁用右键菜单event.ignore()还有一个就是如何让echarts图背景透明类似于下面这种效果这里不卖关子直接下面三行代码实现self.view.setAttribute(Qt.WA_TranslucentBackground, True)self.view.setStyleSheet(background: transparent;)self.view.page().setBackgroundColor(Qt.transparent)4.目标数量可视化这里我们使用了自定义组件自定义组件是垂直布局顶部是当前类别的数量中间是当前类别文字说明底部是当前类别可视化图像用户可以直观地看到具体类别的具体数据因为目标类别的类别数量是确定的这里我们直接就直接绘制好了效果。3.控制台控制台区域分为三个部分分别是拉流控制、视频帧控制、标签显示内容控制这里我们使用了自定义组件-开关组件能够方便地和用户交互交互的结果直接呈现在中间内容区域中同时用户可以控制标签中的展示项目的显隐。4.核心内容区这个区域是本系统的核心部分主要是对输入的rtmp、rtsp流的帧画面进行视觉分析使用多线程的方式在线程中处理视频画面数据然后使用cv2对图像进行绘制再使用信号的方式将处理结果发射到主线程中主线程界面接收到数据将画面、可视化结果展示。下面我引用一下AI的分析原话VideoProcessingThread 是一个基于 PyQt5 的 QThread 子类专为实时视频流处理设计集成了 YOLOv8 目标检测与追踪功能。它通过多线程架构实现高效帧处理主线程负责从 RTMP 流异步读取帧子线程使用 YOLOv8 模型进行目标检测、追踪支持车辆/行人等类别并计算运动轨迹与速度含超速判断。类内维护三个线程安全队列原始帧、渲染帧、统计结果通过 frame_ready 信号实时推送渲染后的帧含边界框、轨迹线、标签等可视化元素同时支持动态流切换、断线重连及 GPU 加速自动切换 FP16 模式。该类封装了完整的视频分析流水线适用于智能交通监控等实时视觉应用并通过模块化设计允许灵活配置检测参数与绘制选项。1.目标检测参数本次使用枚举类对目标检测参数进行设置我在这里贴出来这些参数主要是给目标检测线程类使用每个变量都是有注释的。class Config(Enum):# RTMP 流地址替换为实际的视频流地址来自摄像头或推流服务器RTMP_STREAM_URLrtmp://192.168.99.199/stream/cam1# YOLO 模型文件名可为 yolov8s.pt、yolov8n.pt 等需确保文件存在MODEL_NAMEyolov8s.pt# 每个跟踪对象保存的历史帧数用于计算速度历史越多越稳定但更耗内存MAX_TRACK_HISTORY5# 估算用的像素与实际距离的换算比例单位米/像素用于速度换算METERS_PER_PIXEL0.05# 超速阈值单位km/h超过该速度将高亮显示为红色OVERSPEED_THRESHOLD30# 当无法从视频流中获取 FPS 时使用的默认帧率DEFAULT_FPS25# 框标签文字的缩放比例影响标签大小LABEL_FONT_SCALE0.5# 标签边框线的粗细单位像素需为整数THICKNESS1# 使用的字体类型OpenCV 字体FONTcv2.FONT_HERSHEY_SIMPLEX# 每行标签文字之间的间距单位像素LINE_SPACING5# 标签信息背景透明度前景图层 alpha 值范围 0.0 - 1.0OVERLAY_ALPHA0.65# 标签信息背景透明度背景图层 beta 值1 - alphaOVERLAY_BETA0.35FRAME_QUEUE_SIZE60FRAME_SKIP2# 每 2 帧推理一次可根据设备调整2.帧转QPixmap我们通过cv2拿到视频帧之后是无法直接展示在界面上的这就需要用到帧转QPixmap了这里我封装好一个方法给大家直接调用就能够实现帧转QPixmapdef frame_to_pix(frame): rgb_framecv2.cvtColor(frame, cv2.COLOR_BGR2RGB)h, w, chrgb_frame.shape bytes_per_linech * w qt_imageQImage(rgb_frame.data, w, h, bytes_per_line, QImage.Format_RGB888)returnQPixmap.fromImage(qt_image)3.数据管理我们使用单例模式定义了一个DataManager类这个类能够帮我们动态管理YOLOv8分析后的结果很方便地在其他类、函数里使用这里介绍一下单例模式Python 单例模式Singleton Pattern 是一种设计模式确保一个类仅有一个实例并提供全局访问点。通常通过重写new方法或使用装饰器、元类等方式实现适用于需要全局唯一对象的场景如配置管理、日志记录、数据库连接池等。Python 的模块导入机制天然支持单例模块在首次导入时缓存但显式实现可通过类变量存储实例并在实例化时检查是否已存在避免重复创建从而保证系统资源的高效利用和状态一致性。DataManager是一个数据管理类用于维护和操作结构化键值数据如统计图表数据。它基于system_conf.base_chart_data初始化支持深拷贝原始数据以避免共享问题。核心功能包括数据更新提供单键更新update和批量更新batch_update支持绝对赋值或累加模式自动过滤非法键并补全缺失键为默认值数据查询可获取单个键的值get、中文标签get_label或完整数据副本get_all确保包含所有默认键数据维护支持重置所有值为零reset、检查键存在has_key及删除键remove容错设计自动处理未定义键返回0或空字符串并通过警告日志提示无效操作该类通过全局实例dataManager提供统一的数据管理入口适用于需要动态维护标准化数据集合的场景如实时数据可视化、状态监控等确保数据完整性和操作安全性。5.项目结构本项目在Python3.8环境下开发依赖pyqt55.15.2版本。本项目是基于YOLOv8的项目检测模型为yolov8s.pt这个模型位于./data/models/目录下面大家可以自行替换自己训练的模型软件整体的代码文件结构为我相信有下面的示意图大家能很快的上手本项目三反馈问题1.监控连不上需要本地局域网或者外网rtmp、rtsp拉流地址可以参考https://blog.csdn.net/a1397852386/article/details/148295591?spm1001.2014.3001.5502然后修改system_conf.stream_url的值2.右下角有几个按钮显示不全调整桌面分辨率为100%3.把fa改成fa5s了因为它一直显示我下的包里没有那个字体重下更新也没用pip install QtAwesome1.3.14.OMP: An error has been encountered at line 1 of : Premature end of document.:详细报错An error has been encountered at line 1 of : Premature end of document.:OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OKTRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/.文件顶部加入importos os.environ[KMP_DUPLICATE_LIB_OK]TRUE四问题回答1. 系统主要用的什么技术软件主要使用了YOLOv8、OpenCV、PyQt5使用YOLOv8对目标进行检测配合OpenCV将检测结果标注到画面上最后使用PyQt5实现了用户交互以及可视化图表展示。2. 车辆检测模型用的哪个我能换成我自己训练的模型么yolov8s.pt完全可以替换掉./data/models/yolov8s.pt即可3. 怎样运行本项目只会YOLOv8不会PyQt5能上手本项目吗假设已经下载了本代码配置好YOLO和PyQt5以及本地推流环境https://www.bilibili.com/video/BV1TJ75zmEpc即可启动本项目。4. 系统是如何实现测距的原理是什么单目测距针孔相机模型原理公式5. 界面上的可视化图表是怎么实现的如何实现的数据更新使用ECharts图配合QWebEngineView将网页端的 ECharts 图表嵌入到 Qt 的 界面中。通过 QtWebChannel 实现了 Python 与 JavaScript 的通信完成了图表数据更新。五总结本次和大家分享了我使用PyQt5YOLOv8开发的智慧交通分析平台有图有文字详细地介绍了系统以及具体功能实现但是我认为博客仍然不够直观大家还是亲自体验比较好需要代码可以私聊我但是CSDN我不经常在大家可以点击下面的链接加我WX必定全力支持