基于深度学习的人流量检测系统设计与实现 📅 发布时间:2026/8/31 16:03:44 👁 浏览次数: 简介本资源是一套完整可用的毕业设计项目——基于深度学习的人流量检测系统面向计算机、人工智能、软件工程等专业的本科生毕设实践与课程设计需求解决现实场景中视频流人流量统计与密度分析的技术落地问题。压缩包共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.1CUDA 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.10torch 1.12.1 torchvision 0.13.1opencv-python 4.5.5pyqt5 5.15.7numpy 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不会差太多。训练过程中我最关注的指标是mAP0.5和val_loss。我这次跑的模型在60轮左右mAP0.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_thres0.4, iou_thres0.5): self.model torch.hub.load(ultralytics/yolov5, custom, pathweights_path, sourcelocal) 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.QVBoxLayout把FigureCanvas实例添加进布局同时把刷新操作放到主线程否则在后台线程里直接操作图表控件大概率会崩溃。3.4 模型加载与打包部署如果演示需要在没有深度学习环境的机器上跑可以考虑用PyInstaller把整个项目打包成exe。打包时用得比较多的坑是模型文件加载方式。如果直接用torch.hub.load(ultralytics/yolov5, custom, pathweights_path)这种写法PyInstaller打包之后模型缓存路径会失效运行时会报找不到模型。解决办法是把YOLOv5的代码仓库完整放到项目目录下并加上sourcelocal参数self.model torch.hub.load(ultralytics/yolov5, custom, pathos.path.join(os.getcwd(), weights, best.pt), sourcelocal)这样模型加载时直接从本地仓库读取不依赖网络缓存打包之后也能正常运行。用PyInstaller打包时要注意在spec文件里把权重文件路径加进datas同时排除不必要的PyTorch CUDA文件避免生成的exe体积过大。我打包出来的程序大约300MB对于一个含深度学习模型的桌面应用来说是正常水平。4. 实测效果与常见问题排查4.1 实测效果和演示表现我用模型在不同场景下做了多组测试。在室内走廊场景镜头离地约2.5米俯拍最大同时出现6个人检测稳定跨线计数基本没有漏计测试5分钟累计进入15人、离开14人误差在可接受范围内。在商场入口场景动态背景复杂有人拉行李箱、抱小孩模型对抱小孩的行人偶尔会只检测出大人漏掉小孩但整体漏检率不到10%。在FPS表现上未使用TensorRT加速时单帧检测只要用GPUYOLOv5s在1080Ti上大概能达到55到65FPS界面刷新很流畅。换到普通办公笔记本CPU推理单帧要400到600毫秒画面会有明显延迟。所以如果演示机器没有独立显卡建议使用我录好的视频文件做输入源而不是直接接摄像头否则动态演示会有卡顿感。4.2 复杂场景的典型问题模型在暗光场景下表现比较差。有一次我在傍晚楼道里测试穿黑色外套的路人直接从画面里消失后来通过增加暗光样本和HSV颜色扰动增强情况才有所改善。这说明模型的泛化能力和训练数据的分布有很大关系真实场景部署时一定要针对场景重新采集数据微调不能指望一个通用模型通吃所有环境。遮挡问题是另一个难点。两个人并排走或者交错而过时两个检测框容易发生重叠IOU跟踪有时会把两个ID搞混淆导致计数出错。我的应对策略是把IOU匹配阈值调低比如从0.4降到0.3同时在视觉上给每个ID分配不同颜色现场演示时发现问题可以即时人工观察和判断。4.3 性能优化技巧CPU推理速度慢的优化我的经验是按优先级做下面几件事缩小输入分辨率。把--img从640改成416速度能提升将近一半在画面人数不多的场景下精度损失很小。关闭模型训练增强。推理时model.conf和model.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缩小输入尺寸启动时无法加载模型模型缓存路径失效使用sourcelocal从本地加载摄像头画面黑屏视频源索引错误或设备被占用更换index关闭其他摄像头软件误检严重置信度阈值过低或负样本不足调高conf补充空场景训练样本画面卡顿检测逻辑阻塞了UI线程使用QThread分离检测和显示打包后无法运行缺少动态库或模型路径错误用spec文件包含datas设置local加载这张表我整理了好几天基本覆盖了从开发到部署最常见的坑。建议在写论文时把这部分内容作为“系统测试与问题分析”章节的素材答辩时很有说服力。5. 项目扩展方向与答辩建议5.1 系统还可以做哪些功能扩展做完基础系统之后如果想给项目锦上添花可以考虑以下几个方向。第一个加热力图功能。把每帧检测框中行人的中心点位置统计起来叠加生成一张区域热度图直观展示哪些区域人流最密集。这个功能在商场、景区人流分析场景下很实用而且技术上不复杂用OpenCV的按帧累加加高斯模糊就能实现。第二个接入Web服务。用Flask把检测模块包装成一个HTTP接口外部系统可以通过POST请求提交图片或视频流地址获得检测结果。这样做会让系统从单机应用变成服务化的架构在论文中能作为“系统架构的可扩展性设计”来写。第三个是统计报表导出。把每小时进入和离开的人数存储为CSV文件或者用matplotlib生成日报、周报图表让不关心技术细节的老师也能直观看出统计数据。这个功能对论文的“应用价值”部分是很好的支撑材料。5.2 答辩演示准备与个人体会答辩演示是整个毕业设计收官的关键。根据我的实际经验有几件小事值得提前准备。第一提前录制几段不同场景的视频。完全依赖现场摄像头风险很大——现场的光线、角度、人流量都不确定万一演示时模型检测效果不好场面会很被动。事先录好的视频既可控又能展示模型在不同环境下的表现。第二把训练过程中的损失曲线、mAP曲线截图放到PPT里能证明实验的规范性和工作量。第三准备一句对这个系统适用场景的客观表述比如“当前系统面向中低密度人群场景针对高密度场景可通过换用密度图回归模型进一步优化”这句话能体现你对技术边界有清晰认知。根据我个人的体会毕业设计做这个题目的核心价值不在于把mAP刷多高而在于通过一个真实问题把深度学习从理论变成一个能运行、能演示、能讲清楚的系统。只要把检测、跟踪、计数、界面这几条链路打通再把每一部分的设计理由想明白答辩时基本不会慌。最后再分享一个小技巧把你的项目在GitHub上开个仓库写一份清晰的README把环境配置、数据准备、训练命令和运行步骤都记录下来。这不仅是论文附录的好材料过几个月之后你自己回来看也能快速回忆起来整个项目是怎么跑的。本文还有配套的精品资源点击获取