# 基于YOLO的人群密度检测系统设计与实现 **Repository Path**: qiutian123zxc/yolov5-head ## Basic Information - **Project Name**: 基于YOLO的人群密度检测系统设计与实现 - **Description**: 基于改进后的YOLOv5目标检测模型,实现人群密度检测系统。 - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 3 - **Created**: 2023-12-04 - **Last Updated**: 2025-08-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 人群密度检测系统 ## 工作量 我们小组从github上下载了yolov5的源代码,在此基础上修改和训练模型, 数据集选用的是crowdhuman数据集。 我们对yolov5源码中的common.py、yolo.py、loss.py、general.py 等进行了修改,更换了主干网络、改进了损失函数。 系统的前后端代码则体现在sever.py、detect_web.py和head-detect-web 文件夹中,主要基于Flask实现。 由于模型训练后的权重文件best.pt太大,无法上传到gitee上, 因此想要下载best.pt,来测试模型,需要前往下列百度网盘的链接下载。 https://pan.baidu.com/s/1flH0WziRg0K7wZWCUjW-2g?pwd=1234 提取码:1234 ## 介绍 基于改进后的YOLOv5目标检测模型,实现人群密度检测系统。 改进的YOLOv5模型主要是用FasterNet主干网络更换了原YOLOv5的主干网络, 并应用Soft-NMS、最优运输分配(OTA)等方法改进了损失函数。 ## 目前进展 ### 1 FasterNet实现 根据CVPR 2023的最新论文《Run,Don't walk:Chasing Higher FLOPS for Faster Neural Networks》, 利用PyTorch深度学习框架实现FasterNet主干网络。(具体代码见common.py) ### ![图片无法展示,具体见showimages文件夹](./showimages/1.PNG) ### ![图片无法展示,具体见showimages文件夹](./showimages/2.PNG) ### ![图片无法展示,具体见showimages文件夹](./showimages/3.PNG) ### 2 更换主干网络 在yolo parse_model中添加FasterNet主干网络。(具体代码见yolo.py) ### ![图片无法展示,具体见showimages文件夹](./showimages/4.PNG) ### 3 模型配置文件 完成以FasterNet为主干网络的YOLOv5模型配置,网络大小相比yolov5s参数量降低, 介于yolov5s和yolov5x之间。(具体代码见yolov5-fasternet.yaml) ### ![图片无法展示,具体见showimages文件夹](./showimages/5.PNG) ### ![图片无法展示,具体见showimages文件夹](./showimages/6.PNG) ### 4 改进损失函数 基于CVPR 2021论文《Optimal Transport Assignment for Object Detection》 提出的最优传输分配(OTA)方法,改进损失函数ComputeLoss为ComputeLossOTA。 该方法提出了一种基于优化策略的标签分配方式,将 gt 看做 label 供应商,anchor 看做 label 需求方。 对于正样本,将分类和回归的 loss 加权和作为传输花费,对于负样本,传输花费就为分类 loss,通过最小化该花费,让网络自己学习最优的标签分配方式。 免去了手工选定参数的方式来实现标签分配,让网络自己选择每个 gt 对应的 anchor 数量, 而非提前设定,也能够较好的解决模棱两可的 anchor 分配问题,提高网络对这部分 anchor 的处理效果。(代码太长,下图不全,具体见loss.py) ### ![图片无法展示,具体见showimages文件夹](./showimages/7.PNG) ### 5 添加Soft-NMS方法 将原torchvision.ops.nms方法用soft_nms替换。 该方法能够帮助模型在检测阶段,消除多余的检测框,找到最佳的物体检测位置,提高物体检测框标注的准确性。(具体代码见genneral.py) ### ![图片无法展示,具体见showimages文件夹](./showimages/8.PNG) ### ![图片无法展示,具体见showimages文件夹](./showimages/8.1.PNG) ### ![图片无法展示,具体见showimages文件夹](./showimages/9.PNG) ### 6 网页端部署 目前实现了基于Flask在网页端部署原YOLOv5模型,并调用电脑摄像头进行实时检测, 服务器端代码见sever.py,前端代码见templates/show_web.html,后端代码见detect_web.py。 下图代码为基于Flask实现的服务器端代码。 ### ![图片无法展示,具体见showimages文件夹](./showimages/flask.jpg) ### 7 模型训练 模型训练时loss的收敛过程和曲线等均保存在results文件夹中; ### ![图片无法展示,具体见showimages文件夹](./results/results.png) 模型一共训练200个epoch, 在训练集和验证集上的效果图保存在exp文件夹中; 模型训练的权重保存在weights文件夹中。 下图为标签和模型预测图的示例: ### ![图片无法展示,具体见showimages文件夹](./exp/val_batch1_labels.jpg) ### ![图片无法展示,具体见showimages文件夹](./exp/val_batch1_pred.jpg) ### 8 模型测试 源代码的detect_web.py文件主要定义了一些web后端处理图像时需要用到的一些函数,同时也提供了检测模型性能的四个方法: image_test(image_path):对image_path路径下的图片检测,输出检测结果 image_test_hm(image_path):对image_path路径下的图片检测,输出检测结果的热力图 video_test(video_path):对video_path路径下的视频检测,输出检测结果 video_test_hm(video_path):对video_path路径下的视频检测,输出检测结果的热力图 ### 9 系统实现 理想很丰满,现实很残酷。在实际的系统开发过程中,由于小组技术能力的不足, 尤其是在web前后端开发方面知识、经验和技能的匮乏,以及时间安排的不合理性 (前期模型的修改和训练耗费了较多的时间,工作量也主要集中在模型的修改、训练和测试上), 我们小组并没有依照最初的设想和原型设计开发出功能完整、性能完善的人群密度检测系统, 在系统的具体实现环节出现了一系列我们暂时没有解决的问题。 最终,我们小组只实现系统原型设计中图片/视频检测、摄像头检测的核心功能, 包括实时监控、历史数据查询、系统用户权限设置等功能均未能如期实现。 (web前后端代码体现在sever.py、detect_web.py和head-detect-web文件夹中,主要基于Flask实现) ### ![图片无法展示,具体见showimages文件夹](./showimages/image.JPG) ### ![图片无法展示,具体见showimages文件夹](./showimages/video.JPG)