【论文复现】交通路口智能监测平台实现

在这里插入图片描述

📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述
在这里插入图片描述

❀交通路口智能监测平台实现

  • 1.概述
  • 2.工程文件简介
    • 2.1 工程文件结构
    • 2.2 训练检测模型
      • 2.2.1 准备数据集
      • 2.2.2 训练自己的权重文件
      • 2.2.3 使用自己的权重文件
  • 3.系统可视化
    • 3.1 打开摄像头
    • 3.2 上传视频监测
    • 3.3 统计结果显示
  • 4.效果
  • 5.总结
  • 6.训练环境、VOC数据集和exe文件运行说明
    • 6.1 exe文件运行说明

1.概述


交通要道的路口上人车穿行,特别是上下班早高峰,且时常发生交通事故。因此对交通路口的车流量和人流量的监测必不可少。

2.工程文件简介


在这里插入图片描述

2.1 工程文件结构


这是pycharm打开的工程文件,其中主要有存在权重文件、目标类别的文件夹,YOLOX模型的文件夹还有打包会输出的output文件夹,exe文件存在在这里面。
这里使用的检测模型为YOLOX模型,模型权重为训练VOC数据集得来,其中包括了二十个类别,但我们主要针对地面交通路口进行监测,选择了最关键的三个监测要素作为监测目标,分别为人、汽车和自行车。YOLOX神经网络模型介绍如下:
YOLOX模型由旷世科技提出,模型结构如下图所示。

在这里插入图片描述
该体系主要划分为两大核心组件:一个是负责主干特征提取的网络结构,另一个是用于融合多尺度特征的金字塔架构。主干特征提取网络由四个堆叠的ResBlock模块构成,它们协同工作,从输入图像中抽取多尺度的特征信息,并输出三个关键的特征层至特征金字塔融合部分。在特征金字塔的框架内,这三个来自主干网络的特征层会经历一次多尺度的特征整合过程。考虑到高分辨率特征层富含细节纹理信息,而低分辨率特征层则蕴含丰富的语义内容,策略上首先对低分辨率的特征层P5_out执行上采样处理,使其能够与P4_out在尺寸上对齐并融合。经过这一多尺度特征金字塔的融合机制后,最终产生了三个融合后的特征层,这些特征层专为检测不同大小的目标而设计。

本文所涉及的所有资源的获取方式:这里

2.2 训练检测模型


2.2.1 准备数据集


要在自己的数据集上训练YOLOX模型,首先我们需要根据VOC数据集的格式准备自己的数据集,并将数据集存放在VOCdevkit文件夹中。准备完数据集后,需要运行voc_annotation。py文件随机按比例为1:9生成模型可用的数据集标签,只需要运行voc_annotaion.py就行。

在这里插入图片描述
数据集准备完成后,我们就来到了train.py文件,这是训练YOLOX模型用的,重要的参数在代码中有注释

在这里插入图片描述

2.2.2 训练自己的权重文件


我们仅需调整voc_classes.txt文件的内容,该文件的作用是向模型指明数据集中包含的类别总数。至于model_path参数,它指向的是模型的预训练权重文件路径。在针对自定义数据集进行训练时,采用官方预训练的权重文件作为起点,能显著提升模型的预测准确性。训练轮数被设定为100轮,这意味着模型将遍历数据集,对每张图片进行100次学习。训练过程中,会生成模型的权重文件,这些文件会被保存在log文件夹内,以供后续进行检测时使用。

2.2.3 使用自己的权重文件


在模型训练完成后,我们只需要修改yolo.py文件中的几个地方,就能用我们自己训练的模型了。

在这里插入图片描述
一是修改权重文件的路径,我们训练得到的权重文件,训练的权重文件默认存放在log文件夹中,我们需要从中里面选一个loss损失值最低的作为检测时的权重文件。二是将classes_path修改成我们自己数据集的类型文件。这样检测模型就配置完成了。

3.系统可视化


系统使用了PyQt5作为可视化工具,PyQt和C++中的qt类似,具有良好的交互性,包含了日常开发常用的控件,像显示提示控件QLabel,按钮QPushbotton,输入框控件TextBrowser等,并且实现了信号槽机制,能够简单快速的获取页面控件和响应事件。系统整体效果如下:

在这里插入图片描述
系统整体布局为线性垂直布局,从上至下依次为系统标题、功能区和显示区。显示区为监测的实时画面显示,这里通过QLabel控件来作为一个容器,来接受opencv库中的视频流。
系统实现了实时摄像头监测功能和上传视频监测功能,

3.1 打开摄像头


当用户点击打开摄像头后,系统将打开电脑的默认摄像头进行画面获取,并将获取的画面进行监测,这里最重要的代码就是定时器函数,因为用户点击打开摄像头后,只是一个瞬间事件,而系统需要将摄像头拍摄的画面进行实时检测,这是一个连续性事件,而下面这两行代码很重要

self.timer_camera = QtCore.QTimer()
self.timer_camera.timeout.connect(self.show_camera)  # 将timeout绑定槽函数show_camera

self.timer_camera = QtCore.QTimer()定义了定时器,并通过信号槽self.timer_camera.timeout.connect(self.show_camera)进行了检测事件绑定。

打开摄像头按钮代码如下:

    def open_camera_btn(self):if not self.timer_camera.isActive():  # 定时器未启动flag = self.cap.open(self.CAM_NUM)if flag == False:msg = QtWidgets.QMessageBox.warning(self.window, '警告!', "请检查摄像头是否连接正确",buttons=QtWidgets.QMessageBox.Ok)else:self.timer_camera.start()  # 设置30毫秒后,定时器将每隔30毫秒调用timeout函数self.open_camera.setText('关闭监测')# 关闭检测按钮事件else:self.timer_camera.stop()self.cap.release()self.label_show_camera.clear()  # 清空视频显示区域self.open_camera.setText('开始监测')

这里就比较简单了,只需判断当前定时器是否被打开,如果没有就去打开摄像头,并启动定时器,再把摄像头的提示文字修改一下,改为“关闭摄像头”,当用户再次点击按钮时,就可以关闭摄像头,并将定时器暂定,一个按钮实现启动和关闭功能。

3.2 上传视频监测


上传视频监测按钮整体功能与打开摄像头类似,只需要将视频流进行更改,这里通过QFileDialog.getOpenFileName()函数来实现打开资源文件窗口进行视频选择,并将选择的视频文件的绝对路径进行返回,这样就能将视频的绝对路径传给opencv进行视频流读取:

上传视频文件监测按钮代码如下:

    def video_detect_btn(self):fileUrl, _ = QFileDialog.getOpenFileName(self, "Open Video File", QDir.currentPath(),"Video Files (*.mp4 *.avi *.mov *.wmv);;")# 视频选择成功if fileUrl:print(fileUrl)self.label_video_url.setText(fileUrl)if not self.timer_camera.isActive():  # 定时器未启动flag = self.cap.open(fileUrl)if flag == False:msg = QtWidgets.QMessageBox.warning(self.window, '警告!', "请检查摄像头是否连接正确",buttons=QtWidgets.QMessageBox.Ok)else:self.timer_camera.start()  # 设置30毫秒后,定时器将每隔30毫秒调用timeout函数

点击上传监测视频后,将打开资源文件窗口进行视频文件选择,效果如下:
在这里插入图片描述
用户选择完成后,将开始逐帧检测。

3.3 统计结果显示


页面中的结果显示也采用了垂直线性布局的方式,效果如下:

在这里插入图片描述
目标种类和统计结果两个垂直线性布局包裹在一个QWidget控件中,QWidget控件使用水平线性布局的方式。行人、汽车和自行车统计结果在show_res_num()中实现,dict是一个字典类型的变量,key为目标类型,value为目标类别对应的个数。
代码为:

        label_list = [*dict]all = 0# for i in label_list:#     all = all + int(dict.get(i))# self.all_result.setText(str(all))if 'person' in label_list:self.person_num.setText(str(dict['person']))all += int(dict['person'])else:self.person_num.setText('0')if 'car' in label_list:self.car_num.setText(str(dict['car']))all += int(dict['car'])else:self.car_num.setText('0')if 'bicycle' in label_list:self.light_num.setText(str(dict['bicycle']))all += int(dict['bicycle'])else:self.light_num.setText('0')self.all_result.setText(str(all))

4.效果


智能监测平台实现

5.总结


这里的监测模型使用的是旷视科技提出的YOLOX检测模型,并且权重文件也使用的是官方提供的s版,能够检测的类别有二十种,这里只选取了三种监测模型进行了统计结果显示。程序的入口为main函数,并提供了源码。并且较容易对源码进行修改,以训练自己的数据集,针对自己的应用领域。训练自己数据集请看文章的第二部分。

6.训练环境、VOC数据集和exe文件运行说明


训练环境配置和VOC数据集的链接存放在README.MD文件中。

6.1 exe文件运行说明


如果要想自己数据集上训练的系统能够以exe文件方式运行,我们需要将项目进行打包,这里我们推荐使用auto-py-to-exe打包工具,先要进行安装,安装命令

pip install auto-py-to-exe

在这里插入图片描述
安装完成后,在我们工程文件夹目录中进入cmd命令框,输入auto-py-to-exe.exe启动打包工具,启动完成后,脚本位置选择工程文件中的main.py文件,之后选择单文件,基于窗口的。之后就可点击转化。

在这里插入图片描述
在这里插入图片描述
main.exe可执行文件较大,因为其中包含了torch库文件,这里在VOC数据上训练的main.exe文件下载链接也存放在README.MD文件中。将main.exe文件下载后需要放到output文件夹中,output文件下还有两个文件夹分别为ui和model_data。其中ui文件夹中包含了系统运行所需的页面ui文件;model_data文件夹中包含了检测模型的权重文件和类别文件。双击main.exe文件运行时,可能需要等待一点时间等待系统启动。


编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!

更多内容详见:这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/15517.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

不宽的宽字符

根据提示&#xff0c;通过nc 202.38.93.141 14202来进行连接&#xff0c;可以用自己的机器进行连接&#xff0c;也可以直接点击“打开/下载题目”连接&#xff1a; 意料之中的无法打开flag&#xff0c;看来得下载附件看看源码了 #include <iostream> #include <fstrea…

无脑使用matlab运行YOLOv5模型,实现目标检测

文章目录 前言代码报错解决方法缺点总结 前言 YOLO 是一种经典的一阶段目标检测算法&#xff0c;它将检测问题转化为回归问题。与 Faster R-CNN 不同&#xff0c;YOLO 不是提取 RoI,而是直接通过回归的方法生成每个类的边界框坐标和概率。与 Faster R-CNN相比&#xff0c;大大…

java ssm 高校固定资产管理系统 高校物资管理 资产信息 源码 jsp

一、项目简介 本项目是一套基于SSM的高校固定资产管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&am…

《战国王朝》青铜材料具体作用介绍

《战国王朝》中的青铜材料是游戏里非常重要的金属材料&#xff0c;而青铜材料的具体作用就是青铜用于制作第三层次的工具和武器;它比铜制的更好&#xff0c;但不如铁和钢制的&#xff0c;相比石制和铜制工具&#xff0c;青铜物品的使用寿命更长。 战国王朝青铜材料有什么用 青…

unity3d————延时函数

1.public void InvokeRepeating(string methodName, float time, float repeatRate); 延迟重复执行函数 InvokeRepeating 参数一&#xff1a;函数名字符串 参数二&#xff1a;第一次执行的延迟时间 参数三&#xff1a;之后每次执行的间隔时间 注意&#xff1a; 1-1.延时函数第…

焊接手电钻板子后总结

复用旧工程部分方案注意事项&#xff1a; 粘贴暑假时候做的工程原理图&#xff0c;复制到现在的项目中竟然忘记修改3V3的名称&#xff0c;导致3V3MCU与3V3的区别&#xff0c;这个错误以后一定要注意&#xff1a; 现在工程中的供电3V3&#xff0c;不是3V3MCU: 焊接QFN芯片&…

大模型智能客服比传统智能客服“智”在哪里?

随着人工智能技术的飞速发展&#xff0c;智能客服已成为企业提升服务效率和客户满意度的关键工具。在智能客服的演进过程中&#xff0c;大模型智能客服以其卓越的性能和智能化水平&#xff0c;逐渐崭露头角&#xff0c;更是为客户服务带来了新的变革。那么&#xff0c;大模型客…

Google Play上架/更新被拒的原因及解决方案

Google Play商店是全球Android开发者发布应用的首选平台&#xff0c;但在这个平台上发布或更新应用时&#xff0c;开发者必须遵守严格的规定和政策。如果违反这些规定&#xff0c;应用可能会被拒绝上架或更新&#xff0c;甚至可能导致开发者账号被封禁。本文将总结Google Play上…

docker安装到D盘

双击安装docker默认是安装在c盘&#xff0c;并且安装时我们没法选择位置&#xff0c;如果我们要安装在其他盘可以通过命令行安装 1、下载docker https://docs.docker.com/desktop/setup/install/windows-install/ Docker Desktop 可以使用 WSL 和 Hyper-V任意一种架构&#xf…

Exploring Defeasible Reasoning in Large Language Models: A Chain-of-Thought A

文章目录 题目摘要简介准备工作数据集生成方法实验结论 题目 探索大型语言模型中的可废止推理&#xff1a;思路链 论文地址&#xff1a;http://collegepublications.co.uk/downloads/LNGAI00004.pdf#page136 摘要 许多大型语言模型 (LLM) 经过大量高质量数据语料库的训练&…

山寨一个Catch2的SECTION

Catch2 是一个 C 单元测试库&#xff0c;吹嘘自己比 NUnit 和 xUnit 还要高明&#xff0c; 支持在 TEST_CASE() 中的多个 SECTION&#xff0c; 意思是说 SECTION 外头的代码相当于setup 和 teardown&#xff0c;section 内部则被认为是实际的 test case&#xff0c; 这种写法可…

TensorFlow_T7 咖啡豆识别

目录 一、前言 二、前期准备 1、设置GPU 2、导入数据 3、查看数据图片 三、数据预处理 1、加载数据 2、可视化数据 3、配置数据集 四、构建VGG-16网络 1、VGG优缺点分析 2、自建模型 3、网络结构图 五、编译 六、 训练模型 一、前言 &#x1f368; 本文为&#…

平替备用机!不到 5 元的 410 随身 WiFi 免刷机实现短信转发

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 各位用备用机的&#xff0c;应该有很多只是插上不常用的手机卡&#xff0c;然后装个短信转发的 App 来看看验证码什么的吧。每隔一段时间还要去看看备用机还有没有电&#xff0c;但其实这种需求骁龙 410 芯…

【EmbeddedGUI】脏矩阵设计说明

脏矩阵设计说明 背景介绍 一般情况下&#xff0c;当屏幕内容绘制完毕后&#xff0c;实际应用通常需要更新屏幕中的一部分内容&#xff0c;而不是单纯显示一个静态图片在那。 如下图所示&#xff0c;屏幕中有一个图片控件&#xff08;Img2&#xff09;和一个文本控件&#xf…

网络基础-超文本协议与内外网划分(超长版)

一、超文本协议 1. HTTP协议简介 1.1. 网络架构简单介绍 (1). C/S架构&#xff08;Client/Server架构&#xff09; (2). B/S架构&#xff08;Browser/Server&#xff09; 总结对比 2. HTTP协议版本 2.1. HTTP/0.9 &#xff08;1991年发布&#xff09; 2.2. HTTP/1.0 &a…

5分钟搞懂 Golang 堆内存

本文主要解释了堆内存的概念&#xff0c;介绍了 Linux 堆内存的工作原理&#xff0c;以及 Golang 如何管理堆内存。原文: Understanding Heap Memory in Linux with Go 你想过为什么堆内存被称为 "堆" 吗&#xff1f;想象一下杂乱堆放的对象&#xff0c;与此类似&…

今日 AI 简报 | 开源 RAG 文本分块库、AI代理自动化软件开发框架、多模态统一生成框架、在线图像背景移除等

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作&#xff08;三种实现方式&#xff09;&#xff1a; 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

技术段子——论如何在0.387秒以内获取到闲鱼的上新数据。

个人一直在做闲鱼辅助相关的工具类软件。因为知道阿里系请求和风控的原因&#xff0c;再加个人做软件一直想的是如何让用户稳定运行。 因为阿里系对于请求的风控&#xff0c;所以个人风格导到软件效率一直一般。并不是做不到快速抓取&#xff0c;而是用效率换稳定。 所以&#…

【C#设计模式(10)——装饰器模式(Decorator Pattern)】

前言 装饰器模式可以在运行时为对象添加额外的功&#xff0c;而无需修改原始对象的代码。这种方式比继承更加灵活。 代码 //蛋糕类&#xff08;抽象类&#xff09; public abstract class Cake {public abstract void Create(); } //奶油蛋糕类 public class CreamCake : Cak…