Advertisement

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

阅读量:

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

    • 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打开工程文件时,在项目根目录下主要包含以下几类文件:首先是权重文件夹(weights),其次是目标类别相关文件夹(classes),随后是YOLOX模型所在的model folder以及打包输出时生成的output folder。此外,在工程目录中还可以找到.exe可执行文件。
在本项目中所采用的检测模型是YOLOX模型,在该框架下构建了相应的神经网络结构并进行了相关的参数训练与优化工作。
在实验过程中发现,在本项目中所采用的检测模型是YOLOX神经网络模型,在该框架下构建了相应的神经网络结构并进行了相关的参数训练与优化工作。
在实验过程中发现,

在这里插入图片描述

该系统主要由两个核心模块构成:主干特征提取网络与多尺度特征金字塔融合结构。主干特征提取网络通过四个ResBlock模块的连续连接,在输入图像的基础上完成多尺度特征的提取工作,并将提取到的三个关键的有效特征层传递至特征金字塔融合结构中进行后续处理;在特征金字塔结构中,则会对来自主干分支输出的三个有效特征层展开多层次的特征融合运算;由于高分辨率层级所包含的细节信息更为丰富而低分辨率层级则携带了更为丰富的语义信息,在实际处理过程中首先会对低分辨率特征求取其P5_out层次的信息并通过上采样操作将其转换为适合于与P4_out层次信息进行拼接融合的形式;经过多尺度特征金字塔融合结构后得到三个输出层分别对应于不同尺度目标检测需求从而能够实现对不同尺寸目标的检测

2.2 训练检测模型

2.2.1 准备数据集

要在自己的数据集中训练YOLOX模型,则必须首先按照VOC数据集的标准组织好自己的数据集,并将其放置于VOCdevkit文件夹内完成准备工作。准备好数据后,请依次执行以下操作:调用voc_annotation.py脚本并配置相关参数后运行;随后将自动完成针对1:9比例的数据整理工作以生成可用于训练的数据标签;仅需执行以下操作即可完成整个流程:打开并运行voc_annotation.py脚本配置参数并生成所需标签文件

在这里插入图片描述

完成数据集的准备后我们进入了train.py文件用于训练YOLOX模型代码中对重要参数做了标注

在这里插入图片描述

2.2.2 训练自己的权重文件

该文件的作用是告知模型数据集中存在的类别数量。该参数(model_pate)代表预训练权重文件,在本项目的数据集上进行微调时应使用官方推荐使用的预训练权重文件。通过这种方式能够显著提升模型在实际任务中的表现效果。此外,在设置阶段我们选择了100次迭代作为训练次数选项;这一设定意味着模型将在数据集上完成100次完整的图像学习过程。在此过程中系统会产出相应的权重文件并将其存储于log目录下,在后续的检测环节中我们将利用这些保存下来的学习成果进行推理运算。

2.2.3 使用自己的权重文件

完成模型的训练后只需改动yolo.py文件中的几个地方即可使用自己训练好的模型

在这里插入图片描述

第一步是调整权重文件的位置。我们需要获取通过训练获得的所有权重参数,并找到其中损失最小的那个作为用于实际检测时使用的权重。同时,在这一过程中,请确保将classes_path参数更新为当前数据集对应的分类信息路径

3.系统可视化

该系统采用了PyQt5作为其可视化工具,并与C++中的qt具有相似性。该系统具备良好的人机交互特性,并包含了许多常见的控件组件;例如包括显示提示控件QLabel等;同时实现了信号槽机制以实现对页面控件的快速获取以及响应事件的能力

在这里插入图片描述

系统的整体架构呈线性垂直布局结构,并按照自上而下的顺序依次整合了系统标题界面、功能分区以及视觉呈现区域。在视觉呈现区域中主要以实时监控画面展示为主,并且采用了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 上传视频监测

该按钮的整体功能类似于启动摄像头的功能。只需对所使用的 video stream 进行调整。此处采用 QFileDialog.getOpenFileName() 函数以实现从资源文件中选择并加载所需 video sequences,并将其选中的 video files 的 absolute path 返回。从而能够传递该 absolute path 给 opencv 来处理 video streams。

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

复制代码
    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控件内的目标种类与统计结果采用垂直线性布局并结合水平线性布局显示。通过show_res_num()函数来实现对行人、汽车以及自行车的统计结果展示工作。其中dict被定义为一种字典类型的数据结构,在该结构中键对应的目标类别由其值代表对应目标类别的数量

复制代码
        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文件格式( executable file ),我们需要对项目进行打包处理( package the project )。在此建议采用auto-py-to-exe这个打包工具( auto-py-to-exe tool )。在执行之前需要完成安装步骤( installation steps ),具体操作请参考安装命令( installation commands )。

复制代码
    pip install auto-py-to-exe
在这里插入图片描述

在我们的工程文件夹目录中进入cmd命令框后,在其中运行auto-py-to-exe.exe工具以启动打包程序。完成启动后,请选择工程目录下的main.py作为目标文件。随后设置为单文件打包,并基于窗口位置进行。点击转换按钮即可开始打包过程。

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

该可执行程序体积较大主要因为它整合了 torch 库中的各种组件资源为了方便使用它在 VOC 数据集上进行训练并将相关主程序下载链接提供了 README.MD 文件中

将下载的 main 可执行程序放置于 output 目录中其中包含两个子目录分别是用于系统界面展示的各个页面 UI 文件以及整合了待检测模型权重参数与类别分类所需的各种配置信息

双击运行 main 可能会短暂等待系统启动流程完成这一过程可能会花费一定的时间请耐心操作

资源获取

完整地重现过程的项目源代码、数据以及经过预训练的模型可通过该文章下方的下载链接获取。

附件地址:开发一个交通路口智能监控系统

全部评论 (0)

还没有任何评论哟~