尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
深度学习人流量检测系统实战:YOLOv5目标检测与计数实现
简介这是一份面向计算机专业毕业设计的高分人流量检测系统项目基于深度学习技术包含完整Python源码与项目说明文档适合正在准备毕设、课程设计或期末大作业的学生也适合需要项目实战练习的开发者。项目经过严格调试下载后即可运行。压缩包内共1235个文件包含108个Python源码与编译文件76个py、32个pyc、382个HTML页面、194个JavaScript脚本、51个CSS样式构成完整可视化前端还有186个GIF动图用于展示检测效果以及18个Java、8个C#等辅助代码整体约61.54MB。目前已有263人学习浏览。通过该项目可掌握基于深度学习的人流检测模型构建、数据集处理、模型训练与部署全流程项目说明文档提供设计思路与实现细节便于理解和二次开发是一份高质量的毕业设计参考。1. 从数人头到算密度深度学习人流量检测到底改了什么问题人流量统计听起来是个老问题监控摄像头已经装了十几年靠人工数数又累又不准传统的背景差分和帧差法在空旷场景还能用一旦遇到遮挡、光照突变、行人外观相似误检和漏检立刻就失控。毕业设计一旦选这个课题最核心的难点不是“检测”而是把检测结果真正交给业务——是数通过闸机的人数还是统计某个区域里的人密度两者用的技术栈差距很大。这套基于深度学习的人流量检测系统把目标检测、跟踪和计数逻辑串成了一条完整链路代码能在 Python 环境下直接运行同时配了一份答辩级的项目说明。适合两类人一类是计算机、人工智能方向正在做毕设的学生想找一个能演示又能讲出原理的项目另一类是刚接触目标检测的开发者想看看一个检测模型是怎么被做成实际系统的。我拆过几个同类项目下面说说这套系统的整体思路和落地细节。注意这个压缩包里的文件列表混入了一组controller.ashx、Config.cs、UploadHandler.cs那是 UEditor 的 .NET 服务端上传处理代码可能是作者打包时误放进来的对人流量检测本身没有影响。真正要盯的是 Python 目录下的训练、推理和 Web 展示部分别在无关文件上浪费时间。2. 系统架构与模型选型YOLO 系在密集场景下的边界在哪2.1 端到端检测管线中的模块划分一个能拿去答辩的人流量检测系统通常不是“用模型检测一帧图”这么简单而是下面四个模块在协同工作第一是视频输入模块。支持本地视频文件、摄像头 RTSP 流如果要做成网页演示还会加一个视频上传接口。第二是检测模块这是整套系统的核心负责在每一帧里找出所有人形目标输出边界框坐标、置信度和类别。第三是计数模块根据检测框做区域判断或轨迹跟踪决定目标进入还是离开。第四是可视化与数据持久化模块在画面上绘制检测框和人数曲线同时把统计结果写进 CSV 或数据库。这里最容易踩的坑是检测模块单独拿出来效果很好但放到视频流里就频繁闪框、重复计数。原因在于检测是逐帧的没有做时间维度的关联。所以稍成熟的系统都会在检测后面接一个目标跟踪模块用 IoU 匹配或外观特征把同一目标跨帧绑定起来计数才能稳定下来。2.2 模型对比Faster R-CNN、SSD、YOLOv5 与 YOLOv8人流量检测场景对模型的基本要求是小目标多、密集遮挡、实时性要求高。毕业设计里常见的选择就三个流派我把它们的边界拉出来对比一下模型推理速度小目标能力部署难度典型用途Faster R-CNN慢5-15 FPS强中精度优先不要求实时SSD快30 FPS 以上较弱低简单场景、算力有限YOLOv5快30-60 FPS中上低视频监控、毕设首选YOLOv8快30-60 FPS中上C2f 结构更好低新项目、模型结构更新从实际筛选经验看Faster R-CNN 的精度确实高但在 1080p 监控视频上跑不到实时演示时画面一卡就显得效果差。SSD 对小目标的召回率偏低人稍微站远一点就漏检。YOLOv5 在速度和精度之间最均衡且生态完整预训练权重好找可视化工具也成熟所以在毕设和课程设计中成了事实上的默认选项。2.3 为什么推荐 YOLOv5 作为毕设基线如果这套系统是你从零开始搭我依然建议先把 YOLOv5 跑通再考虑换模型。原因有三第一YOLOv5 的代码结构非常清晰train.py、detect.py、utils/分层明确写进毕业论文里容易讲清楚第二它的超参数配置全部集中在 yaml 文件里改图像尺寸、batch、学习率都不需要动源码适合在论文里做控制变量实验第三社区资料量大遇到报错搜索一下就能解决。需要说清楚的是YOLOv5 对密集人群的漏检率仍然存在尤其是人头叠人头的场景。如果你想要更好的效果项目里可以这样优化把检测类别从“人”改成“人头”因为头部的遮挡情况远少于全身或者引入注意力机制比如在骨干网络后加一层 SE 模块但那样会增加训练复杂度。毕设阶段先跑通原始 YOLOv5把计数逻辑做稳再谈优化是更务实的选择。3. 数据准备与训练从视频到可用的权重文件3.1 数据集选型与预处理训练一个人流量检测模型数据无非两个来源公开数据集和自己标。公开数据集里用得最多的是 VOC20072012 的 person 类以及 CrowdHuman、MOT16。CrowdHuman 专门针对密集人群框的质量高但格式是 COCO 风格MOT16 是跟踪数据集适合做后续的跨帧关联验证。我的建议是如果毕设目标是人流量计数直接用 VOC 或 COCO 的 person 子集初始化权重再拿几段自己录的监控视频做微调。这样既保证类别的多样性又能让模型适应当前的摄像头角度。预处理阶段有三个关键动作必须做统一图像尺寸YOLOv5 默认用 640x640小数据集建议保持这个尺寸不要为了省显存降到 416否则小目标会大量丢失过滤掉高宽比异常的目标比如宽度小于 5 像素的人形候选框基本是噪声做在线数据增强YOLOv5 内置了 mosaic、随机平移、色彩抖动直接在训练时生效不需要手动生成图片。3.2 标注格式转换从 VOC 到 YOLO txt如果你手上的数据是 LabelImg 标出来的 VOC XML 格式训练前必须转成 YOLO 需要的 txt 格式。每张图片对应一个同名 txt 文件每行是class_id x_center y_center width height其中坐标都是相对于图片宽高的归一化值。转换脚本可以这样写import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_dir, out_dir, classes): os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) out_lines [] for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue box obj.find(bndbox) x_min float(box.find(xmin).text) y_min float(box.find(ymin).text) x_max float(box.find(xmax).text) y_max float(box.find(ymax).text) # 计算中心坐标和宽高并归一化 x_center (x_min x_max) / 2 / img_w y_center (y_min y_max) / 2 / img_h width (x_max - x_min) / img_w height (y_max - y_min) / img_h out_lines.append(f{classes.index(cls)} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) with open(os.path.join(out_dir, xml_file.replace(.xml, .txt)), w) as f: f.write(\n.join(out_lines)) # 假设 person 是唯一类别索引为 0 voc_to_yolo(labels/xml, labels/txt, [person])这段代码的核心逻辑是把左上角和右下角的绝对坐标转换为归一化的中心点加宽高。转换完成后最好写一个检查脚本随机抽几张原图把 txt 里的框画出来看是否贴准。很多训练效果差的问题都出在这一步类别索引对不上或者图片被缩放后标注没跟着变。classes列表的顺序决定了模型输出的类别编号训练时data.yaml中的 names 必须和这里的顺序完全一致否则模型会学乱。另外YOLO 格式不接受负数坐标如果你的标注里有目标略微超出图像边界需要先裁掉这些框。3.3 训练命令与关键参数解析数据准备好之后在 YOLOv5 工程目录下执行训练命令python train.py --data data/crowd.yaml --weights yolov5s.pt --img 640 --batch-size 16 --epochs 100 --device 0data/crowd.yaml里至少要有三行关键配置train和val指向图片目录nc是类别数names是类别名列表。batch-size要根据显存调整8G 显存跑 640 分辨率建议从 16 开始显存不足就减半同时学习率也要相应减小。训练过程里要盯两个曲线Box损失下降是否平缓mAP0.5是否还在上升。如果训练到 50 epoch 之后 mAP 还在缓慢涨可以考虑提前停止如果 loss 震荡剧烈大概率是学习率太大或 batch 太小把初始学习率从默认的 0.01 降到 0.001 重新训练。很多人直接拿默认参数跑自定义小数据集结果过拟合严重原因就是数据集只有几百张而模型容量开始记忆背景。训练完成后会生成runs/train/exp/weights/best.pt这就是后续推理要用的权重文件。如果发现验证集 mAP 不错但实际视频里效果差通常是训练图片和实际场景的分布差异太大比如训练集都是平视角度而监控是俯视角度此时可以添加俯拍数据做多尺度训练。4. 检测加计数给每帧结果接上业务逻辑4.1 加载模型并对视频流推理拿到权重后下一步是把模型封装成一个可复用的检测器。这里强烈建议不要每次都写命令行调用detect.py而是把 YOLOv5 的模型加载逻辑抽出来写成一个类或函数方便后续在计数模块里逐帧调用。常见做法如下import cv2 import torch # 加载训练好的 YOLOv5 模型 model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, force_reloadTrue) model.conf 0.4 # 置信度阈值 model.iou 0.5 # NMS IoU 阈值 model.classes [0] # 只保留 person 类别 cap cv2.VideoCapture(test_video.mp4) while cap.isOpened(): ret, frame cap.read() if not ret: break results model(frame) # 推理返回所有检测结果 detections results.xyxy[0].cpu().numpy() # 输出 [x1, y1, x2, y2, conf, cls] for det in detections: x1, y1, x2, y2, conf, cls det # 在这里做后续的计数或绘制逻辑 cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) cv2.imshow(frame, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()torch.hub.load第一次运行会下载 YOLOv5 仓库和依赖如果你的环境无法联网可以改成直接把项目里的yolov5目录拉到当前工程然后from models.experimental import attempt_load来加载权重。model.conf控制检测框的置信度阈值阈值越高漏检越多越低误检越多人流量计数场景建议 0.4 左右过于密集的人群区块可以降到 0.25。results.xyxy[0]返回的是归一化前的像素坐标直接用在cv2.rectangle里即可。处理视频时一定要自己写cap.read()循环不要用detect.py的--source视频参数一键跑完因为计数逻辑需要跨帧状态而且你要在每一帧里插入业务代码。4.2 基于检测框的计数策略最朴素的计数方式是“区域计数”在画面里画一条线或一个矩形区域检测框中心落入区域就计数加一。这种方式实现简单但缺点很明显同一人站在区域边界会抖动导致同一个目标被重复计数。我给一个稍微稳一点的方案用“进入/离开事件”而不是纯中心点判断。count_in 0 count_out 0 line_y 480 # 在画面中设定一条水平线 prev_centers {} # key: 跟踪ID, value: 上一帧中心y坐标 for det in detections: x1, y1, x2, y2 det[:4] cx (x1 x2) / 2 cy (y1 y2) / 2 # 这里需要结合跟踪模块给每个目标一个唯一ID track_id get_track_id(det) if track_id in prev_centers: prev_y prev_centers[track_id] # 跨过直线从线上方到下方视为进入反之为离开 if prev_y line_y and cy line_y: count_in 1 elif prev_y line_y and cy line_y: count_out 1 prev_centers[track_id] cyline_y的位置决定了计数区域一般放在画面中下部避开人群重叠最严重的部分。prev_centers存储的是每个目标上一帧的中心纵坐标通过跨线的方向判断进出。这种方案的关键是track_id的稳定性如果跟踪丢失目标重新出现时会被当成新目标从而计数偏大。所以在工程里需要设计跟踪模块而不是每帧做独立检测。计数逻辑的边界条件很多目标刚进入画面时中心可能已经在判定线以下此时不能计为“进入”目标跨线后又被遮挡了 5 帧回来后 ID 变了就会导致计数错误。对于毕设演示可以把这些边界写成参数比如设置一个最小跟踪时间目标连续出现 2 帧以上才参与计数能有效过滤闪烁检测框。4.3 用目标跟踪降低重复计数跨帧关联的常见选择是给 YOLOv5 接一个 IoU 匹配器或者直接用 DeepSORT。DeepSORT 需要额外的 ReID 特征训练复杂毕设场景下一个基于 IoU 的简易跟踪器已经够用。核心流程是每帧的检测框列表与上一帧的框做交并比匹配匹配上的框继承旧 ID匹配不上的新框分配新的 ID。def iou(box1, box2): x1 max(box1[0], box2[0]) y1 max(box1[1], box2[1]) x2 min(box1[2], box2[2]) y2 min(box1[3], box2[3]) inter max(0, x2 - x1) * max(0, y2 - y1) area1 (box1[2] - box1[0]) * (box1[3] - box1[1]) area2 (box2[2] - box2[0]) * (box2[3] - box2[1]) union area1 area2 - inter return inter / (union 1e-6) # 每帧保存上一个状态 def match_tracks(dets, prev_tracks): matched [] new_tracks [] used_prev set() for det in dets: best_iou 0.0 best_id None for track_id, prev_box in prev_tracks.items(): if track_id in used_prev: continue score iou(det[:4], prev_box[:4]) if score best_iou: best_iou score best_id track_id if best_id is not None and best_iou 0.3: matched.append((best_id, det)) used_prev.add(best_id) else: new_id max(prev_tracks.keys()) 1 if prev_tracks else 0 new_tracks.append((new_id, det)) return matched, new_tracksmatch_tracks接受当前帧检测结果和上一帧的跟踪列表返回匹配结果和新出现的目标。IoU 阈值 0.3 是比较常用的经验值超过 0.3 就认为同一目标阈值设太高会导致目标移动快时断帧设太低会把挨得近的不同人错误配对。如果想做得更细可以在 IoU 基础上加中心点距离约束两个框中心点距离超过当前框宽度的 1.5 倍即使 IoU 达标也认为是不同目标。注意的是这种简单跟踪器不支持目标被完全遮挡后重现。如果要更稳定就需要卡尔曼滤波预测下一帧位置甚至用 DeepSORT 的外观特征。毕设答辩时把这一点作为“后续改进方向”主动说出来比被评委问倒要好得多。5. 重新训练与阈值调优让检测系统适配不同摄像头场景5.1 用少量数据微调模型适配俯视场景公开权重在平视街景上表现良好但很多监控摄像头是俯视安装的这时候直接用人头检测比全身检测更合适。如果你手上的训练数据不足可以先用预训练模型对当前场景跑一遍把置信度高于 0.6 的检测结果自动导出成标注人工修正后加入训练集这种半自动标注能大幅缩短数据准备时间。具体做法是用detect.py --source video --save-txt输出每帧的检测坐标再写脚本把坐标还原到原图并生成 XML。生成的标注中难免有误检需要抽查修正这个工作量通常比完全手工标注小一半以上。微调时把epochs设为 50学习率设小到 0.0005防止破坏原有特征。5.2 参数调优的优先级排序很多同学一上来就调模型结构其实在人流量场景里以下参数的性价比远高于改网络置信度阈值conf直接影响误检和漏检的平衡。商场闸机场景人群稀疏阈值可以设到 0.5减少误报地铁站高峰期人群拥挤阈值降到 0.25 反而能找回更多被遮挡的目标。NMS 的 IoU 阈值iou控制在 0.4 到 0.5过高时重叠的人会合并成一个框过低时同一个人会产生多个框。视频处理时帧率也要注意。如果摄像头是 25 FPS而你的检测只有 10 FPS跟踪模块会不断丢帧。此时可以每隔一帧做检测中间一帧用上一帧的检测结果或者用多线程把检测和视频读取拆开检测线程处理慢一点没关系读取线程保持原速用队列缓冲。5.3 效果验证与调试技巧验证人流量检测系统好坏不能只看 mAP还要看计数准确率。拿一段带人工标记的视频统计模型输出的人数与真实人数的误差。我一般会输出三段数据检测框数量、跟踪得到的独立 ID 数、跨线事件计数。三段数据互相印证如果检测框数很多而独立 ID 数很少说明跟踪过度合并反之则说明目标频繁被创建新 ID。调试时在画面里把track_id绘制在检测框上方盯着运动过程看 ID 是否稳定。常见问题中ID 频繁跳变大多是检测框抖动导致 IoU 匹配失败这时可以给检测框做平滑比如对连续三帧的坐标做指数移动平均。另一个实用技巧是启用 YOLOv5 的--augment推理参数它会用 TTA 的方式提升检测框稳定性代价是速度下降约三倍适合在离线视频分析时使用。最后提一个很多人会忽略的细节项目说明里一定要记录训练环境的 Python 版本、依赖库版本特别是 PyTorch 和 OpenCV。这个项目的源码在 Windows 和 Linux 上都能跑但 CUDA 版本不匹配会在torch.hub.load阶段直接报错。如果你没有 GPU把device设为cpu也能跑只是速度会慢到 2-3 FPS演示时建议用短视频而不是实时摄像头。到这里从数据到训练再到计数的完整链路已经跑通剩下的就是把你自己的视频放进--source参数里看看这套系统在你场景下的真实表现。本文还有配套的精品资源点击获取
RELATED

相关推荐

Meetily 后端 API 实战指南:基于 FastAPI 的会议纪要生成服务从配置到调用

Meetily 后端 API 实战指南:基于 FastAPI 的会议纪要生成服务从配置到调用

Meetily 后端 API 实战指南:基于 FastAPI 的会议纪要生成服务从配置到调用 【免费下载链接】meetily Privacy first, AI meeting assistant with 4x faster Parakeet/Whisper live transcription, speaker diarization, and Ollama summarization built on Rust. 10…

📅 2026/9/11 2:17:30
G-Helper:单文件接管华硕笔记本性能优化,3分钟上手实战

G-Helper:单文件接管华硕笔记本性能优化,3分钟上手实战

G-Helper:单文件接管华硕笔记本性能优化,3分钟上手实战 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook,…

📅 2026/9/11 2:17:30
HeyGem.ai 本地部署:3 条命令跑通离线数字人

HeyGem.ai 本地部署:3 条命令跑通离线数字人

HeyGem.ai 本地部署:3 条命令跑通离线数字人 【免费下载链接】Duix-Avatar 🚀 Truly open-source AI avatar(digital human) toolkit for offline video generation and digital human cloning. 项目地址: https://gitcode.com/GitHub_Trending/he/Dui…

📅 2026/9/11 2:17:30
MORE NEWS

更多资讯

📰

CopilotKit Tool-Based Generative UI 功能验证指南:AG2 集成场景下的端到端 QA 清单与实践

CopilotKit Tool-Based Generative UI 功能验证指南:AG2 集成场景下的端到端 QA 清单与实践 【免费下载链接】CopilotKit The Frontend Stack for Agents & Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol 项目地址:…

📰

基于FastAPI与订单状态机的虚拟商品自动发货系统实践

1. 项目定位与整体设计思路先说结论:这个项目解决的是“没有营业执照、没有企业资质、也不想走第三方支付平台审核”的卖家,如何低成本搭建一个能自动发货、能管理订单的虚拟商品交易系统。我做这个系统时,最核心的取舍就是:不接微…

📰

Ventoy启动盘无法引导?3步排查修复,保留ISO文件的更新方法

Ventoy启动盘无法引导?3步排查修复,保留ISO文件的更新方法 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy U盘插上Ventoy启动盘、重启,启动菜单里却没有这个盘的踪影…

📰

基于均值-方差模型的资产配置:Python实现有效前沿与协方差估计

简介:围绕均值方差资产配置模型的可执行资料包,面向金融投资、量化分析与资产组合管理方向的学习者与从业者,帮助理解如何在风险与收益之间权衡,并用定量方法确定最优资产权重。压缩包内共2个文件,分别为MATLAB优化脚本…

📰

G-Helper:华硕笔记本性能模式、风扇调校与 GPU 切换,一个 exe 搞定

G-Helper:华硕笔记本性能模式、风扇调校与 GPU 切换,一个 exe 搞定 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt…

📰

Qt程序打包全攻略:从动态链接库依赖到安装包制作选型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬