news 2026/8/31 16:03:40

基于深度学习的人流量检测系统设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习的人流量检测系统设计与实现

简介:本资源是一套完整可用的毕业设计项目——基于深度学习的人流量检测系统,面向计算机、人工智能、软件工程等专业的本科生毕设实践与课程设计需求,解决现实场景中视频流人流量统计与密度分析的技术落地问题。压缩包共1235个文件,含76个核心Python源码(含模型训练、推理部署、前后端交互逻辑)、382个HTML前端页面、208张可视化结果PNG图、194个JS交互脚本及配套CSS、配置文件与说明文档,整体大小61.78MB,结构清晰,模块划分明确,涵盖数据预处理、YOLOv5/DeepSORT目标检测与跟踪、人流计数算法及Web展示层。已有433人学习下载,项目经导师指导并高分通过,附详细项目说明文档与可直接运行的调试环境配置,特别适合毕设学生快速上手、理解端到端AI应用开发流程,并为后续优化提供完整代码基础与排错参考。 毕业设计选了“基于深度学习的人流量检测系统设计与实现”这个题目,看起来挺唬人,但拆开来看其实就三件事:用深度学习模型把画面里的人找出来,用Python把检测结果变成可统计的数据,再做一个可视化界面让整套系统能跑起来。很多同学听到“深度学习”三个字就先慌了,实际上这个方向的技术路线已经非常成熟,只要选对模型、理清流程,工作量是完全可控的。我做完这个项目最大的感受是:难的不是模型本身,而是把检测、跟踪、计数、界面这些环节串成一条完整的链路。

这篇内容我从选题思路、数据集准备、模型训练、系统实现到常见问题排查,完整记录了我做这个系统时踩过的坑和验证过的方案。无论你是正在做类似毕业设计,还是想入门目标检测实战,都可以直接参考里面的配置和代码思路。

1. 项目整体设计与技术选型

1.1 先想清楚系统要做什么,再动手写代码

拿到题目之后,我第一件事不是去找开源代码,而是先把“人流量检测系统”这件事拆成具体的功能点。人流量检测的本质是目标检测问题,但“检测”和“系统”之间还有很长的路。如果只是训练一个YOLO模型,在命令行里跑一张图片出框,那只是一个演示脚本,不能叫系统。一个完整的系统至少要支持三种输入源——图片、视频文件、摄像头实时画面,并且要能展示检测结果、统计人数变化、保存记录,这些功能在毕业设计答辩时才算站得住。

我当时画了一张简单的功能模块图,把整个系统分成三层:数据输入层负责读取图片、视频和摄像头画面,核心算法层负责人流目标的检测、跟踪和跨线计数,交互展示层负责绘制检测框、显示实时人数、画出人数变化曲线。这个框架看起来简单,但它决定了后面的代码结构。很多同学一上来就调模型参数,结果做到最后论文都不知道怎么组织,就是因为前期没有把系统的边界划清楚。

1.2 技术选型:YOLOv5、PyTorch、PyQt5怎么搭配

模型选型是整个项目最关键的一步。我一开始也试过Faster R-CNN,检测精度在密集场景确实不错,但推理速度太慢,在一张普通的显卡上单帧都要上百毫秒,做到实时界面交互时会非常卡。后来换成了YOLOv5,速度和精度的平衡明显更好,而且生态非常成熟,预训练权重、导出工具、部署方案都是现成的,不用自己造轮子。

具体版本组合我也直接列出来:Python 3.8.10、PyTorch 1.12.1(CUDA 11.6)、YOLOv5 6.0版本代码、OpenCV 4.5.5、PyQt5 5.15.7。这里要特别说一下Python版本,3.8不是最新的,但它是PyTorch和PyQt5兼容性最稳的组合。我见过有人用Python 3.11装PyTorch然后遇到一堆依赖问题,对毕设来说没必要折腾,选验证过的版本组合是最省时间的。

界面层用PyQt5而不是Tkinter或Web前端,主要原因是PyQt5在桌面端做视频展示和交互控制非常方便,信号槽机制天然适合多线程画面刷新。而且它打包成exe之后给老师演示也容易。

1.3 数据流和模块协作关系

整个系统的数据流是这样的:摄像头或视频文件的每一帧画面送入检测模块,检测模块返回所有人体的边界框;然后跟踪模块把相邻两帧的检测结果关联起来,给每个行人赋予一个稳定的ID;计数模块判断这些ID是否跨过了预先设置的虚拟线,并在线两端分别累加“进入”和“离开”的人数;最后界面把这些信息全部绘制到画面上,并实时更新统计面板和折线图。

这个链路里,跟踪模块是很多人容易忽略的部分。如果只做单帧检测,那只能显示“当前画面里有几个人”,不能算“人流量”,因为根本无法区分这个人是刚进来的还是已经站了很久的。加上跟踪之后,系统才能回答“这个时间段有多少人经过了这个区域”这个问题。我用的是简单IOU跟踪加跨线判断,没有上DeepSORT,因为DeepSORT还需要额外的ReID模型来提升重识别能力,对整个毕设来说复杂度有点高,效果提升在一般摄像头场景下又不明显。

提示:如果论文里需要展示算法对比,可以提一句“本系统采用基于IOU的轻量跟踪策略,在保证实时性的前提下满足中低密度场景的计数需求”,这句话在答辩时很实用。

2. 数据集准备与模型训练

2.1 数据集来源与标注格式

训练数据这块,我的做法是“公开数据集做底,自采数据微调”。公开数据集用的是COCO的person类别,虽然COCO里面行人目标占比不小,但在密集场景下小目标多、遮挡多,直接用它训练出来的模型部署到你的实际场景,效果不一定好。所以我先通过COCO预训练权重做基础,再采集了自己场景下的视频帧进行微调,这样模型对特定视角、特定光照环境的适应性会好很多。

如果你时间充裕,自己采集300到500帧画面,用LabelImg工具手动标注,效果是最好的。标注格式是YOLO的txt格式,每一行代表一个目标,内容依次是类别id、归一化后的中心点x、中心点y、框宽、框高。比如一个行人的标注可能是:

0 0.4389 0.6421 0.1842 0.5231

这里0表示person这个类别,后面四个数是归一化的坐标和尺寸,图像宽度和高度都归一化到0到1之间。

如果你连标注的时间都不够,可以直接用CrowdHuman数据集的子集。我用过这个数据集,它专门针对密集人群,标注质量很高,缺点是原始标注格式是COCO风格,需要写个脚本转成YOLO格式。转换逻辑不复杂,就是把bbox字段里的[x, y, w, h]换算成归一化的center_x, center_y, w, h。数据集的划分我按8:1:1分成训练集、验证集和测试集,确保测试集没有参与过训练。

2.2 训练环境的搭建和安装顺序

环境搭建是新手最容易卡住的一步。我第一次装的时候就因为先装了OpenCV后装PyTorch,两个库的numpy依赖冲突,导致OpenCV导入直接报错。后来我调整了安装顺序,先把PyTorch全家桶装好,再装OpenCV和其他工具库,问题就没再出现过。

我最终验证可以用的环境配置是:

  • Python 3.8.10
  • torch 1.12.1 + torchvision 0.13.1
  • opencv-python 4.5.5
  • pyqt5 5.15.7
  • numpy 1.21.6

如果电脑没有NVIDIA显卡,也可以用CPU训练,但要把batch size调小、图片分辨率调低。我试过用CPU跑YOLOv5s训练100轮,一个epoch要将近20分钟,整个训练跑完要一天多,虽然能出结果,但调参会非常痛苦。有条件尽量用显卡,哪怕是最低端的RTX 3050,训练效率都能快上好几倍。

2.3 训练参数配置与实际调整经验

我用的是YOLOv5自带的训练脚本,核心启动命令如下:

python train.py --img 640 --batch 16 --epochs 100 --data crowd.yaml --cfg yolov5s.yaml --weights yolov5s.pt --name density

这几个参数是我反复试下来比较稳的组合,每个参数背后都有讲究:

  • --img 640:输入分辨率640x640。分辨率越高小目标越容易检测到,但显存占用会明显增大。如果你的显卡只有6G显存,降到480比较保险。
  • --batch 16:在8G显存显卡上比较稳。训练时YOLOv5默认开启mosaic增强,显存波动比较大,batch不能再往上提了,否则很容易CUDA out of memory。
  • --epochs 100:用预训练权重微调,100轮足够收敛。我第一次跑150轮,后50轮几乎没变化,纯粹浪费时间。
  • --weights yolov5s.pt:用s版本预训练权重,比从零开始训练收敛快很多,而且mAP不会差太多。

训练过程中,我最关注的指标是mAP@0.5val_loss。我这次跑的模型在60轮左右mAP@0.5就到了0.87,最终100轮稳定在0.91。验证集损失曲线前期快速下降,后期趋于平稳,训练集和验证集的损失差距不大,说明没有明显过拟合。

2.4 训练过程中踩过的几个坑

第一个坑是类别不平衡。我自己采集的数据里,有人出现的画面和完全没有人出现的空场景画面比例大约只有3比1,结果模型在空场景下误检率特别高,经常把墙壁上的纹理和消防栓识别成人。后来我把空场景帧补充到正样本的三分之一左右,误检问题立刻缓解了。

第二个坑是小目标漏检。画面里远处的人可能只有20x30像素,模型几乎检测不到。后来我把YOLOv5的mosaic增强打开,它会把四张训练图拼接在一起,等效于在训练中增加大量小目标,漏检情况改善了不少。

第三个坑是标注框不统一。我一开始标注时只框了行人身体露出的部分,结果不同标注员框的位置五花八门,模型收到的训练信号互相矛盾,损失下降很慢。后来我统一规定,只要人没被大面积遮挡,就框完整的身体范围,训练稳定了很多。这个细节特别值得注意,数据质量比数据量更能影响最终效果。

3. 系统核心功能实现与代码解析

3.1 检测模块的实现

推理部分我直接基于YOLOv5的detect逻辑做了简化,核心类大致长这样:

import torch import cv2 import numpy as np class Detector: def __init__(self, weights_path, conf_thres=0.4, iou_thres=0.5): self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=weights_path, source='local') self.model.conf = conf_thres self.model.iou = iou_thres def detect_frame(self, frame): results = self.model(frame) boxes = results.xyxy[0].numpy() # x1, y1, x2, y2, score, class person_boxes = [] for b in boxes: if int(b[5]) == 0: # class 0 对应 COCO 中的 person person_boxes.append(b[:4]) return person_boxes

这里有个参数需要进行解释:conf_thres(置信度阈值)我设成0.4,不是随便定的。设成0.25,检测框会大量出现,但误检也明显增加,柱子、箱子、墙上的海报都容易被当成行人;设成0.6,误检少了,但很多被遮挡的人会被漏掉。0.4是综合考虑密集场景下漏检和误检的平衡点。你可以先跑一个批量测试,或者通过验证集的P-R曲线来确定更适合自己场景的值,我这里是给出了一个常见且稳妥的起点。

3.2 跟踪与跨线计数逻辑

我用的为相邻帧目标框匹配的IOU跟踪策略。核心思想是对相邻两帧的检测框中心点计算距离,距离小于给定阈值的视为同一个目标,继承其ID;一个ID连续多帧没有匹配到任何框,就认为目标已经离开,将其删除。这个逻辑虽然简单,但在摄像头视角固定、行人移动速度不快的场景下已经足够稳定。

跨线计数是整个系统里最直观的部分。我先在画面中定义一条虚拟线,比如y坐标等于400的一条水平线。那么只需要判断每个ID中心点在相邻两帧之间的y坐标变化,就能知道这个人是从线的哪一侧走到了另一侧,据此统计进入和离开人数。核心代码很简短:

def check_crossing(prev_y, curr_y, line_y): if prev_y <= line_y < curr_y: return "enter" elif prev_y >= line_y > curr_y: return "leave" return None

如果行人一直在线附近来回移动,可能会产生重复计数。我在实现里加了一个防抖机制:同一个ID在2秒内只能触发一次跨越事件。这样可以有效避免误统计。

注意:如果场景是俯视视角,虚拟线不一定是水平线,也可能是画面中的一条斜线或者一个闭合区域。在实现时可以用OpenCV的cv2.line来绘制辅助线,便于现场调试和演示。

3.3 PyQt5界面与多线程刷新逻辑

界面部分我用了PyQt5的QThread。为什么必须用多线程?因为检测是一个耗时操作,视频流读取和检测如果放在Qt主线程里,界面会直接卡死,拖动窗口、点击按钮都会失去响应,看起来就是“程序未响应”。所以我把视频读取和检测放到一个后台线程里,每处理完一帧,就通过pyqtSignal把检测结果和新画面发回主线程刷新。

我界面的整体布局分三个区域:

  • 左侧为视频预览区,实时显示带检测框的画面,框的颜色用绿色,被计数的目标ID显示在框上方。
  • 右上为统计面板,显示当前画面人数、累计进入人数、累计离开人数和实时FPS。
  • 下方为人数变化折线图,用matplotlib库嵌入到PyQt5的FigureCanvas里,每5秒更新一个点,展示最近20分钟的人流趋势。

整个界面跑起来之后,左边视频条数实时变化,右边数字和折线图一起更新,答辩演示效果很直观。这里要提醒一下,matplotlib嵌入PyQt后必须通过QtWidgets.QVBoxLayoutFigureCanvas实例添加进布局,同时把刷新操作放到主线程,否则在后台线程里直接操作图表控件,大概率会崩溃。

3.4 模型加载与打包部署

如果演示需要在没有深度学习环境的机器上跑,可以考虑用PyInstaller把整个项目打包成exe。打包时用得比较多的坑是模型文件加载方式。如果直接用torch.hub.load('ultralytics/yolov5', 'custom', path=weights_path)这种写法,PyInstaller打包之后模型缓存路径会失效,运行时会报找不到模型。

解决办法是把YOLOv5的代码仓库完整放到项目目录下,并加上source='local'参数:

self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=os.path.join(os.getcwd(), 'weights', 'best.pt'), source='local')

这样模型加载时直接从本地仓库读取,不依赖网络缓存,打包之后也能正常运行。用PyInstaller打包时,要注意在spec文件里把权重文件路径加进datas,同时排除不必要的PyTorch CUDA文件,避免生成的exe体积过大。我打包出来的程序大约300MB,对于一个含深度学习模型的桌面应用来说是正常水平。

4. 实测效果与常见问题排查

4.1 实测效果和演示表现

我用模型在不同场景下做了多组测试。在室内走廊场景,镜头离地约2.5米俯拍,最大同时出现6个人,检测稳定,跨线计数基本没有漏计,测试5分钟累计进入15人、离开14人,误差在可接受范围内。在商场入口场景,动态背景复杂,有人拉行李箱、抱小孩,模型对抱小孩的行人偶尔会只检测出大人漏掉小孩,但整体漏检率不到10%。

在FPS表现上,未使用TensorRT加速时,单帧检测只要用GPU,YOLOv5s在1080Ti上大概能达到55到65FPS,界面刷新很流畅。换到普通办公笔记本CPU推理,单帧要400到600毫秒,画面会有明显延迟。所以如果演示机器没有独立显卡,建议使用我录好的视频文件做输入源,而不是直接接摄像头,否则动态演示会有卡顿感。

4.2 复杂场景的典型问题

模型在暗光场景下表现比较差。有一次我在傍晚楼道里测试,穿黑色外套的路人直接从画面里消失,后来通过增加暗光样本和HSV颜色扰动增强,情况才有所改善。这说明模型的泛化能力和训练数据的分布有很大关系,真实场景部署时一定要针对场景重新采集数据微调,不能指望一个通用模型通吃所有环境。

遮挡问题是另一个难点。两个人并排走或者交错而过时,两个检测框容易发生重叠,IOU跟踪有时会把两个ID搞混淆,导致计数出错。我的应对策略是把IOU匹配阈值调低,比如从0.4降到0.3,同时在视觉上给每个ID分配不同颜色,现场演示时发现问题可以即时人工观察和判断。

4.3 性能优化技巧

CPU推理速度慢的优化,我的经验是按优先级做下面几件事:

  • 缩小输入分辨率。把--img从640改成416,速度能提升将近一半,在画面人数不多的场景下精度损失很小。
  • 关闭模型训练增强。推理时model.confmodel.iou只负责过滤,真正影响速度的是输入尺寸和模型规模。如果常用在CPU环境,训练时可以换更轻量的yolov5n
  • 画面显示做抽帧。界面刷新显示可以间隔两三帧做一次,检测逻辑仍然逐帧运行,这样界面视觉流畅度更好。

如果想让CPU推理速度更快,可以导出成ONNX格式,再用ONNX Runtime加载,通常比PyTorch模型的CPU推理快20%到40%。我实测把一个YOLOv5s模型从PyTorch直接推理的350毫秒优化到了ONNX Runtime的180毫秒左右,效果很明显。

4.4 常见问题速查表

现象原因解决方法
训练时CUDA out of memorybatch过大或分辨率过高降低batch,关闭mosaic,缩小输入尺寸
启动时无法加载模型模型缓存路径失效使用source='local'从本地加载
摄像头画面黑屏视频源索引错误或设备被占用更换index,关闭其他摄像头软件
误检严重置信度阈值过低或负样本不足调高conf,补充空场景训练样本
画面卡顿检测逻辑阻塞了UI线程使用QThread分离检测和显示
打包后无法运行缺少动态库或模型路径错误用spec文件包含datas,设置local加载

这张表我整理了好几天,基本覆盖了从开发到部署最常见的坑。建议在写论文时把这部分内容作为“系统测试与问题分析”章节的素材,答辩时很有说服力。

5. 项目扩展方向与答辩建议

5.1 系统还可以做哪些功能扩展

做完基础系统之后,如果想给项目锦上添花,可以考虑以下几个方向。

第一个加热力图功能。把每帧检测框中行人的中心点位置统计起来,叠加生成一张区域热度图,直观展示哪些区域人流最密集。这个功能在商场、景区人流分析场景下很实用,而且技术上不复杂,用OpenCV的按帧累加加高斯模糊就能实现。

第二个接入Web服务。用Flask把检测模块包装成一个HTTP接口,外部系统可以通过POST请求提交图片或视频流地址,获得检测结果。这样做会让系统从单机应用变成服务化的架构,在论文中能作为“系统架构的可扩展性设计”来写。

第三个是统计报表导出。把每小时进入和离开的人数存储为CSV文件,或者用matplotlib生成日报、周报图表,让不关心技术细节的老师也能直观看出统计数据。这个功能对论文的“应用价值”部分是很好的支撑材料。

5.2 答辩演示准备与个人体会

答辩演示是整个毕业设计收官的关键。根据我的实际经验,有几件小事值得提前准备。

第一,提前录制几段不同场景的视频。完全依赖现场摄像头风险很大——现场的光线、角度、人流量都不确定,万一演示时模型检测效果不好,场面会很被动。事先录好的视频既可控又能展示模型在不同环境下的表现。第二,把训练过程中的损失曲线、mAP曲线截图放到PPT里,能证明实验的规范性和工作量。第三,准备一句对这个系统适用场景的客观表述,比如“当前系统面向中低密度人群场景,针对高密度场景可通过换用密度图回归模型进一步优化”,这句话能体现你对技术边界有清晰认知。

根据我个人的体会,毕业设计做这个题目的核心价值不在于把mAP刷多高,而在于通过一个真实问题把深度学习从理论变成一个能运行、能演示、能讲清楚的系统。只要把检测、跟踪、计数、界面这几条链路打通,再把每一部分的设计理由想明白,答辩时基本不会慌。最后再分享一个小技巧:把你的项目在GitHub上开个仓库,写一份清晰的README,把环境配置、数据准备、训练命令和运行步骤都记录下来。这不仅是论文附录的好材料,过几个月之后你自己回来看,也能快速回忆起来整个项目是怎么跑的。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 16:03:35

基于深度学习的仪表读数识别实战:从YOLO检测到OCR部署

简介&#xff1a;本资源是一份面向高校本科生及毕业设计学生的深度学习实践项目&#xff0c;聚焦工业场景下仪表读数的自动化识别问题&#xff0c;有效替代传统人工抄表&#xff0c;提升工业巡检与数据采集效率。压缩包共11个文件&#xff0c;包含5个核心Python脚本&#xff08…

作者头像 李华
网站建设 2026/8/31 16:03:11

拆解一个YOLO图像识别系统:从数据标注到推理部署全流程

简介&#xff1a;本资源是一个基于YOLO系列模型&#xff08;含yolo11n.pt、btdV1/V2.pt等&#xff09;构建的端到端图像识别系统实现&#xff0c;面向人工智能初学者、计算机视觉开发者及课程设计实践者&#xff0c;解决目标检测场景下的模型部署、前后端协同与实时推理等核心问…

作者头像 李华
网站建设 2026/8/31 16:02:44

基于Vue 3与TipTap的电子病历编辑器架构设计实践

简介&#xff1a;本资源是一个基于Vue框架开发的医疗级电子病历编辑器完整前端项目&#xff0c;面向医疗信息化开发者、HIS系统集成工程师及前端进阶学习者&#xff0c;解决临床场景下病历录入效率低、格式不统一、数据难结构化、安全合规性不足等核心痛点。压缩包共939个文件&…

作者头像 李华
网站建设 2026/8/31 16:02:08

【计算机毕业设计】基于fastapi+vue的宠物领养管理系统

基于fastapivue的宠物领养管理系统 一、项目简介 宠物领养管理系统是一套面向普通用户、志愿者和管理员的全栈公益平台。后端采用 FastAPI、SQLAlchemy、Pydantic、MySQL、JWT 和 openpyxl&#xff0c;前端采用 Vue 3&#xff1b;系统覆盖宠物信息、领养申请、流浪宠物救助、…

作者头像 李华
网站建设 2026/8/31 16:02:03

【计算机毕业设计】基于 Python 的美妆销售数据分析 Web 系统

基于 Python 的美妆销售数据分析 Web 系统 一、项目简介 本系统以淘宝美妆商品数据为分析对象&#xff0c;集成数据采集、数据清洗、数据管理与多维可视化分析能力。Web 版本采用 Flask、Vue、ECharts 与 MySQL&#xff0c;项目同时保留爬虫、数据库、数据分析、可视化和本地…

作者头像 李华
网站建设 2026/8/31 15:56:21

基于TensorFlow 2.3与MobileNetV2的花卉识别系统设计与实现

简介&#xff1a;本资源是一份面向高校计算机、人工智能及相关专业本科生的期末大作业级花卉图像识别系统&#xff0c;基于Python与TensorFlow 2.3框架开发&#xff0c;聚焦K12及入门级深度学习实践场景&#xff0c;解决多类别花卉图像分类与可视化识别问题。压缩包共27个文件&…

作者头像 李华